sapenlinea-components 0.9.75 → 0.9.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"sapenlinea-components.mjs","sources":["../../../projects/sapenlinea-components/src/lib/components/pagination/pagination.ts","../../../projects/sapenlinea-components/src/lib/components/pagination/pagination.html","../../../projects/sapenlinea-components/src/lib/services/pdf-viewer/pdf-viewer.service.ts","../../../projects/sapenlinea-components/src/lib/components/table/table.ts","../../../projects/sapenlinea-components/src/lib/components/table/table.html","../../../projects/sapenlinea-components/src/lib/components/date-time-picker/date-time-picker.ts","../../../projects/sapenlinea-components/src/lib/components/date-time-picker/date-time-picker.html","../../../projects/sapenlinea-components/src/lib/components/date-time-filter/date-time-filter.ts","../../../projects/sapenlinea-components/src/lib/components/date-time-filter/date-time-filter.html","../../../projects/sapenlinea-components/src/lib/components/input-number-filter/input-number-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-number-filter/input-number-filter.html","../../../projects/sapenlinea-components/src/lib/components/input-select-filter/input-select-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-select-filter/input-select-filter.html","../../../projects/sapenlinea-components/src/lib/components/input-text-filter/input-text-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-text-filter/input-text-filter.html","../../../projects/sapenlinea-components/src/lib/components/input/input.ts","../../../projects/sapenlinea-components/src/lib/components/input/input.html","../../../projects/sapenlinea-components/src/lib/components/select-custom-search/select-custom-search.ts","../../../projects/sapenlinea-components/src/lib/components/select-custom-search/select-custom-search.html","../../../projects/sapenlinea-components/src/lib/components/toggle-custom/toggle-custom.ts","../../../projects/sapenlinea-components/src/lib/components/toggle-custom/toggle-custom.html","../../../projects/sapenlinea-components/src/lib/components/dynamic-form-fields/dynamic-form-fields.ts","../../../projects/sapenlinea-components/src/lib/components/dynamic-form-fields/dynamic-form-fields.html","../../../projects/sapenlinea-components/src/lib/components/wizard-form/wizard-form.ts","../../../projects/sapenlinea-components/src/lib/components/wizard-form/wizard-form.html","../../../projects/sapenlinea-components/src/lib/helpers/toast-helper.ts","../../../projects/sapenlinea-components/src/lib/components/button/button.ts","../../../projects/sapenlinea-components/src/lib/components/button/button.html","../../../projects/sapenlinea-components/src/lib/components/modal-form/modal-form.ts","../../../projects/sapenlinea-components/src/lib/components/modal-form/modal-form.html","../../../projects/sapenlinea-components/src/lib/components/dialog-alert/dialog-alert.ts","../../../projects/sapenlinea-components/src/lib/components/dialog-alert/dialog-alert.html","../../../projects/sapenlinea-components/src/lib/components/dialog-confirmation/dialog-confirmation.ts","../../../projects/sapenlinea-components/src/lib/components/dialog-confirmation/dialog-confirmation.html","../../../projects/sapenlinea-components/src/lib/components/not-found-modal/not-found-modal.ts","../../../projects/sapenlinea-components/src/lib/components/not-found-modal/not-found-modal.html","../../../projects/sapenlinea-components/src/lib/components/loader/loader.ts","../../../projects/sapenlinea-components/src/lib/components/loader/loader.html","../../../projects/sapenlinea-components/src/lib/services/progress/progress-service.ts","../../../projects/sapenlinea-components/src/lib/components/progress-bar/progress-bar.ts","../../../projects/sapenlinea-components/src/lib/components/progress-bar/progress-bar.html","../../../projects/sapenlinea-components/src/lib/components/processing-overlay/processing-overlay.ts","../../../projects/sapenlinea-components/src/lib/components/processing-overlay/processing-overlay.html","../../../projects/sapenlinea-components/src/lib/components/info-group/info-group.ts","../../../projects/sapenlinea-components/src/lib/components/info-group/info-group.html","../../../projects/sapenlinea-components/src/lib/components/feature-card/feature-card.ts","../../../projects/sapenlinea-components/src/lib/components/feature-card/feature-card.html","../../../projects/sapenlinea-components/src/lib/components/side-card/side-card.ts","../../../projects/sapenlinea-components/src/lib/components/side-card/side-card.html","../../../projects/sapenlinea-components/src/lib/components/side-card-detail/side-card-detail.ts","../../../projects/sapenlinea-components/src/lib/components/side-card-detail/side-card-detail.html","../../../projects/sapenlinea-components/src/lib/components/devices-carousel/devices-carousel.ts","../../../projects/sapenlinea-components/src/lib/components/devices-carousel/devices-carousel.html","../../../projects/sapenlinea-components/src/lib/components/input-time-filter/input-time-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-time-filter/input-time-filter.html","../../../projects/sapenlinea-components/src/lib/components/title-filters/title-filters.ts","../../../projects/sapenlinea-components/src/lib/components/title-filters/title-filters.html","../../../projects/sapenlinea-components/src/lib/components/notification-modal/notification-modal.ts","../../../projects/sapenlinea-components/src/lib/components/notification-modal/notification-modal.html","../../../projects/sapenlinea-components/src/lib/components/footer/footer.ts","../../../projects/sapenlinea-components/src/lib/components/footer/footer.html","../../../projects/sapenlinea-components/src/lib/components/button-cards/button-cards.ts","../../../projects/sapenlinea-components/src/lib/components/button-cards/button-cards.html","../../../projects/sapenlinea-components/src/lib/components/card-content/card-content.ts","../../../projects/sapenlinea-components/src/lib/components/card-content/card-content.html","../../../projects/sapenlinea-components/src/lib/components/tabs/tabs.ts","../../../projects/sapenlinea-components/src/lib/components/tabs/tabs.html","../../../projects/sapenlinea-components/src/lib/components/not-found-section/not-found-section.ts","../../../projects/sapenlinea-components/src/lib/components/not-found-section/not-found-section.html","../../../projects/sapenlinea-components/src/lib/services/toast/toast-service.ts","../../../projects/sapenlinea-components/src/lib/components/toast/toast.ts","../../../projects/sapenlinea-components/src/lib/components/toast/toast.html","../../../projects/sapenlinea-components/src/lib/components/option-card/option-card.ts","../../../projects/sapenlinea-components/src/lib/components/option-card/option-card.html","../../../projects/sapenlinea-components/src/lib/components/quick-access-cards/quick-access-cards.ts","../../../projects/sapenlinea-components/src/lib/components/quick-access-cards/quick-access-cards.html","../../../projects/sapenlinea-components/src/lib/components/charts/base/base-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/base/base-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/bar-chart/bar-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/bar-chart/bar-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/line-chart/line-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/line-chart/line-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/donut-chart/donut-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/donut-chart/donut-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/heatmap/heatmap.ts","../../../projects/sapenlinea-components/src/lib/components/charts/heatmap/heatmap.html","../../../projects/sapenlinea-components/src/lib/components/map/geo-api-maps/geo-api-maps.ts","../../../projects/sapenlinea-components/src/lib/components/map/geo-api-maps/geo-api-maps.html","../../../projects/sapenlinea-components/src/lib/components/charts/map-geo/map-geo.ts","../../../projects/sapenlinea-components/src/lib/components/charts/map-geo/map-geo.html","../../../projects/sapenlinea-components/src/lib/components/charts/table-chart/table-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/table-chart/table-chart.html","../../../projects/sapenlinea-components/src/lib/components/kpi-card/kpi-card.ts","../../../projects/sapenlinea-components/src/lib/components/kpi-card/kpi-card.html","../../../projects/sapenlinea-components/src/lib/components/load-image/load-image.ts","../../../projects/sapenlinea-components/src/lib/components/load-image/load-image.html","../../../projects/sapenlinea-components/src/lib/components/pdf-viewer/pdf-viewer.ts","../../../projects/sapenlinea-components/src/lib/components/pdf-viewer/pdf-viewer.html","../../../projects/sapenlinea-components/src/lib/components/documents-upload/documents-upload.ts","../../../projects/sapenlinea-components/src/lib/components/documents-upload/documents-upload.html","../../../projects/sapenlinea-components/src/public-api.ts","../../../projects/sapenlinea-components/src/sapenlinea-components.ts"],"sourcesContent":["import { Component, computed, input, model, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-pagination',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './pagination.html',\r\n styleUrls: ['./pagination.css']\r\n})\r\nexport class PaginationComponent {\r\n // Inputs as Models/Signals\r\n page = model(1);\r\n pageSize = model(10);\r\n totalItems = input(0);\r\n\r\n showPageSizeSelector = input(false);\r\n pageSizeOptions = input([10, 20, 30, 50]);\r\n\r\n // Internal state\r\n isOpen = signal(false);\r\n showPageSizeMenu = signal(false);\r\n\r\n totalPages = computed(() => {\r\n const size = this.pageSize();\r\n const total = this.totalItems();\r\n return size > 0 ? Math.ceil(total / size) : 1;\r\n });\r\n\r\n visiblePages = computed(() => {\r\n const total = this.totalPages();\r\n const current = this.page();\r\n\r\n // Configuración de cuantos números mostrar a los lados del actual\r\n const siblingCount = 1;\r\n const totalNumbers = siblingCount + 5; // siblingCount + first + last + current + 2*dots\r\n\r\n // Si el total de páginas es menor que los números que queremos mostrar, mostrar todo\r\n if (totalNumbers >= total) {\r\n return Array.from({ length: total }, (_, i) => i + 1);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(current - siblingCount, 1);\r\n const rightSiblingIndex = Math.min(current + siblingCount, total);\r\n\r\n const shouldShowLeftDots = leftSiblingIndex > 2;\r\n const shouldShowRightDots = rightSiblingIndex < total - 2;\r\n\r\n const firstPageIndex = 1;\r\n const lastPageIndex = total;\r\n\r\n // Caso 1: Solo puntos a la derecha\r\n // 1 2 3 4 5 ... 20\r\n if (!shouldShowLeftDots && shouldShowRightDots) {\r\n const leftRangeCount = 3 + 2 * siblingCount;\r\n const leftRange = Array.from({ length: leftRangeCount }, (_, i) => i + 1);\r\n return [...leftRange, '...', total];\r\n }\r\n\r\n // Caso 2: Solo puntos a la izquierda\r\n // 1 ... 16 17 18 19 20\r\n if (shouldShowLeftDots && !shouldShowRightDots) {\r\n const rightRangeCount = 3 + 2 * siblingCount;\r\n const rightRange = Array.from({ length: rightRangeCount }, (_, i) => total - rightRangeCount + i + 1);\r\n return [firstPageIndex, '...', ...rightRange];\r\n }\r\n\r\n // Caso 3: Puntos a ambos lados\r\n // 1 ... 9 10 11 ... 20\r\n if (shouldShowLeftDots && shouldShowRightDots) {\r\n const middleRange = Array.from(\r\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\r\n (_, i) => leftSiblingIndex + i\r\n );\r\n return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex];\r\n }\r\n\r\n // Fallback (no debería ocurrir con la lógica actual si totalNumbers >= total cubre los casos pequeños)\r\n return Array.from({ length: total }, (_, i) => i + 1);\r\n });\r\n\r\n onPageClick(p: number | string) {\r\n if (typeof p === 'number') {\r\n this.goToPage(p);\r\n }\r\n }\r\n\r\n isPageActive(p: number | string) {\r\n return typeof p === 'number' && this.page() === p;\r\n }\r\n\r\n goToPage(p: number | string) {\r\n if (typeof p !== 'number') return;\r\n this.page.set(p);\r\n }\r\n\r\n togglePageSizeMenu() {\r\n this.isOpen.update(v => !v);\r\n this.showPageSizeMenu.update(v => !v);\r\n }\r\n\r\n selectPageSize(size: number) {\r\n this.pageSize.set(size);\r\n this.showPageSizeMenu.set(false);\r\n this.isOpen.set(false);\r\n }\r\n}\r\n","<div class=\"pagination-container\">\r\n <div class=\"pagination\" role=\"navigation\" aria-label=\"Pagination\">\r\n <!-- Botón doble atrás -->\r\n <button class=\"icon-button\" (click)=\"goToPage(1)\" [disabled]=\"page() === 1\" aria-label=\"Ir a la primera página\">\r\n ««\r\n </button>\r\n\r\n <!-- Botón atrás -->\r\n <button class=\"icon-button\" (click)=\"goToPage(page() - 1)\" [disabled]=\"page() === 1\"\r\n aria-label=\"Ir a la página anterior\">\r\n «\r\n </button>\r\n\r\n <!-- Números de página -->\r\n <div class=\"pages\">\r\n @for (p of visiblePages(); track $index) {\r\n <button class=\"page-btn\" [class.active]=\"p === page()\" [disabled]=\"p === '...'\" (click)=\"goToPage(p)\"\r\n [attr.aria-current]=\"p === page() ? 'page' : null\"\r\n [attr.aria-label]=\"p === '...' ? 'Más páginas' : 'Ir a la página ' + p\">\r\n {{ p }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Botón siguiente -->\r\n <button class=\"icon-button\" (click)=\"goToPage(page() + 1)\" [disabled]=\"page() === totalPages()\"\r\n aria-label=\"Ir a la página siguiente\">\r\n »\r\n </button>\r\n\r\n <!-- Botón doble adelante -->\r\n <button class=\"icon-button\" (click)=\"goToPage(totalPages())\" [disabled]=\"page() === totalPages()\"\r\n aria-label=\"Ir a la última página\">\r\n »»\r\n </button>\r\n </div>\r\n\r\n <!-- Selector Items por página -->\r\n @if (showPageSizeSelector() && totalPages() > 1) {\r\n <div class=\"pagination-v-4\">\r\n <div class=\"label-pagination\">Items por página</div>\r\n <div class=\"elements-pagination\">\r\n <div class=\"split-button\" (click)=\"togglePageSizeMenu()\">\r\n <div class=\"leading-button\">\r\n <div class=\"state-layer\">\r\n <div class=\"label\">{{ pageSize() }}</div>\r\n </div>\r\n </div>\r\n <div class=\"trailing-button\">\r\n <div class=\"arrow\" [class.open]=\"isOpen()\">\r\n <svg class=\"arrow\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Menú desplegable -->\r\n @if (showPageSizeMenu()) {\r\n <div class=\"page-size-menu\">\r\n @for (opt of pageSizeOptions(); track $index) {\r\n <div class=\"menu-option\" [class.active]=\"opt === pageSize()\" (click)=\"selectPageSize(opt)\">\r\n {{ opt }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Injectable, signal } from '@angular/core';\r\n\r\nexport type FileViewerType = 'pdf' | 'image';\r\n\r\nexport interface FileViewerDoc {\r\n name: string;\r\n /** Una o varias URLs del archivo a visualizar */\r\n urls: string[];\r\n /** Si no se indica, se detecta automáticamente por la extensión de la primera URL */\r\n type?: FileViewerType;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PdfViewerService {\r\n showModalDocuments = signal(false);\r\n selectedPdf = signal<FileViewerDoc | null>(null);\r\n\r\n openModal() {\r\n this.showModalDocuments.set(true);\r\n }\r\n\r\n closeModal() {\r\n this.showModalDocuments.set(false);\r\n }\r\n\r\n setSelectedPdf(pdf: FileViewerDoc | null) {\r\n this.selectedPdf.set(pdf);\r\n }\r\n\r\n /** Abre el visor directamente con el documento indicado */\r\n open(doc: FileViewerDoc) {\r\n this.selectedPdf.set(doc);\r\n this.showModalDocuments.set(true);\r\n }\r\n}","import { AfterViewInit, Component, computed, ElementRef, HostListener, inject, input, output, QueryList, signal, ViewChildren } from '@angular/core';\r\nimport { UpperCasePipe } from '@angular/common';\r\nimport { PdfViewerService } from '../../services/pdf-viewer/pdf-viewer.service';\r\n\r\nexport interface TableColumn {\r\n key: string;\r\n label: string;\r\n type?: 'text' | 'number' | 'money' | 'date' | 'datetime' | 'percentage' | 'status' | 'icon-button' | 'email' | 'grade';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n sortable?: boolean;\r\n showActions?: boolean;\r\n\r\n icon?: string;\r\n iconKey?: string;\r\n\r\n totalizable?: boolean;\r\n}\r\n\r\nexport interface SubColumn {\r\n key: string;\r\n label: string;\r\n type?: 'text' | 'number' | 'money' | 'date' | 'datetime' | 'percentage' | 'status' | 'icon-button' | 'email'| 'grade';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n}\r\n\r\nexport interface ColumnGroupItem {\r\n key: string;\r\n label: string;\r\n description: string;\r\n type?: 'checkbox' | 'number' | 'icon-button' | 'percentage';\r\n icon?: string;\r\n iconKey?: string;\r\n /** Key del row que contiene la URL del archivo a visualizar al hacer click en el checkbox marcado */\r\n fileUrlKey?: string;\r\n /** Key del row para el nombre del archivo en el viewer (opcional, por defecto usa label) */\r\n fileNameKey?: string;\r\n}\r\n\r\nexport interface ColumnGroup {\r\n groupLabel: string;\r\n columns: ColumnGroupItem[];\r\n}\r\n\r\nexport interface TableRow {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface TableAction {\r\n key: string;\r\n icon: string;\r\n label: string;\r\n}\r\n\r\nexport interface StatusToneMap {\r\n [statusKey: string]: StatusTone;\r\n}\r\n\r\nexport type StatusTone =\r\n | 'success'\r\n | 'error'\r\n | 'warning'\r\n | 'info'\r\n | 'neutral';\r\n\r\nconst STATUS_TONE_STYLES: Record<StatusTone, { bg: string; color: string }> = {\r\n success: { bg: '#9ED89D', color: '#006D2F' },\r\n error: { bg: '#D89D9D', color: '#CF0707' },\r\n warning: { bg: '#D8BF9D', color: '#CF6507' },\r\n info: { bg: '#9DAFD8', color: '#0746CF' },\r\n neutral: { bg: '#BAC2BB', color: '#40484C' },\r\n};\r\n\r\nconst ICON_COLOR_MAP: Record<string, string> = {\r\n 'icon-delete': '#CF0707',\r\n 'icon-deactivate': '#CF0707',\r\n\r\n 'icon-edit': '#596300',\r\n 'icon-refresh': '#596300',\r\n\r\n 'icon-activate': '#006D2F',\r\n\r\n 'icon-view': '#063546',\r\n 'icon-add': '#063546',\r\n 'icon-file': '#40484C',\r\n\r\n 'icon-sanction': '#CF6507',\r\n};\r\n\r\n// Instancia única reutilizada para formatear moneda — evita crearla en cada render\r\nconst currencyFormatter = new Intl.NumberFormat('es-CO', {\r\n style: 'currency',\r\n currency: 'COP',\r\n minimumFractionDigits: 0,\r\n});\r\n\r\n@Component({\r\n selector: 'lib-table',\r\n imports: [UpperCasePipe],\r\n standalone: true,\r\n templateUrl: './table.html',\r\n styleUrl: './table.css',\r\n})\r\nexport class Table implements AfterViewInit {\r\n private pdfViewerService = inject(PdfViewerService);\r\n columns = input<TableColumn[]>([]);\r\n data = input<TableRow[]>([]);\r\n actions = input<TableAction[] | ((row: TableRow) => TableAction[])>([] as TableAction[]);\r\n showActions = input<boolean>(true);\r\n\r\n openedMenu = signal<number | null>(null);\r\n selectedRow = signal<TableRow | null>(null);\r\n sortColumn = signal<string | null>(null);\r\n sortDirection = signal<'asc' | 'desc'>('desc');\r\n\r\n optionSelected = output<{ action: string; row: TableRow }>();\r\n iconAction = output<{ action: string; row: TableRow }>();\r\n\r\n statusToneMap = input<StatusToneMap>({});\r\n statusEnumMap = input<Record<number | string, string>>({});\r\n\r\n subColumns = input<SubColumn[]>([]);\r\n expandedRowId = signal<number | string | null>(null);\r\n isRowExpandable = input<(row: TableRow) => boolean>(() => false);\r\n expandedChildren = input<(row: TableRow) => TableRow[] | null>(() => null);\r\n rowIdKey = input<string>('id');\r\n\r\n showSelection = input<boolean>(false);\r\n selectedRows = signal<Set<string | number>>(new Set());\r\n\r\n showTotals = input<boolean>(false);\r\n\r\n columnGroups = input<ColumnGroup[]>([]);\r\n columnGroupChange = output<{ key: string; row: TableRow; value: any }>();\r\n\r\n readonly hasColumnGroups = computed(() => this.columnGroups().length > 0);\r\n\r\n readonly totalGroupSubColumns = computed(() =>\r\n this.columnGroups().reduce((sum, g) => sum + g.columns.length, 0)\r\n );\r\n\r\n readonly totalColspan = computed(() =>\r\n this.columns().length\r\n + this.totalGroupSubColumns()\r\n + (this.showActions() ? 1 : 0)\r\n + (this.showSelection() ? 1 : 0)\r\n );\r\n\r\n @ViewChildren('statusChip') chips!: QueryList<ElementRef>;\r\n\r\n ngAfterViewInit() {\r\n this.recalculateStatusChipWidth();\r\n\r\n this.chips.changes.subscribe(() => {\r\n this.recalculateStatusChipWidth();\r\n });\r\n }\r\n\r\n toggleMenu(index: number) {\r\n this.openedMenu.set(this.openedMenu() === index ? null : index);\r\n }\r\n\r\n onOptionClick(option: TableAction, row: TableRow) {\r\n this.optionSelected.emit({ action: option.label, row });\r\n this.openedMenu.set(null);\r\n }\r\n\r\n openModal(row: TableRow, event?: MouseEvent) {\r\n event?.stopPropagation();\r\n\r\n if (this.selectedRow()?.['id'] === row['id']) {\r\n this.selectedRow.set(null);\r\n } else {\r\n this.selectedRow.set(row);\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.menu-acciones')) {\r\n this.selectedRow.set(null);\r\n }\r\n }\r\n\r\n getAlignment(col: TableColumn | SubColumn): string {\r\n if (col.align && col.align !== 'auto') return col.align;\r\n\r\n switch (col.type) {\r\n case 'number':\r\n case 'money':\r\n case 'percentage':\r\n return 'right';\r\n case 'status':\r\n case 'grade':\r\n return 'center';\r\n case 'email':\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n formatValue(col: TableColumn | SubColumn, value: any): string {\r\n if (value === null || value === undefined) return '';\r\n\r\n switch (col.type) {\r\n case 'money':\r\n return currencyFormatter.format(value);\r\n\r\n case 'number':\r\n return String(value);\r\n\r\n case 'percentage':\r\n return `${value}%`;\r\n\r\n case 'date':\r\n return this.formatDateValue(value);\r\n\r\n case 'datetime':\r\n return this.formatDateTimeValue(value);\r\n\r\n case 'email':\r\n return String(value).toLowerCase();\r\n\r\n case 'grade':\r\n return `${value}°`;\r\n\r\n default:\r\n return String(value);\r\n }\r\n }\r\n\r\n getActionColor(action: TableAction): string {\r\n return ICON_COLOR_MAP[action.icon] ?? '#40484C'; // fallback neutral\r\n }\r\n\r\n getStatusLabel(value: any): string {\r\n if (value === null || value === undefined) return '';\r\n return this.statusEnumMap()?.[value] ?? String(value);\r\n }\r\n\r\n getStatusStyle(value: any) {\r\n if (value === null || value === undefined) {\r\n return STATUS_TONE_STYLES.neutral;\r\n }\r\n\r\n const mapped = this.statusEnumMap()?.[value] ?? value;\r\n const key = this.normalizeStatus(mapped);\r\n const tone = this.statusToneMap()?.[key] ?? 'neutral';\r\n\r\n return STATUS_TONE_STYLES[tone];\r\n }\r\n\r\n private normalizeStatus(value: any): string {\r\n return String(value ?? '')\r\n .toLowerCase()\r\n .trim()\r\n .replace(/\\s+/g, '_');\r\n }\r\n\r\n private formatDateValue(value: any): string {\r\n if (!value) return '';\r\n\r\n const str = String(value).trim();\r\n\r\n // Si ya está exactamente en formato dd/mm/yyyy → no tocar\r\n const alreadyFormatted = /^\\d{2}\\/\\d{2}\\/\\d{4}$/;\r\n if (alreadyFormatted.test(str)) {\r\n return str;\r\n }\r\n\r\n let day: string | number;\r\n let month: string | number;\r\n let year: string | number;\r\n\r\n // Formato tipo yyyy-mm-dd o yyyy-m-d\r\n const isoMatch = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(str);\r\n if (isoMatch) {\r\n year = isoMatch[1];\r\n month = isoMatch[2];\r\n day = isoMatch[3];\r\n }\r\n // Formato tipo d/m/yyyy o dd/mm/yyyy sin ceros\r\n else {\r\n const slashMatch = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(str);\r\n if (slashMatch) {\r\n day = slashMatch[1];\r\n month = slashMatch[2];\r\n year = slashMatch[3];\r\n } else {\r\n // Fallback: intentar con Date\r\n const d = new Date(str);\r\n if (isNaN(d.getTime())) return str;\r\n\r\n day = d.getDate();\r\n month = d.getMonth() + 1;\r\n year = d.getFullYear();\r\n }\r\n }\r\n\r\n const dd = String(day).padStart(2, '0');\r\n const mm = String(month).padStart(2, '0');\r\n const yyyy = String(year);\r\n\r\n return `${dd}/${mm}/${yyyy}`;\r\n }\r\n\r\n private formatDateTimeValue(value: any): string {\r\n if (!value) return '';\r\n\r\n const str = String(value).trim();\r\n \r\n // Si ya está exactamente en formato dd/mm/yyyy hh:mm AM/PM → no tocar\r\n const alreadyFormattedDt = /^\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2} (AM|PM)$/i;\r\n // Si viene exactamente como fecha sin hora → no tocar tampoco\r\n const alreadyFormattedDate = /^\\d{2}\\/\\d{2}\\/\\d{4}$/;\r\n \r\n if (alreadyFormattedDt.test(str) || alreadyFormattedDate.test(str)) {\r\n return str;\r\n }\r\n\r\n let day: string | number;\r\n let month: string | number;\r\n let year: string | number;\r\n let hours: string | number = 0;\r\n let minutes: string | number = 0;\r\n let hasTime = false;\r\n\r\n // Matches 'YYYY-MM-DD' taking optional ' HH:mm' or 'THH:mm'\r\n const isoMatch = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[\\sT](\\d{1,2}):(\\d{1,2})(?::\\d{1,2})?(?:\\.\\d+Z?)?)?$/.exec(str);\r\n \r\n // Matches 'D/M/YYYY' with optional ' HH:mm'\r\n const slashMatch = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})(?:[\\s](\\d{1,2}):(\\d{1,2})(?::\\d{1,2})?)?$/.exec(str);\r\n \r\n if (isoMatch) {\r\n year = isoMatch[1];\r\n month = isoMatch[2];\r\n day = isoMatch[3];\r\n if (isoMatch[4]) {\r\n hours = parseInt(isoMatch[4], 10);\r\n minutes = parseInt(isoMatch[5], 10);\r\n hasTime = true;\r\n }\r\n } else if (slashMatch) {\r\n day = slashMatch[1];\r\n month = slashMatch[2];\r\n year = slashMatch[3];\r\n if (slashMatch[4]) {\r\n hours = parseInt(slashMatch[4], 10);\r\n minutes = parseInt(slashMatch[5], 10);\r\n hasTime = true;\r\n }\r\n } else {\r\n // Fallback: intentar con Date puro\r\n let d = new Date(value);\r\n if (isNaN(d.getTime()) && typeof value === 'string') {\r\n d = new Date(value.replace(' ', 'T'));\r\n }\r\n\r\n if (isNaN(d.getTime())) return str;\r\n\r\n day = d.getDate();\r\n month = d.getMonth() + 1;\r\n year = d.getFullYear();\r\n hours = d.getHours();\r\n minutes = d.getMinutes();\r\n \r\n // Try to determine if the purely parsed date had any time component. If hours/min are zero, \r\n // assume it didn't unless proven otherwise, though standard behavior is to just print it.\r\n // But we will print the time portion anyway to be safe.\r\n hasTime = true; \r\n }\r\n\r\n const dd = String(day).padStart(2, '0');\r\n const mm = String(month).padStart(2, '0');\r\n const yyyy = String(year);\r\n\r\n if (!hasTime) {\r\n return `${dd}/${mm}/${yyyy}`;\r\n }\r\n\r\n let h = Number(hours);\r\n const m = String(minutes).padStart(2, '0');\r\n const ampm = h >= 12 ? 'PM' : 'AM';\r\n \r\n h = h % 12;\r\n h = h ? h : 12; // 0 becomes 12\r\n const hh = String(h).padStart(2, '0');\r\n\r\n return `${dd}/${mm}/${yyyy} ${hh}:${m} ${ampm}`;\r\n }\r\n\r\n\r\n /**\r\n * Devuelve las acciones para una fila.\r\n * Puede ser que `actions` sea un arreglo (se muestra tal cual) o una función\r\n * que recibe la fila y retorna las acciones correspondientes.\r\n */\r\n getActionsForRow(row: TableRow): TableAction[] {\r\n const acts = this.actions();\r\n if (!acts) return [];\r\n if (typeof acts === 'function') {\r\n try {\r\n return acts(row) ?? [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n return acts;\r\n\r\n }\r\n\r\n // computed: solo recalcula cuando cambian data, sortColumn o sortDirection\r\n readonly sortedData = computed(() => {\r\n const col = this.sortColumn();\r\n if (!col) return this.data();\r\n\r\n const dir = this.sortDirection();\r\n\r\n return [...this.data()].sort((a, b) => {\r\n const x = a[col] ?? '';\r\n const y = b[col] ?? '';\r\n\r\n if (this.isDate(x) && this.isDate(y)) {\r\n return dir === 'asc'\r\n ? new Date(x).getTime() - new Date(y).getTime()\r\n : new Date(y).getTime() - new Date(x).getTime();\r\n }\r\n\r\n if (!isNaN(Number(x)) && !isNaN(Number(y))) {\r\n return dir === 'asc' ? Number(x) - Number(y) : Number(y) - Number(x);\r\n }\r\n\r\n return dir === 'asc'\r\n ? x.toString().localeCompare(y.toString())\r\n : y.toString().localeCompare(x.toString());\r\n });\r\n });\r\n\r\n isDate(value: any): boolean {\r\n return (\r\n typeof value === 'string' &&\r\n value.length > 5 &&\r\n !isNaN(Date.parse(value))\r\n );\r\n }\r\n\r\n onSort(col: TableColumn) {\r\n if (this.sortColumn() === col.key) {\r\n // cambiar asc <-> desc\r\n this.sortDirection.set(\r\n this.sortDirection() === 'asc' ? 'desc' : 'asc'\r\n );\r\n } else {\r\n // nueva columna → empieza en desc (más reciente primero)\r\n this.sortColumn.set(col.key);\r\n this.sortDirection.set('desc');\r\n }\r\n }\r\n\r\n onIconColumnClick(col: TableColumn, row: TableRow, event: MouseEvent) {\r\n event.stopPropagation();\r\n\r\n this.iconAction.emit({\r\n action: col.iconKey ?? col.key,\r\n row\r\n });\r\n }\r\n\r\n private recalculateStatusChipWidth() {\r\n const chipEls = this.chips.map(c => c.nativeElement);\r\n\r\n if (!chipEls.length) return;\r\n\r\n // reset previo\r\n chipEls.forEach(el => (el.style.width = 'auto'));\r\n\r\n const widths = chipEls.map(el => el.scrollWidth);\r\n const maxContentWidth = Math.max(...widths);\r\n\r\n chipEls.forEach(el => {\r\n el.style.width = `${maxContentWidth}px`;\r\n });\r\n }\r\n\r\n private getRowId(row: TableRow): string | number | null {\r\n return row?.[this.rowIdKey()];\r\n }\r\n\r\n toggleRowExpand(row: TableRow, event?: MouseEvent) {\r\n event?.stopPropagation();\r\n if (!this.isRowExpandable()(row)) return;\r\n\r\n const id = this.getRowId(row);\r\n this.expandedRowId.set(\r\n this.expandedRowId() === id ? null : id\r\n );\r\n }\r\n\r\n isExpanded(row: TableRow): boolean {\r\n return this.expandedRowId() === this.getRowId(row);\r\n }\r\n\r\n getChildRows(row: TableRow): TableRow[] {\r\n const provider = this.expandedChildren();\r\n if (!provider) return [];\r\n return provider(row) ?? [];\r\n }\r\n\r\n toggleAllRows(checked: boolean) {\r\n if (!checked) {\r\n this.selectedRows.set(new Set());\r\n return;\r\n }\r\n\r\n const allIds = this.sortedData().map(row => row['id']);\r\n this.selectedRows.set(new Set(allIds));\r\n }\r\n\r\n toggleRow(row: any, checked: boolean) {\r\n const next = new Set(this.selectedRows());\r\n\r\n checked ? next.add(row.id) : next.delete(row.id);\r\n this.selectedRows.set(next);\r\n }\r\n\r\n isRowSelected(row: any): boolean {\r\n return this.selectedRows().has(row.id);\r\n }\r\n\r\n isAllSelected(): boolean {\r\n const sorted = this.sortedData();\r\n return sorted.length > 0 && this.selectedRows().size === sorted.length;\r\n }\r\n\r\n getMoneyTotal(col: any): number {\r\n if (col.type !== 'money' || !col.totalizable) return 0;\r\n\r\n return this.sortedData().reduce((acc, row) => {\r\n const value = Number(row[col.key]);\r\n return acc + (isNaN(value) ? 0 : value);\r\n }, 0);\r\n }\r\n\r\n getGradeStyle(value: number): { bg: string; color: string } {\r\n if (value >= 0 && value <= 0.9) return { bg: '#9ED89D', color: '#006D2F' };\r\n if (value > 0.9 && value <= 2.9) return { bg: '#D8BF9D', color: '#CF6507' };\r\n if (value > 2.9 && value <= 4) return { bg: '#D89D9D', color: '#CF0707' };\r\n return { bg: '#BAC2BB', color: '#40484C' };\r\n }\r\n\r\n onGroupItemChange(col: ColumnGroupItem, row: TableRow, value: any) {\r\n this.columnGroupChange.emit({ key: col.key, row, value });\r\n }\r\n\r\n onGroupIconClick(col: ColumnGroupItem, row: TableRow, event: MouseEvent) {\r\n event.stopPropagation();\r\n this.iconAction.emit({ action: col.iconKey ?? col.key, row });\r\n }\r\n\r\n /** Indica si el checkbox marcado tiene un archivo asociado para visualizar */\r\n hasCheckboxFile(col: ColumnGroupItem, row: TableRow): boolean {\r\n if (!row[col.key]) return false;\r\n if (col.fileUrlKey) return !!row[col.fileUrlKey];\r\n return typeof row[col.key] === 'string' && !!row[col.key];\r\n }\r\n\r\n onGroupCheckboxClick(col: ColumnGroupItem, row: TableRow, event: MouseEvent) {\r\n event.stopPropagation();\r\n if (!row[col.key]) return;\r\n\r\n const raw = col.fileUrlKey\r\n ? row[col.fileUrlKey]\r\n : typeof row[col.key] === 'string' ? row[col.key] : null;\r\n\r\n const urls: string[] = Array.isArray(raw)\r\n ? raw.filter(Boolean)\r\n : raw ? [raw] : [];\r\n\r\n if (!urls.length) return;\r\n\r\n const name = col.fileNameKey ? row[col.fileNameKey] : col.label;\r\n this.pdfViewerService.open({ name, urls });\r\n }\r\n}\r\n","<div class=\"table-wrapper\">\n <table class=\"inner-table\">\n <thead>\n <!-- Fila 1 -->\n <tr>\n\n @if (showSelection()) {\n <th class=\"checkbox-header\" [attr.rowspan]=\"hasColumnGroups() ? 2 : null\">\n <label class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [checked]=\"isAllSelected()\" (change)=\"toggleAllRows($event.target.checked)\" />\n <span class=\"checkmark\"></span>\n </label>\n </th>\n }\n\n @for (col of columns(); track col.key) {\n <th (click)=\"col.sortable !== false && onSort(col)\" [class.sortable]=\"col.sortable !== false\"\n [class]=\"getAlignment(col)\" [attr.rowspan]=\"hasColumnGroups() ? 2 : null\">\n {{ col.label }}\n\n <!-- iconos de orden opcionales -->\n @if (sortColumn() === col.key) {\n <span class=\"sort-icon\">\n {{ sortDirection() === 'asc' ? '▲' : '▼' }}\n </span>\n }\n </th>\n }\n\n <!-- headers de grupo (colspan = número de sub-columnas) -->\n @for (group of columnGroups(); track group.groupLabel) {\n <th class=\"column-group-header\" [attr.colspan]=\"group.columns.length\">\n {{ group.groupLabel }}\n </th>\n }\n\n <!-- columna para acciones -->\n @if (showActions()) {\n <th class=\"actions-header\" [attr.rowspan]=\"hasColumnGroups() ? 2 : null\">Acciones</th>\n }\n </tr>\n\n <!-- Fila 2: sub-headers de grupo (solo si hay groups) -->\n @if (hasColumnGroups()) {\n <tr>\n @for (group of columnGroups(); track group.groupLabel) {\n @for (subCol of group.columns; track subCol.key) {\n <th class=\"column-group-sub-header\">{{ subCol.label }}</th>\n }\n }\n </tr>\n }\n </thead>\n\n <tbody>\n @for (row of sortedData(); track row['id']) {\n <tr class=\"parent-row\"\n [class.expandable]=\"isRowExpandable()(row)\"\n [class.expanded]=\"isExpanded(row)\"\n [class.selected]=\"isRowSelected(row)\"\n (click)=\"toggleRowExpand(row, $event)\">\n\n @if (showSelection()) {\n <td class=\"checkbox-cell\">\n <label class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [checked]=\"isRowSelected(row)\" (change)=\"toggleRow(row, $event.target.checked)\" />\n <span class=\"checkmark\"></span>\n </label>\n </td>\n }\n\n @for (col of columns(); track col.key) {\n <td [class]=\"getAlignment(col)\">\n @if (col.type === 'status') { @let style =\n getStatusStyle(row[col.key]);\n <span #statusChip class=\"status-chip\" [style.background-color]=\"style.bg\" [style.color]=\"style.color\">\n {{ getStatusLabel(row[col.key]) }}\n </span>\n\n } @else if (col.type === 'icon-button') {\n\n <button (click)=\"onIconColumnClick(col, row, $event)\">\n <span class=\"icon\" [class]=\"col.icon\"></span>\n </button>\n } @else if (col.type === 'grade') {\n @let style = getGradeStyle(row[col.key]);\n <span class=\"status-chip\" [style.background-color]=\"style.bg\" [style.color]=\"style.color\">\n {{ formatValue(col, row[col.key]) }}\n </span>\n } @else {\n {{ formatValue(col, row[col.key]) }}\n\n }\n </td>\n }\n\n <!-- Celdas de grupo -->\n @for (group of columnGroups(); track group.groupLabel) {\n @for (subCol of group.columns; track subCol.key) {\n <td class=\"column-group-cell\">\n @if (!subCol.type || subCol.type === 'checkbox') {\n <label class=\"custom-checkbox\"\n [class.custom-checkbox--file]=\"hasCheckboxFile(subCol, row)\"\n (click)=\"onGroupCheckboxClick(subCol, row, $event)\">\n <input type=\"checkbox\" disabled [checked]=\"row[subCol.key]\" />\n <span class=\"checkmark\"></span>\n </label>\n } @else if (subCol.type === 'number') {\n {{ row[subCol.key] }}\n } @else if (subCol.type === 'percentage') {\n {{ row[subCol.key] }}%\n } @else if (subCol.type === 'icon-button') {\n <button (click)=\"onGroupIconClick(subCol, row, $event)\">\n <span class=\"icon\" [class]=\"subCol.icon\"></span>\n </button>\n }\n </td>\n }\n }\n\n <!-- Celda de acciones -->\n @if (showActions()) {\n <td class=\"acciones-cell\">\n <div class=\"menu-acciones\">\n <button class=\"icon-button\" (click)=\"openModal(row); $event.stopPropagation()\">\n <div class=\"content\">\n <div class=\"state-layer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"more-vert\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n </div>\n </div>\n </button>\n @if(selectedRow()?.['id'] === row['id']){\n <div class=\"modal-options-table\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content-table\">\n <ul>\n @for (option of getActionsForRow(row); track $index) {\n <li class=\"option-item-table\" [style.color]=\"getActionColor(option)\"\n (click)=\"onOptionClick(option, row)\">\n <span class=\"icon\" [class]=\"option.icon\"></span>\n <span class=\"label\">{{ option.label }}</span>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n </td>\n }\n </tr>\n <!-- Subfilas (solo si es expandible y está expandida) -->\n @if (isRowExpandable()(row) && isExpanded(row)) {\n <tr class=\"child-row child-header-row\">\n <td class=\"child-cell-full\"\n [attr.colspan]=\"totalColspan()\">\n <div class=\"child-grid\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\">\n <span class=\"child-label\">{{ subCol.label }}</span>\n </div>\n }\n </div>\n </td>\n </tr>\n\n @for (child of getChildRows(row); track child['id']) {\n <tr class=\"child-row\">\n <td class=\"child-cell-full\" [attr.colspan]=\"totalColspan()\">\n <div class=\"child-grid\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\">\n\n @if (subCol.type === 'status') {\n @let style = getStatusStyle(child[subCol.key]);\n <span class=\"status-chip child-status-chip\" [style.background-color]=\"style.bg\"\n [style.color]=\"style.color\">\n {{ getStatusLabel(child[subCol.key]) }}\n </span>\n } @else {\n <span class=\"child-value\">\n {{ formatValue(subCol, child[subCol.key]) }}\n </span>\n }\n\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n }\n @if (showTotals()) {\n <tr class=\"total-row\">\n \n <!-- checkbox -->\n @if (showSelection()) {\n <td class=\"checkbox-cell\"></td>\n }\n \n @for (col of columns(); track col.key) {\n <td [class]=\"getAlignment(col)\">\n \n @if (col.type === 'money' && col.totalizable) {\n {{ formatValue(col, getMoneyTotal(col)) }}\n } @else if (col === columns()[0]) {\n <strong>Total</strong>\n }\n \n </td>\n }\n\n <!-- celdas vacías para sub-columnas de grupo -->\n @for (group of columnGroups(); track group.groupLabel) {\n @for (subCol of group.columns; track subCol.key) {\n <td></td>\n }\n }\n \n @if (showActions()) {\n <td></td>\n }\n \n </tr>\n }\n\n <!-- Fila de leyenda (solo si hay columnGroups) -->\n @for (group of columnGroups(); track group.groupLabel) {\n <tr class=\"legend-row\">\n <td class=\"legend-cell\" [attr.colspan]=\"totalColspan()\">\n <span class=\"legend-title\">{{ group.groupLabel | uppercase }}:</span>\n @for (col of group.columns; track col.key; let last = $last) {\n <span class=\"legend-item\">{{ col.label }}:\n {{ col.description }}{{ last ? '' : ' · ' }}</span>\n }\n </td>\n </tr>\n }\n \n </tbody>\n </table>\n</div>","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTimeMode, Hour12 } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-date-time-picker',\r\n imports: [],\r\n templateUrl: './date-time-picker.html',\r\n styleUrl: './date-time-picker.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateTimePicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateTimePicker implements ControlValueAccessor, OnDestroy {\r\n mode = input<DateTimeMode>('date');\r\n placeholder = input<string>('Seleccionar fecha');\r\n minDate = input<Date | null>(null);\r\n maxDate = input<Date | null>(null);\r\n\r\n dateChange = output<Date | null>();\r\n\r\n isOpen = signal<boolean>(false);\r\n openUpward = signal<boolean>(false);\r\n selectedDate = signal<Date | null>(null);\r\n isDisabled = signal<boolean>(false);\r\n isTouched = signal<boolean>(false);\r\n readonly = input<boolean>(false);\r\n\r\n isBlocked = computed(() => this.isDisabled() || this.readonly());\r\n\r\n // Texto que escribe el usuario (DD/MM/YYYY)\r\n inputTextValue = signal<string>('');\r\n\r\n // Navegación del calendario\r\n currentMonth = signal(new Date().getMonth());\r\n currentYear = signal(new Date().getFullYear());\r\n\r\n // Hora en formato 24h (para el backend)\r\n selectedHour = signal(0);\r\n selectedMinute = signal(0);\r\n \r\n // Estado AM/PM\r\n selectedAmPm = signal<'AM' | 'PM'>('AM');\r\n\r\n private documentClickListener?: (event: Event) => void;\r\n\r\n /**\r\n * Valor que se muestra en el campo de texto.\r\n * Siempre muestra la fecha en formato DD/MM/YYYY.\r\n */\r\n displayValue = computed(() => {\r\n const text = this.inputTextValue().trim();\r\n if (text) {\r\n return text;\r\n }\r\n\r\n const date = this.selectedDate();\r\n if (!date) return '';\r\n\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n });\r\n\r\n monthName = computed(() => {\r\n const months = [\r\n 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\r\n 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'\r\n ];\r\n return months[this.currentMonth()];\r\n });\r\n\r\n calendarDays = computed(() => {\r\n const year = this.currentYear();\r\n const month = this.currentMonth();\r\n const firstDay = new Date(year, month, 1);\r\n const lastDay = new Date(year, month + 1, 0);\r\n const daysInMonth = lastDay.getDate();\r\n const startingDayOfWeek = firstDay.getDay();\r\n\r\n const days: (number | null)[] = [];\r\n\r\n // Días vacíos al inicio\r\n for (let i = 0; i < startingDayOfWeek; i++) {\r\n days.push(null);\r\n }\r\n\r\n // Días del mes\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n days.push(day);\r\n }\r\n\r\n return days;\r\n });\r\n\r\n // Horas en formato 12h\r\n hours12 = computed((): Hour12[] => {\r\n return Array.from({ length: 12 }, (_, i) => {\r\n const hour12 = i === 0 ? 12 : i;\r\n return {\r\n value: hour12,\r\n display: hour12.toString().padStart(2, '0')\r\n };\r\n });\r\n });\r\n\r\n // Hora seleccionada en formato 12h\r\n selectedHour12 = computed(() => {\r\n const hour24 = this.selectedHour();\r\n if (hour24 === 0) return 12;\r\n if (hour24 > 12) return hour24 - 12;\r\n return hour24;\r\n });\r\n\r\n minutes = computed(() => Array.from({ length: 60 }, (_, i) => i));\r\n\r\n private onChange = (value: any) => {};\r\n private onTouched = () => {};\r\n\r\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {}\r\n\r\n ngOnDestroy() {\r\n this.removeDocumentListener();\r\n }\r\n\r\n writeValue(value: any): void {\r\n let date: Date | null = null;\r\n\r\n if (value instanceof Date) {\r\n date = value;\r\n } else if (typeof value === 'string' && value) {\r\n // Manejar tanto fechas ISO como otros formatos de string\r\n const parsedDate = new Date(value);\r\n if (!isNaN(parsedDate.getTime())) {\r\n date = parsedDate;\r\n }\r\n }\r\n\r\n if (date) {\r\n this.updateInternalState(date);\r\n } else {\r\n this.resetInternalState();\r\n }\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.set(isDisabled);\r\n }\r\n\r\n toggle() {\r\n if (this.isBlocked()) return;\r\n\r\n this.markAsTouched();\r\n\r\n if (this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n open() {\r\n if (this.isBlocked()) return;\r\n\r\n this.markAsTouched();\r\n\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n this.openUpward.set(spaceBelow < 420);\r\n\r\n this.isOpen.set(true);\r\n this.addDocumentListener();\r\n\r\n // Si hay fecha seleccionada, navegar a ese mes/año\r\n const selected = this.selectedDate();\r\n if (selected) {\r\n this.currentMonth.set(selected.getMonth());\r\n this.currentYear.set(selected.getFullYear());\r\n }\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.removeDocumentListener();\r\n this.markAsTouched();\r\n }\r\n\r\n selectDay(day: number | null) {\r\n if (!day || this.isBlocked()) return;\r\n\r\n const newDate = new Date(\r\n this.currentYear(),\r\n this.currentMonth(),\r\n day,\r\n this.selectedHour(),\r\n this.selectedMinute()\r\n );\r\n\r\n if (this.isDateDisabled(newDate)) return;\r\n\r\n this.updateInternalState(newDate);\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n\r\n // Solo cerrar automáticamente si es modo 'date'\r\n if (this.mode() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n setHour12(hour12: number) {\r\n if (this.isBlocked()) return;\r\n\r\n // Convertir de 12h a 24h\r\n let hour24: number;\r\n const amPm = this.selectedAmPm();\r\n \r\n if (hour12 === 12) {\r\n hour24 = amPm === 'AM' ? 0 : 12;\r\n } else {\r\n hour24 = amPm === 'AM' ? hour12 : hour12 + 12;\r\n }\r\n\r\n this.selectedHour.set(hour24);\r\n this.updateDateTime();\r\n }\r\n\r\n setMinute(minute: number) {\r\n if (this.isBlocked()) return;\r\n\r\n this.selectedMinute.set(minute);\r\n this.updateDateTime();\r\n }\r\n\r\n setAmPm(amPm: 'AM' | 'PM') {\r\n if (this.isBlocked()) return;\r\n\r\n const currentHour24 = this.selectedHour();\r\n const currentHour12 = this.selectedHour12();\r\n let newHour24: number;\r\n\r\n if (amPm === 'AM') {\r\n newHour24 = currentHour12 === 12 ? 0 : currentHour12;\r\n } else {\r\n newHour24 = currentHour12 === 12 ? 12 : currentHour12 + 12;\r\n }\r\n\r\n this.selectedAmPm.set(amPm);\r\n this.selectedHour.set(newHour24);\r\n this.updateDateTime();\r\n }\r\n\r\n previousMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n\r\n if (currentMonth === 0) {\r\n this.currentMonth.set(11);\r\n this.currentYear.set(currentYear - 1);\r\n } else {\r\n this.currentMonth.set(currentMonth - 1);\r\n }\r\n }\r\n\r\n nextMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n\r\n if (currentMonth === 11) {\r\n this.currentMonth.set(0);\r\n this.currentYear.set(currentYear + 1);\r\n } else {\r\n this.currentMonth.set(currentMonth + 1);\r\n }\r\n }\r\n\r\n previousYear() {\r\n this.currentYear.set(this.currentYear() - 1);\r\n }\r\n\r\n nextYear() {\r\n this.currentYear.set(this.currentYear() + 1);\r\n }\r\n\r\n today() {\r\n const today = new Date();\r\n this.updateInternalState(today);\r\n this.onChange(today.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(today);\r\n\r\n if (this.mode() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n clear() {\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.markAsTouched();\r\n this.dateChange.emit(null);\r\n this.close();\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (this.isBlocked()) return;\r\n\r\n if (event.key === 'Escape') {\r\n this.close();\r\n } else if (event.key === 'Tab') {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n }\r\n\r\n isDaySelected(day: number | null): boolean {\r\n if (!day) return false;\r\n const selected = this.selectedDate();\r\n if (!selected) return false;\r\n\r\n return (\r\n selected.getDate() === day &&\r\n selected.getMonth() === this.currentMonth() &&\r\n selected.getFullYear() === this.currentYear()\r\n );\r\n }\r\n\r\n isToday(day: number | null): boolean {\r\n if (!day) return false;\r\n const today = new Date();\r\n return (\r\n today.getDate() === day &&\r\n today.getMonth() === this.currentMonth() &&\r\n today.getFullYear() === this.currentYear()\r\n );\r\n }\r\n\r\n isDayDisabled(day: number | null): boolean {\r\n if (!day) return true;\r\n \r\n const date = new Date(this.currentYear(), this.currentMonth(), day);\r\n return this.isDateDisabled(date);\r\n }\r\n\r\n isDateDisabled(date: Date): boolean {\r\n const minDate = this.minDate();\r\n const maxDate = this.maxDate();\r\n\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n\r\n return false;\r\n }\r\n\r\n private updateDateTime() {\r\n const selected = this.selectedDate();\r\n if (!selected) return;\r\n\r\n const newDate = new Date(selected);\r\n newDate.setHours(this.selectedHour());\r\n newDate.setMinutes(this.selectedMinute());\r\n\r\n this.updateInternalState(newDate);\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n }\r\n\r\n // Manejo de input de texto (DD/MM/YYYY)\r\n onInputChange(event: Event) {\r\n if (this.isBlocked()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value;\r\n\r\n // Eliminar todo lo que no sea número\r\n const numbersOnly = value.replace(/\\D/g, '');\r\n\r\n // Limitar a 8 dígitos (DDMMYYYY)\r\n const limitedNumbers = numbersOnly.slice(0, 8);\r\n\r\n // Formatear con barras: DD/MM/YYYY\r\n let formatted = '';\r\n if (limitedNumbers.length > 0) {\r\n formatted = limitedNumbers.slice(0, 2);\r\n if (limitedNumbers.length > 2) {\r\n formatted += '/' + limitedNumbers.slice(2, 4);\r\n }\r\n if (limitedNumbers.length > 4) {\r\n formatted += '/' + limitedNumbers.slice(4, 8);\r\n }\r\n }\r\n\r\n this.inputTextValue.set(formatted);\r\n input.value = formatted;\r\n\r\n this.markAsTouched();\r\n\r\n // Solo intentamos parsear cuando tenemos DD/MM/YYYY completo (10 caracteres)\r\n if (formatted.length === 10) {\r\n const parsedDate = this.parseDateInput(formatted);\r\n\r\n if (parsedDate) {\r\n if (this.isDateDisabled(parsedDate)) {\r\n // Está fuera de rango, dejamos el texto pero no cambiamos el valor\r\n return;\r\n }\r\n\r\n this.updateInternalState(parsedDate);\r\n this.onChange(parsedDate.toISOString());\r\n this.dateChange.emit(parsedDate);\r\n }\r\n } else if (formatted.trim() === '') {\r\n // Si el campo queda vacío, limpiamos el valor\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.dateChange.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Selects the date segment (DD, MM, or YYYY) under the cursor on click,\r\n * mimicking native date-input block-editing behavior.\r\n * Format: DD/MM/YYYY → segments at positions 0-1, 3-4, 6-9\r\n */\r\n onInputClick(event: Event) {\r\n event.stopPropagation();\r\n if (this.isBlocked()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const pos = input.selectionStart ?? 0;\r\n const value = input.value;\r\n\r\n // Only do segment selection when the value looks like a date (has slashes)\r\n if (!value || !value.includes('/')) return;\r\n\r\n // Determine which segment the cursor is in\r\n // DD = 0..1, slash at 2, MM = 3..4, slash at 5, YYYY = 6..9\r\n let start: number;\r\n let end: number;\r\n\r\n if (pos <= 2) {\r\n // Day segment\r\n start = 0;\r\n end = 2;\r\n } else if (pos <= 5) {\r\n // Month segment\r\n start = 3;\r\n end = 5;\r\n } else {\r\n // Year segment\r\n start = 6;\r\n end = 10;\r\n }\r\n\r\n // Use setTimeout to override the browser's default selection behavior\r\n setTimeout(() => {\r\n input.setSelectionRange(start, end);\r\n }, 0);\r\n }\r\n\r\n onInputFocus() {\r\n if (this.isBlocked()) return;\r\n this.open();\r\n }\r\n\r\n private parseDateInput(input: string): Date | null {\r\n if (!input || input.trim() === '') return null;\r\n\r\n const match = input.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (match) {\r\n const day = parseInt(match[1], 10);\r\n const month = parseInt(match[2], 10) - 1;\r\n const year = parseInt(match[3], 10);\r\n\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n const date = new Date(year, month, day);\r\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\r\n return date;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private formatDateForInput(date: Date): string {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n\r\n private updateInternalState(date: Date) {\r\n this.selectedDate.set(date);\r\n this.currentMonth.set(date.getMonth());\r\n this.currentYear.set(date.getFullYear());\r\n this.selectedHour.set(date.getHours());\r\n this.selectedMinute.set(date.getMinutes());\r\n this.selectedAmPm.set(date.getHours() >= 12 ? 'PM' : 'AM');\r\n\r\n const formatted = this.formatDateForInput(date);\r\n this.inputTextValue.set(formatted);\r\n }\r\n\r\n private resetInternalState() {\r\n this.selectedDate.set(null);\r\n this.inputTextValue.set('');\r\n this.selectedHour.set(0);\r\n this.selectedMinute.set(0);\r\n this.selectedAmPm.set('AM');\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private addDocumentListener() {\r\n if (this.documentClickListener) {\r\n this.removeDocumentListener();\r\n }\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.documentClickListener = (event: Event) => {\r\n const target = event.target as Node;\r\n if (!this.elementRef.nativeElement.contains(target)) {\r\n this.ngZone.run(() => {\r\n if (this.isOpen()) {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n });\r\n }\r\n };\r\n\r\n setTimeout(() => {\r\n document.addEventListener('click', this.documentClickListener!, true);\r\n }, 10);\r\n });\r\n }\r\n\r\n private removeDocumentListener() {\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n this.documentClickListener = undefined;\r\n }\r\n }\r\n\r\n public markTouched() {\r\n this.markAsTouched();\r\n }\r\n\r\n /**\r\n * Obtiene la fecha seleccionada en formato ISO string\r\n * @returns string ISO o null si no hay fecha seleccionada\r\n */\r\n public getISOString(): string | null {\r\n const date = this.selectedDate();\r\n return date ? date.toISOString() : null;\r\n }\r\n\r\n /**\r\n * Establece la fecha desde un string ISO\r\n * @param isoString - Fecha en formato ISO\r\n */\r\n public setFromISOString(isoString: string | null): void {\r\n if (isoString) {\r\n const date = new Date(isoString);\r\n if (!isNaN(date.getTime())) {\r\n this.writeValue(date);\r\n this.onChange(isoString);\r\n }\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}","<div class=\"datetime-container\">\r\n <div\r\n class=\"datetime-header\"\r\n [class.active]=\"isOpen()\"\r\n [class.disabled]=\"isBlocked()\"\r\n [class.readonly]=\"isBlocked()\"\r\n (click)=\"!isBlocked() && toggle()\"\r\n (keydown)=\"!isBlocked() && onKeyDown($event)\"\r\n tabindex=\"0\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"datetime-input\"\r\n [value]=\"displayValue()\"\r\n [placeholder]=\"placeholder()\"\r\n (input)=\"onInputChange($event)\"\r\n (click)=\"onInputClick($event)\"\r\n (focus)=\"!isBlocked() && onInputFocus()\"\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"readonly()\"\r\n />\r\n\r\n <div class=\"header-icons\">\r\n @if (selectedDate()) {\r\n <span\r\n class=\"clear-icon\"\r\n (click)=\"!isBlocked() && clear(); $event.stopPropagation()\"\r\n title=\"Limpiar\"\r\n >\r\n ×\r\n </span>\r\n }\r\n <span class=\"arrow\" [class.open]=\"isOpen()\"></span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (isOpen()) {\r\n<div class=\"dropdown\" [class.dropdown--upward]=\"openUpward()\">\r\n <div class=\"datetime-content\">\r\n <!-- Sección del calendario -->\r\n <div class=\"calendar-section\">\r\n <!-- Navegación del calendario -->\r\n <div class=\"calendar-nav\">\r\n <div class=\"nav-section\">\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"previousYear()\"\r\n title=\"Año anterior\"\r\n >\r\n ‹‹\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"previousMonth()\"\r\n title=\"Mes anterior\"\r\n >\r\n ‹\r\n </button>\r\n </div>\r\n\r\n <div class=\"current-date\">{{ monthName() }} {{ currentYear() }}</div>\r\n\r\n <div class=\"nav-section\">\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"nextMonth()\"\r\n title=\"Siguiente mes\"\r\n >\r\n ›\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"nextYear()\"\r\n title=\"Siguiente año\"\r\n >\r\n ››\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Días de la semana -->\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\">Dom</div>\r\n <div class=\"weekday\">Lun</div>\r\n <div class=\"weekday\">Mar</div>\r\n <div class=\"weekday\">Mié</div>\r\n <div class=\"weekday\">Jue</div>\r\n <div class=\"weekday\">Vie</div>\r\n <div class=\"weekday\">Sáb</div>\r\n </div>\r\n\r\n <!-- Días del mes -->\r\n <div class=\"calendar-grid\">\r\n @for (day of calendarDays(); track $index) {\r\n <div\r\n class=\"calendar-day\"\r\n [class.selected]=\"isDaySelected(day)\"\r\n [class.today]=\"isToday(day)\"\r\n [class.disabled]=\"isDayDisabled(day)\"\r\n [class.empty]=\"!day\"\r\n (click)=\"selectDay(day)\"\r\n >\r\n {{ day || '' }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Selector de tiempo (solo si mode === 'datetime') -->\r\n @if (mode() === 'datetime') {\r\n <div class=\"time-section\">\r\n <div class=\"time-header\">Horario</div>\r\n\r\n <div class=\"time-selectors\">\r\n <div class=\"time-group\">\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Hora</div>\r\n <div class=\"time-scroll\">\r\n @for (hour of hours12(); track hour.value) {\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"hour.value === selectedHour12()\"\r\n (click)=\"setHour12(hour.value)\"\r\n >\r\n {{ hour.display }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator-vertical\">:</div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Min</div>\r\n <div class=\"time-scroll\">\r\n @for (minute of minutes(); track minute) {\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"minute === selectedMinute()\"\r\n (click)=\"setMinute(minute)\"\r\n >\r\n {{ minute.toString().padStart(2, '0') }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">AM/PM</div>\r\n <div class=\"time-scroll ampm\">\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"selectedAmPm() === 'AM'\"\r\n (click)=\"setAmPm('AM')\"\r\n >\r\n AM\r\n </div>\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"selectedAmPm() === 'PM'\"\r\n (click)=\"setAmPm('PM')\"\r\n >\r\n PM\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Botones de acción -->\r\n <div class=\"action-buttons\">\r\n <button type=\"button\" class=\"action-btn secondary\" (click)=\"today()\">\r\n Hoy\r\n </button>\r\n @if (mode() === 'datetime') {\r\n <button type=\"button\" class=\"action-btn primary\" (click)=\"close()\">\r\n Aceptar\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n effect,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { DateFilterSelection, DateTimeMode, FilterItem, Hour12 } from '../../interfaces/filters';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-date-time-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './date-time-filter.html',\r\n styleUrl: './date-time-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateTimeFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateTimeFilter implements ControlValueAccessor, OnDestroy {\r\n @ViewChild('chip') chipRef!: ElementRef<HTMLElement>;\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n\r\n // Outputs\r\n dateSelected = output<DateFilterSelection>();\r\n dateChange = output<Date | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n activeFilterType = signal<string | null>(null);\r\n isOpen = signal(false);\r\n selectedDate = signal<Date | null>(null);\r\n inputTextValue = signal<string>('');\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n dropdownDirection = signal<'left' | 'right'>('right');\r\n\r\n // Máscara visual dinámica para la guía de fecha __/__/____\r\n // Devuelve un arreglo de caracteres con flag \"filled\" para poder dar color distinto\r\n inputMask = computed(() => {\r\n const raw = this.inputTextValue() || '';\r\n const numbersOnly = raw.replace(/\\D/g, '');\r\n\r\n const template: { char: string; filled: boolean }[] = [\r\n { char: 'd', filled: false },\r\n { char: 'd', filled: false },\r\n { char: '/', filled: false },\r\n { char: 'm', filled: false },\r\n { char: 'm', filled: false },\r\n { char: '/', filled: false },\r\n { char: 'y', filled: false },\r\n { char: 'y', filled: false },\r\n { char: 'y', filled: false },\r\n { char: 'y', filled: false },\r\n ];\r\n\r\n let index = 0;\r\n\r\n for (let i = 0; i < template.length && index < numbersOnly.length; i++) {\r\n if (template[i].char === '/') continue;\r\n template[i] = { char: numbersOnly[index++], filled: true };\r\n }\r\n\r\n // Cuando se completa el segmento, el slash correspondiente pasa a \"filled\"\r\n if (numbersOnly.length >= 2) {\r\n template[2] = { char: '/', filled: true }; // después de DD\r\n }\r\n if (numbersOnly.length >= 4) {\r\n template[5] = { char: '/', filled: true }; // después de MM\r\n }\r\n\r\n return template; // para usar en el template y colorear por carácter\r\n });\r\n\r\n clearTrigger = input<number>(0);\r\n\r\n // Computed Properties based on active filter\r\n activeFilter = computed(() => {\r\n const type = this.activeFilterType();\r\n return this.filters().find(f => f.value === type) || null;\r\n });\r\n\r\n mode = computed<DateTimeMode>(() => {\r\n const filter = this.activeFilter();\r\n return filter?.type === 'datetime' ? 'datetime' : 'date';\r\n });\r\n\r\n placeholder = computed(() => this.activeFilter()?.placeholder || 'Seleccionar fecha');\r\n minDate = computed(() => this.activeFilter()?.minDate || null);\r\n maxDate = computed(() => this.activeFilter()?.maxDate || null);\r\n filterValue = computed(() => this.activeFilter()?.value || '');\r\n\r\n // Calendar Navigation\r\n currentMonth = signal(new Date().getMonth());\r\n currentYear = signal(new Date().getFullYear());\r\n\r\n // Time State\r\n selectedHour = signal(0);\r\n selectedMinute = signal(0);\r\n selectedAmPm = signal<'AM' | 'PM'>('AM');\r\n\r\n private documentClickListener?: (event: Event) => void;\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.clear();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeDocumentListener();\r\n }\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n\r\n if (this.isOpen()) {\r\n this.close();\r\n }\r\n\r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | Date | null): void {\r\n let date: Date | null = null;\r\n\r\n if (value instanceof Date) {\r\n date = value;\r\n } else if (typeof value === 'string' && value) {\r\n const parsedDate = new Date(value);\r\n if (!isNaN(parsedDate.getTime())) {\r\n date = parsedDate;\r\n }\r\n }\r\n\r\n if (date) {\r\n this.updateInternalState(date);\r\n } else {\r\n this.resetInternalState();\r\n }\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.set(isDisabled);\r\n }\r\n\r\n toggle(filterValue: string) {\r\n this.activeFilterType.set(filterValue);\r\n\r\n if (this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n private calculateDropdownDirectionFromChip(): void {\r\n const chip = this.chipRef?.nativeElement;\r\n if (!chip) return;\r\n\r\n const rect = chip.getBoundingClientRect();\r\n const spaceRight = window.innerWidth - rect.right;\r\n\r\n if (spaceRight < 400) {\r\n this.dropdownDirection.set('left');\r\n } else {\r\n this.dropdownDirection.set('right');\r\n }\r\n }\r\n\r\n open() {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n this.isOpen.set(true);\r\n\r\n this.calculateDropdownDirectionFromChip();\r\n\r\n this.addDocumentListener();\r\n\r\n const selected = this.selectedDate();\r\n if (selected) {\r\n this.currentMonth.set(selected.getMonth());\r\n this.currentYear.set(selected.getFullYear());\r\n }\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.removeDocumentListener();\r\n this.markAsTouched();\r\n }\r\n\r\n // Calendar Logic\r\n selectDay(day: number | null) {\r\n if (!day || this.isDisabled()) return;\r\n\r\n const newDate = new Date(\r\n this.currentYear(),\r\n this.currentMonth(),\r\n day,\r\n this.selectedHour(),\r\n this.selectedMinute()\r\n );\r\n\r\n if (this.isDateDisabled(newDate)) return;\r\n\r\n this.updateInternalState(newDate);\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n\r\n this.dateSelected.emit({\r\n filter: this.filterValue(),\r\n value: newDate,\r\n });\r\n\r\n if (this.mode() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n displayValue = computed(() => {\r\n const date = this.selectedDate();\r\n if (!date) return '';\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n };\r\n\r\n if (this.mode() === 'datetime') {\r\n options.hour = '2-digit';\r\n options.minute = '2-digit';\r\n options.hour12 = true;\r\n }\r\n\r\n return date.toLocaleDateString('es-ES', options);\r\n });\r\n\r\n // Input text handling\r\n onInputChange(event: Event, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value;\r\n\r\n // Remove all non-numeric characters\r\n const numbersOnly = value.replace(/\\D/g, '');\r\n\r\n // Limit to 8 digits (DD/MM/YYYY)\r\n const limitedNumbers = numbersOnly.slice(0, 8);\r\n\r\n // Format with slashes: DD/MM/YYYY\r\n let formatted = '';\r\n if (limitedNumbers.length > 0) {\r\n formatted = limitedNumbers.slice(0, 2);\r\n if (limitedNumbers.length > 2) {\r\n formatted += '/' + limitedNumbers.slice(2, 4);\r\n }\r\n if (limitedNumbers.length > 4) {\r\n formatted += '/' + limitedNumbers.slice(4, 8);\r\n }\r\n }\r\n\r\n // Update the input value\r\n this.inputTextValue.set(formatted);\r\n input.value = formatted;\r\n\r\n this.markAsTouched();\r\n\r\n // Only parse when we have a complete date (DD/MM/YYYY = 10 characters)\r\n if (formatted.length === 10) {\r\n const parsedDate = this.parseDateInput(formatted);\r\n\r\n if (parsedDate) {\r\n if (this.isDateDisabled(parsedDate)) {\r\n return;\r\n }\r\n\r\n this.updateInternalState(parsedDate);\r\n this.onChange(parsedDate.toISOString());\r\n this.dateChange.emit(parsedDate);\r\n this.dateSelected.emit({\r\n filter: filterValue,\r\n value: parsedDate,\r\n });\r\n }\r\n } else if (formatted.trim() === '') {\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.dateChange.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Selects the date segment (DD, MM, or YYYY) under the cursor on click,\r\n * mimicking native date-input block-editing behavior.\r\n * Format: DD/MM/YYYY → segments at positions 0-1, 3-4, 6-9\r\n */\r\n onInputClick(event: Event, filterValue: string) {\r\n event.stopPropagation();\r\n if (this.isDisabled()) return;\r\n\r\n this.activeFilterType.set(filterValue);\r\n\r\n const input = event.target as HTMLInputElement;\r\n const pos = input.selectionStart ?? 0;\r\n const value = input.value;\r\n\r\n // Only do segment selection when the value looks like a date (has slashes)\r\n if (!value || !value.includes('/')) return;\r\n\r\n // Determine which segment the cursor is in\r\n // DD = 0..1, slash at 2, MM = 3..4, slash at 5, YYYY = 6..9\r\n let start: number;\r\n let end: number;\r\n\r\n if (pos <= 2) {\r\n start = 0;\r\n end = 2;\r\n } else if (pos <= 5) {\r\n start = 3;\r\n end = 5;\r\n } else {\r\n start = 6;\r\n end = 10;\r\n }\r\n\r\n // Use setTimeout to override the browser's default selection behavior\r\n setTimeout(() => {\r\n input.setSelectionRange(start, end);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Handles keyboard navigation for segment-based date editing.\r\n * - Tab / ArrowRight: move to next segment\r\n * - Shift+Tab / ArrowLeft: move to previous segment\r\n * - ArrowUp / ArrowDown: increment/decrement current segment\r\n * - Enter: close dropdown and emit\r\n */\r\n onInputKeyDown(event: KeyboardEvent, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const value = input.value;\r\n\r\n // Handle Enter key\r\n if (event.key === 'Enter') {\r\n if (this.isOpen()) {\r\n this.close();\r\n }\r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n return;\r\n }\r\n\r\n // Only handle segment navigation when value has slashes (date format)\r\n if (!value || !value.includes('/')) return;\r\n\r\n const pos = input.selectionStart ?? 0;\r\n\r\n // Determine current segment: 0 = day, 1 = month, 2 = year\r\n let currentSegment: number;\r\n if (pos <= 2) {\r\n currentSegment = 0;\r\n } else if (pos <= 5) {\r\n currentSegment = 1;\r\n } else {\r\n currentSegment = 2;\r\n }\r\n\r\n // Segment ranges\r\n const segments = [\r\n { start: 0, end: 2 }, // DD\r\n { start: 3, end: 5 }, // MM\r\n { start: 6, end: 10 }, // YYYY\r\n ];\r\n\r\n if (event.key === 'Tab') {\r\n if (event.shiftKey) {\r\n // Move to previous segment\r\n if (currentSegment > 0) {\r\n event.preventDefault();\r\n const prev = segments[currentSegment - 1];\r\n setTimeout(() => input.setSelectionRange(prev.start, prev.end), 0);\r\n }\r\n // If at first segment, let Tab work normally (move focus out)\r\n } else {\r\n // Move to next segment\r\n if (currentSegment < 2) {\r\n event.preventDefault();\r\n const next = segments[currentSegment + 1];\r\n setTimeout(() => input.setSelectionRange(next.start, next.end), 0);\r\n }\r\n // If at last segment, let Tab work normally (move focus out)\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n if (currentSegment < 2) {\r\n event.preventDefault();\r\n const next = segments[currentSegment + 1];\r\n setTimeout(() => input.setSelectionRange(next.start, next.end), 0);\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n if (currentSegment > 0) {\r\n event.preventDefault();\r\n const prev = segments[currentSegment - 1];\r\n setTimeout(() => input.setSelectionRange(prev.start, prev.end), 0);\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n\r\n // Parse current value\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (!match) return;\r\n\r\n let day = parseInt(match[1], 10);\r\n let month = parseInt(match[2], 10);\r\n let year = parseInt(match[3], 10);\r\n const delta = event.key === 'ArrowUp' ? 1 : -1;\r\n\r\n if (currentSegment === 0) {\r\n // Increment/decrement day\r\n day += delta;\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day < 1) day = maxDay;\r\n if (day > maxDay) day = 1;\r\n } else if (currentSegment === 1) {\r\n // Increment/decrement month\r\n month += delta;\r\n if (month < 1) month = 12;\r\n if (month > 12) month = 1;\r\n // Clamp day to valid range for new month\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n } else {\r\n // Increment/decrement year\r\n year += delta;\r\n if (year < 1900) year = 1900;\r\n if (year > 2100) year = 2100;\r\n // Clamp day (for leap year changes on Feb 29)\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n }\r\n\r\n const newFormatted = `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}`;\r\n this.inputTextValue.set(newFormatted);\r\n input.value = newFormatted;\r\n\r\n // Parse and update if valid\r\n const parsedDate = this.parseDateInput(newFormatted);\r\n if (parsedDate && !this.isDateDisabled(parsedDate)) {\r\n this.updateInternalState(parsedDate);\r\n this.onChange(parsedDate.toISOString());\r\n this.dateChange.emit(parsedDate);\r\n this.dateSelected.emit({ filter: filterValue, value: parsedDate });\r\n }\r\n\r\n // Re-select the same segment\r\n const seg = segments[currentSegment];\r\n setTimeout(() => input.setSelectionRange(seg.start, seg.end), 0);\r\n return;\r\n }\r\n\r\n // Handle Escape\r\n if (event.key === 'Escape') {\r\n this.close();\r\n return;\r\n }\r\n }\r\n\r\n onInputFocus(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n this.activeFilterType.set(filterValue);\r\n this.open();\r\n }\r\n\r\n private parseDateInput(input: string): Date | null {\r\n if (!input || input.trim() === '') return null;\r\n\r\n // Only accept DD/MM/YYYY format\r\n const match = input.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (match) {\r\n const day = parseInt(match[1], 10);\r\n const month = parseInt(match[2], 10) - 1;\r\n const year = parseInt(match[3], 10);\r\n\r\n // Validate date\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n const date = new Date(year, month, day);\r\n // Check if date is valid (handles invalid dates like 31/02/2024)\r\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\r\n return date;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n monthName = computed(() => {\r\n const months = [\r\n 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\r\n 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'\r\n ];\r\n return months[this.currentMonth()];\r\n });\r\n\r\n calendarDays = computed(() => {\r\n const year = this.currentYear();\r\n const month = this.currentMonth();\r\n const firstDay = new Date(year, month, 1);\r\n const lastDay = new Date(year, month + 1, 0);\r\n const daysInMonth = lastDay.getDate();\r\n const startingDayOfWeek = firstDay.getDay();\r\n\r\n const days: (number | null)[] = [];\r\n for (let i = 0; i < startingDayOfWeek; i++) days.push(null);\r\n for (let day = 1; day <= daysInMonth; day++) days.push(day);\r\n return days;\r\n });\r\n\r\n hours12 = computed((): Hour12[] => {\r\n return Array.from({ length: 12 }, (_, i) => {\r\n const hour12 = i === 0 ? 12 : i;\r\n return {\r\n value: hour12,\r\n display: hour12.toString().padStart(2, '0')\r\n };\r\n });\r\n });\r\n\r\n selectedHour12 = computed(() => {\r\n const hour24 = this.selectedHour();\r\n if (hour24 === 0) return 12;\r\n if (hour24 > 12) return hour24 - 12;\r\n return hour24;\r\n });\r\n\r\n minutes = computed(() => Array.from({ length: 60 }, (_, i) => i));\r\n\r\n // Helper methods\r\n private updateInternalState(date: Date) {\r\n this.selectedDate.set(date);\r\n this.currentMonth.set(date.getMonth());\r\n this.currentYear.set(date.getFullYear());\r\n this.selectedHour.set(date.getHours());\r\n this.selectedMinute.set(date.getMinutes());\r\n this.selectedAmPm.set(date.getHours() >= 12 ? 'PM' : 'AM');\r\n\r\n // Update input text value to match the formatted date\r\n const formatted = this.formatDateForInput(date);\r\n this.inputTextValue.set(formatted);\r\n }\r\n\r\n private resetInternalState() {\r\n this.selectedDate.set(null);\r\n this.inputTextValue.set('');\r\n this.selectedHour.set(0);\r\n this.selectedMinute.set(0);\r\n this.selectedAmPm.set('AM');\r\n }\r\n\r\n private formatDateForInput(date: Date): string {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private addDocumentListener() {\r\n if (this.documentClickListener) this.removeDocumentListener();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.documentClickListener = (event: Event) => {\r\n const target = event.target as Node;\r\n if (!this.elementRef.nativeElement.contains(target)) {\r\n this.ngZone.run(() => {\r\n if (this.isOpen()) {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n });\r\n }\r\n };\r\n setTimeout(() => document.addEventListener('click', this.documentClickListener!, true), 10);\r\n });\r\n }\r\n\r\n private removeDocumentListener() {\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n this.documentClickListener = undefined;\r\n }\r\n }\r\n\r\n // Navigation methods\r\n previousMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n if (currentMonth === 0) {\r\n this.currentMonth.set(11);\r\n this.currentYear.set(currentYear - 1);\r\n } else {\r\n this.currentMonth.set(currentMonth - 1);\r\n }\r\n }\r\n\r\n nextMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n if (currentMonth === 11) {\r\n this.currentMonth.set(0);\r\n this.currentYear.set(currentYear + 1);\r\n } else {\r\n this.currentMonth.set(currentMonth + 1);\r\n }\r\n }\r\n\r\n previousYear() { this.currentYear.set(this.currentYear() - 1); }\r\n nextYear() { this.currentYear.set(this.currentYear() + 1); }\r\n\r\n today() {\r\n const today = new Date();\r\n this.updateInternalState(today);\r\n this.onChange(today.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(today);\r\n this.dateSelected.emit({ filter: this.filterValue(), value: today });\r\n if (this.mode() === 'date') this.close();\r\n }\r\n\r\n clear() {\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.markAsTouched();\r\n this.dateChange.emit(null);\r\n this.close();\r\n }\r\n\r\n // Time setters\r\n setHour12(hour12: number) {\r\n if (this.isDisabled()) return;\r\n const amPm = this.selectedAmPm();\r\n const hour24 = hour12 === 12 ? (amPm === 'AM' ? 0 : 12) : (amPm === 'AM' ? hour12 : hour12 + 12);\r\n this.selectedHour.set(hour24);\r\n this.updateDateTime();\r\n }\r\n\r\n setMinute(minute: number) {\r\n if (this.isDisabled()) return;\r\n this.selectedMinute.set(minute);\r\n this.updateDateTime();\r\n }\r\n\r\n setAmPm(amPm: 'AM' | 'PM') {\r\n if (this.isDisabled()) return;\r\n const currentHour12 = this.selectedHour12();\r\n const newHour24 = amPm === 'AM' ? (currentHour12 === 12 ? 0 : currentHour12) : (currentHour12 === 12 ? 12 : currentHour12 + 12);\r\n this.selectedAmPm.set(amPm);\r\n this.selectedHour.set(newHour24);\r\n this.updateDateTime();\r\n }\r\n\r\n private updateDateTime() {\r\n const selected = this.selectedDate();\r\n if (!selected) return;\r\n const newDate = new Date(selected);\r\n newDate.setHours(this.selectedHour());\r\n newDate.setMinutes(this.selectedMinute());\r\n this.selectedDate.set(newDate);\r\n\r\n // Update input text value\r\n const formatted = this.formatDateForInput(newDate);\r\n this.inputTextValue.set(formatted);\r\n\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n this.dateSelected.emit({\r\n filter: this.filterValue(),\r\n value: newDate,\r\n });\r\n }\r\n\r\n // Validation helpers\r\n isDaySelected(day: number | null): boolean {\r\n if (!day) return false;\r\n const selected = this.selectedDate();\r\n return !!selected && selected.getDate() === day && selected.getMonth() === this.currentMonth() && selected.getFullYear() === this.currentYear();\r\n }\r\n\r\n isToday(day: number | null): boolean {\r\n if (!day) return false;\r\n const today = new Date();\r\n return today.getDate() === day && today.getMonth() === this.currentMonth() && today.getFullYear() === this.currentYear();\r\n }\r\n\r\n isDayDisabled(day: number | null): boolean {\r\n if (!day) return true;\r\n return this.isDateDisabled(new Date(this.currentYear(), this.currentMonth(), day));\r\n }\r\n\r\n isDateDisabled(date: Date): boolean {\r\n const minDate = this.minDate();\r\n const maxDate = this.maxDate();\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n return false;\r\n }\r\n}","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip-input-wrapper\" #chip [class.has-value]=\"selectedDate() || inputTextValue()\"\r\n [class.active]=\"activeFilterType() === item.value\">\r\n <!-- Etiqueta flotante -->\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'dd/mm/aaaa' }}</label>\r\n\r\n <!-- Máscara de guía de fecha dinámica (__/__/____) -->\r\n <div class=\"chip-input-mask\">\r\n @for (part of inputMask(); track $index) {\r\n <span class=\"mask-char\" [class.mask-char-filled]=\"part.filled\" [class.mask-char-placeholder]=\"!part.filled\">\r\n {{ part.char }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <input type=\"text\" [value]=\"inputTextValue()\" (input)=\"onInputChange($event, item.value)\"\r\n (click)=\"onInputClick($event, item.value)\"\r\n (focus)=\"onInputFocus(item.value)\" [placeholder]=\"item.placeholder || 'Seleccionar Fecha'\" class=\"chip-input\"\r\n [disabled]=\"isDisabled()\" (keydown)=\"onInputKeyDown($event, item.value)\" />\r\n\r\n <button type=\"button\" class=\"calendar-icon-button\" (click)=\"toggle(item.value)\" title=\"Abrir calendario\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-calendar-event\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M4 5m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z\" />\r\n <path d=\"M16 3l0 4\" />\r\n <path d=\"M8 3l0 4\" />\r\n <path d=\"M4 11l16 0\" />\r\n <path d=\"M8 15h2v2h-2z\" />\r\n </svg>\r\n </button>\r\n\r\n @if (isOpen() && activeFilterType() === item.value) {\r\n <div class=\"dropdown\" [class.open-left]=\"dropdownDirection() === 'left'\">\r\n <div class=\"datetime-content\">\r\n <!-- Sección del calendario -->\r\n <div class=\"calendar-section\">\r\n <!-- Navegación -->\r\n <div class=\"calendar-nav\">\r\n <div class=\"nav-section\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousYear()\" title=\"Año anterior\">\r\n ‹‹\r\n </button>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousMonth()\" title=\"Mes anterior\">\r\n ‹\r\n </button>\r\n </div>\r\n\r\n <div class=\"current-date\">\r\n {{ monthName() }} {{ currentYear() }}\r\n </div>\r\n\r\n <div class=\"nav-section\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextMonth()\" title=\"Siguiente mes\">\r\n ›\r\n </button>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextYear()\" title=\"Siguiente año\">\r\n ››\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Días de la semana -->\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\">Dom</div>\r\n <div class=\"weekday\">Lun</div>\r\n <div class=\"weekday\">Mar</div>\r\n <div class=\"weekday\">Mié</div>\r\n <div class=\"weekday\">Jue</div>\r\n <div class=\"weekday\">Vie</div>\r\n <div class=\"weekday\">Sáb</div>\r\n </div>\r\n\r\n <!-- Días -->\r\n <div class=\"calendar-grid\">\r\n @for (day of calendarDays(); track $index) {\r\n <div class=\"calendar-day\" [class.selected]=\"isDaySelected(day)\" [class.today]=\"isToday(day)\"\r\n [class.disabled]=\"isDayDisabled(day)\" [class.empty]=\"!day\" (click)=\"selectDay(day)\">\r\n {{ day || \"\" }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- TIME PICKER -->\r\n @if (mode() === 'datetime') {\r\n <div class=\"time-section\">\r\n <div class=\"time-header\">Horario</div>\r\n\r\n <div class=\"time-selectors\">\r\n <div class=\"time-group\">\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Hora</div>\r\n <div class=\"time-scroll\">\r\n @for (hour of hours12(); track hour.value) {\r\n <div class=\"time-option\" [class.selected]=\"hour.value === selectedHour12()\"\r\n (click)=\"setHour12(hour.value)\">\r\n {{ hour.display }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator-vertical\">:</div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Min</div>\r\n <div class=\"time-scroll\">\r\n @for (minute of minutes(); track minute) {\r\n <div class=\"time-option\" [class.selected]=\"minute === selectedMinute()\" (click)=\"setMinute(minute)\">\r\n {{ minute.toString().padStart(2, \"0\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">AM/PM</div>\r\n <div class=\"time-scroll ampm\">\r\n <div class=\"time-option\" [class.selected]=\"selectedAmPm() === 'AM'\" (click)=\"setAmPm('AM')\">\r\n AM\r\n </div>\r\n <div class=\"time-option\" [class.selected]=\"selectedAmPm() === 'PM'\" (click)=\"setAmPm('PM')\">\r\n PM\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- botones -->\r\n <div class=\"action-buttons\">\r\n <button type=\"button\" class=\"action-btn secondary\" (click)=\"today()\">\r\n Hoy\r\n </button>\r\n\r\n @if (mode() === 'datetime') {\r\n <button type=\"button\" class=\"action-btn primary\" (click)=\"close()\">\r\n Aceptar\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n effect,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FilterItem } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-input-number-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule],\r\n templateUrl: './input-number-filter.html',\r\n styleUrl: './input-number-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputNumberFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputNumberFilter implements ControlValueAccessor, OnDestroy {\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n clearTrigger = input<number>(0); // Increment this to trigger a clear\r\n\r\n // Outputs\r\n filterSelected = output<{ filter: string; value: string }>();\r\n valueChange = output<string | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n filterValues = signal<Record<string, string>>({});\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor() {\r\n // Watch for clear trigger changes\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n // No cleanup needed\r\n }\r\n\r\n private resetAllFilters() {\r\n this.filterValues.set({});\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | null): void {\r\n // Not used for multiple inputs\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.set(isDisabled);\r\n }\r\n\r\n // Public Methods\r\n onInputChange(event: Event, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const value = (event.target as HTMLInputElement).value;\r\n\r\n this.updateFilterValue(filterValue, value);\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private updateFilterValue(filterValue: string, value: string) {\r\n this.markAsTouched();\r\n\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [filterValue]: value\r\n }));\r\n\r\n const normalized = value || null;\r\n\r\n this.onChange(normalized);\r\n this.valueChange.emit(normalized);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: value,\r\n });\r\n }\r\n\r\n clearFilter(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n\r\n // Limpiar el valor del filtro específico\r\n this.filterValues.update(current => {\r\n const updated = { ...current };\r\n delete updated[filterValue];\r\n return updated;\r\n });\r\n\r\n // Emitir eventos\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: '',\r\n });\r\n }\r\n\r\n increment(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const currentValue = this.filterValues()[filterValue];\r\n const numeric = currentValue !== undefined && currentValue !== null && currentValue !== ''\r\n ? parseFloat(currentValue)\r\n : 0;\r\n\r\n const next = isNaN(numeric) ? 0 : numeric + 1;\r\n this.updateFilterValue(filterValue, String(next));\r\n }\r\n\r\n decrement(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const currentValue = this.filterValues()[filterValue];\r\n const numeric = currentValue !== undefined && currentValue !== null && currentValue !== ''\r\n ? parseFloat(currentValue)\r\n : 0;\r\n\r\n const next = isNaN(numeric) ? 0 : numeric - 1;\r\n this.updateFilterValue(filterValue, String(next));\r\n }\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n \r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n}\r\n","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip-input-wrapper\" [class.has-value]=\"filterValues()[item.value]\">\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Escribir Número' }}</label>\r\n <input\r\n type=\"number\"\r\n [value]=\"filterValues()[item.value] || ''\"\r\n (input)=\"onInputChange($event, item.value)\"\r\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Escribir Número')\"\r\n class=\"chip-input\"\r\n [disabled]=\"isDisabled()\"\r\n (keydown)=\"onEnter($event)\"\r\n />\r\n <div class=\"right-controls\">\r\n @if (filterValues()[item.value]) {\r\n <button type=\"button\" class=\"clear-button\" (click)=\"clearFilter(item.value)\" title=\"Limpiar\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n }\r\n <div class=\"spinner-buttons\">\r\n <button\r\n type=\"button\"\r\n class=\"spinner-button spinner-button-up\"\r\n (click)=\"increment(item.value)\"\r\n title=\"Aumentar\"\r\n >\r\n ▲\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"spinner-button spinner-button-down\"\r\n (click)=\"decrement(item.value)\"\r\n title=\"Disminuir\"\r\n >\r\n ▼\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n effect,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FilterItem } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-input-select-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule],\r\n templateUrl: './input-select-filter.html',\r\n styleUrl: './input-select-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputSelectFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputSelectFilter implements ControlValueAccessor, OnDestroy {\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n clearTrigger = input<number>(0); // Increment this to trigger a clear\r\n\r\n // Outputs\r\n filterSelected = output<{ filter: string; value: string }>();\r\n valueChange = output<string | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n activeFilterType = signal<string | null>(null);\r\n isOpen = signal(false);\r\n selectedLabel = signal<string>('');\r\n filterValues = signal<Record<string, string>>({});\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n searchTerm = signal('');\r\n\r\n // Computed Properties based on active filter\r\n activeFilter = computed(() => {\r\n const type = this.activeFilterType();\r\n return this.filters().find(f => f.value === type) || null;\r\n });\r\n\r\n placeholder = computed(() => this.activeFilter()?.placeholder || 'Seleccionar...');\r\n filterValueKey = computed(() => this.activeFilter()?.value || '');\r\n options = computed(() => this.activeFilter()?.options || []);\r\n filteredOptions = computed(() => {\r\n const term = this.searchTerm().toLowerCase().trim();\r\n const opts = this.options();\r\n\r\n if (!term) return opts;\r\n\r\n return opts.filter(option =>\r\n option.label.toLowerCase().includes(term) ||\r\n option.value.toString().toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n private documentClickListener?: (event: Event) => void;\r\n private documentClickTimer: ReturnType<typeof setTimeout> | null = null;\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {\r\n // Watch for clear trigger changes\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeDocumentListener();\r\n if (this.documentClickTimer !== null) {\r\n clearTimeout(this.documentClickTimer);\r\n this.documentClickTimer = null;\r\n }\r\n }\r\n\r\n private resetAllFilters() {\r\n this.filterValues.set({});\r\n this.selectedLabel.set('');\r\n this.activeFilterType.set(null);\r\n this.isOpen.set(false);\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | null): void {\r\n // If we had a way to map value back to label without activeFilter, we would do it here.\r\n // For now, we might need to rely on the consumer or just show the value if label not found.\r\n // But since we only know options when activeFilter is set, this is tricky.\r\n // However, usually writeValue is for the form control value.\r\n // Let's just store it.\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.set(isDisabled);\r\n }\r\n\r\n // Public Methods\r\n toggle(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n if (this.activeFilterType() === filterValue && this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.activeFilterType.set(filterValue);\r\n this.open();\r\n }\r\n }\r\n\r\n open() {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n this.isOpen.set(true);\r\n this.addDocumentListener();\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.removeDocumentListener();\r\n this.markAsTouched();\r\n }\r\n\r\n selectOption(option: { label: string; value: string }) {\r\n this.selectedLabel.set(option.label);\r\n\r\n const type = this.activeFilterType();\r\n if (type) {\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [type]: option.label // Show label in chip\r\n }));\r\n }\r\n\r\n this.onChange(option.value);\r\n this.valueChange.emit(option.value);\r\n this.filterSelected.emit({\r\n filter: this.filterValueKey(),\r\n value: option.value,\r\n });\r\n this.close();\r\n // this.enterPressed.emit();\r\n }\r\n\r\n clear() {\r\n this.selectedLabel.set('');\r\n const type = this.activeFilterType();\r\n if (type) {\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [type]: ''\r\n }));\r\n }\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n this.searchTerm.set('');\r\n this.close();\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n onInputChange(event: Event, filterType: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const target = event.target as HTMLInputElement;\r\n const value = target.value;\r\n\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [filterType]: value,\r\n }));\r\n\r\n this.searchTerm.set(value);\r\n this.activeFilterType.set(filterType);\r\n\r\n if (!this.isOpen()) {\r\n this.open();\r\n }\r\n }\r\n\r\n onFocusFilter(filterType: string) {\r\n if (this.isDisabled()) return;\r\n\r\n this.activeFilterType.set(filterType);\r\n const currentValue = this.filterValues()[filterType] || '';\r\n this.searchTerm.set(currentValue);\r\n\r\n if (!this.isOpen()) {\r\n this.open();\r\n }\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n } else if (event.key === 'Enter') {\r\n const filtered = this.filteredOptions();\r\n if (filtered.length > 0) {\r\n this.selectOption(filtered[0]);\r\n }\r\n }\r\n }\r\n\r\n /* onKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n return;\r\n }\r\n } */\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n \r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n\r\n /* onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // 🔹 Caso 1: no está abierto → solo abrir\r\n if (!this.isOpen()) {\r\n this.open();\r\n return;\r\n }\r\n\r\n // 🔹 Caso 2: está abierto → seleccionar primera opción\r\n const options = this.filteredOptions();\r\n if (options.length > 0) {\r\n this.selectOption(options[0]);\r\n }\r\n } */\r\n\r\n private addDocumentListener() {\r\n if (this.documentClickListener) this.removeDocumentListener();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.documentClickListener = (event: Event) => {\r\n const target = event.target as Node;\r\n if (!this.elementRef.nativeElement.contains(target)) {\r\n this.ngZone.run(() => {\r\n if (this.isOpen()) {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n });\r\n }\r\n };\r\n // Guardamos el handle para poder cancelar si el componente se destruye\r\n // antes de que el timeout dispare\r\n this.documentClickTimer = setTimeout(() => {\r\n this.documentClickTimer = null;\r\n document.addEventListener('click', this.documentClickListener!, true);\r\n }, 10);\r\n });\r\n }\r\n\r\n private removeDocumentListener() {\r\n if (this.documentClickTimer !== null) {\r\n clearTimeout(this.documentClickTimer);\r\n this.documentClickTimer = null;\r\n }\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n this.documentClickListener = undefined;\r\n }\r\n }\r\n}\r\n","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip\" [class.active]=\"activeFilterType() === item.value\" [class.has-value]=\"filterValues()[item.value]\">\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Seleccionar' }}</label>\r\n <div class=\"content-chip\">\r\n <input type=\"text\" class=\"chip-input\" [value]=\"filterValues()[item.value] || ''\"\r\n (input)=\"onInputChange($event, item.value)\" (focus)=\"onFocusFilter(item.value)\"\r\n (click)=\"$event.stopPropagation()\" (keydown)=\"onKeyDown($event)\" (keydown)=\"onEnter($event)\"\r\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Seleccionar')\"\r\n [disabled]=\"isDisabled()\" />\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-list\" (click)=\"onFocusFilter(item.value)\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M9 6l11 0\" />\r\n <path d=\"M9 12l11 0\" />\r\n <path d=\"M9 18l11 0\" />\r\n <path d=\"M5 6l0 .01\" />\r\n <path d=\"M5 12l0 .01\" />\r\n <path d=\"M5 18l0 .01\" />\r\n </svg>\r\n </div>\r\n\r\n @if (isOpen() && activeFilterType() === item.value) {\r\n <div class=\"dropdown\">\r\n <div class=\"options-list\">\r\n <!-- Opción por defecto sin valor -->\r\n <div class=\"option-item option-default\" (click)=\"clear()\">\r\n {{ 'Seleccionar' }}\r\n </div>\r\n @for (option of filteredOptions(); track option.value) {\r\n <div class=\"option-item\" (click)=\"selectOption(option)\">\r\n {{ option.label }}\r\n </div>\r\n }\r\n @if (filteredOptions().length === 0) {\r\n <div class=\"no-options\">No hay opciones</div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n effect,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FilterItem } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-input-text-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule],\r\n templateUrl: './input-text-filter.html',\r\n styleUrl: './input-text-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputTextFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputTextFilter implements ControlValueAccessor, OnDestroy {\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n clearTrigger = input<number>(0); // Increment this to trigger a clear\r\n\r\n // Outputs\r\n filterSelected = output<{ filter: string; value: string }>();\r\n valueChange = output<string | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n filterValues = signal<Record<string, string>>({});\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor() {\r\n // Watch for clear trigger changes\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n // No cleanup needed\r\n }\r\n\r\n private resetAllFilters() {\r\n this.filterValues.set({});\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | null): void {\r\n // Not used for multiple inputs\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.set(isDisabled);\r\n }\r\n\r\n // Public Methods\r\n onInputChange(event: Event, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const value = (event.target as HTMLInputElement).value;\r\n \r\n this.markAsTouched();\r\n \r\n // Actualizar el valor del filtro específico\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [filterValue]: value\r\n }));\r\n\r\n // Emitir eventos\r\n this.onChange(value || null);\r\n this.valueChange.emit(value || null);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: value,\r\n });\r\n }\r\n\r\n clearFilter(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n \r\n // Limpiar el valor del filtro específico\r\n this.filterValues.update(current => {\r\n const updated = { ...current };\r\n delete updated[filterValue];\r\n return updated;\r\n });\r\n\r\n // Emitir eventos\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: '',\r\n });\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n \r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n}\r\n","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip-input-wrapper\" [class.has-value]=\"filterValues()[item.value]\">\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Escribir' }}</label>\r\n <input type=\"text\" [value]=\"filterValues()[item.value] || ''\" (input)=\"onInputChange($event, item.value)\"\r\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Escribir')\"\r\n class=\"chip-input\" [disabled]=\"isDisabled()\" (keydown)=\"onEnter($event)\" />\r\n @if (filterValues()[item.value]) {\r\n <button type=\"button\" class=\"clear-button\" (click)=\"clearFilter(item.value)\" title=\"Limpiar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>","import { Component, input, model, output, signal, ElementRef, inject, effect } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-input',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './input.html',\r\n styleUrl: './input.css',\r\n})\r\nexport class Input {\r\n private readonly el = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n const v = this.value();\r\n const inputEl = this.el.nativeElement.querySelector('input');\r\n if (inputEl && inputEl.value !== v) {\r\n inputEl.value = v;\r\n }\r\n });\r\n }\r\n\r\n mode = input<'search' | 'select'>('search');\r\n placeholder = input<string>();\r\n type = input<string>('text');\r\n value = model<string>('');\r\n maxLength = input<number | null>(null);\r\n uppercase = input<boolean>(false);\r\n regex = input<RegExp | null>(null);\r\n onSearch = output<string>();\r\n onSelect = output<string>();\r\n onClear = output<void>();\r\n\r\n options = input<{ code: string; name: string }[]>([]);\r\n showDropdown = signal(false);\r\n\r\n clear() {\r\n this.value.set('');\r\n this.onClear.emit();\r\n }\r\n\r\n search() {\r\n this.onSearch.emit(this.value());\r\n }\r\n\r\n handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n let inputValue = target.value;\r\n\r\n if (this.type() === 'number') {\r\n inputValue = inputValue.replace(/[^0-9]/g, '');\r\n }\r\n\r\n const max = this.maxLength();\r\n if (max !== null && inputValue.length > max) {\r\n inputValue = inputValue.slice(0, max);\r\n }\r\n\r\n if (this.uppercase()) {\r\n inputValue = inputValue.toUpperCase();\r\n }\r\n\r\n const currentRegex = this.regex();\r\n if (currentRegex && inputValue !== '') {\r\n const pattern = new RegExp(currentRegex);\r\n if (!pattern.test(inputValue)) {\r\n inputValue = this.value();\r\n }\r\n }\r\n\r\n target.value = inputValue;\r\n this.value.set(inputValue);\r\n }\r\n\r\n selectOption(option: any) {\r\n this.value.set(`${option.code} - ${option.name}`);\r\n this.showDropdown.set(false);\r\n }\r\n \r\n openSelect() {\r\n this.showDropdown.set(!this.showDropdown());\r\n }\r\n}\r\n","<div class=\"input-wrapper\">\r\n <input\r\n [type]=\"type()\"\r\n [placeholder]=\"placeholder()\"\r\n class=\"custom-input\"\r\n [value]=\"value()\"\r\n [attr.maxlength]=\"maxLength()\"\r\n [style.text-transform]=\"uppercase() ? 'uppercase' : null\"\r\n (input)=\"handleInput($event)\"\r\n (keyup.enter)=\"search()\"\r\n />\r\n\r\n @if (value() && mode() === 'search') {\r\n <button class=\"clear-btn\" (click)=\"clear()\" type=\"button\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n } @if (mode() === 'search') {\r\n <button class=\"search-btn\" (click)=\"search()\" type=\"button\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"56\"\r\n height=\"56\"\r\n fill=\"none\"\r\n viewBox=\"0 0 56 56\"\r\n >\r\n <g clip-path=\"url(#clip0_190_2403)\">\r\n <path\r\n fill=\"#454733\"\r\n d=\"M31.755 30.255h-.79l-.28-.27a6.47 6.47 0 0 0 1.57-4.23 6.5 6.5 0 1 0-6.5 6.5c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99 1.49-1.49zm-6 0c-2.49 0-4.5-2.01-4.5-4.5s2.01-4.5 4.5-4.5 4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_190_2403\">\r\n <rect width=\"56\" height=\"56\" fill=\"#fff\" rx=\"28\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n } @else {\r\n <button class=\"select-btn\" (click)=\"openSelect()\" type=\"button\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-chevron-down\"\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M6 9l6 6l6 -6\" />\r\n </svg>\r\n </button>\r\n }\r\n</div>\r\n\r\n@if (showDropdown()) {\r\n <div class=\"dropdown-menu\">\r\n @for (option of options(); track option.code) {\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <span class=\"code\">{{ option.code }}</span>\r\n <span class=\"dash\">-</span>\r\n <span class=\"name\">{{ option.name }}</span>\r\n </button>\r\n }\r\n </div>\r\n}","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n HostListener,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\ninterface Option {\r\n value: any;\r\n label: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-select-custom-search',\r\n imports: [],\r\n templateUrl: './select-custom-search.html',\r\n styleUrl: './select-custom-search.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectCustomSearch),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SelectCustomSearch implements ControlValueAccessor {\r\n options = input<Option[]>([]);\r\n placeholder = input<string>('Seleccionar opción');\r\n\r\n selectionChange = output<Option | null>();\r\n\r\n isOpen = signal(false);\r\n openUpward = signal(false);\r\n searchTerm = signal('');\r\n selectedValue = signal<any>(null);\r\n isDisabled = signal(false);\r\n\r\n readonly = input<boolean>(false);\r\n\r\n isBlocked = computed(() => this.isDisabled() || this.readonly());\r\n\r\n selectedOption = computed(() => {\r\n const value = this.selectedValue();\r\n return this.options().find((option) => option.value === value) || null;\r\n });\r\n\r\n filteredOptions = computed(() => {\r\n const term = this.searchTerm().toLowerCase().trim();\r\n const opts = this.options();\r\n\r\n if (!term) return opts;\r\n\r\n return opts.filter(\r\n (option) =>\r\n option.label.toLowerCase().includes(term) ||\r\n option.value.toString().toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n private onChange = (value: any) => {};\r\n private onTouched = () => {};\r\n\r\n constructor(private elementRef: ElementRef) {}\r\n\r\n writeValue(value: any): void {\r\n this.selectedValue.set(value);\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.set(isDisabled); \r\n }\r\n\r\n toggle() {\r\n \r\n if (this.isBlocked()) return;\r\n \r\n if (this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n open() {\r\n\r\n if (this.isBlocked()) return;\r\n\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n this.openUpward.set(spaceBelow < 260);\r\n\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n\r\n setTimeout(() => {\r\n const input =\r\n this.elementRef.nativeElement.querySelector('.search-input');\r\n if (input) input.focus();\r\n });\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n }\r\n\r\n selectOption(option: Option) {\r\n\r\n if (this.isBlocked()) return;\r\n \r\n this.selectedValue.set(option.value);\r\n this.onChange(option.value);\r\n this.onTouched();\r\n this.selectionChange.emit(option);\r\n this.close();\r\n }\r\n\r\n clearSelection() {\r\n if (this.isBlocked()) return;\r\n\r\n this.selectedValue.set(null);\r\n this.onChange(null);\r\n this.onTouched();\r\n this.selectionChange.emit(null);\r\n this.close();\r\n }\r\n\r\n onSearch(event: Event) {\r\n\r\n if (this.isBlocked()) return;\r\n \r\n const target = event.target as HTMLInputElement;\r\n this.searchTerm.set(target.value);\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n\r\n if (this.isBlocked()) return;\r\n \r\n if (event.key === 'Escape') {\r\n this.close();\r\n } else if (event.key === 'Enter') {\r\n const filtered = this.filteredOptions();\r\n if (filtered.length > 0) {\r\n this.selectOption(filtered[0]);\r\n }\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: Event) {\r\n \r\n if (!this.isBlocked() && !this.elementRef.nativeElement.contains(event.target as Node)) {\r\n this.close();\r\n }\r\n }\r\n}","<div class=\"select-container\">\r\n <div\r\n class=\"select-header\"\r\n [class.active]=\"isOpen()\"\r\n [class.disabled]=\"isBlocked()\"\r\n [class.readonly]=\"isBlocked()\"\r\n (click)=\"!isBlocked() && toggle()\"\r\n (keydown)=\"!isBlocked() && onKeyDown($event)\"\r\n tabindex=\"0\"\r\n >\r\n <span class=\"selected-text\" [class.placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label || placeholder() }}\r\n </span>\r\n\r\n <span class=\"arrow\" [class.open]=\"isOpen()\"></span>\r\n </div>\r\n\r\n @if (isOpen()) {\r\n <div class=\"dropdown\" [class.dropdown--upward]=\"openUpward()\">\r\n <input\r\n type=\"text\"\r\n class=\"search-input\"\r\n [value]=\"searchTerm()\"\r\n placeholder=\"Buscar...\"\r\n (input)=\"!isBlocked() &&onSearch($event)\"\r\n (keydown)=\"!isBlocked() && onKeyDown($event)\"\r\n />\r\n\r\n @if (filteredOptions().length > 0) {\r\n <div class=\"options\">\r\n <div\r\n class=\"option default-option\"\r\n [class.selected]=\"selectedValue() === null\"\r\n (click)=\"!isBlocked() && clearSelection()\"\r\n >\r\n {{ placeholder() }}\r\n </div>\r\n @for (option of filteredOptions(); track option.value) {\r\n <div\r\n class=\"option\"\r\n [class.selected]=\"option.value === selectedValue()\"\r\n (click)=\"!isBlocked() && selectOption(option)\"\r\n [attr.disabled]=\"isBlocked()\"\r\n >\r\n {{ option.label }}\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"no-results\">No se encontraron resultados</div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nexport type ToggleCustomKey = string | number;\r\n\r\nexport interface ToggleCustomChange {\r\n key: ToggleCustomKey | undefined;\r\n checked: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-toggle-custom',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './toggle-custom.html',\r\n styleUrl: './toggle-custom.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ToggleCustom),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class ToggleCustom implements ControlValueAccessor {\r\n label = input<string>('');\r\n /** Referencia estable del toggle (p. ej. id de negocio) para lógica en el padre. */\r\n key = input<ToggleCustomKey | undefined>(undefined);\r\n disabled = input(false, { transform: booleanAttribute });\r\n checked = model<boolean>(false);\r\n\r\n /** Emite al cambiar por interacción del usuario (incluye `key` para identificar la instancia). */\r\n toggleChange = output<ToggleCustomChange>();\r\n\r\n private onChange: (value: boolean) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n isDisabledByControl = false;\r\n\r\n get isDisabled(): boolean {\r\n return this.isDisabledByControl || this.disabled();\r\n }\r\n\r\n toggle() {\r\n if (this.isDisabled) return;\r\n const next = !this.checked();\r\n this.checked.set(next);\r\n this.toggleChange.emit({ key: this.key(), checked: next });\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: boolean): void {\r\n this.checked.set(!!value);\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => 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.isDisabledByControl = isDisabled;\r\n }\r\n}\r\n","<label\r\n class=\"toggle-wrapper\"\r\n [class.disabled]=\"isDisabled\"\r\n [attr.data-toggle-key]=\"key() !== undefined ? key() : null\"\r\n>\r\n <div class=\"toggle-track\" [class.checked]=\"checked()\" (click)=\"toggle()\">\r\n <div class=\"toggle-thumb\"></div>\r\n </div>\r\n @if (label()) {\r\n <span class=\"toggle-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n","import { Component, input, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormArray,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { Subscription } from 'rxjs';\r\nimport { SelectCustomSearch } from '../select-custom-search/select-custom-search';\r\nimport { DateTimePicker } from '../date-time-picker/date-time-picker';\r\nimport { ToggleCustom } from '../toggle-custom/toggle-custom';\r\n\r\ntype FieldType =\r\n | 'text'\r\n | 'email'\r\n | 'number'\r\n | 'date'\r\n | 'datetime-local'\r\n | 'select'\r\n | 'radio'\r\n | 'checkbox'\r\n | 'textarea'\r\n | 'disabled'\r\n | 'password'\r\n | 'time'\r\n | 'file'\r\n | 'toggle';\r\n\r\nexport interface Option {\r\n value: string | number | boolean;\r\n label: string;\r\n subtitle?: string;\r\n}\r\n\r\nexport interface FieldConfig {\r\n key: string;\r\n label?: string;\r\n type: FieldType;\r\n placeholder?: string;\r\n required?: boolean;\r\n options?: Option[];\r\n col?: number;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n matchWith?: string;\r\n copyFrom?: string;\r\n pattern?: string;\r\n patternType?:\r\n | 'numbers'\r\n | 'phone'\r\n | 'custom'\r\n | 'text'\r\n | 'username'\r\n | 'alphanumeric';\r\n\r\n minDate?: Date;\r\n maxDate?: Date;\r\n variant?: 'cards';\r\n /**\r\n * Solo para checkbox.\r\n * Fields con el mismo nombre se comportan como radio: al marcar uno se desmarcan los demás.\r\n */\r\n radioGroup?: string;\r\n /**\r\n * Solo para checkbox.\r\n * Fields con el mismo nombre permiten selección múltiple pero impiden quedar todos desmarcados.\r\n */\r\n atLeastOneGroup?: string;\r\n /** Controla si el texto de las opciones se muestra en mayúsculas. Default: true */\r\n uppercase?: boolean;\r\n}\r\n\r\nexport interface SectionConfig {\r\n title?: string;\r\n description?: string;\r\n fields: FieldConfig[];\r\n}\r\n\r\ninterface RealTimeCopyItem {\r\n fieldKey: string;\r\n subscription: Subscription;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-dynamic-form-fields',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, SelectCustomSearch, DateTimePicker, ToggleCustom],\r\n templateUrl: './dynamic-form-fields.html',\r\n styleUrl: './dynamic-form-fields.css',\r\n})\r\nexport class DynamicFormFields implements OnInit, OnDestroy {\r\n form = input.required<FormGroup>();\r\n sections = input<SectionConfig[]>([]);\r\n compact = input<boolean>(false);\r\n\r\n private copyFromSubscriptions: Subscription[] = [];\r\n private realTimeCopySubscriptions: RealTimeCopyItem[] = [];\r\n\r\n ngOnInit(): void {\r\n setTimeout(() => {\r\n this.setupCopyFromLogic();\r\n }, 100);\r\n }\r\n\r\n getDatePickerMode(fieldType: FieldType): 'date' | 'datetime' {\r\n return fieldType === 'datetime-local' ? 'datetime' : 'date';\r\n }\r\n\r\n private setupCopyFromLogic(): void {\r\n this.sections().forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (field.copyFrom) {\r\n this.setupFieldCopy(field);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private setupFieldCopy(field: FieldConfig): void {\r\n const targetControl = this.form().get(field.key);\r\n if (!targetControl) return;\r\n\r\n const sourceControl = this.form().get(field.copyFrom!);\r\n if (!sourceControl) return;\r\n\r\n const triggerFieldKey = this.findTriggerField();\r\n\r\n if (!triggerFieldKey) {\r\n this.setupSimpleCopy(sourceControl, targetControl);\r\n return;\r\n }\r\n\r\n const triggerControl = this.form().get(triggerFieldKey);\r\n if (!triggerControl) {\r\n this.setupSimpleCopy(sourceControl, targetControl);\r\n return;\r\n }\r\n\r\n const subscription = triggerControl.valueChanges.subscribe(\r\n (shouldCopy: boolean) => {\r\n if (shouldCopy) {\r\n targetControl.setValue(sourceControl.value);\r\n targetControl.disable();\r\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\r\n } else {\r\n targetControl.enable();\r\n\r\n targetControl.setValue('');\r\n this.removeRealTimeCopy(field.key);\r\n }\r\n }\r\n );\r\n\r\n this.copyFromSubscriptions.push(subscription);\r\n\r\n if (triggerControl.value === true) {\r\n targetControl.setValue(sourceControl.value);\r\n targetControl.disable();\r\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\r\n }\r\n }\r\n\r\n private findTriggerField(): string {\r\n for (const section of this.sections()) {\r\n const triggerField = section.fields.find(\r\n (f) =>\r\n f.type === 'radio' &&\r\n (f.key.includes('is_owner') || f.key.includes('infractor-owner'))\r\n );\r\n if (triggerField) return triggerField.key;\r\n }\r\n return '';\r\n }\r\n\r\n private setupSimpleCopy(\r\n sourceControl: AbstractControl,\r\n targetControl: AbstractControl\r\n ): void {\r\n const subscription = sourceControl.valueChanges.subscribe((value) => {\r\n targetControl.setValue(value);\r\n });\r\n this.copyFromSubscriptions.push(subscription);\r\n }\r\n\r\n private setupRealTimeCopy(\r\n sourceControl: AbstractControl,\r\n targetControl: AbstractControl,\r\n fieldKey: string\r\n ): void {\r\n this.removeRealTimeCopy(fieldKey);\r\n\r\n const subscription = sourceControl.valueChanges.subscribe((value) => {\r\n targetControl.setValue(value);\r\n });\r\n\r\n this.realTimeCopySubscriptions.push({\r\n fieldKey,\r\n subscription,\r\n });\r\n }\r\n\r\n private removeRealTimeCopy(fieldKey: string): void {\r\n const index = this.realTimeCopySubscriptions.findIndex(\r\n (item) => item.fieldKey === fieldKey\r\n );\r\n if (index >= 0) {\r\n this.realTimeCopySubscriptions[index].subscription.unsubscribe();\r\n this.realTimeCopySubscriptions.splice(index, 1);\r\n }\r\n }\r\n\r\n /** toggle, checkbox y radio siempre ocupan la fila completa (12 cols) */\r\n isGroupType(type: FieldType): boolean {\r\n return type === 'toggle';\r\n }\r\n\r\n getFieldRuns(fields: FieldConfig[]): { isGroup: boolean; fields: FieldConfig[] }[] {\r\n const runs: { isGroup: boolean; fields: FieldConfig[] }[] = [];\r\n for (const f of fields) {\r\n const isGroup = this.isGroupType(f.type);\r\n const last = runs[runs.length - 1];\r\n if (last && last.isGroup === isGroup) {\r\n last.fields.push(f);\r\n } else {\r\n runs.push({ isGroup, fields: [f] });\r\n }\r\n }\r\n return runs;\r\n }\r\n\r\n ctrl = (key: string): AbstractControl | null => this.form().get(key);\r\n\r\n getCheckboxArray(key: string): FormControl[] | undefined {\r\n return (this.form().get(key) as FormArray)?.controls as FormControl[];\r\n }\r\n\r\n onCheckboxChange(event: Event, fieldKey: string, optionIndex: number) {\r\n const checkbox = event.target as HTMLInputElement;\r\n const checkboxArray = this.getCheckboxArray(fieldKey);\r\n checkboxArray?.[optionIndex]?.setValue(checkbox.checked);\r\n }\r\n\r\n onCheckboxInteract(event: Event, field: FieldConfig, optionIndex: number) {\r\n if (field.disabled || field.readonly) {\r\n (event.target as HTMLInputElement).checked = !!this.getCheckboxArray(field.key)?.[optionIndex]?.value;\r\n return;\r\n }\r\n const { key, radioGroup, atLeastOneGroup } = field;\r\n\r\n if (radioGroup) {\r\n this.getCheckboxArray(key)?.forEach((ctrl, i) => ctrl.setValue(i === optionIndex));\r\n this.sections().forEach(sec =>\r\n sec.fields\r\n .filter(f => f.radioGroup === radioGroup && f.key !== key)\r\n .forEach(f => this.getCheckboxArray(f.key)?.forEach(ctrl => ctrl.setValue(false)))\r\n );\r\n return;\r\n }\r\n\r\n if (atLeastOneGroup) {\r\n const checkbox = event.target as HTMLInputElement;\r\n if (!checkbox.checked) {\r\n const anyOtherInSameField = this.getCheckboxArray(key)?.some((ctrl, i) => i !== optionIndex && ctrl.value);\r\n const anyOtherInOtherFields = this.sections().some(sec =>\r\n sec.fields\r\n .filter(f => f.atLeastOneGroup === atLeastOneGroup && f.key !== key)\r\n .some(f => this.getCheckboxArray(f.key)?.some(ctrl => ctrl.value))\r\n );\r\n if (!anyOtherInSameField && !anyOtherInOtherFields) { checkbox.checked = true; return; }\r\n }\r\n this.onCheckboxChange(event, key, optionIndex);\r\n return;\r\n }\r\n\r\n this.onCheckboxChange(event, key, optionIndex);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.copyFromSubscriptions.forEach((sub) => sub.unsubscribe());\r\n this.realTimeCopySubscriptions.forEach((item) =>\r\n item.subscription.unsubscribe()\r\n );\r\n }\r\n\r\n onCancel(): void {\r\n }\r\n\r\n onEnter(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') return;\r\n \r\n const target = event.target as HTMLElement;\r\n \r\n // Permitir salto de línea en textarea con Shift+Enter\r\n if (target.tagName === 'TEXTAREA' && event.shiftKey) return;\r\n \r\n event.preventDefault();\r\n this.focusNextElement(target);\r\n }\r\n\r\n onUppercaseInput(event: Event, fieldType: string, key: string) {\r\n if (['email', 'password'].includes(fieldType)) return;\r\n \r\n const control = this.form().get(key);\r\n if (!control) return;\r\n \r\n const value = control.value;\r\n if (typeof value !== 'string') return;\r\n \r\n const upperValue = value.toUpperCase();\r\n \r\n if (value !== upperValue) {\r\n control.setValue(upperValue);\r\n }\r\n }\r\n \r\n private focusNextElement(current: HTMLElement): void {\r\n const form = current.closest('form');\r\n if (!form) return;\r\n \r\n const focusable = Array.from(\r\n form.querySelectorAll<HTMLElement>(\r\n 'input:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly]), select:not([disabled]), button:not([disabled])'\r\n )\r\n );\r\n \r\n const index = focusable.indexOf(current);\r\n \r\n // Si hay siguiente input → foco\r\n if (index >= 0 && index < focusable.length - 1) {\r\n focusable[index + 1].focus();\r\n return;\r\n }\r\n \r\n // Si es el último → submit\r\n const submitBtn = form.querySelector<HTMLButtonElement>(\r\n 'button[type=\"submit\"]'\r\n );\r\n \r\n submitBtn?.click();\r\n }\r\n \r\n}\r\n","@if (form()) {\n<form class=\"form\" [formGroup]=\"form()\" [class.form--compact]=\"compact()\" (keydown)=\"onEnter($event)\">\n @for (sec of sections(); track $index) {\n <section class=\"section\">\n @if (sec.title) {\n <h3 class=\"section-title\">{{ sec.title }}</h3>\n } @if (sec.description) {\n <p class=\"section-desc\">{{ sec.description }}</p>\n }\n\n <div class=\"grid\">\n @for (run of getFieldRuns(sec.fields); track $index) {\n\n @if (run.isGroup) {\n <!-- toggle: wrapper que siempre ocupa la fila completa -->\n <div class=\"col col--group-wrapper\">\n @for (f of run.fields; track f.key) {\n <div class=\"group-item\">\n <lib-toggle-custom [key]=\"f.key\" [label]=\"f.label ?? ''\" [formControlName]=\"f.key\" />\n </div>\n }\n </div>\n\n } @else {\n <!-- Campos normales (incluye checkbox y radio con su col configurable) -->\n @for (f of run.fields; track f.key) {\n <div class=\"col\" [style.--col-span]=\"f.col || 6\">\n @if (['text','number','email', 'password', 'time'].includes(f.type))\n {\n <input\n class=\"input\"\n [type]=\"f.type\"\n [placeholder]=\"f.placeholder\"\n [formControlName]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n (input)=\"onUppercaseInput($event, f.type, f.key)\"\n />\n } @if (['date', 'datetime-local'].includes(f.type)) {\n <lib-date-time-picker\n [mode]=\"getDatePickerMode(f.type)\"\n [placeholder]=\"\n f.placeholder ||\n (f.type === 'date'\n ? 'Seleccionar fecha'\n : 'Seleccionar fecha y hora')\n \"\n [formControlName]=\"f.key\"\n [minDate]=\"f.minDate || null\"\n [maxDate]=\"f.maxDate || null\"\n [readonly]=\"f.readonly || false\"\n />\n } @if (f.type === 'textarea') {\n <textarea\n class=\"input textarea\"\n [placeholder]=\"f.placeholder\"\n [formControlName]=\"f.key\"\n rows=\"6\"\n [readonly]=\"f.readonly || false\"\n ></textarea>\n } @if (f.type === 'select') {\n <lib-select-custom-search\n [options]=\"f.options ?? []\"\n [placeholder]=\"f.placeholder || 'Seleccionar...'\"\n [formControlName]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n />\n } @if (f.type === 'radio') {\n <div class=\"radio-group\">\n @for (o of f.options ?? []; track o.value) {\n <label class=\"radio\">\n <input\n type=\"radio\"\n [value]=\"o.value\"\n [formControlName]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n />\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">{{ o.label }}</span>\n </label>\n }\n </div>\n } @if (f.type === 'checkbox') {\n <div class=\"checkbox-group\"\n [class.checkbox-group--cards]=\"f.variant === 'cards'\"\n [class.checkbox-group--lowercase]=\"f.uppercase === false\"\n [class.checkbox-group--readonly]=\"f.readonly && !f.disabled\">\n @for (o of f.options ?? []; track o.value) {\n <label class=\"checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"getCheckboxArray(f.key)?.at($index)?.value\"\n (change)=\"onCheckboxInteract($event, f, $index)\"\n [disabled]=\"f.disabled || f.readonly || false\"\n />\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-text\">\n <span class=\"checkbox-label\">{{ o.label }}</span>\n @if (o.subtitle) {\n <span class=\"checkbox-subtitle\">{{ o.subtitle }}</span>\n }\n </span>\n </label>\n }\n </div>\n } @if (f.type === 'disabled') {\n <input\n class=\"input input--disabled\"\n [placeholder]=\"f.placeholder || 'Automático'\"\n disabled\n />\n } @if (ctrl(f.key)?.touched && ctrl(f.key)?.invalid) {\n <div class=\"error\">\n @if (ctrl(f.key)?.errors?.['required']) {\n <span>Campo requerido</span>\n } @if (ctrl(f.key)?.errors?.['email']) {\n <span>Correo inválido</span>\n } @if (ctrl(f.key)?.errors?.['pattern']) {\n <span>\n @switch (f.patternType) { @case ('numbers') { Solo se permiten\n números } @case ('phone') { Formato de teléfono inválido } @case\n ('text') { Solo se permiten letras y espacios } @case ('username') {\n Solo se permiten letras, números, puntos y guiones bajos (no al\n inicio ni al final) } @case ('alphanumeric') { Solo se permiten\n letras y números } @default { Formato inválido } }\n </span>\n } @if (ctrl(f.key)?.errors?.['notMatching']) {\n <span>Las contraseñas no coinciden</span>\n }\n </div>\n }\n\n @if(f.label && f.type !== 'toggle') {\n <label\n [class.label-radio]=\"f.type === 'radio'\"\n [class.label-checkbox]=\"f.type === 'checkbox'\"\n [class.label-disabled]=\"f.readonly || f.disabled\"\n class=\"label\"\n >\n {{ f.label }} </label>\n }\n </div>\n }\n }\n\n }\n </div>\n </section>\n }\n</form>\n}\n","import {\r\n Component,\r\n DestroyRef,\r\n inject,\r\n input,\r\n output,\r\n computed,\r\n effect,\r\n} from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { ModalFormStep } from '../modal-form/modal-form';\r\n\r\n@Component({\r\n selector: 'lib-wizard-form',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './wizard-form.html',\r\n styleUrl: './wizard-form.css',\r\n})\r\nexport class WizardForm {\r\n form = input<FormGroup>();\r\n currentStep = input<number>(1);\r\n steps = input<ModalFormStep[]>([]);\r\n\r\n canContinue = output<boolean>();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private groupSubs: Subscription[] = [];\r\n\r\n // Devuelve la key del paso\r\n currentStepKey = computed(() => {\r\n const index = this.currentStep() - 1;\r\n return this.steps()[index]?.key ?? null;\r\n });\r\n\r\n // Devuelve el subform correspondiente\r\n currentGroup = computed(() => {\r\n const key = this.currentStepKey();\r\n return key ? (this.form()?.get(key) as FormGroup) : null;\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const group = this.currentGroup();\r\n\r\n // Limpiar subscriptions del grupo anterior antes de crear las nuevas\r\n this.groupSubs.forEach(s => s.unsubscribe());\r\n this.groupSubs = [];\r\n\r\n if (!group) {\r\n this.canContinue.emit(false);\r\n return;\r\n }\r\n\r\n this.canContinue.emit(group.valid);\r\n\r\n this.groupSubs.push(\r\n group.statusChanges.subscribe(() => this.canContinue.emit(group.valid)),\r\n group.valueChanges.subscribe(() => this.canContinue.emit(group.valid))\r\n );\r\n });\r\n\r\n // Garantizar limpieza al destruir el componente\r\n this.destroyRef.onDestroy(() => {\r\n this.groupSubs.forEach(s => s.unsubscribe());\r\n });\r\n }\r\n\r\n currentGroupComponent = computed(() => {\r\n const index = this.currentStep() - 1;\r\n return this.steps()[index].component;\r\n });\r\n}\r\n","<ng-container>\r\n\r\n @if (currentGroup()) {\r\n <ng-container\r\n *ngComponentOutlet=\"currentGroupComponent(); inputs: { group: currentGroup() }\"\r\n ></ng-container>\r\n }\r\n\r\n</ng-container>\r\n","import PubSub from 'pubsub-js';\r\n\r\nexport const TOAST_EVENTS = {\r\n SHOW_TOAST: 'SHOW_TOAST',\r\n SHOW_TOAST_WITH_ACTION: 'SHOW_TOAST_WITH_ACTION',\r\n HIDE_TOAST: 'HIDE_TOAST',\r\n} as const;\r\n\r\nexport interface ToastData {\r\n description: string;\r\n duration?: number;\r\n buttonText?: string;\r\n action?: () => void;\r\n}\r\n\r\n\r\nexport class ToastHelper {\r\n \r\n static show(description: string, duration?: number) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST, {\r\n description,\r\n duration,\r\n });\r\n }\r\n\r\n static showWithAction(\r\n description: string,\r\n buttonText: string,\r\n action: () => void,\r\n duration?: number\r\n ) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST_WITH_ACTION, {\r\n description,\r\n buttonText,\r\n action,\r\n duration,\r\n });\r\n }\r\n\r\n \r\n static success(message: string, duration?: number) {\r\n this.show(`${message}`, duration);\r\n }\r\n\r\n\r\n static error(message: string, duration?: number) {\r\n this.show(`${message}`, duration || 6000); \r\n }\r\n\r\n\r\n static warning(message: string, duration?: number) {\r\n this.show(`${message}`, duration);\r\n }\r\n\r\n \r\n static info(message: string, duration?: number) {\r\n this.show(`ℹ${message}`, duration);\r\n }\r\n\r\n\r\n static hide() {\r\n PubSub.publish(TOAST_EVENTS.HIDE_TOAST);\r\n }\r\n\r\n \r\n static showUndo(\r\n message: string,\r\n undoAction: () => void,\r\n duration: number = 8000\r\n ) {\r\n this.showWithAction(message, 'Deshacer', undoAction, duration);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './button.html',\r\n styleUrl: './button.css',\r\n})\r\nexport class Button {\r\n /**\r\n * Variante visual del botón.\r\n * - primary: fondo #596300\r\n * - secondary: fondo #dee58f\r\n * - outline: fondo transparente, borde y texto con mismo color\r\n */\r\n variant = input<'primary' | 'secondary' | 'outline'>('primary');\r\n\r\n /** Tipo nativo del botón */\r\n type = input<'button' | 'submit'>('button');\r\n\r\n /** Estado deshabilitado */\r\n disabled = input<boolean>(false);\r\n\r\n /** Ocupa todo el ancho del contenedor */\r\n fullWidth = input<boolean>(false);\r\n\r\n /** Tamaño del botón: por defecto (grande) o compacto */\r\n size = input<'default' | 'compact'>('default');\r\n\r\n /** Evento click del botón */\r\n clicked = output<MouseEvent>();\r\n\r\n handleClick(event: MouseEvent) {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.clicked.emit(event);\r\n }\r\n}\r\n","<button\r\n class=\"sl-btn\"\r\n [class.sl-btn--primary]=\"variant() === 'primary'\"\r\n [class.sl-btn--secondary]=\"variant() === 'secondary'\"\r\n [class.sl-btn--outline]=\"variant() === 'outline'\"\r\n [class.sl-btn--compact]=\"size() === 'compact'\"\r\n [class.sl-btn--full]=\"fullWidth()\"\r\n [attr.type]=\"type()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"handleClick($event)\"\r\n>\r\n <ng-content></ng-content>\r\n</button>\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n Type,\r\n} from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { WizardForm } from '../wizard-form/wizard-form';\r\nimport { ToastHelper } from '../../helpers/toast-helper';\r\nimport { Button } from '../button/button';\r\n\r\nexport interface ModalFormStep {\r\n key: string;\r\n label: string;\r\n component: Type<any>;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-modal-form',\r\n standalone: true,\r\n imports: [CommonModule, WizardForm, Button],\r\n templateUrl: './modal-form.html',\r\n styleUrl: './modal-form.css',\r\n})\r\nexport class ModalForm {\r\n isFull = input<boolean>(false);\r\n scrollBody = input<boolean>(false);\r\n title = input<string>('Formulario');\r\n subtitle = input<string | null>('');\r\n submitLabel = input<string>('Guardar');\r\n\r\n form = input<FormGroup>();\r\n steps = input<ModalFormStep[]>([]);\r\n\r\n currentStep = signal<number>(1);\r\n canContinue = signal<boolean>(false);\r\n\r\n onSubmit = output<{form: any; evidence?: File}>();\r\n onCancel = output<void>();\r\n evidenceChange = output<File>();\r\n\r\n evidenceFile = signal<File | null>(null);\r\n evidenceFileName = signal<string | null>(null);\r\n showActionsLeft = input<boolean>(false);\r\n\r\n evidenceLabel = input<string>('Cargar archivo');\r\n evidenceHelperText = input<string>('Formato admitido');\r\n evidenceAccept = input<string>('application/pdf');\r\n maxSizeMB = input<number>(25);\r\n\r\n hiddenFooterActions = input<boolean>(false);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.steps().length) {\r\n this.canContinue.set(true);\r\n } else {\r\n this.currentStep.set(1);\r\n }\r\n });\r\n }\r\n\r\n nextStep() {\r\n if (this.currentStep() < this.steps().length) {\r\n this.currentStep.update(v => v + 1);\r\n }\r\n }\r\n\r\n prevStep() {\r\n if (this.currentStep() > 1) {\r\n this.currentStep.update(v => v - 1);\r\n }\r\n }\r\n\r\n submitForm() {\r\n this.onSubmit.emit({\r\n form: this.form()?.value,\r\n evidence: this.evidenceFileName() ? (this.evidenceFile() as File) : undefined\r\n });\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files?.length) return;\r\n\r\n const file = input.files[0];\r\n\r\n if (!this.evidenceAccept().includes(file.type)) {\r\n ToastHelper.warning('Tipo de archivo no permitido');\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Tamaño máximo 25MB\r\n if (file.size > this.maxSizeMB() * 1024 * 1024) {\r\n ToastHelper.warning(`El archivo no puede superar los ${this.maxSizeMB}MB`);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n this.evidenceFile.set(file);\r\n this.evidenceFileName.set(file.name);\r\n this.evidenceChange.emit(file);\r\n }\r\n}","<div class=\"modal-form-container\" [class.expanded]=\"isFull()\" [class.no-scroll]=\"!scrollBody()\">\r\n <div class=\"header-content\">\r\n <div class=\"header-top\">\r\n <div class=\"header-text\">\r\n <h1>{{ title() }}</h1>\r\n @if(subtitle()){\r\n <p>{{ subtitle() }}</p>\r\n }\r\n </div>\r\n \r\n <button class=\"close-btn\" type=\"button\" (click)=\"onCancel.emit()\">\r\n ✕\r\n </button>\r\n </div>\r\n </div>\r\n\r\n @if (steps() && steps().length > 1) {\r\n <div class=\"steps\">\r\n @for (step of steps(); track $index) {\r\n <div class=\"step\" [class.step-active]=\"currentStep() === $index + 1\"\r\n [class.step-completed]=\"currentStep() > $index + 1\">\r\n @if (currentStep() > $index + 1) {\r\n <span class=\"check-icon\">✔</span>\r\n }\r\n <span>Paso {{ $index + 1 }}: {{ step.label }}</span>\r\n </div>\r\n\r\n @if ($index < steps().length - 1) { <span class=\"separator\">›</span>\r\n } }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <div class=\"body-content\" [class.scrollable]=\"scrollBody()\" [class.no-scroll]=\"!scrollBody()\">\r\n @if (!steps() || !steps().length) {\r\n <ng-content></ng-content>\r\n } @else {\r\n <!-- Render dinámico del paso actual -->\r\n <lib-wizard-form [form]=\"form()\" [currentStep]=\"currentStep()\" [steps]=\"steps()\"\r\n (canContinue)=\"canContinue.set($event)\"></lib-wizard-form>\r\n }\r\n </div>\r\n\r\n @if (!hiddenFooterActions()) {\r\n <div class=\"actions\">\r\n @if (showActionsLeft()){\r\n <div class=\"actions-left\">\r\n <p class=\"file-type\">{{ evidenceHelperText() }}</p>\r\n <lib-button variant=\"outline\" type=\"button\" (clicked)=\"fileInput.click()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"upload-icon icon icon-tabler icons-tabler-outline icon-tabler-cloud-upload\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1\" />\r\n <path d=\"M9 15l3 -3l3 3\" />\r\n <path d=\"M12 12l0 9\" />\r\n </svg>\r\n <span class=\"label-button\">\r\n {{ evidenceFileName() || evidenceLabel() }}\r\n </span>\r\n </lib-button>\r\n <input #fileInput type=\"file\" hidden [accept]=\"evidenceAccept()\" (change)=\"onFileSelected($event)\" />\r\n </div>\r\n }\r\n\r\n <div class=\"actions-right\">\r\n @if (!steps() || steps().length <= 1) { \r\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\r\n Cancelar\r\n </lib-button>\r\n } @else if (currentStep() === 1) {\r\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\r\n Cancelar\r\n </lib-button>\r\n } @else {\r\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"prevStep()\">\r\n Volver\r\n </lib-button>\r\n }\r\n\r\n <lib-button\r\n variant=\"primary\"\r\n type=\"button\"\r\n [disabled]=\"!canContinue()\"\r\n (clicked)=\"!steps() || !steps().length ? submitForm() : (currentStep() === steps().length ? submitForm() : nextStep())\"\r\n >\r\n {{ !steps() || !steps().length ? submitLabel() : currentStep() ===\r\n steps().length ? submitLabel() : 'Continuar' }}\r\n </lib-button>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';\r\nimport { DynamicFormFields, FieldConfig, SectionConfig } from '../dynamic-form-fields/dynamic-form-fields';\r\n\r\n@Component({\r\n selector: 'lib-dialog-alert-component',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicFormFields],\r\n templateUrl: './dialog-alert.html',\r\n styleUrl: './dialog-alert.css',\r\n})\r\nexport class DialogAlertComponent implements OnInit, OnChanges {\r\n @Input() title: string = 'Mensaje';\r\n @Input() message!: string;\r\n @Input() type: 'warning' | 'error' | 'info' | 'success' = 'info';\r\n /** Acción asociada al alert (ej: 'desactivar', 'eliminar', 'anular', 'sancionar') */\r\n @Input() action?: string;\r\n /** Forzar mostrar el campo razón si se necesita */\r\n @Input() showReason: boolean = false;\r\n @Input() confirm: boolean = false;\r\n @Input() confirmLabel: string = 'Aceptar';\r\n @Output() close = new EventEmitter<boolean>();\r\n /** Emite la razón escrita cuando aplica */\r\n @Input() reasonOptions: { label: string; value: any }[] = [];\r\n @Output() confirmReason = new EventEmitter<{\r\n reason?: string;\r\n observations?: string;\r\n }>();\r\n\r\n icon = ':fuente_de_información:';\r\n\r\n // Formulario interno que pasaremos a dynamic-form-fields\r\n form: FormGroup = new FormGroup({ reason: new FormControl('') });\r\n\r\n // Secciones para dynamic-form-fields\r\n sections: SectionConfig[] = [];\r\n\r\n // Calcula si se debe mostrar el campo razón\r\n get isReasonNeeded(): boolean {\r\n const action = (this.action || '').toLowerCase();\r\n const actionsRequiringReason = ['deactivate', 'delete', 'anulate', 'sancionar', 'active'];\r\n return this.showReason || actionsRequiringReason.includes(action);\r\n }\r\n\r\n ngOnInit() {\r\n this.updateFormAndSections();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['action'] || changes['showReason'] || changes['type']) {\r\n this.updateFormAndSections();\r\n }\r\n }\r\n\r\n private updateFormAndSections() {\r\n // Preparar form y sections según si la razón es necesaria\r\n if (this.isReasonNeeded) {\r\n this.form = new FormGroup({ reason: new FormControl('', [Validators.required]), observations: new FormControl('') });\r\n const reasonSection: SectionConfig[] = [\r\n {\r\n fields: [\r\n {\r\n key: \"reason\",\r\n label: \"Razón\",\r\n type: \"select\",\r\n placeholder: \"Seleccionar\",\r\n required: true,\r\n col: 12,\r\n options: this.reasonOptions ?? [],\r\n },\r\n {\r\n key: \"observations\",\r\n label: \"Observaciones\",\r\n type: \"textarea\",\r\n placeholder: \"Escriba las observaciones...\",\r\n col: 12,\r\n }\r\n ],\r\n },\r\n ];\r\n this.sections = reasonSection;\r\n } else {\r\n this.form = new FormGroup({ reason: new FormControl('') });\r\n this.sections = [];\r\n }\r\n }\r\n\r\n onConfirm() {\r\n if (this.isReasonNeeded && !this.form.get('reason')?.value?.trim().length) {\r\n return;\r\n }\r\n \r\n const reason = this.form.get('reason')?.value;\r\n const observations = this.form.get('observations')?.value;\r\n \r\n this.confirmReason.emit({\r\n reason: reason || undefined,\r\n observations: observations || undefined,\r\n });\r\n \r\n this.close.emit(true);\r\n }\r\n\r\n onCancel() {\r\n this.close.emit(false);\r\n }\r\n}","<div class=\"modal-backdrop\" (click)=\"onCancel()\">\r\n <div class=\"modal-card\" [class.modal-card-compact]=\"!isReasonNeeded\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n @if(type != 'info') {\r\n <div class=\"icono-container\" [ngClass]=\"type\">\r\n @if (type === 'success') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n } @else if(type === 'error') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-x\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M10 10l4 4m0 -4l-4 4\" />\r\n </svg>\r\n } @else if (type === 'warning') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-alert-triangle\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M12 9v4\" />\r\n <path\r\n d=\"M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0\" />\r\n <path d=\"M12 16h.01\" />\r\n </svg>\r\n }\r\n </div>\r\n }\r\n <h2>{{ title }}</h2>\r\n </div>\r\n\r\n <div class=\"modal-body\">\r\n <p>{{ message }}</p>\r\n <lib-dynamic-form-fields [form]=\"form\" [sections]=\"sections\"></lib-dynamic-form-fields>\r\n </div>\r\n <div class=\"modal-footer\">\r\n @if (confirm) {\r\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\r\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\r\n } @else {\r\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport interface DialogItem {\r\n key: string;\r\n label: string;\r\n value: string | number | Date;\r\n expandible?: boolean;\r\n children?: DialogItem[];\r\n}\r\n\r\n@Component({\r\n selector: 'lib-dialog-confirmation',\r\n imports: [CommonModule],\r\n templateUrl: './dialog-confirmation.html',\r\n styleUrl: './dialog-confirmation.css',\r\n})\r\nexport class DialogConfirmation {\r\n @Input() title: string = 'TITULO';\r\n @Input() message: string = '';\r\n @Input() confirm: boolean = false;\r\n @Input() confirmLabel: string = 'Aceptar';\r\n @Input() items: DialogItem[] = [];\r\n @Input() btnMap: boolean = false;\r\n @Input() type: 'info' | 'default' = 'default';\r\n\r\n @Output() close = new EventEmitter<boolean>();\r\n\r\n expandedIndex: number | null = null;\r\n\r\n toggle(index: number) {\r\n this.expandedIndex = this.expandedIndex === index ? null : index;\r\n }\r\n\r\n onConfirm() {\r\n this.close.emit(true);\r\n }\r\n\r\n onCancel() {\r\n this.close.emit(false);\r\n }\r\n}\r\n","<div class=\"modal-backdrop\" (click)=\"onCancel()\">\r\n <div class=\"modal-card\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n <div class=\"modal-header-title\">\r\n <div class=\"icon-container\" class=\"icono-container\" [ngClass]=\"type\">\r\n @if(type === 'info') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n }\r\n </div>\r\n <h2>{{ title }}</h2>\r\n <p class=\"modal-header-message\">{{ message }}</p>\r\n </div>\r\n <button class=\"close-btn\" (click)=\"onCancel()\" aria-label=\"Cerrar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"info-container\" [class.expanded]=\"expandedIndex !== null\">\r\n @for (item of items; track item.key; let i = $index) {\r\n\r\n <div class=\"info-item\">\r\n <div class=\"info-main\" [class.info-main-expanded]=\"item.expandible\" (click)=\"item.expandible && toggle(i)\">\r\n <span class=\"label\">{{ item.label }} @if (item.expandible) {\r\n <span class=\"arrow\"> {{ expandedIndex === i ? '▲' : '▼' }} </span>\r\n }\r\n </span>\r\n <span class=\"value\"> {{ item.value }} </span>\r\n </div>\r\n\r\n @if (expandedIndex === i && item.children?.length) {\r\n <div class=\"info-children\">\r\n @for (child of item.children; track child.key) {\r\n <div class=\"info-item child-item\">\r\n <div class=\"info-main\">\r\n <span class=\"label\">{{ child.label }}</span>\r\n <span class=\"value\">{{ child.value }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n }\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n @if (confirm) {\r\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\r\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\r\n @if(btnMap) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\r\n <path fill=\"#fff\"\r\n d=\"M10.85 16.608v1.684a8.3 8.3 0 0 0 4.433-1.842L14.1 15.258a6.6 6.6 0 0 1-3.25 1.35M3.358 10c0-3.375 2.525-6.175 5.792-6.608V1.708C4.958 2.15 1.692 5.7 1.692 10s3.266 7.85 7.458 8.292v-1.684C5.883 16.175 3.358 13.375 3.358 10m13.267-.833h1.683a8.3 8.3 0 0 0-1.841-4.434l-1.192 1.192a6.56 6.56 0 0 1 1.35 3.242M15.283 3.55a8.3 8.3 0 0 0-4.433-1.842v1.684a6.6 6.6 0 0 1 3.25 1.35zm-.008 10.533 1.192 1.184a8.3 8.3 0 0 0 1.841-4.434h-1.683a6.6 6.6 0 0 1-1.35 3.25\" />\r\n <path fill=\"#fff\"\r\n d=\"M13.333 9.25c0-2.075-1.583-3.417-3.333-3.417S6.667 7.175 6.667 9.25c0 1.383 1.108 3.025 3.333 4.917 2.225-1.892 3.333-3.534 3.333-4.917M10 10a.893.893 0 0 1 0-1.783A.893.893 0 0 1 10 10\" />\r\n </svg>\r\n }\r\n {{ confirmLabel }}\r\n </button>\r\n } @else {\r\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\r\n @if(btnMap) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\r\n <path fill=\"#fff\"\r\n d=\"M10.85 16.608v1.684a8.3 8.3 0 0 0 4.433-1.842L14.1 15.258a6.6 6.6 0 0 1-3.25 1.35M3.358 10c0-3.375 2.525-6.175 5.792-6.608V1.708C4.958 2.15 1.692 5.7 1.692 10s3.266 7.85 7.458 8.292v-1.684C5.883 16.175 3.358 13.375 3.358 10m13.267-.833h1.683a8.3 8.3 0 0 0-1.841-4.434l-1.192 1.192a6.56 6.56 0 0 1 1.35 3.242M15.283 3.55a8.3 8.3 0 0 0-4.433-1.842v1.684a6.6 6.6 0 0 1 3.25 1.35zm-.008 10.533 1.192 1.184a8.3 8.3 0 0 0 1.841-4.434h-1.683a6.6 6.6 0 0 1-1.35 3.25\" />\r\n <path fill=\"#fff\"\r\n d=\"M13.333 9.25c0-2.075-1.583-3.417-3.333-3.417S6.667 7.175 6.667 9.25c0 1.383 1.108 3.025 3.333 4.917 2.225-1.892 3.333-3.534 3.333-4.917M10 10a.893.893 0 0 1 0-1.783A.893.893 0 0 1 10 10\" />\r\n </svg>\r\n }\r\n {{ confirmLabel }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { Component, input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-not-found-modal',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './not-found-modal.html',\r\n styleUrl: './not-found-modal.css',\r\n})\r\nexport class NotFoundModal {\r\n isVisible = input<boolean>(false);\r\n title = input<string>('Documento no encontrado');\r\n message = input<string>('No encontrado');\r\n\r\n onClose = output<void>();\r\n\r\n onOverlayClick(event: Event) {\r\n if (event.target === event.currentTarget) {\r\n this.onClose.emit();\r\n }\r\n }\r\n\r\n onAccept() {\r\n this.onClose.emit();\r\n }\r\n}\r\n","<div\r\n class=\"modal-overlay\"\r\n (click)=\"onOverlayClick($event)\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n <div class=\"icon-container\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"error-icon\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#ef4444\" stroke-width=\"2\" />\r\n <path\r\n d=\"M15 9l-6 6\"\r\n stroke=\"#ef4444\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M9 9l6 6\"\r\n stroke=\"#ef4444\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <h2 class=\"modal-title\">{{ title() }}</h2>\r\n </div>\r\n\r\n <div class=\"modal-body\">\r\n <p class=\"modal-message\">{{ message() }}</p>\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button\r\n class=\"btn-primary\"\r\n (click)=\"onAccept()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"'Cerrar modal de documento no encontrado'\"\r\n >\r\n Aceptar\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-loader',\r\n imports: [],\r\n templateUrl: './loader.html',\r\n styleUrl: './loader.css'\r\n})\r\nexport class Loader {\r\n\r\n}\r\n","<div class=\"loader-overlay\">\r\n <div class=\"loader\"></div>\r\n</div>\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\ninterface StepConfig {\r\n title: string;\r\n key: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProgressFormService {\r\n currentPage = signal(1);\r\n totalPages = signal(6);\r\n\r\n private stepsConfig: { [key: number]: StepConfig } = {\r\n 1: { title: 'Paso 1', key: 'step1' },\r\n 2: { title: 'Paso 2', key: 'step2' },\r\n };\r\n\r\n resetData() {\r\n this.currentPage.set(1);\r\n }\r\n\r\n getProgressText() {\r\n return `${this.currentPage()}/${this.totalPages()}`;\r\n }\r\n\r\n getCurrentPageTitle(): string {\r\n const currentPage = this.currentPage();\r\n return this.stepsConfig[currentPage]?.title || `Página ${currentPage}`;\r\n }\r\n\r\n nextPage(): boolean {\r\n const current = this.currentPage();\r\n\r\n if (current < this.totalPages()) {\r\n this.currentPage.set(current + 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n prevPage(): boolean {\r\n const current = this.currentPage();\r\n\r\n if (current > 1) {\r\n this.currentPage.set(current - 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getProgressPercentage(): number {\r\n const current = this.currentPage();\r\n const total = this.totalPages();\r\n return Math.round((current / total) * 100);\r\n }\r\n}\r\n","import { Component, Input, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ProgressFormService } from '../../services/progress/progress-service';\r\n\r\n@Component({\r\n selector: 'lib-progress-bar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './progress-bar.html',\r\n styleUrl: './progress-bar.css',\r\n})\r\nexport class ProgressBar {\r\n constructor(public progress: ProgressFormService) {}\r\n title = input<string>('');\r\n current = input<number>(1);\r\n total = input<number>(1);\r\n\r\n get percentage() {\r\n return Math.round((this.current() / this.total()) * 100);\r\n }\r\n\r\n get text() {\r\n return `Paso ${this.current()} de ${this.total()}`;\r\n }\r\n}\r\n","<div class=\"progress-container\">\r\n <div class=\"progress-header\">\r\n <span class=\"progress-title\">{{ title() }}</span>\r\n <span class=\"progress-fraction\">{{ text }}</span>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div\r\n class=\"progress-fill\"\r\n [style.width.%]=\"percentage\"\r\n ></div>\r\n </div>\r\n</div>\r\n","import { Component, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-processing-overlay',\r\n imports: [],\r\n templateUrl: './processing-overlay.html',\r\n styleUrl: './processing-overlay.css',\r\n})\r\nexport class ProcessingOverlay {\r\n loadingText = input<string>('Cargando...');\r\n}\r\n","<div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <figure>\r\n <svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M58.8943 10.1325C61.244 6.40017 66.7559 6.40017 69.1056 10.1325L74.7379 19.079C76.2827 21.5328 79.399 22.5304 82.1127 21.4398L92.0068 17.4636C96.1345 15.8048 100.594 18.9967 100.268 23.3769L99.487 33.8765C99.2728 36.7562 101.199 39.368 104.045 40.0572L114.422 42.57C118.751 43.6183 120.454 48.783 117.577 52.138L110.681 60.18C108.79 62.3857 108.79 65.6141 110.681 67.8198L117.577 75.8619C120.454 79.2169 118.751 84.3816 114.422 85.4298L104.045 87.9427C101.199 88.6319 99.2728 91.2436 99.487 94.1234L100.268 104.623C100.594 109.003 96.1345 112.195 92.0069 110.536L82.1127 106.56C79.399 105.469 76.2827 106.467 74.7379 108.921L69.1056 117.867C66.756 121.6 61.244 121.6 58.8943 117.867L53.2621 108.921C51.7173 106.467 48.6009 105.469 45.8872 106.56L35.9931 110.536C31.8655 112.195 27.4062 109.003 27.732 104.623L28.5129 94.1234C28.7271 91.2436 26.8011 88.6319 23.955 87.9427L13.5783 85.4299C9.24928 84.3816 7.546 79.2169 10.4228 75.8619L17.3186 67.8198C19.21 65.6141 19.21 62.3857 17.3186 60.18L10.4228 52.138C7.546 48.783 9.24928 43.6183 13.5783 42.57L23.955 40.0572C26.8011 39.368 28.7271 36.7562 28.5129 33.8765L27.732 23.3769C27.4062 18.9967 31.8655 15.8048 35.9931 17.4636L45.8872 21.4398C48.6009 22.5304 51.7173 21.5328 53.2621 19.079L58.8943 10.1325Z\" fill=\"#BFD100\"/>\r\n </svg> \r\n </figure>\r\n <p class=\"loading-text\">{{ loadingText() }}</p>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input, signal } from '@angular/core';\r\n\r\nexport interface InfoItem {\r\n label: string;\r\n value: string | boolean | null | undefined;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-info-group',\r\n imports: [CommonModule],\r\n templateUrl: './info-group.html',\r\n styleUrl: './info-group.css',\r\n})\r\nexport class InfoGroup {\r\n type = input<'success' | 'error' | 'info'>('info');\r\n showBox = input<boolean>(false)\r\n // modo info\r\n items = input<InfoItem[]>([]);\r\n title = input<string | null>(null);\r\n titleAlign = input<'center' | 'left' | 'right'>('center');\r\n\r\n // modo comparación\r\n itemsLeft = input<InfoItem[]>([]);\r\n itemsRight = input<InfoItem[]>([]);\r\n titleLeft = input<string | null>(null);\r\n titleRight = input<string | null>(null);\r\n\r\n // modo box\r\n fullName = input<string | null>(null);\r\n typeDocument = input<string | null>(null);\r\n document = input<string | null>(null);\r\n}","@if (!showBox()) {\r\n<div class=\"info-card\">\r\n @if (title()) {\r\n <h3 class=\"info-title\" [style.text-align]=\"titleAlign()\">{{ title() }}</h3>\r\n }\r\n\r\n @if (itemsLeft().length || itemsRight().length) {\r\n <div class=\"compare-grid\">\r\n <div class=\"compare-col\">\r\n @if (titleLeft()) {\r\n <span class=\"col-title\">{{ titleLeft() }}</span>\r\n }\r\n @for (item of itemsLeft(); track item.label) {\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">{{ item.label }}</span>\r\n <span class=\"info-value\">\r\n {{ item.value === true ? \"SI\" : item.value === false ? \"NO\" : item.value || \"-\" }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"compare-divider\"></div>\r\n <div class=\"compare-col\">\r\n @if (titleRight()) {\r\n <span class=\"col-title\">{{ titleRight() }}</span>\r\n }\r\n @for (item of itemsRight(); track item.label) {\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">{{ item.label }}</span>\r\n <span class=\"info-value\">\r\n {{ item.value === true ? \"SI\" : item.value === false ? \"NO\" : item.value || \"-\" }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"info-grid\">\r\n @for (item of items(); track item.label) {\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">{{ item.label }}</span>\r\n <span class=\"info-value\">\r\n {{ item.value === true ? \"SI\" : item.value === false ? \"NO\" : item.value\r\n || \"-\" }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n} \r\n\r\n@if (showBox()) {\r\n<div class=\"person-box\" [ngClass]=\"type()\" >\r\n <span class=\"person-name\">{{ fullName() || '-' }}</span>\r\n <span class=\"divider\"></span>\r\n <span class=\"person-doc\">{{ typeDocument() }} {{ document() || '-' }}</span>\r\n</div>\r\n}\r\n","import { Component, computed, effect, input, model, signal, ElementRef, ViewChild, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type FeatureType = 'money' | 'percentage' | 'measurement' | 'date';\nexport type MeasurementUnit = 'km' | 'km/h' | 'm' | 'cm';\n\nexport interface Feature {\n key?: number | string;\n icon?: string;\n title: string;\n description: string | null | undefined;\n /** Tipo de dato para formatear la descripción */\n type?: FeatureType;\n /** Unidad de medida (solo aplica cuando type = 'measurement') */\n unit?: MeasurementUnit;\n /** Código de moneda ISO 4217 (default: 'COP'). Solo aplica cuando type = 'money' */\n currency?: string;\n /** Locale para formateo numérico (default: 'es-CO') */\n locale?: string;\n /** Indica si la descripción es editable */\n editable?: boolean;\n /** Límite inferior para valores numéricos */\n min?: number;\n /** Límite superior para valores numéricos */\n max?: number;\n}\n\n@Component({\n selector: 'lib-feature-card',\n standalone: true,\n templateUrl: './feature-card.html',\n styleUrls: ['./feature-card.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FeatureCard),\n multi: true,\n },\n ],\n})\nexport class FeatureCard implements ControlValueAccessor {\n /** Objeto feature (con soporte para binding bidireccional vía señales) */\n feature = model<Feature | undefined>();\n \n showLeading = input<boolean>(false);\n showTrailling = input<boolean>(false);\n\n /** Valor interno de la descripción mientras se edita */\n descriptionValue = signal<string>('');\n isEditingDescription = signal<boolean>(false);\n isDisabled = signal<boolean>(false);\n\n @ViewChild('descriptionInput')\n descriptionInput?: ElementRef<HTMLInputElement>;\n\n onChange = (_: any) => {};\n onTouched = () => {};\n\n /** Descripción formateada según el tipo de feature */\n readonly formattedDescription = computed(() => {\n const raw = this.descriptionValue();\n const feat = this.feature();\n if (!feat?.type) return raw;\n\n const numValue = Number(raw);\n\n switch (feat.type) {\n case 'money': {\n if (isNaN(numValue)) return raw;\n const locale = feat.locale ?? 'es-CO';\n const currency = feat.currency ?? 'COP';\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(numValue);\n }\n case 'percentage':\n return isNaN(numValue) ? raw : `${numValue}%`;\n case 'measurement':\n if (isNaN(numValue)) return raw;\n return feat.unit ? `${numValue} ${feat.unit}` : `${numValue}`;\n case 'date': {\n const d = new Date(raw);\n if (isNaN(d.getTime())) return raw;\n const dd = String(d.getDate()).padStart(2, '0');\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const yyyy = d.getFullYear();\n return `${dd}/${mm}/${yyyy}`;\n }\n default:\n return raw;\n }\n });\n\n constructor() {\n // Sincroniza el valor interno cuando cambia el objeto feature inicial\n effect(() => {\n const feat = this.feature();\n this.descriptionValue.set(feat?.description ?? '');\n });\n }\n\n // --- ControlValueAccessor Implementation ---\n\n writeValue(value: string | number | undefined | null): void {\n const nextDescription = value == null ? '' : String(value);\n \n // Solo actualizamos el valor visual (descriptionValue)\n this.descriptionValue.set(nextDescription);\n \n // Mantenemos sincronizado el objeto base\n const current = this.feature();\n if (current) {\n // Modificamos el objeto feature subyacente para no perder la configuración\n this.feature.set({ ...current, description: nextDescription });\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n // --- Event Handlers ---\n\n onDescriptionInput(event: Event) {\n if (this.isDisabled()) return;\n \n const target = event.target as HTMLInputElement;\n let nextDescription = target.value;\n \n const currentFeature = this.feature();\n \n // Validar y filtrar entrada para tipos numéricos\n if (currentFeature?.type && ['money', 'percentage', 'measurement'].includes(currentFeature.type)) {\n // Permitir solo números y punto decimal\n nextDescription = nextDescription.replace(/[^0-9.]/g, '');\n \n // Evitar múltiples puntos decimales\n const parts = nextDescription.split('.');\n if (parts.length > 2) {\n nextDescription = parts[0] + '.' + parts.slice(1).join('');\n }\n\n // Aplicar límite máximo en tiempo real\n if (currentFeature.max !== undefined && nextDescription !== '' && nextDescription !== '.') {\n const numericValue = parseFloat(nextDescription);\n if (!isNaN(numericValue) && numericValue > currentFeature.max) {\n nextDescription = currentFeature.max.toString();\n }\n }\n\n // Sincronizar el valor visual del input si cambió por el filtrado o límite\n if (target.value !== nextDescription) {\n target.value = nextDescription;\n }\n }\n\n this.descriptionValue.set(nextDescription);\n \n if (currentFeature) {\n const updatedFeature = { ...currentFeature, description: nextDescription };\n // Actualiza vía señal (model 2-way binding)\n this.feature.set(updatedFeature);\n }\n // Notifica al formulario (Reactive Forms) - Emitimos solo el valor\n this.onChange(nextDescription);\n this.onTouched();\n }\n\n onEditIconClick() {\n if (!this.showTrailling() || this.isDisabled()) return;\n this.isEditingDescription.set(true);\n\n // Asegura el foco una vez que el input se renderiza.\n setTimeout(() => {\n this.descriptionInput?.nativeElement?.focus();\n this.descriptionInput?.nativeElement?.select();\n }, 0);\n }\n\n onDescriptionBlur() {\n this.isEditingDescription.set(false);\n\n // Aplicar límite mínimo al perder el foco (para evitar interrumpir mientras se escribe)\n const currentFeature = this.feature();\n if (currentFeature?.type && ['money', 'percentage', 'measurement'].includes(currentFeature.type) && currentFeature.min !== undefined) {\n const currentRaw = this.descriptionValue();\n const numericValue = parseFloat(currentRaw);\n \n if (!isNaN(numericValue) && numericValue < currentFeature.min) {\n const clampedValue = currentFeature.min.toString();\n this.descriptionValue.set(clampedValue);\n \n const updatedFeature = { ...currentFeature, description: clampedValue };\n this.feature.set(updatedFeature);\n this.onChange(clampedValue);\n }\n }\n\n this.onTouched();\n }\n}\n","<div class=\"feature-card\" [class.feature-card--editing]=\"isEditingDescription()\">\n @if(showLeading()){\n <div class=\"feature-icon-leading\">\n <img [src]=\"feature()?.icon\" alt=\"{{ feature()?.title }}\" />\n </div>\n }\n \n <div class=\"feature-content\">\n <p>{{ feature()!.title }}</p>\n @if (showTrailling()) {\n <div class=\"feature-description-editable\">\n @if (isEditingDescription()) {\n <input\n #descriptionInput\n class=\"feature-description-input\"\n type=\"text\"\n [value]=\"descriptionValue()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onDescriptionInput($event)\"\n (blur)=\"onDescriptionBlur()\"\n aria-label=\"Description\"\n autofocus\n />\n } @else {\n <h3>{{ formattedDescription() }}</h3>\n }\n </div>\n } @else {\n <h3>{{ formattedDescription() }}</h3>\n }\n </div>\n\n @if(showTrailling()){\n <button\n type=\"button\"\n class=\"feature-icon-trailling\"\n [disabled]=\"isDisabled()\"\n (click)=\"onEditIconClick()\"\n aria-label=\"Editar description\"\n >\n <span class=\"description-edit-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, Input, Output, AfterViewInit, OnDestroy, ViewChild, OnChanges } from '@angular/core';\r\n\r\nexport interface SideCardItem {\r\n key: number;\r\n label: string;\r\n value: string | number;\r\n}\r\n\r\nexport interface SideCardSection {\r\n title?: string;\r\n items?: SideCardItem[];\r\n showSlider?: boolean;\r\n sliderLabel?: string;\r\n sliderValue?: number; \r\n sliderUnit?: string;\r\n\r\n buttonSectionLabel?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-side-card',\r\n imports: [CommonModule],\r\n templateUrl: './side-card.html',\r\n styleUrl: './side-card.css',\r\n})\r\nexport class SideCard implements AfterViewInit, OnChanges, OnDestroy {\r\n @ViewChild('SideCard', { static: true })\r\n wrapper!: ElementRef<HTMLElement>;\r\n \r\n @Input() isFloating = true;\r\n isCompact = false;\r\n // Header\r\n @Input() modeSideCard: 'create' | 'edit' | 'info' = 'create';\r\n @Input() showTypeSelector = true;\r\n selectedType: 'radial' | 'poligonal' = 'radial';\r\n @Output() btnClickIcon = new EventEmitter<void>();\r\n\r\n // Input\r\n @Input() placeholder = 'NOMBRE';\r\n @Input() value = '';\r\n\r\n @Output() valueChange = new EventEmitter<string>();\r\n @Output() typeChange = new EventEmitter<'radial' | 'poligonal'>();\r\n\r\n @Input() statusValue: 1 | 2 = 1; // backend value\r\n @Output() statusChange = new EventEmitter<1 | 2>();\r\n\r\n // Sections\r\n @Input() sections: SideCardSection[] = [];\r\n\r\n @Output() sectionButtonClick = new EventEmitter<SideCardSection>();\r\n\r\n // Slider\r\n @Input() min = 0;\r\n @Input() max = 1000;\r\n sliderLabel = 'Radio';\r\n sliderUnit = 'km';\r\n\r\n sliderValue = 0;\r\n @Output() sliderChange = new EventEmitter<number>();\r\n\r\n //actions\r\n @Input() showBtnPrimary = false;\r\n @Input() primaryButtonLabel = 'Aceptar';\r\n \r\n @Input() showBtnSecondary = false;\r\n @Input() secondaryButtonLabel = 'Cancelar';\r\n\r\n @Output() buttonClick = new EventEmitter<'primary' | 'secondary'>();\r\n\r\n private ro!: ResizeObserver;\r\n \r\n get statusLabel(): string {\r\n return this.statusValue === 1 ? 'Activo' : 'Inactivo';\r\n }\r\n\r\n get statusClass(): string {\r\n return this.statusValue === 1\r\n ? 'status-chip-active'\r\n : 'status-chip-inactive';\r\n }\r\n\r\n get sliderPercentage(): string {\r\n const max = this.max || 1000;\r\n return ((this.sliderValue / max) * 100) + '%';\r\n }\r\n\r\n // Inicializa slider cuando llegan secciones\r\n ngOnChanges() {\r\n const section = this.sections.find(s => s.showSlider);\r\n\r\n if (section) {\r\n this.sliderLabel = section.sliderLabel || 'Radio';\r\n this.sliderUnit = section.sliderUnit || 'km';\r\n this.sliderValue = section.sliderValue ?? 0;\r\n } \r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ro = new ResizeObserver(entries => {\r\n const rect = entries[0].contentRect;\r\n this.updateCompact(rect.width, rect.height);\r\n });\r\n \r\n this.ro.observe(this.wrapper.nativeElement);\r\n \r\n // evaluación inicial\r\n const rect = this.wrapper.nativeElement.getBoundingClientRect();\r\n this.updateCompact(rect.width, rect.height);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ro?.disconnect();\r\n }\r\n\r\n selectType(type: 'radial' | 'poligonal') {\r\n this.selectedType = type;\r\n this.typeChange.emit(type);\r\n }\r\n\r\n onInput(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input.value;\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n focusInput(input: HTMLInputElement) {\r\n input.focus();\r\n }\r\n\r\n onSliderChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n this.sliderValue = Number(input.value);\r\n this.sliderChange.emit(this.sliderValue);\r\n }\r\n\r\n onButtonSectionClick(section: SideCardSection) {\r\n this.sectionButtonClick.emit(section);\r\n }\r\n\r\n onButtonClick(type: 'primary' | 'secondary') {\r\n this.buttonClick.emit(type);\r\n }\r\n\r\n changeStatusLabel() {\r\n if (this.modeSideCard !== 'edit') return;\r\n\r\n this.statusValue = this.statusValue === 1 ? 2 : 1;\r\n this.statusChange.emit(this.statusValue);\r\n }\r\n\r\n buttonClickIcon() {\r\n this.btnClickIcon.emit();\r\n }\r\n\r\n private updateCompact(width: number, height: number) {\r\n this.isCompact =\r\n width <= 299 ||\r\n height <= 360;\r\n }\r\n}\r\n","<div #SideCard class=\"side-card-wrapper\">\r\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\r\n <div class=\"element-header\">\r\n @if (modeSideCard === 'create' && showTypeSelector) {\r\n <div class=\"button-group\">\r\n <button class=\"btn-type\" [class.active]=\"selectedType === 'radial'\" (click)=\"selectType('radial')\">\r\n Radial\r\n </button>\r\n <button class=\"btn-type\" [class.active]=\"selectedType === 'poligonal'\" (click)=\"selectType('poligonal')\">\r\n Poligonal\r\n </button>\r\n </div>\r\n }\r\n <div class=\"text-container\">\r\n <input #inputRef type=\"text\" class=\"input-field\" [placeholder]=\"placeholder\" [value]=\"value\"\r\n (input)=\"onInput($event)\" [disabled]=\"modeSideCard === 'info'\" />\r\n @if(modeSideCard === 'create' || modeSideCard === 'edit'){\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-edit\" (click)=\"focusInput(inputRef)\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\" />\r\n <path d=\"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415\" />\r\n <path d=\"M16 5l3 3\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-settings\" (click)=\"buttonClickIcon()\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065\" />\r\n <path d=\"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0\" />\r\n </svg>\r\n }\r\n </div>\r\n\r\n @if(modeSideCard === 'edit' || modeSideCard === 'info'){\r\n <span #statusChip class=\"status-chip\" [class.status-chip--disabled]=\"modeSideCard === 'info'\" [ngClass]=\"statusClass\" (click)=\"changeStatusLabel()\">\r\n {{ statusLabel }}\r\n </span>\r\n }\r\n </div>\r\n @for (section of sections; track section.title) {\r\n <div class=\"element-section\">\r\n <h3>{{ section.title }}</h3>\r\n\r\n <div class=\"element-content\">\r\n @if (section.items?.length) { @for (item of section.items; track\r\n item.label) {\r\n <div class=\"element-item\">\r\n <span class=\"label\">{{ item.label }}</span>\r\n <span class=\"value\">{{ item.value }}</span>\r\n </div>\r\n } } @if (section.showSlider) {\r\n <div class=\"element-item\">\r\n <span class=\"label\">{{ sliderLabel }}</span>\r\n <span class=\"value\">{{ sliderValue }} {{ sliderUnit }}</span>\r\n </div>\r\n @if (modeSideCard !== 'info') {\r\n <input type=\"range\" class=\"slider\" [min]=\"min\" [max]=\"max\" [value]=\"sliderValue\"\r\n [style.--slider-value]=\"sliderPercentage\" step=\"0.01\" (input)=\"onSliderChange($event)\" />\r\n }} @if (section.buttonSectionLabel && modeSideCard !== 'info') {\r\n <button class=\"btn-assign\" (click)=\"onButtonSectionClick(section)\">{{ section.buttonSectionLabel }}</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"side-card-actions\">\r\n @if (showBtnPrimary) {\r\n <button class=\"btn-primary\" (click)=\"onButtonClick('primary')\">{{ primaryButtonLabel }}</button>\r\n }\r\n @if (showBtnSecondary) {\r\n <button class=\"btn-secondary\" (click)=\"onButtonClick('secondary')\">{{ secondaryButtonLabel }}</button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';\r\nimport { SideCardSection } from '../side-card/side-card';\r\n\r\n@Component({\r\n selector: 'lib-side-card-detail',\r\n imports: [CommonModule],\r\n templateUrl: './side-card-detail.html',\r\n styleUrl: './side-card-detail.css',\r\n})\r\nexport class SideCardDetail implements AfterViewInit, OnDestroy{\r\n @ViewChild('SideCard', { static: true })\r\n wrapper!: ElementRef<HTMLElement>;\r\n\r\n @Input() isFloating = true;\r\n isCompact = false;\r\n\r\n nowLabel = 'Ahora mismo';\r\n agoLabel = 'Hace';\r\n\r\n // showMessageModal = false;\r\n\r\n // Header\r\n @Input() title = 'Titulo';\r\n @Input() subtitle = 'Subtitulo'\r\n @Output() btnClickIcon = new EventEmitter<'back' | 'location' | 'message'>();\r\n\r\n @Input() statusValue: 1 | 2 = 1; // backend value\r\n @Output() statusChange = new EventEmitter<1 | 2>();\r\n\r\n // Sections\r\n @Input() sections: SideCardSection[] = [];\r\n\r\n activeTab: 'principal' | 'historial' = 'principal';\r\n @Output() tabChange = new EventEmitter<'principal' | 'historial'>();\r\n\r\n private ro!: ResizeObserver;\r\n\r\n ngAfterViewInit() {\r\n this.ro = new ResizeObserver(entries => {\r\n const rect = entries[0].contentRect;\r\n this.updateCompact(rect.width, rect.height);\r\n });\r\n \r\n this.ro.observe(this.wrapper.nativeElement);\r\n \r\n // evaluación inicial\r\n const rect = this.wrapper.nativeElement.getBoundingClientRect();\r\n this.updateCompact(rect.width, rect.height);\r\n }\r\n \r\n ngOnDestroy() {\r\n this.ro?.disconnect();\r\n }\r\n\r\n get statusLabel(): string {\r\n return this.statusValue === 1 ? 'Dentro de geocerca' : 'Fuera de geocerca';\r\n }\r\n\r\n get statusClass(): string {\r\n return this.statusValue === 1\r\n ? 'status-chip-active'\r\n : 'status-chip-inactive';\r\n }\r\n\r\n buttonClickIcon(type: 'back' | 'location' | 'message') {\r\n /* if (type === 'message') {\r\n this.showMessageModal = !this.showMessageModal;\r\n return;\r\n } */\r\n \r\n this.btnClickIcon.emit(type);\r\n }\r\n\r\n setTab(tab: 'principal' | 'historial') {\r\n this.activeTab = tab;\r\n this.tabChange.emit(tab);\r\n }\r\n\r\n getIndicatorLeft(): string {\r\n return this.activeTab === 'principal' ? '0%' : '50%';\r\n }\r\n\r\n isDateValue(value: any): boolean {\r\n if (!value) return false;\r\n return (\r\n typeof value === 'string' &&\r\n !isNaN(Date.parse(value))\r\n );\r\n }\r\n\r\n getRelativeTime(date: string | Date | number): string {\r\n const d = new Date(date);\r\n const now = new Date();\r\n\r\n if (isNaN(d.getTime())) return '';\r\n\r\n const diff = Math.floor((now.getTime() - d.getTime()) / 1000);\r\n\r\n if (diff < 10) return this.nowLabel;\r\n\r\n const units = [\r\n { singular: 'Segundo', plural: 'Segundos', value: 60 },\r\n { singular: 'Minuto', plural: 'Minutos', value: 60 },\r\n { singular: 'Hora', plural: 'Horas', value: 24 },\r\n { singular: 'Día', plural: 'Días', value: 7 },\r\n { singular: 'Semana', plural: 'Semanas', value: 4 },\r\n { singular: 'Mes', plural: 'Meses', value: 12 },\r\n { singular: 'Año', plural: 'Años', value: Infinity }\r\n ];\r\n\r\n let value = diff;\r\n let unit = units[0];\r\n\r\n for (let i = 0; i < units.length; i++) {\r\n if (value < units[i].value) {\r\n unit = units[i];\r\n break;\r\n }\r\n value = Math.floor(value / units[i].value);\r\n }\r\n\r\n const label = value === 1 ? unit.singular : unit.plural;\r\n\r\n return `${this.agoLabel} ${value} ${label}`;\r\n }\r\n\r\n private updateCompact(width: number, height: number) {\r\n this.isCompact =\r\n width <= 312 ||\r\n height <= 460;\r\n }\r\n\r\n /* onNotify(message: string) {\r\n console.log('Mensaje recibido:', message);\r\n\r\n this.showMessageModal = false;\r\n } */\r\n}\r\n","<div #SideCard class=\"side-card-wrapper\">\r\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\r\n <div class=\"element-header\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-arrow-left\" (click)=\"buttonClickIcon('back')\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M5 12l12 0\" />\r\n <path d=\"M5 12l4 5\" />\r\n <path d=\"M5 12l4 -5\" />\r\n </svg>\r\n\r\n <div class=\"text-container\">\r\n <span class=\"title\"> {{ title }} </span>\r\n <span class=\"subtitle\"> {{ subtitle }} </span>\r\n <div class=\"container-chip\">\r\n <span #statusChip class=\"status-chip\" [ngClass]=\"statusClass\">\r\n {{ statusLabel }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"right-icons\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\"\r\n class=\"icon icon-tabler icons-tabler-filled icon-tabler-current-location\"\r\n (click)=\"buttonClickIcon('location')\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M12 1a1 1 0 0 1 1 1v1.055a9.004 9.004 0 0 1 7.946 7.945h1.054a1 1 0 0 1 0 2h-1.055a9.004 9.004 0 0 1 -7.944 7.945l-.001 1.055a1 1 0 0 1 -2 0v-1.055a9.004 9.004 0 0 1 -7.945 -7.944l-1.055 -.001a1 1 0 0 1 0 -2h1.055a9.004 9.004 0 0 1 7.945 -7.945v-1.055a1 1 0 0 1 1 -1m0 4a7 7 0 1 0 0 14a7 7 0 0 0 0 -14m0 3a4 4 0 1 1 -4 4l.005 -.2a4 4 0 0 1 3.995 -3.8\" />\r\n </svg>\r\n\r\n <!-- message + modal -->\r\n <div class=\"message-icon-wrapper\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-message-circle\"\r\n (click)=\"buttonClickIcon('message')\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1\" />\r\n </svg>\r\n\r\n <!-- @if (showMessageModal) {\r\n <div class=\"message-modal-anchor\">\r\n <lib-notification-modal (buttonClick)=\"onNotify($event)\" />\r\n </div>\r\n } -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"side-tabs\">\r\n <div class=\"tab\" [class.active]=\"activeTab === 'principal'\" (click)=\"setTab('principal')\">\r\n Principal\r\n </div>\r\n\r\n <div class=\"tab\" [class.active]=\"activeTab === 'historial'\" (click)=\"setTab('historial')\">\r\n Historial\r\n </div>\r\n\r\n <div class=\"tab-indicator\" [style.left]=\"getIndicatorLeft()\"></div>\r\n </div>\r\n <div class=\"body-content\">\r\n @for (section of sections; track section.title) {\r\n <div class=\"element-section\">\r\n <h3>{{ section.title }}</h3>\r\n\r\n <div class=\"element-content\">\r\n @if (section.items?.length) { @for (item of section.items; track\r\n item.key) {\r\n <div class=\"element-item\">\r\n <span class=\"label\">{{ item.label }}</span>\r\n <span class=\"value\">{{ isDateValue(item.value) ? getRelativeTime(item.value) : item.value }}</span>\r\n </div>\r\n } }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';\r\n\r\nexport interface DeviceStatus {\r\n geofence: 'inside' | 'outside';\r\n wifi?: boolean;\r\n bluetooth?: boolean;\r\n gps?: boolean;\r\n signalStatus?: 0 | 1 | 2 | 3 | 4;\r\n batteryPercentage?: string;\r\n}\r\n\r\nexport interface DeviceCard {\r\n androidId: string;\r\n code: string;\r\n name: string;\r\n geofenceName: string;\r\n deviceInfo: string;\r\n status: DeviceStatus;\r\n lastUpdate: string | Date | number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-devices-carousel',\r\n imports: [CommonModule],\r\n templateUrl: './devices-carousel.html',\r\n styleUrl: './devices-carousel.css',\r\n})\r\nexport class DevicesCarousel implements AfterViewInit {\r\n @Input() devices: DeviceCard[] = [];\r\n nowLabel = 'AHORA MISMO';\r\n agoLabel = 'HACE';\r\n\r\n canScrollLeft = false;\r\n canScrollRight = false;\r\n\r\n @Output() btnClickIcon = new EventEmitter<DeviceCard>();\r\n\r\n @ViewChild('list', { static: false }) listRef!: ElementRef<HTMLElement>;\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n this.updateScrollButtons();\r\n }\r\n\r\n onScroll(el: HTMLElement) {\r\n this.updateScrollButtons(el);\r\n }\r\n\r\n updateScrollButtons(el?: HTMLElement) {\r\n const element = el ?? this.listRef?.nativeElement;\r\n if (!element) return;\r\n\r\n this.canScrollLeft = element.scrollLeft > 0;\r\n\r\n this.canScrollRight =\r\n element.scrollLeft + element.clientWidth < element.scrollWidth - 1;\r\n }\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => {\r\n this.updateScrollButtons();\r\n });\r\n }\r\n\r\n scroll(el: HTMLElement, dir: 'left' | 'right') {\r\n const amount = 300;\r\n\r\n el.scrollBy({\r\n left: dir === 'right' ? amount : -amount,\r\n behavior: 'smooth'\r\n });\r\n\r\n setTimeout(() => this.updateScrollButtons(el), 300);\r\n }\r\n\r\n getGeofenceClass(state: string) {\r\n return state === 'inside' ? 'badge-inside' : 'badge-outside';\r\n }\r\n\r\n getSignalClass(level: 0 | 1 | 2 | 3 | 4) {\r\n return 'signal-' + level;\r\n }\r\n\r\n getBatteryLevel(battery?: string): 0 | 1 | 2 | 3 | 4 {\r\n if (!battery) return 0;\r\n \r\n const value = parseInt(battery.replace('%', ''), 10);\r\n \r\n if (isNaN(value) || value <= 5) return 0;\r\n if (value <= 25) return 1;\r\n if (value <= 50) return 2;\r\n if (value <= 75) return 3;\r\n return 4;\r\n }\r\n\r\n getRelativeTime(date: string | Date | number): string {\r\n const d = new Date(date);\r\n const now = new Date();\r\n\r\n if (isNaN(d.getTime())) return 'FECHA INVÁLIDA';\r\n\r\n const diff = Math.floor((now.getTime() - d.getTime()) / 1000);\r\n\r\n if (diff < 10) return this.nowLabel;\r\n\r\n const units = [\r\n { singular: 'SEGUNDO', plural: 'SEGUNDOS', value: 60 },\r\n { singular: 'MINUTO', plural: 'MINUTOS', value: 60 },\r\n { singular: 'HORA', plural: 'HORAS', value: 24 },\r\n { singular: 'DÍA', plural: 'DÍAS', value: 7 },\r\n { singular: 'SEMANA', plural: 'SEMANAS', value: 4 },\r\n { singular: 'MES', plural: 'MESES', value: 12 },\r\n { singular: 'AÑO', plural: 'AÑOS', value: Infinity }\r\n ];\r\n\r\n let value = diff;\r\n let unit = units[0];\r\n\r\n for (let i = 0; i < units.length; i++) {\r\n if (value < units[i].value) {\r\n unit = units[i];\r\n break;\r\n }\r\n value = Math.floor(value / units[i].value);\r\n }\r\n\r\n const label = value === 1 ? unit.singular : unit.plural;\r\n\r\n return `${this.agoLabel} ${value} ${label}`;\r\n }\r\n\r\n buttonClickIcon(dc: DeviceCard) {\r\n this.btnClickIcon.emit(dc);\r\n }\r\n}\r\n","<div class=\"carousel-container\">\r\n <div class=\"carousel-wrapper\">\r\n\r\n @if (canScrollLeft) {\r\n <button class=\"nav left\" (click)=\"scroll(list,'left')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-chevron-left\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" stroke=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path d=\"m15 6-6 6 6 6\" />\r\n </svg>\r\n </button>\r\n }\r\n\r\n <div class=\"carousel-mask\">\r\n <div class=\"carousel-list\" #list (scroll)=\"onScroll(list)\">\r\n @for (d of devices; track d.androidId) {\r\n <div class=\"device-card\">\r\n <div class=\"card-header\">\r\n <div class=\"header-title-wrapper\">\r\n <span class=\"code\">{{ d.code }} - {{ d.name }}</span>\r\n <span class=\"geofence\">{{ d.geofenceName }}</span>\r\n </div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\"\r\n class=\"target icon icon-tabler icons-tabler-filled icon-tabler-current-location\"\r\n (click)=\"buttonClickIcon(d)\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path\r\n d=\"M12 1a1 1 0 0 1 1 1v1.055A9.004 9.004 0 0 1 20.946 11H22a1 1 0 0 1 0 2h-1.055a9.004 9.004 0 0 1-7.944 7.945L13 22a1 1 0 0 1-2 0v-1.055a9.004 9.004 0 0 1-7.945-7.944L2 13a1 1 0 0 1 0-2h1.055A9.004 9.004 0 0 1 11 3.055V2a1 1 0 0 1 1-1m0 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14m0 3a4 4 0 1 1-4 4l.005-.2A4 4 0 0 1 12 8\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"device-info\">\r\n <span>{{ d.deviceInfo }}</span>\r\n <div class=\"icons\">\r\n @if (d.status.wifi) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\">\r\n <title>En Línea</title>\r\n <path fill=\"#454733\"\r\n d=\"M.833 7.314 2.5 8.98c4.142-4.141 10.858-4.141 15 0l1.667-1.666C14.108 2.255 5.9 2.255.833 7.314M7.5 13.98l2.5 2.5 2.5-2.5a3.53 3.53 0 0 0-5 0m-3.333-3.333 1.666 1.667c2.3-2.3 6.034-2.3 8.334 0l1.666-1.667c-3.216-3.217-8.441-3.217-11.666 0\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Fuera de Línea</title>\r\n <path fill=\"#454733\"\r\n d=\"m17.5 10.142 1.667-1.667C16.058 5.367 11.775 4.183 7.75 4.883l2.15 2.15a10.62 10.62 0 0 1 7.6 3.109m-1.667 1.666a8.25 8.25 0 0 0-3.1-1.941l2.517 2.516zM7.5 15.142l2.5 2.5 2.5-2.5a3.53 3.53 0 0 0-5 0m-4.658-12.8L1.667 3.517l2.541 2.541A13.1 13.1 0 0 0 .833 8.475L2.5 10.142a10.5 10.5 0 0 1 3.475-2.317l1.867 1.867a8.2 8.2 0 0 0-3.675 2.116l1.666 1.667a5.83 5.83 0 0 1 4.075-1.717l5.9 5.9 1.175-1.175z\" />\r\n </svg>\r\n } @if (getBatteryLevel(d.status.batteryPercentage) >= 4) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>76-100%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562-1.25h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625V6.938c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 3) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>51-75%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562 4.375h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 2) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>21-50%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562 10h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 1) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>1-20%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562 15.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>0%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187z\" />\r\n </g>\r\n </svg>\r\n }\r\n @if (d.status.signalStatus! >= 4) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Excelente</title>\r\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667z\" />\r\n </svg>\r\n } @else if (d.status.signalStatus! == 3) { <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>Buena</title>\r\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\r\n <path id=\"Combined-Shape\"\r\n d=\"M426.667 0v341.333H0zM384 88.747l-85.334 68.266v141.653H384z\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n } @else if (d.status.signalStatus! == 2) { <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>Regular</title>\r\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\r\n <path id=\"Combined-Shape\"\r\n d=\"M426.667 0v341.333H0zM384 88.747 213.333 225.28v73.386H384z\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n } @else if (d.status.signalStatus! == 1) { <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>Mala</title>\r\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\r\n <path id=\"Combined-Shape\"\r\n d=\"M426.667 0v341.333H0zM384 88.747 170.666 259.413v39.253H384z\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n } @else { <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Sin Señal</title>\r\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667zm15-1.666H5.692L16.667 5.692z\" />\r\n </svg>\r\n }\r\n @if (d.status.bluetooth) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Conectado</title>\r\n <path fill=\"#454733\"\r\n d=\"m15.296 6.425-4.758-4.758h-.834v6.325L5.88 4.167 4.704 5.342 9.363 10l-4.659 4.658 1.175 1.175 3.825-3.825v6.325h.834l4.758-4.758L11.713 10zM11.37 4.858l1.567 1.567-1.567 1.567zm1.567 8.717-1.567 1.567v-3.134z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Desconectado</title>\r\n <path fill=\"#454733\"\r\n d=\"M10.833 4.858 12.4 6.425l-1.333 1.333 1.175 1.175 2.516-2.516L10 1.667h-.833v4.191l1.666 1.667zM4.508 3.333 3.333 4.508 8.825 10l-4.658 4.658 1.175 1.175 3.825-3.825v6.325H10l3.575-3.575 1.917 1.909 1.175-1.175zm6.325 11.809v-3.134l1.567 1.567z\" />\r\n </svg>\r\n }\r\n @if (d.status.gps) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <g clip-path=\"url(#clip0_3_9268)\">\r\n <title>Localizado</title>\r\n <path fill=\"#454733\"\r\n d=\"M10 6.667a3.332 3.332 0 1 0 0 6.666 3.332 3.332 0 1 0 0-6.666m7.45 2.5a7.495 7.495 0 0 0-6.617-6.617V.833H9.167V2.55A7.495 7.495 0 0 0 2.55 9.167H.833v1.666H2.55a7.495 7.495 0 0 0 6.617 6.617v1.717h1.666V17.45a7.495 7.495 0 0 0 6.617-6.617h1.717V9.167zM10 15.833A5.83 5.83 0 0 1 4.167 10 5.83 5.83 0 0 1 10 4.167 5.83 5.83 0 0 1 15.833 10 5.83 5.83 0 0 1 10 15.833\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3_9268\">\r\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <g clip-path=\"url(#clip0_3_9268)\">\r\n <title>No Localizado</title>\r\n <path fill=\"#454733\"\r\n d=\"M17.45 9.167a7.495 7.495 0 0 0-6.617-6.617V.833H9.167V2.55a7.4 7.4 0 0 0-2.309.65l1.275 1.275a5.83 5.83 0 0 1 7.392 7.392l1.275 1.275a7.4 7.4 0 0 0 .65-2.309h1.717V9.167zM2.5 3.558l1.7 1.7a7.5 7.5 0 0 0-1.65 3.909H.833v1.666H2.55a7.495 7.495 0 0 0 6.617 6.617v1.717h1.666V17.45a7.5 7.5 0 0 0 3.909-1.65l1.7 1.7 1.175-1.175L3.675 2.383zm11.058 11.059a5.829 5.829 0 0 1-8.175-8.175z\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3_9268\">\r\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <span class=\"badge\" [ngClass]=\"getGeofenceClass(d.status.geofence)\">\r\n {{ d.status.geofence === 'inside' ? 'DENTRO DE GEOCERCA' : 'FUERA DE GEOCERCA' }}\r\n </span>\r\n\r\n <span class=\"badge update\">{{ getRelativeTime(d.lastUpdate) }}</span>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (canScrollRight) {\r\n <button class=\"nav right\" (click)=\"scroll(list,'right')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-chevron-right\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" stroke=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path d=\"m9 6 6 6-6 6\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n</div>","import { CommonModule } from '@angular/common';\nimport {\n Component,\n effect,\n ElementRef,\n forwardRef,\n input,\n NgZone,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { FilterItem, Hour12 } from '../../interfaces/filters';\n\n@Component({\n selector: 'lib-input-time-filter',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './input-time-filter.html',\n styleUrl: './input-time-filter.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputTimeFilter),\n multi: true,\n },\n ],\n})\nexport class InputTimeFilter implements ControlValueAccessor, OnDestroy {\n // Inputs\n filters = input<FilterItem[]>([]);\n clearTrigger = input<number>(0);\n\n // Outputs\n filterSelected = output<{ filter: string; value: string }>();\n valueChange = output<string | null>();\n enterPressed = output<void>();\n\n // Estado interno\n filterValues = signal<Record<string, string>>({});\n activeFilterType = signal<string | null>(null);\n isOpen = signal<boolean>(false);\n\n // Estado de hora para el filtro activo\n selectedHour = signal<number>(0); // 0–23\n selectedMinute = signal<number>(0); // 0–59\n selectedAmPm = signal<'AM' | 'PM'>('AM');\n\n isDisabled = signal(false);\n isTouched = signal(false);\n\n // Listas derivadas para el dropdown\n hours12 = signal<Hour12[]>(\n Array.from({ length: 12 }, (_, i) => {\n const hour12 = i === 0 ? 12 : i;\n return {\n value: hour12,\n display: hour12.toString().padStart(2, '0'),\n };\n }),\n );\n\n get selectedHour12(): number {\n const hour24 = this.selectedHour();\n if (hour24 === 0) return 12;\n if (hour24 > 12) return hour24 - 12;\n return hour24;\n }\n\n minutes = signal<number[]>(Array.from({ length: 60 }, (_, i) => i));\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n private documentClickListener?: (event: Event) => void;\n\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {\n // Limpiar cuando cambie el trigger externo\n effect(() => {\n const trigger = this.clearTrigger();\n if (trigger > 0) {\n this.resetAllFilters();\n }\n });\n }\n\n ngOnDestroy() {\n this.removeDocumentListener();\n }\n\n // ControlValueAccessor\n writeValue(_value: string | null): void {\n // No se usa para múltiples filtros, se controla por filterValues\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n // API pública\n toggleDropdown(filterValue: string) {\n if (this.isDisabled()) return;\n\n const isSame = this.activeFilterType() === filterValue;\n if (isSame && this.isOpen()) {\n this.closeDropdown();\n return;\n }\n\n this.activeFilterType.set(filterValue);\n this.syncTimeFromValue(filterValue);\n this.isOpen.set(true);\n this.addDocumentListener();\n }\n\n closeDropdown() {\n this.isOpen.set(false);\n this.removeDocumentListener();\n }\n\n onEnter(event: KeyboardEvent) {\n if (event.key !== 'Enter') return;\n event.preventDefault();\n this.closeDropdown();\n this.enterPressed.emit();\n }\n\n // Setters de tiempo\n setHour12(hour12: number) {\n if (this.isDisabled()) return;\n const amPm = this.selectedAmPm();\n const hour24 =\n hour12 === 12\n ? amPm === 'AM'\n ? 0\n : 12\n : amPm === 'AM'\n ? hour12\n : hour12 + 12;\n this.selectedHour.set(hour24);\n this.commitTime();\n }\n\n setMinute(minute: number) {\n if (this.isDisabled()) return;\n this.selectedMinute.set(minute);\n this.commitTime();\n }\n\n setAmPm(amPm: 'AM' | 'PM') {\n if (this.isDisabled()) return;\n const currentHour12 = this.selectedHour12;\n const newHour24 =\n amPm === 'AM'\n ? currentHour12 === 12\n ? 0\n : currentHour12\n : currentHour12 === 12\n ? 12\n : currentHour12 + 12;\n this.selectedAmPm.set(amPm);\n this.selectedHour.set(newHour24);\n this.commitTime();\n }\n\n clearActive(filterValue: string) {\n if (this.isDisabled()) return;\n this.markAsTouched();\n this.filterValues.update((current) => {\n const updated = { ...current };\n delete updated[filterValue];\n return updated;\n });\n\n this.onChange(null);\n this.valueChange.emit(null);\n this.filterSelected.emit({ filter: filterValue, value: '' });\n }\n\n // Internos\n private resetAllFilters() {\n this.filterValues.set({});\n this.onChange(null);\n this.valueChange.emit(null);\n this.isOpen.set(false);\n }\n\n private markAsTouched() {\n if (!this.isTouched()) {\n this.isTouched.set(true);\n this.onTouched();\n }\n }\n\n private syncTimeFromValue(filterValue: string) {\n const value = this.filterValues()[filterValue];\n if (!value) {\n this.selectedHour.set(0);\n this.selectedMinute.set(0);\n this.selectedAmPm.set('AM');\n return;\n }\n\n const [hh, mm] = value.split(':').map((v) => parseInt(v, 10));\n if (isNaN(hh) || isNaN(mm)) {\n this.selectedHour.set(0);\n this.selectedMinute.set(0);\n this.selectedAmPm.set('AM');\n return;\n }\n\n this.selectedHour.set(hh);\n this.selectedMinute.set(mm);\n this.selectedAmPm.set(hh >= 12 ? 'PM' : 'AM');\n }\n\n private commitTime() {\n const filterValue = this.activeFilterType();\n if (!filterValue) return;\n\n this.markAsTouched();\n\n const hh = this.selectedHour().toString().padStart(2, '0');\n const mm = this.selectedMinute().toString().padStart(2, '0');\n const timeString = `${hh}:${mm}`;\n\n this.filterValues.update((current) => ({\n ...current,\n [filterValue]: timeString,\n }));\n\n this.onChange(timeString);\n this.valueChange.emit(timeString);\n this.filterSelected.emit({\n filter: filterValue,\n value: timeString,\n });\n }\n\n private addDocumentListener() {\n this.removeDocumentListener();\n\n this.ngZone.runOutsideAngular(() => {\n this.documentClickListener = (event: Event) => {\n const target = event.target as Node;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.ngZone.run(() => {\n if (this.isOpen()) {\n this.closeDropdown();\n }\n });\n }\n };\n\n setTimeout(() => {\n document.addEventListener('click', this.documentClickListener!, true);\n }, 10);\n });\n }\n\n private removeDocumentListener() {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener, true);\n this.documentClickListener = undefined;\n }\n }\n}\n","<div class=\"filter-chips\">\n @for (item of filters(); track item.value) {\n <div\n class=\"chip-input-wrapper\"\n [class.has-value]=\"filterValues()[item.value]\"\n [class.active]=\"activeFilterType() === item.value && isOpen()\"\n >\n <label class=\"floating-label\">\n {{ item.placeholder || item.label || 'Seleccionar hora' }}\n </label>\n\n <input\n type=\"text\"\n class=\"chip-input\"\n [value]=\"filterValues()[item.value] || ''\"\n [placeholder]=\"item.placeholder || item.label || 'hh:mm'\"\n readonly\n [disabled]=\"isDisabled()\"\n (click)=\"toggleDropdown(item.value)\"\n (keydown)=\"onEnter($event)\"\n />\n\n <button\n type=\"button\"\n class=\"time-icon-button\"\n (click)=\"toggleDropdown(item.value)\"\n title=\"Seleccionar hora\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <polyline points=\"12 7 12 12 15 15\" />\n </svg>\n </button>\n\n @if (isOpen() && activeFilterType() === item.value) {\n <div class=\"dropdown\">\n <div class=\"datetime-content\">\n <div class=\"time-section\">\n <!-- <div class=\"time-header\">Horario</div> -->\n\n <div class=\"time-selectors\">\n <div class=\"time-group\">\n <div class=\"time-column\">\n <div class=\"time-label\">Hora</div>\n <div class=\"time-scroll\">\n @for (hour of hours12(); track hour.value) {\n <div\n class=\"time-option\"\n [class.selected]=\"hour.value === selectedHour12\"\n (click)=\"setHour12(hour.value)\"\n >\n {{ hour.display }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"time-separator-vertical\">:</div>\n\n <div class=\"time-column\">\n <div class=\"time-label\">Min</div>\n <div class=\"time-scroll\">\n @for (minute of minutes(); track minute) {\n <div\n class=\"time-option\"\n [class.selected]=\"minute === selectedMinute()\"\n (click)=\"setMinute(minute)\"\n >\n {{ minute.toString().padStart(2, '0') }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"time-column\">\n <div class=\"time-label\">AM/PM</div>\n <div class=\"time-scroll ampm\">\n <div\n class=\"time-option\"\n [class.selected]=\"selectedAmPm() === 'AM'\"\n (click)=\"setAmPm('AM')\"\n >\n AM\n </div>\n <div\n class=\"time-option\"\n [class.selected]=\"selectedAmPm() === 'PM'\"\n (click)=\"setAmPm('PM')\"\n >\n PM\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button\n type=\"button\"\n class=\"action-btn secondary\"\n (click)=\"clearActive(item.value)\"\n >\n Limpiar\n </button>\n <button\n type=\"button\"\n class=\"action-btn primary\"\n (click)=\"closeDropdown()\"\n >\n Aceptar\n </button>\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import { Component, computed, ElementRef, input, output, signal, ViewChild } from '@angular/core';\nimport { DateFilterSelection, FilterItem, FilterType, SelectedDatesMap } from '../../interfaces/filters';\nimport { InputNumberFilter } from '../input-number-filter/input-number-filter';\nimport { InputTextFilter } from '../input-text-filter/input-text-filter';\nimport { InputSelectFilter } from '../input-select-filter/input-select-filter';\nimport { DateTimeFilter } from '../date-time-filter/date-time-filter';\nimport { InputTimeFilter } from '../input-time-filter/input-time-filter';\nimport { Button } from '../button/button';\n\nexport interface TitleFilterConfig {\n type: FilterType;\n filters: FilterItem[];\n}\n\ntype FilterButtonMode = 'toggle' | 'action' | 'click' | 'clickRight';\n\n@Component({\n selector: 'lib-title-filters',\n imports: [InputNumberFilter, InputTextFilter, InputSelectFilter, DateTimeFilter, InputTimeFilter, Button],\n templateUrl: './title-filters.html',\n styleUrl: './title-filters.css',\n})\nexport class TitleFilters {\n @ViewChild('filtersContainer', { read: ElementRef })\n filtersContainer!: ElementRef<HTMLElement>;\n\n @ViewChild('submitBtn', { read: ElementRef })\n submitBtn?: ElementRef<HTMLElement>;\n\n showFilters = signal<boolean>(false);\n\n title = input<string>('Listado');\n filtersConfig = input<TitleFilterConfig[]>([]);\n\n filtersChange = output<Record<string, string | number | Date | null>>();\n\n applyFilters = output<void>();\n clearFilters = output<void>();\n\n clearFilterTrigger = signal(0);\n\n selectedDates = signal<SelectedDatesMap>({});\n selectedTextFilters = signal<Record<string, string>>({});\n\n buttonMode = input<FilterButtonMode>('toggle');\n filterButtonClicked = output<void>();\n\n // Botón de acción\n clickButtonIcon = input<string>('');\n clickButtonLabel = input<string>('Acción');\n alwaysShowFilters = input<boolean>(false);\n\n // Botón secundario\n showSecondaryButton = input<boolean>(false);\n secondaryButtonIcon = input<string>('icon-download');\n secondaryButtonLabel = input<string>('Exportar PDF');\n secondaryButtonClicked = output<void>();\n\n // Botón de exportar\n showButtonExport = input<boolean>(false);\n exportButtonIcon = input<string>('icon-export');\n exportButtonLabel = input<string>('Exportar CSV');\n exportButtonClicked = output<void>();\n\n // Botón de atrás\n showButtonBack = input<boolean>(false);\n clickButtonBack = output<void>();\n\n private emitAllFilters(\n textFilters: Record<string, string>,\n dateFilters: SelectedDatesMap\n ): void {\n this.filtersChange.emit({\n ...textFilters,\n ...dateFilters,\n });\n }\n\n private normalizeSelectOptions(options: any[]) {\n return options.map(opt => ({\n label: String(opt.label ?? opt.name ?? opt.text),\n value: String(opt.value ?? opt.code ?? opt.id),\n }));\n }\n\n private normalizeFilters(filters: FilterItem[]): FilterItem[] {\n return filters.map(filter => {\n if (!filter.options) return filter;\n\n return {\n ...filter,\n options: this.normalizeSelectOptions(filter.options),\n };\n });\n }\n\n normalizedFiltersConfig = computed<TitleFilterConfig[]>(() => {\n return this.filtersConfig().map(group => ({\n ...group,\n filters: this.normalizeFilters(group.filters),\n }));\n });\n\n\n onFilterButtonClick() {\n if (this.buttonMode() === 'toggle') {\n this.toggleFilters();\n } else {\n this.filterButtonClicked.emit();\n }\n }\n\n get filtersVisible(): boolean {\n return this.alwaysShowFilters() || this.showFilters();\n }\n\n toggleFilters(): void {\n this.showFilters.update((v) => !v);\n }\n\n clearAllFilters(): void {\n this.selectedDates.set({});\n this.selectedTextFilters.set({});\n this.clearFilterTrigger.update(v => v + 1);\n this.filtersChange.emit({});\n this.clearFilters.emit();\n }\n\n onApplyFilters(): void {\n this.applyFilters.emit();\n }\n\n onDateSelected(event: DateFilterSelection): void {\n this.selectedDates.update((current) => {\n const updated = {\n ...current,\n [event.filter]: event.value,\n };\n\n this.emitAllFilters(this.selectedTextFilters(), updated);\n return updated;\n });\n }\n\n onFilterSelected(event: { filter: string; value: string }): void {\n this.selectedTextFilters.update((current) => {\n const updated = {\n ...current,\n [event.filter]: event.value,\n };\n\n this.emitAllFilters(updated, this.selectedDates());\n return updated;\n });\n }\n\n focusNextFilter() {\n const container = this.filtersContainer?.nativeElement;\n if (!container) return;\n\n\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>(\n 'input:not([disabled]), textarea:not([disabled]), select:not([disabled])'\n )\n ).filter(el => el.offsetParent !== null); // solo visibles\n\n const active = document.activeElement as HTMLElement;\n const index = focusable.indexOf(active);\n\n // 👉 Si hay siguiente → foco\n if (index >= 0 && index < focusable.length - 1) {\n focusable[index + 1].focus();\n return;\n }\n\n // 👉 Si es el último → aplicar filtros\n this.onApplyFilters();\n }\n\n clickButton() {\n this.clickButtonBack.emit();\n }\n\n /* focusNextFilter() {\n const container = this.filtersContainer?.nativeElement;\n if (!container) return;\n\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>(\n '[tabindex], input:not([disabled]), button:not([disabled])'\n )\n ).filter(el => el.offsetParent !== null);\n\n const active = document.activeElement as HTMLElement;\n const index = focusable.indexOf(active);\n\n // 👉 siguiente foco\n if (index >= 0 && index < focusable.length - 1) {\n focusable[index + 1].focus();\n return;\n }\n\n // 👉 último → enfocar botón submit\n this.focusSubmitButton();\n }\n\n focusSubmitButton() {\n const btn = this.submitBtn?.nativeElement;\n if (!btn) return;\n\n btn.focus();\n } */\n}\n","<div class=\"header-container-table\">\n <div class=\"filters-dashboard-table\">\n <div class=\"left-title\">\n @if(showButtonBack()) {\n <div class=\"button-back\" (click)=\"clickButton()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"icon-tabler icons-tabler-outline icon-tabler-arrow-left\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M5 12l14 0\" />\n <path d=\"M5 12l6 6\" />\n <path d=\"M5 12l6 -6\" />\n </svg>\n </div>\n }\n <div class=\"title-table\">{{ title() }}</div>\n </div>\n\n @if (buttonMode() === 'toggle') {\n <div class=\"button-small-primary\" (click)=\"toggleFilters()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-filter\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z\" />\n </svg>\n <div class=\"label\">Filtros</div>\n </div>\n }\n @if (buttonMode() === 'action') {\n <div class=\"button-small-primary\" (click)=\"onFilterButtonClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\"\n d=\"M10.85 16.608v1.684a8.3 8.3 0 0 0 4.433-1.842L14.1 15.258a6.6 6.6 0 0 1-3.25 1.35M3.358 10c0-3.375 2.525-6.175 5.792-6.608V1.708C4.958 2.15 1.692 5.7 1.692 10s3.266 7.85 7.458 8.292v-1.684C5.883 16.175 3.358 13.375 3.358 10m13.267-.833h1.683a8.3 8.3 0 0 0-1.841-4.434l-1.192 1.192a6.56 6.56 0 0 1 1.35 3.242M15.283 3.55a8.3 8.3 0 0 0-4.433-1.842v1.684a6.6 6.6 0 0 1 3.25 1.35zm-.008 10.533 1.192 1.184a8.3 8.3 0 0 0 1.841-4.434h-1.683a6.6 6.6 0 0 1-1.35 3.25\" />\n <path fill=\"#fff\"\n d=\"M13.333 9.25c0-2.075-1.583-3.417-3.333-3.417S6.667 7.175 6.667 9.25c0 1.383 1.108 3.025 3.333 4.917 2.225-1.892 3.333-3.534 3.333-4.917M10 10a.893.893 0 0 1 0-1.783A.893.893 0 0 1 10 10\" />\n </svg>\n <div class=\"label\">Ir al Mapa</div>\n </div>\n }\n @if (buttonMode() === 'click') {\n <lib-button variant=\"primary\" (clicked)=\"onFilterButtonClick()\">\n @if (clickButtonIcon()) {\n <span class=\"btn-icon {{clickButtonIcon()}}\"></span>\n }\n {{ clickButtonLabel() }}\n </lib-button>\n }\n <div class=\"secondary-action-btn\">\n @if (showSecondaryButton()) {\n <lib-button variant=\"secondary\" (clicked)=\"secondaryButtonClicked.emit()\">\n @if (secondaryButtonIcon()) {\n <span class=\"btn-icon {{secondaryButtonIcon()}}\"></span>\n }\n {{ secondaryButtonLabel() }}\n </lib-button>\n }\n @if (showButtonExport()) {\n <lib-button variant=\"outline\" (clicked)=\"exportButtonClicked.emit()\">\n <span class=\"btn-icon {{exportButtonIcon()}}\"></span>\n {{ exportButtonLabel() }}\n </lib-button>\n }\n @if (buttonMode() === 'clickRight') {\n <lib-button variant=\"primary\" (clicked)=\"onFilterButtonClick()\">\n @if (clickButtonIcon()) {\n <span class=\"btn-icon {{clickButtonIcon()}}\"></span>\n }\n {{ clickButtonLabel() }}\n </lib-button>\n }\n </div>\n </div>\n\n @if (filtersVisible) {\n <div class=\"filters-container\" #filtersContainer>\n <div class=\"filters-wrapper\">\n\n @for (config of normalizedFiltersConfig(); track $index) {\n @switch (config.type) {\n @case ('text') {\n <lib-input-text-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('number') {\n <lib-input-number-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('select') {\n <lib-input-select-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('date') {\n <lib-date-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (dateSelected)=\"onDateSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('time') {\n <lib-input-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n }\n }\n\n <div class=\"actions\">\n <lib-button #submitBtn tabindex=\"0\" [size]=\"'compact'\" (click)=\"onApplyFilters()\"\n (keydown.enter)=\"onApplyFilters()\">\n Aplicar Filtros\n </lib-button>\n\n <lib-button [variant]=\"'outline'\" [size]=\"'compact'\" (click)=\"clearAllFilters()\">\n Borrar Filtros\n </lib-button>\n </div>\n </div>\n </div>\n }\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'lib-notification-modal',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './notification-modal.html',\r\n styleUrl: './notification-modal.css',\r\n})\r\nexport class NotificationModal {\r\n @ViewChild('messageInput') messageInput!: ElementRef<HTMLTextAreaElement>;\r\n\r\n mode: 'list' | 'edit' = 'list';\r\n\r\n messageControl = new FormControl<string>('', { nonNullable: true });\r\n\r\n @Input() titulo = 'Notificar a este Agente';\r\n @Output() buttonClick = new EventEmitter<string>();\r\n\r\n\r\n itemLabel = '¡URGENTE!';\r\n btnLabel = 'Personalizado';\r\n\r\n defaultMessages = [\r\n '¡URGENTE!',\r\n '¡ALERTA!',\r\n '¡EMERGENCIA!'\r\n ];\r\n\r\n selectDefaultMessage(message: string) {\r\n this.mode = 'edit';\r\n this.messageControl.setValue(message);\r\n\r\n setTimeout(() => {\r\n const el = this.messageInput.nativeElement;\r\n el.focus();\r\n el.setSelectionRange(message.length, message.length);\r\n });\r\n }\r\n\r\n customMessage() {\r\n this.mode = 'edit';\r\n this.messageControl.reset('');\r\n\r\n setTimeout(() => {\r\n this.messageInput.nativeElement.focus();\r\n });\r\n }\r\n\r\n btnClick() {\r\n const value = this.messageControl.value.trim();\r\n if (!value) return;\r\n \r\n \r\n this.buttonClick.emit(value);\r\n }\r\n\r\n backToList() {\r\n this.mode = 'list';\r\n this.messageControl.reset('');\r\n }\r\n}\r\n","<div class=\"notification-modal-container\">\r\n <div class=\"notification-modal-header\">\r\n <h3>{{ titulo }}</h3>\r\n </div>\r\n <div class=\"notification-modal-body\">\r\n <!-- LISTA DE MENSAJES -->\r\n @if (mode === 'list') {\r\n <div class=\"default-message-list\">\r\n @for (msg of defaultMessages; track msg) {\r\n <div class=\"default-message-item\" (click)=\"selectDefaultMessage(msg)\">\r\n <span>{{ msg }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-send-2\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" stroke=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path\r\n d=\"M4.698 4.034 21 12 4.698 19.966a.5.5 0 0 1-.546-.124.56.56 0 0 1-.12-.568L6.5 12 4.032 4.726a.56.56 0 0 1 .12-.568.5.5 0 0 1 .546-.124M6.5 12H21\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- EDICIÓN -->\r\n @if (mode === 'edit') {\r\n <div class=\"text-area-wrapper\">\r\n <textarea #messageInput class=\"message-textarea\" rows=\"5\" placeholder=\"Mensaje...\" [formControl]=\"messageControl\"></textarea>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"notification-modal-actions\">\r\n @if (mode === 'edit') {\r\n <button class=\"btn-back\" (click)=\"backToList()\">\r\n Volver\r\n </button>\r\n <button class=\"btn-custom\" [disabled]=\"!messageControl.value.trim()\" (click)=\"btnClick()\">\r\n Notificar\r\n </button>\r\n } @else {\r\n <button class=\"btn-custom\" (click)=\"customMessage()\">\r\n Personalizado\r\n </button>\r\n }\r\n </div>\r\n</div>","import { Component } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'app-footer',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './footer.html',\r\n styleUrl: './footer.css',\r\n})\r\nexport class Footer {\r\n}","<footer class=\"footer\">\r\n © 2026 <span>PAICO · Sistemas y Aplicaciones en Línea.</span> Todos los derechos reservados.\r\n</footer>\r\n","import { Component, output, computed, input, signal } from '@angular/core';\r\n\r\nexport type OpcionButtonVariant = 'success' | 'danger';\r\n\r\ninterface ValidationOption {\r\n label: string;\r\n subtitle: string;\r\n variant: OpcionButtonVariant;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-button-cards',\r\n imports: [],\r\n templateUrl: './button-cards.html',\r\n styleUrl: './button-cards.css',\r\n})\r\nexport class ButtonCards {\r\n groupCard = input<Boolean>(false);\r\n label = input<string>();\r\n subtitle = input<string>();\r\n variant = input<OpcionButtonVariant>('success');\r\n\r\n // Estado interno\r\n selectedSingle = signal(false);\r\n selectedGroup = signal<OpcionButtonVariant | null>('success');\r\n\r\n // Output\r\n selectedChange = output<OpcionButtonVariant>();\r\n\r\n // Computeds\r\n isSuccess = computed(() => this.variant() === 'success');\r\n isDanger = computed(() => this.variant() === 'danger');\r\n\r\n options = computed<ValidationOption[]>(() => [\r\n {\r\n label: 'Aprobar Evidencia',\r\n subtitle: 'La evidencia cumple con los requisitos',\r\n variant: 'success'\r\n },\r\n {\r\n label: 'Rechazar Evidencia',\r\n subtitle: 'La evidencia no cumple con los requisitos',\r\n variant: 'danger'\r\n }\r\n ]);\r\n\r\n toggleSingle() {\r\n this.selectedSingle.update(v => !v);\r\n this.selectedChange.emit(this.variant());\r\n }\r\n\r\n selectGroup(option: OpcionButtonVariant) {\r\n this.selectedGroup.set(option);\r\n this.selectedChange.emit(option);\r\n }\r\n\r\n isSelected(option: OpcionButtonVariant) {\r\n return this.selectedGroup() === option;\r\n }\r\n}\r\n","@if (!groupCard()) {\r\n\r\n<!-- MODO SINGLE -->\r\n<button class=\"opcion-boton\" [class.opcion-activa]=\"selectedSingle()\"\r\n [class.opcion-success]=\"selectedSingle() && isSuccess()\" [class.opcion-danger]=\"selectedSingle() && isDanger()\"\r\n (click)=\"toggleSingle()\">\r\n\r\n <div class=\"opcion-contenido\">\r\n <div class=\"opcion-icono-container\" [class.icono-activo]=\"selectedSingle()\">\r\n\r\n @if (isSuccess()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\" [class.icon-success]=\"selectedSingle() && isSuccess()\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n } @else if(isDanger()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-x\" [class.icon-danger]=\"selectedSingle() && isDanger()\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M10 10l4 4m0 -4l-4 4\" />\r\n </svg>\r\n }\r\n </div>\r\n\r\n <div class=\"opcion-textos\">\r\n <div class=\"opcion-titulo\" [class.titulo-success]=\"selectedSingle() && isSuccess()\"\r\n [class.titulo-danger]=\"selectedSingle() && isDanger()\">\r\n {{ label() }}\r\n </div>\r\n\r\n <div class=\"opcion-subtitulo\" [class.subtitulo-success]=\"selectedSingle() && isSuccess()\"\r\n [class.subtitulo-danger]=\"selectedSingle() && isDanger()\">\r\n {{ subtitle() }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (selectedSingle()) {\r\n <div class=\"indicador-seleccion\">\r\n <div class=\"indicador-punto\" [class.punto-success]=\"isSuccess()\" [class.punto-danger]=\"isDanger()\">\r\n </div>\r\n </div>\r\n }\r\n</button>\r\n\r\n} @else {\r\n<!-- MODO GROUP -->\r\n<div class=\"columnCards\">\r\n @for (option of options(); track option.variant) {\r\n <button class=\"opcion-boton\" [class.opcion-activa]=\"isSelected(option.variant)\"\r\n [class.opcion-success]=\"isSelected(option.variant) && option.variant === 'success'\"\r\n [class.opcion-danger]=\"isSelected(option.variant) && option.variant === 'danger'\"\r\n (click)=\"selectGroup(option.variant)\">\r\n <div class=\"opcion-contenido\">\r\n <div class=\"opcion-icono-container\">\r\n @if (option.variant === 'success') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n } @else if(option.variant === 'danger') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-x\" [class.icon-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M10 10l4 4m0 -4l-4 4\" />\r\n </svg>\r\n }\r\n </div>\r\n\r\n <div class=\"opcion-textos\">\r\n <div class=\"opcion-titulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\r\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\r\n {{ option.label }}\r\n </div>\r\n\r\n <div class=\"opcion-subtitulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\r\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\r\n {{ option.subtitle }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (isSelected(option.variant)) {\r\n <div class=\"indicador-seleccion\">\r\n <div class=\"indicador-punto\" [class.punto-success]=\"option.variant === 'success'\"\r\n [class.punto-danger]=\"option.variant === 'danger'\">\r\n </div>\r\n </div>\r\n }\r\n </button>\r\n }\r\n</div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, input, model, output } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { SectionConfig, DynamicFormFields } from '../dynamic-form-fields/dynamic-form-fields';\r\nimport { Input } from \"../input/input\";\r\n\r\n/** Colores predefinidos para el fondo de la card */\r\nexport const CARD_BG = {\r\n default: '#EBE8D6',\r\n light: '#ededdf',\r\n} as const;\r\n\r\nexport type CardBgPreset = keyof typeof CARD_BG;\r\n\r\n@Component({\r\n selector: 'lib-card-content',\r\n imports: [CommonModule, DynamicFormFields, Input],\r\n templateUrl: './card-content.html',\r\n styleUrl: './card-content.css',\r\n})\r\nexport class CardContent {\r\n title = input<string>('Título de sección');\r\n isForm = input<boolean>(false);\r\n form = input<FormGroup>();\r\n sections = input<SectionConfig[]>([]);\r\n variant = input<string>('default');\r\n sectionNumber = input<number | null>(null);\r\n compact = input<boolean>(false);\r\n searchRegex = input<RegExp | null>(null);\r\n\r\n /**\r\n * Color de fondo de la card.\r\n * Acepta un preset ('beige' | 'white') o cualquier valor CSS válido (hex, rgb, etc.).\r\n * Por defecto 'beige' (#EBE8D6).\r\n */\r\n bgColor = input<CardBgPreset | string>('default');\r\n\r\n /** Muestra la barra de búsqueda */\r\n withSearch = input<boolean>(false);\r\n /** Placeholder del input de búsqueda */\r\n searchPlaceholder = input<string>('Buscar...');\r\n /** Valor del input de búsqueda (two-way binding con [(searchValue)]) */\r\n searchValue = model<string>('');\r\n /** Se emite al presionar Enter o el botón buscar */\r\n onSearch = output<string>();\r\n /** Se emite al borrar el valor del input */\r\n onSearchClear = output<void>();\r\n\r\n /** Resuelve preset → hex, o pasa directo si es un color custom */\r\n readonly resolvedBg = computed(() => {\r\n const c = this.bgColor();\r\n return (CARD_BG as Record<string, string>)[c] ?? c;\r\n });\r\n\r\n /** Aplica background y --sl-form-surface juntos para que los labels siempre coincidan */\r\n readonly cardStyles = computed(() => ({\r\n 'background': this.resolvedBg(),\r\n '--sl-form-surface': this.resolvedBg(),\r\n }));\r\n}\r\n","<div class=\"card\" [style]=\"cardStyles()\">\r\n @if (variant() === 'default') {\r\n <div class=\"card-header\">\r\n <p>{{ title() }}</p>\r\n </div>\r\n }\r\n @if (variant() === 'numeric') {\r\n <div class=\"card-header-numeric\">\r\n <span class=\"card-header-icon\">\r\n <svg viewBox=\"0 0 24 24\" class=\"card-header-icon-svg\" aria-hidden=\"true\" focusable=\"false\">\r\n <circle cx=\"12\" cy=\"12\" r=\"12\" class=\"card-header-icon-circle\" />\r\n <text x=\"12\" y=\"12\" text-anchor=\"middle\" dominant-baseline=\"central\" class=\"card-header-icon-text\">\r\n {{ sectionNumber() }}\r\n </text>\r\n </svg>\r\n </span>\r\n <p>{{ title() }}</p>\r\n </div>\r\n }\r\n <div class=\"card-content\">\r\n @if (isForm()) {\r\n @if (withSearch()) {\r\n <div class=\"search-wrapper\">\r\n <lib-input\r\n mode=\"search\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n [(value)]=\"searchValue\"\r\n (onSearch)=\"onSearch.emit($event)\"\r\n (onClear)=\"onSearchClear.emit()\"\r\n [regex]=\"searchRegex()\"\r\n />\r\n </div>\r\n }\r\n <lib-dynamic-form-fields [form]=\"form()!\" [sections]=\"sections()!\" [compact]=\"compact()\" />\r\n } @else {\r\n <ng-content></ng-content>\r\n }\r\n </div>\r\n</div>","import { Component, computed, DestroyRef, effect, inject, input, model, output, signal, viewChildren } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { CardContent, CardBgPreset } from '../card-content/card-content';\r\nimport { DynamicFormFields, SectionConfig } from '../dynamic-form-fields/dynamic-form-fields';\r\nimport { InfoGroup, InfoItem } from '../info-group/info-group';\r\nimport { Input } from '../input/input';\r\n\r\nexport type TabId = string | number;\r\n\r\nexport interface TabCardConfig {\r\n title: string;\r\n // --- Modo formulario (existente) ---\r\n isForm?: boolean;\r\n form?: FormGroup;\r\n sections?: SectionConfig[];\r\n compact?: boolean;\r\n variant?: 'default' | 'numeric';\r\n sectionNumber?: number | null;\r\n withSearch?: boolean;\r\n searchPlaceholder?: string;\r\n /** Color de fondo de la card. Acepta preset ('default' | 'light') o cualquier valor CSS. */\r\n bgColor?: CardBgPreset | string;\r\n /** Callback al buscar (Enter o botón buscar) */\r\n onSearch?: (value: string) => void;\r\n /** Callback al limpiar el input de búsqueda */\r\n onSearchClear?: () => void;\r\n /** Regex para validar el input de búsqueda */\r\n searchRegex?: RegExp | null;\r\n // --- Modo info-group ---\r\n /** Modo info: items en grid de dos columnas. */\r\n infoItems?: InfoItem[];\r\n infoTitleAlign?: 'center' | 'left' | 'right';\r\n /** Modo comparación: columnas independientes. */\r\n infoItemsLeft?: InfoItem[];\r\n infoItemsRight?: InfoItem[];\r\n infoTitleLeft?: string;\r\n infoTitleRight?: string;\r\n}\r\n\r\nexport interface TabTogglesConfig {\r\n /** FormGroup que respalda los toggles — los cambios se emiten automáticamente. */\r\n form: FormGroup;\r\n /** Secciones con fields de tipo 'toggle'. */\r\n sections: SectionConfig[];\r\n}\r\n\r\nexport interface TabSearchConfig {\r\n /** Placeholder del input de búsqueda */\r\n placeholder?: string;\r\n /** Callback al buscar (Enter o botón buscar) */\r\n onSearch?: (value: string) => void;\r\n /** Callback al limpiar el input de búsqueda */\r\n onClear?: () => void;\r\n /** Regex para validar el input de búsqueda */\r\n searchRegex?: RegExp | null;\r\n}\r\n\r\nexport interface TabItem {\r\n id: TabId;\r\n label: string;\r\n disabled?: boolean;\r\n /** Si se define, el componente renderiza automáticamente las cards al seleccionar el tab */\r\n cards?: TabCardConfig[];\r\n /** Toggles opcionales a mostrar encima de las cards (respaldados por FormGroup). */\r\n toggles?: TabTogglesConfig;\r\n /** Barra de búsqueda opcional a mostrar encima de las cards */\r\n search?: TabSearchConfig;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-tabs',\r\n imports: [CardContent, InfoGroup, DynamicFormFields, Input],\r\n templateUrl: './tabs.html',\r\n styleUrl: './tabs.css',\r\n})\r\nexport class Tabs {\r\n tabs = input<TabItem[]>([]);\r\n activeTab = input<TabId | null>(null);\r\n /**\r\n * Cuando es true, bloquea el cambio de tab si el formulario del tab actual\r\n * tiene campos inválidos. Útil para flujos de registro.\r\n * Para vistas de detalle dejar en false (default).\r\n */\r\n validateOnTabChange = input<boolean>(false);\r\n\r\n tabChange = output<TabId>();\r\n activeTabChange = output<TabId>();\r\n /** Emite el id del tab actual cuando la validación impide el cambio */\r\n tabValidationFailed = output<TabId>();\r\n\r\n private internalActive = signal<TabId | null>(null);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private validitySubs: Subscription[] = [];\r\n\r\n /**\r\n * Indica si todos los formularios del tab activo son válidos.\r\n * Se actualiza reactivamente cuando cambia la validez de cualquier campo.\r\n * true cuando el tab no tiene formularios (navegación libre).\r\n */\r\n readonly currentTabValid = signal<boolean>(true);\r\n\r\n /** Valor interno del buscador (para usar el componente `lib-input` en modo búsqueda) */\r\n readonly searchValue = model<string>('');\r\n\r\n constructor() {\r\n // Mantiene currentTabValid sincronizado con la validez real de los forms del tab activo\r\n effect(() => {\r\n const cards = this.activeCards();\r\n\r\n this.validitySubs.forEach(s => s.unsubscribe());\r\n this.validitySubs = [];\r\n\r\n const formCards = cards?.filter(c => c.isForm && c.form) ?? [];\r\n\r\n if (!formCards.length) {\r\n this.currentTabValid.set(true);\r\n return;\r\n }\r\n\r\n const updateValidity = () =>\r\n this.currentTabValid.set(formCards.every(c => c.form!.valid));\r\n\r\n updateValidity();\r\n\r\n formCards.forEach(c => {\r\n this.validitySubs.push(\r\n c.form!.statusChanges.subscribe(() => updateValidity())\r\n );\r\n });\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.validitySubs.forEach(s => s.unsubscribe());\r\n });\r\n\r\n effect(() => {\r\n const list = this.tabs();\r\n const external = this.activeTab();\r\n const internal = this.internalActive();\r\n\r\n if (!list.length) {\r\n if (internal !== null) this.internalActive.set(null);\r\n return;\r\n }\r\n\r\n const isValid = (id: TabId | null) => !!id && list.some(t => t.id === id);\r\n\r\n const next: TabId =\r\n isValid(external) ? external! :\r\n isValid(internal) ? internal! :\r\n list[0].id;\r\n\r\n if (internal !== next) {\r\n this.internalActive.set(next);\r\n }\r\n });\r\n }\r\n\r\n readonly active = computed<TabId | null>(() => {\r\n const list = this.tabs();\r\n if (!list.length) return null;\r\n\r\n const external = this.activeTab();\r\n if (external && list.some(t => t.id === external)) return external;\r\n\r\n return this.internalActive() ?? list[0].id;\r\n });\r\n\r\n readonly count = computed(() => Math.max(this.tabs().length, 1));\r\n\r\n readonly indicatorWidth = computed(() => `${100 / this.count()}%`);\r\n\r\n readonly activeIndex = computed(() => {\r\n const list = this.tabs();\r\n const a = this.active();\r\n if (!list.length || !a) return 0;\r\n const idx = list.findIndex(t => t.id === a);\r\n return idx >= 0 ? idx : 0;\r\n });\r\n\r\n readonly indicatorLeft = computed(() => `${(100 / this.count()) * this.activeIndex()}%`);\r\n\r\n /** Cards del tab activo — null si el tab no tiene cards definidas */\r\n readonly activeCards = computed<TabCardConfig[] | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n return tab?.cards ?? null;\r\n });\r\n\r\n /** Toggles del tab activo */\r\n readonly activeTabToggles = computed<TabTogglesConfig | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n return tab?.toggles ?? null;\r\n });\r\n\r\n /** Search del tab activo */\r\n readonly activeTabSearch = computed<TabSearchConfig | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n return tab?.search ?? null;\r\n });\r\n\r\n /** Placeholder de búsqueda del tab activo (siempre string) */\r\n readonly tabSearchPlaceholder = computed(() => {\r\n return this.activeTabSearch()?.placeholder ?? 'Buscar...';\r\n });\r\n\r\n childCards = viewChildren(CardContent);\r\n\r\n setTab(tabId: TabId) {\r\n if (tabId === this.active()) return;\r\n\r\n if (this.validateOnTabChange() && !this.isCurrentTabValid()) {\r\n this.tabValidationFailed.emit(this.active()!);\r\n return;\r\n }\r\n\r\n this.searchValue.set('');\r\n this.childCards().forEach(c => c.searchValue.set(''));\r\n this.internalActive.set(tabId);\r\n this.activeTabChange.emit(tabId);\r\n this.tabChange.emit(tabId);\r\n }\r\n\r\n /**\r\n * Valida los formularios del tab activo.\r\n * Marca todos los campos como touched para que los errores sean visibles.\r\n * Retorna true si todos los formularios son válidos (o si el tab no tiene forms).\r\n */\r\n private isCurrentTabValid(): boolean {\r\n const cards = this.activeCards();\r\n if (!cards) return true;\r\n\r\n const formCards = cards.filter(c => c.isForm && c.form);\r\n if (!formCards.length) return true;\r\n\r\n const allValid = formCards.every(c => c.form!.valid);\r\n\r\n if (!allValid) {\r\n formCards.forEach(c => c.form!.markAllAsTouched());\r\n }\r\n\r\n return allValid;\r\n }\r\n\r\n // Accesibilidad \r\n onTabKeydown(event: KeyboardEvent, currentId: TabId) {\r\n const key = event.key;\r\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End', 'Enter', ' '].includes(key)) return;\r\n\r\n event.preventDefault();\r\n\r\n if (key === 'Enter' || key === ' ') {\r\n this.setTab(currentId);\r\n this.focusTab(currentId);\r\n return;\r\n }\r\n\r\n const nextId =\r\n key === 'Home' ? this.firstEnabledId()\r\n : key === 'End' ? this.lastEnabledId()\r\n : key === 'ArrowRight' ? this.nextEnabledId(currentId, +1)\r\n : this.nextEnabledId(currentId, -1);\r\n\r\n if (!nextId) return;\r\n\r\n // mover foco\r\n this.focusTab(nextId);\r\n // comportamiento común: solo mover foco con flechas (no activar)\r\n // Si quieres activar también con flechas, descomenta:\r\n // this.setTab(nextId);\r\n }\r\n\r\n private enabledTabs(): TabItem[] {\r\n return this.tabs().filter(t => !t.disabled);\r\n }\r\n\r\n private firstEnabledId(): TabId | null {\r\n return this.enabledTabs()[0]?.id ?? null;\r\n }\r\n\r\n private lastEnabledId(): TabId | null {\r\n const list = this.enabledTabs();\r\n return list.length ? list[list.length - 1].id : null;\r\n }\r\n\r\n private nextEnabledId(currentId: TabId, delta: 1 | -1): TabId | null {\r\n const list = this.tabs();\r\n if (!list.length) return null;\r\n\r\n const idx = list.findIndex(t => t.id === currentId);\r\n if (idx < 0) return this.firstEnabledId();\r\n\r\n // buscar siguiente habilitado con wrap-around\r\n for (let step = 1; step <= list.length; step++) {\r\n const i = (idx + step * delta + list.length) % list.length;\r\n if (!list[i].disabled) return list[i].id;\r\n }\r\n return null;\r\n }\r\n\r\n private focusTab(tabId: TabId) {\r\n // IDs determinísticos para focus (ver template)\r\n const el = document.getElementById(this.tabDomId(tabId)) as HTMLButtonElement | null;\r\n el?.focus();\r\n }\r\n\r\n tabDomId(tabId: TabId) {\r\n return `lib-tab-${tabId}`;\r\n }\r\n}\r\n","<div class=\"side-tabs\" role=\"tablist\">\r\n @if (tabs().length > 0) {\r\n @for (t of tabs(); track t.id) {\r\n <button type=\"button\" class=\"tab\" role=\"tab\" [id]=\"tabDomId(t.id)\" [class.active]=\"t.id === active()\"\r\n [class.disabled]=\"!!t.disabled\" [attr.aria-selected]=\"t.id === active()\" [attr.aria-disabled]=\"!!t.disabled\"\r\n [disabled]=\"!!t.disabled\" [attr.tabindex]=\"t.id === active() ? 0 : -1\" (click)=\"setTab(t.id)\"\r\n (keydown)=\"onTabKeydown($event, t.id)\">\r\n {{ t.label }}\r\n </button>\r\n }\r\n <div class=\"tab-indicator\" [class.hidden]=\"active() === null\" [style.width]=\"indicatorWidth()\"\r\n [style.left]=\"indicatorLeft()\"></div>\r\n }\r\n</div>\r\n\r\n@if (activeCards(); as cards) {\r\n<div class=\"tab-panels\">\r\n @if (activeTabToggles(); as togglesCfg) {\r\n <div class=\"toggles-container\">\r\n <lib-dynamic-form-fields\r\n [form]=\"togglesCfg.form\"\r\n [sections]=\"togglesCfg.sections\"\r\n [compact]=\"true\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (activeTabSearch()) {\r\n <div class=\"search-container\">\r\n <lib-input\r\n mode=\"search\"\r\n [placeholder]=\"tabSearchPlaceholder()\"\r\n [(value)]=\"searchValue\"\r\n (onSearch)=\"activeTabSearch()?.onSearch?.($event)\"\r\n (onClear)=\"activeTabSearch()?.onClear?.()\"\r\n [regex]=\"activeTabSearch()?.searchRegex ?? null\"\r\n />\r\n </div>\r\n }\r\n\r\n @for (card of cards; track active() + '-' + $index) {\r\n @if (card.infoItems || card.infoItemsLeft || card.infoItemsRight) {\r\n <lib-info-group\r\n [title]=\"card.title\"\r\n [titleAlign]=\"card.infoTitleAlign ?? 'center'\"\r\n [items]=\"card.infoItems ?? []\"\r\n [itemsLeft]=\"card.infoItemsLeft ?? []\"\r\n [itemsRight]=\"card.infoItemsRight ?? []\"\r\n [titleLeft]=\"card.infoTitleLeft ?? null\"\r\n [titleRight]=\"card.infoTitleRight ?? null\"\r\n />\r\n } @else {\r\n <lib-card-content\r\n [title]=\"card.title\"\r\n [isForm]=\"card.isForm ?? false\"\r\n [form]=\"card.form\"\r\n [sections]=\"card.sections ?? []\"\r\n [compact]=\"card.compact ?? false\"\r\n [variant]=\"card.variant ?? 'default'\"\r\n [sectionNumber]=\"card.sectionNumber ?? null\"\r\n [withSearch]=\"card.withSearch ?? false\"\r\n [searchPlaceholder]=\"card.searchPlaceholder ?? 'Buscar...'\"\r\n [bgColor]=\"card.bgColor ?? 'default'\"\r\n (onSearch)=\"card.onSearch?.($event)\"\r\n (onSearchClear)=\"card.onSearchClear?.()\"\r\n [searchRegex]=\"card.searchRegex ?? null\"\r\n />\r\n }\r\n }\r\n</div>\r\n}","import { Component, input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-not-found-section',\r\n imports: [],\r\n templateUrl: './not-found-section.html',\r\n styleUrl: './not-found-section.css',\r\n})\r\nexport class NotFoundSection {\r\n title = input<string>('No hay datos');\r\n showButton = input<boolean>(true);\r\n buttonLabel = input<string>('Crear');\r\n\r\n openModal = output<void>();\r\n}\r\n","<div class=\"content-container\">\r\n <div class=\"no-data-container\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-inbox\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z\" />\r\n <path d=\"M4 13h3l3 3h4l3 -3h3\" />\r\n </svg>\r\n <div class=\"title2\">{{ title() }}</div>\r\n @if(showButton()){\r\n <button class=\"button-medium-primary\" (click)=\"openModal.emit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-plus\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M12 5l0 14\" />\r\n <path d=\"M5 12l14 0\" />\r\n </svg>\r\n <div class=\"label\">{{ buttonLabel() }}</div>\r\n </button>\r\n }\r\n </div>\r\n </div>","import { Injectable, signal } from '@angular/core';\r\nimport PubSub from 'pubsub-js';\r\nimport { ToastData, TOAST_EVENTS } from '../../helpers/toast-helper';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ToastService {\r\n currentToast = signal<ToastData | null>(null);\r\n isVisible = signal(false);\r\n\r\n private timeoutId: any;\r\n private subscriptionTokens: string[] = [];\r\n\r\n constructor() {\r\n this.initializePubSubListeners();\r\n }\r\n\r\n private initializePubSubListeners() {\r\n const showToastToken = PubSub.subscribe(\r\n TOAST_EVENTS.SHOW_TOAST,\r\n (msg: string, data: ToastData) => {\r\n this.showToast(data);\r\n }\r\n );\r\n\r\n const showToastWithActionToken = PubSub.subscribe(\r\n TOAST_EVENTS.SHOW_TOAST_WITH_ACTION,\r\n (\r\n msg: string,\r\n data: {\r\n description: string;\r\n buttonText: string;\r\n action: () => void;\r\n duration?: number;\r\n }\r\n ) => {\r\n this.showToastWithAction(\r\n data.description,\r\n data.buttonText,\r\n data.action,\r\n data.duration\r\n );\r\n }\r\n );\r\n\r\n const hideToastToken = PubSub.subscribe(TOAST_EVENTS.HIDE_TOAST, () => {\r\n this.hideToast();\r\n });\r\n\r\n this.subscriptionTokens = [\r\n showToastToken,\r\n showToastWithActionToken,\r\n hideToastToken,\r\n ];\r\n }\r\n\r\n showToast(data: ToastData) {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n }\r\n\r\n this.currentToast.set(data);\r\n this.isVisible.set(true);\r\n\r\n const duration = data.duration || 4000;\r\n this.timeoutId = setTimeout(() => {\r\n this.hideToast();\r\n }, duration);\r\n }\r\n\r\n showToastWithAction(\r\n description: string,\r\n buttonText: string,\r\n action: () => void,\r\n duration?: number\r\n ) {\r\n this.showToast({\r\n description,\r\n buttonText,\r\n action,\r\n duration,\r\n });\r\n }\r\n\r\n hideToast() {\r\n this.isVisible.set(false);\r\n\r\n setTimeout(() => {\r\n this.currentToast.set(null);\r\n }, 300);\r\n\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptionTokens.forEach((token) => {\r\n PubSub.unsubscribe(token);\r\n });\r\n }\r\n\r\n static publishToast(data: ToastData) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST, data);\r\n }\r\n\r\n static publishToastWithAction(\r\n description: string,\r\n buttonText: string,\r\n action: () => void,\r\n duration?: number\r\n ) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST_WITH_ACTION, {\r\n description,\r\n buttonText,\r\n action,\r\n duration,\r\n });\r\n }\r\n\r\n static publishHideToast() {\r\n PubSub.publish(TOAST_EVENTS.HIDE_TOAST);\r\n }\r\n}\r\n","import { Component, computed, inject } from '@angular/core';\r\nimport { ToastService } from '../../services/toast/toast-service';\r\n\r\n\r\n@Component({\r\n selector: 'lib-toast',\r\n templateUrl: './toast.html',\r\n styleUrls: ['./toast.css'],\r\n})\r\nexport class Toast {\r\n public toastService = inject(ToastService);\r\n\r\n isShowToast = computed(() => this.toastService.isVisible());\r\n\r\n close() {\r\n this.toastService.hideToast();\r\n }\r\n executeAction() {\r\n const currentToast = this.toastService.currentToast();\r\n if (currentToast?.action) {\r\n currentToast.action();\r\n }\r\n }\r\n}\r\n","@if (isShowToast()) {\r\n<div class=\"toast\" [class.show]=\"toastService.isVisible()\">\r\n <div class=\"toast-body\">\r\n <div class=\"toast-header\">\r\n <span class=\"toast-message\">\r\n {{\r\n toastService.currentToast()?.description\r\n }}\r\n </span>\r\n <button class=\"btn-close\" (click)=\"close()\" aria-label=\"Cerrar\">\r\n &times;\r\n </button>\r\n </div>\r\n\r\n @if (toastService.currentToast()?.buttonText &&\r\n toastService.currentToast()?.action) {\r\n <div class=\"toast-footer\">\r\n <button\r\n class=\"btn-action\"\r\n (click)=\"executeAction()\"\r\n [attr.aria-label]=\"toastService.currentToast()?.buttonText\"\r\n >\r\n {{ toastService.currentToast()?.buttonText }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n}","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-option-card',\r\n imports: [],\r\n templateUrl: './option-card.html',\r\n styleUrl: './option-card.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OptionCard {\r\n mode = input<'default' | 'quick-access'>('default');\r\n label = input.required<string>();\r\n description = input<string>('');\r\n buttonBg = input<string>();\r\n iconBg = input<string>();\r\n\r\n clickAction = output<void>();\r\n\r\n onClick(): void {\r\n this.clickAction.emit();\r\n }\r\n}\r\n","<button type=\"button\" class=\"option-btn\" (click)=\"onClick()\" [style.--btn-bg]=\"buttonBg()\" [style.--icon-bg]=\"iconBg()\">\r\n <!-- Ícono (proyectado) -->\r\n <div class=\"option-btn-wrapper\" [class.option-btn-wrapper--quick-access]=\"mode() === 'quick-access'\">\r\n <div class=\"option-btn-icon\">\r\n <ng-content select=\"[icon]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Contenido -->\r\n <div class=\"option-btn-content\">\r\n <div class=\"option-btn-header\">\r\n <h3 class=\"option-btn-title\">\r\n {{ label() }}\r\n </h3>\r\n\r\n @if (mode() === 'default') {\r\n <span class=\"option-btn-chevron\">›</span>\r\n }\r\n </div>\r\n\r\n @if (description()) {\r\n <p class=\"option-btn-description\">\r\n {{ description() }}\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n</button>","import { Component, input, output } from '@angular/core';\nimport { OptionCard } from \"../option-card/option-card\";\n\nexport interface QuickAccessItem {\n id: string;\n label: string;\n description: string;\n icon: string; // CSS icon class name, e.g. 'icon-settings'\n iconBg?: string;\n}\n\n@Component({\n selector: 'lib-quick-access-cards',\n imports: [OptionCard],\n templateUrl: './quick-access-cards.html',\n styleUrl: './quick-access-cards.css',\n})\nexport class QuickAccessCards {\n title = input<string>('Accesos Rápidos');\n items = input<QuickAccessItem[]>([]);\n\n clickAction = output<QuickAccessItem>();\n\n onOptionClick(item: QuickAccessItem): void {\n this.clickAction.emit(item);\n }\n}\n","<h2 class=\"quick-access-title\">{{ title() }}</h2>\n<div class=\"quick-access-grid\">\n @for (item of items(); track item.id) {\n <lib-option-card [label]=\"item.label\" [description]=\"item.description\" [iconBg]=\"item.iconBg\"\n [mode]=\"'quick-access'\" (clickAction)=\"onOptionClick(item)\">\n <span icon [class]=\"item.icon\"></span>\n </lib-option-card>\n }\n</div>","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { BarChart, HeatmapChart, LineChart, PieChart } from 'echarts/charts';\r\nimport * as echarts from 'echarts/core';\r\nimport { NgxEchartsDirective, provideEchartsCore } from 'ngx-echarts';\r\nimport { GraphicComponent, GridComponent } from 'echarts/components';\r\nimport { TooltipComponent, DataZoomComponent, VisualMapComponent, LegendComponent } from 'echarts/components';\r\nimport { CanvasRenderer } from 'echarts/renderers';\r\n\r\n\r\necharts.use([\r\n BarChart,\r\n LineChart,\r\n PieChart,\r\n HeatmapChart,\r\n GridComponent,\r\n TooltipComponent,\r\n CanvasRenderer,\r\n GraphicComponent,\r\n DataZoomComponent,\r\n VisualMapComponent,\r\n LegendComponent\r\n]);\r\n\r\nexport interface BarSeries {\r\n name: string;\r\n data: number[];\r\n color?: string;\r\n}\r\n\r\nexport interface LineSeries {\r\n name: string;\r\n data: number[];\r\n color?: string;\r\n}\r\n\r\nexport interface ChartItem {\r\n label: string;\r\n value: number;\r\n}\r\n\r\nexport const UI_CHART_TOKENS = {\r\n fontFamily: 'Inter, sans-serif',\r\n text: '#1f2937',\r\n muted: '#6b7280',\r\n grid: '#e5e7eb',\r\n tooltipBg: '#ffffff',\r\n tooltipBorder: '#e5e7eb',\r\n primary: '#596300',\r\n primarySoft: '#eef4d3',\r\n secondary: '#61661F',\r\n secondarySoft: '#eef4d3',\r\n axis: '#8f948d',\r\n areaTop: 'rgba(201, 214, 108, 0.50)',\r\n areaBottom: 'rgba(201, 214, 108, 0.05)',\r\n labelLine: '#7f8572',\r\n centerText: '#202020',\r\n donutPalette: [\r\n '#6b7319', // olive green (brand)\r\n '#d9df88', // lime soft\r\n '#92001f', // burgundy\r\n '#003f55', // deep teal\r\n '#7c7d63', // sage\r\n '#c4d600', // chartreuse\r\n '#37add1', // sky blue\r\n '#9fc6da', // light steel blue\r\n '#d4883a', // warm amber\r\n '#8b5e3c', // terracotta\r\n '#6a4c93', // dusty purple\r\n '#1b998b', // jade green\r\n '#e07a5f', // coral clay\r\n '#3d405b', // charcoal slate\r\n '#f2cc8f', // sand gold\r\n '#81b29a', // mint sage\r\n '#b56576', // rose mauve\r\n '#355070', // navy steel\r\n '#eaac8b', // peach\r\n '#a7c957', // spring green\r\n ],\r\n};\r\n\r\n@Component({\r\n selector: 'lib-base-chart',\r\n imports: [NgxEchartsDirective],\r\n providers: [provideEchartsCore({ echarts })],\r\n templateUrl: './base-chart.html',\r\n styleUrl: './base-chart.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BaseChart {\r\n options = input.required<Record<string, unknown>>();\r\n chartClick = output<any>();\r\n\r\n onChartClick(event: any) {\r\n this.chartClick.emit(event);\r\n }\r\n}\r\n","<div echarts class=\"ui-base-chart\" [options]=\"options()\" [autoResize]=\"true\" (chartClick)=\"onChartClick($event)\">\r\n</div>","import { Component, computed, input, signal } from '@angular/core';\r\nimport { UI_CHART_TOKENS, BaseChart, ChartItem, BarSeries } from '../base/base-chart';\r\n\r\nfunction buildBarChartOptions(data: ChartItem[], multiSeries?: BarSeries[], horizontal = false) {\r\n const showScroll = data.length > 12;\r\n const zoomEnd = showScroll ? Math.floor((12 / data.length) * 100) : 100;\r\n const isMulti = !!multiSeries && multiSeries.length > 0;\r\n\r\n const xAxisData = data.map(item => item.label);\r\n\r\n const series = isMulti \r\n ? multiSeries!.map((s, index) => ({\r\n name: s.name,\r\n type: 'bar',\r\n data: s.data,\r\n barMaxWidth: 32,\r\n itemStyle: {\r\n color: s.color || UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n },\r\n label: {\r\n show: true,\r\n position: horizontal ? 'right' : 'top',\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 10,\r\n },\r\n }))\r\n : [\r\n {\r\n type: 'bar',\r\n data: data.map(item => item.value),\r\n barWidth: 32,\r\n itemStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n },\r\n emphasis: {\r\n itemStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n },\r\n },\r\n label: {\r\n show: true,\r\n position: horizontal ? 'right' : 'top',\r\n color: '#374151',\r\n fontSize: 12,\r\n },\r\n },\r\n ];\r\n\r\n return {\r\n animation: true,\r\n grid: {\r\n left: horizontal ? 16 : 8,\r\n right: horizontal ? 40 : 8,\r\n top: isMulti ? 40 : 16,\r\n bottom: showScroll ? 46 : 32,\r\n containLabel: true,\r\n },\r\n legend: {\r\n show: isMulti,\r\n top: 0,\r\n icon: 'roundRect',\r\n itemWidth: 14,\r\n itemHeight: 14,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n }\r\n },\r\n ...(showScroll && {\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n ...(horizontal ? { yAxisIndex: [0] } : { xAxisIndex: [0] }),\r\n start: 0,\r\n end: zoomEnd,\r\n },\r\n {\r\n type: 'slider',\r\n show: true,\r\n ...(horizontal ? { yAxisIndex: [0], right: 10, width: 16 } : { xAxisIndex: [0], bottom: 10, height: 16 }),\r\n start: 0,\r\n end: zoomEnd,\r\n fillerColor: 'rgba(97, 102, 31, 0.2)',\r\n borderColor: 'transparent',\r\n backgroundColor: 'rgba(97, 102, 31, 0.05)',\r\n dataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.4 },\r\n areaStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.1 }\r\n },\r\n selectedDataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.8 },\r\n areaStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.3 }\r\n },\r\n handleIcon: 'path://M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z',\r\n handleSize: '120%',\r\n handleStyle: {\r\n color: '#fff',\r\n borderColor: UI_CHART_TOKENS.secondary,\r\n borderWidth: 1.5,\r\n shadowBlur: 3,\r\n shadowColor: 'rgba(97, 102, 31, 0.3)',\r\n shadowOffsetX: 1,\r\n shadowOffsetY: 1\r\n },\r\n moveHandleStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n opacity: 0.6\r\n },\r\n textStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n fontWeight: 500\r\n }\r\n }\r\n ]\r\n }),\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: {\r\n type: 'shadow',\r\n },\r\n backgroundColor: UI_CHART_TOKENS.tooltipBg,\r\n borderColor: UI_CHART_TOKENS.tooltipBorder,\r\n borderWidth: 1,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.text,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n extraCssText: `\r\n border-radius: 12px;\r\n box-shadow: 0 8px 24px rgba(0,0,0,0.08);\r\n padding: 10px 12px;\r\n `,\r\n },\r\n xAxis: horizontal\r\n ? {\r\n type: 'value',\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n }\r\n : {\r\n type: 'category',\r\n data: xAxisData,\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n interval: 0,\r\n rotate: data.length > 6 ? 45 : 0,\r\n width: 80,\r\n overflow: 'truncate',\r\n },\r\n },\r\n yAxis: horizontal\r\n ? {\r\n type: 'category',\r\n data: xAxisData,\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n width: 100,\r\n overflow: 'truncate',\r\n },\r\n }\r\n : {\r\n type: 'value',\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n },\r\n series: series,\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bar-chart',\r\n imports: [BaseChart],\r\n templateUrl: './bar-chart.html',\r\n styleUrl: './bar-chart.css',\r\n})\r\nexport class BarChart {\r\n title = input<string>('Bar Chart');\r\n data = input<ChartItem[]>([]);\r\n multiSeries = input<BarSeries[]>();\r\n horizontal = input<boolean>(false);\r\n\r\n isExpanded = signal(false);\r\n toggleExpand = () => this.isExpanded.update(v => !v);\r\n\r\n options = computed(() =>\r\n buildBarChartOptions(this.data(), this.multiSeries(), this.horizontal()),\r\n );\r\n}\r\n","<div class=\"bar-chart-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"bar-chart-header\">\r\n <h3 class=\"bar-chart-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" class=\"chart-wrapper\" />\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}\r\n","import { Component, computed, input, signal } from '@angular/core';\r\nimport { BaseChart, ChartItem, LineSeries, UI_CHART_TOKENS } from \"../base/base-chart\";\r\nimport * as echarts from 'echarts/core';\r\n\r\n function buildLineChartOptions(data: ChartItem[], multiSeries?: LineSeries[]) {\r\n const isMulti = !!multiSeries && multiSeries.length > 0;\r\n const showScroll = data.length > 12;\r\n const zoomEnd = showScroll ? Math.floor((12 / data.length) * 100) : 100;\r\n\r\n return {\r\n animation: true,\r\n backgroundColor: 'transparent',\r\n grid: {\r\n left: 16,\r\n right: 16,\r\n top: isMulti ? 40 : 20,\r\n bottom: showScroll ? 46 : 16,\r\n containLabel: true,\r\n },\r\n legend: {\r\n show: isMulti,\r\n top: 0,\r\n icon: 'circle',\r\n itemWidth: 10,\r\n itemHeight: 10,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n }\r\n },\r\n ...(showScroll && {\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n xAxisIndex: [0],\r\n start: 0,\r\n end: zoomEnd,\r\n },\r\n {\r\n type: 'slider',\r\n show: true,\r\n xAxisIndex: [0],\r\n start: 0,\r\n end: zoomEnd,\r\n bottom: 10,\r\n height: 16,\r\n fillerColor: 'rgba(97, 102, 31, 0.2)',\r\n borderColor: 'transparent',\r\n backgroundColor: 'rgba(97, 102, 31, 0.05)',\r\n dataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.4 },\r\n areaStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.1 }\r\n },\r\n selectedDataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.8 },\r\n areaStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.3 }\r\n },\r\n handleIcon: 'path://M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z',\r\n handleSize: '120%',\r\n handleStyle: {\r\n color: '#fff',\r\n borderColor: UI_CHART_TOKENS.secondary,\r\n borderWidth: 1.5,\r\n shadowBlur: 3,\r\n shadowColor: 'rgba(97, 102, 31, 0.3)',\r\n shadowOffsetX: 1,\r\n shadowOffsetY: 1\r\n },\r\n moveHandleStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n opacity: 0.6\r\n },\r\n textStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n fontWeight: 500\r\n }\r\n }\r\n ]\r\n }),\r\n tooltip: {\r\n trigger: 'axis',\r\n backgroundColor: UI_CHART_TOKENS.tooltipBg,\r\n borderColor: UI_CHART_TOKENS.tooltipBorder,\r\n borderWidth: 1,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.text,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n extraCssText: `\r\n border-radius: 10px;\r\n box-shadow: 0 8px 24px rgba(0,0,0,0.10);\r\n padding: 8px 10px;\r\n `,\r\n axisPointer: {\r\n type: 'line',\r\n lineStyle: {\r\n color: '#bfc4a6',\r\n width: 1,\r\n type: 'dashed',\r\n },\r\n },\r\n },\r\n xAxis: {\r\n type: 'category',\r\n boundaryGap: false,\r\n data: data.map(item => item.label),\r\n axisLine: {\r\n show: true,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.axis,\r\n width: 1,\r\n },\r\n },\r\n axisTick: {\r\n show: true,\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n interval: 0,\r\n rotate: data.length > 6 ? 45 : 0,\r\n width: 80,\r\n overflow: 'truncate',\r\n margin: 10,\r\n },\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n type: 'dotted',\r\n width: 1,\r\n opacity: 0.1,\r\n },\r\n },\r\n },\r\n yAxis: {\r\n type: 'value',\r\n min: 0,\r\n axisLine: {\r\n show: true,\r\n },\r\n axisTick: {\r\n show: true,\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n margin: 8,\r\n },\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n type: 'dotted',\r\n width: 1,\r\n opacity: 0.1,\r\n },\r\n },\r\n },\r\n series: isMulti\r\n ? multiSeries!.map((s, index) => ({\r\n name: s.name,\r\n type: 'line',\r\n smooth: true,\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n data: s.data,\r\n itemStyle: {\r\n color: s.color || UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n },\r\n lineStyle: {\r\n color: s.color || UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n width: 2,\r\n },\r\n emphasis: {\r\n focus: 'series',\r\n itemStyle: {\r\n borderWidth: 2,\r\n borderColor: '#fff',\r\n shadowBlur: 6,\r\n shadowColor: 'rgba(0,0,0,0.15)',\r\n },\r\n },\r\n }))\r\n : [\r\n {\r\n type: 'line',\r\n smooth: true,\r\n symbol: data.length === 1 ? 'circle' : 'none',\r\n symbolSize: 8,\r\n data: data.map(item => item.value),\r\n itemStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n },\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n width: 2,\r\n },\r\n areaStyle: {\r\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\r\n { offset: 0, color: UI_CHART_TOKENS.areaTop },\r\n { offset: 1, color: UI_CHART_TOKENS.areaBottom },\r\n ]),\r\n },\r\n },\r\n ],\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'lib-line-chart',\r\n imports: [BaseChart],\r\n templateUrl: './line-chart.html',\r\n styleUrl: './line-chart.css',\r\n})\r\nexport class LineChart {\r\n title = input<string>('Line Chart');\r\n data = input.required<ChartItem[]>();\r\n multiSeries = input<LineSeries[]>();\r\n\r\n isExpanded = signal(false);\r\n toggleExpand = () => this.isExpanded.update(v => !v);\r\n\r\n options = computed<Record<string, unknown>>(() =>\r\n buildLineChartOptions(this.data(), this.multiSeries())\r\n );\r\n}\r\n","<div class=\"line-chart-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"line-chart-header\">\r\n <h3 class=\"line-chart-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" class=\"chart-wrapper\" />\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}\r\n","import { Component, computed, input, output, signal } from '@angular/core';\r\nimport { BaseChart, ChartItem, UI_CHART_TOKENS } from \"../base/base-chart\";\r\nimport { CommonModule } from '@angular/common';\r\n\r\nfunction getTotal(data: ChartItem[]): number {\r\n return data.reduce((acc, item) => acc + item.value, 0);\r\n}\r\n\r\nfunction buildDonutChartOptions(data: ChartItem[]): Record<string, unknown> {\r\n const total = getTotal(data);\r\n const showLegend = data.length > 10;\r\n\r\n return {\r\n animation: true,\r\n backgroundColor: 'transparent',\r\n color: UI_CHART_TOKENS.donutPalette,\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n xAxisIndex: [0],\r\n start: 0,\r\n end: 100,\r\n },\r\n ],\r\n tooltip: {\r\n trigger: 'item',\r\n backgroundColor: '#ffffff',\r\n borderColor: '#d9dcc7',\r\n borderWidth: 1,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.text,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n extraCssText: `\r\n border-radius: 10px;\r\n box-shadow: 0 8px 24px rgba(0,0,0,0.10);\r\n padding: 8px 10px;\r\n `,\r\n formatter: (params: any) => `${params.name}: ${params.value}`,\r\n },\r\n ...(showLegend ? {\r\n legend: {\r\n type: 'scroll',\r\n orient: 'horizontal',\r\n bottom: 0,\r\n left: 'center',\r\n itemWidth: 12,\r\n itemHeight: 12,\r\n itemGap: 10,\r\n textStyle: {\r\n fontSize: 11,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.muted,\r\n },\r\n pageTextStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n },\r\n pageIconColor: UI_CHART_TOKENS.centerText,\r\n pageIconInactiveColor: '#ccc',\r\n },\r\n } : {}),\r\n series: [\r\n {\r\n type: 'pie',\r\n radius: ['44%', '72%'],\r\n center: ['50%', showLegend ? '46%' : '52%'],\r\n avoidLabelOverlap: true,\r\n minAngle: 4,\r\n itemStyle: {\r\n borderWidth: 0,\r\n },\r\n label: {\r\n show: !showLegend,\r\n position: 'outside',\r\n formatter: (params: any) => {\r\n return `{label|${params.name}}\\n{value|${params.value}}`;\r\n },\r\n rich: {\r\n label: {\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.muted,\r\n lineHeight: 16,\r\n },\r\n value: {\r\n fontSize: 14,\r\n fontWeight: 700,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n lineHeight: 18,\r\n },\r\n },\r\n },\r\n labelLine: {\r\n show: !showLegend,\r\n length: 12,\r\n length2: 20,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.labelLine,\r\n width: 1,\r\n },\r\n },\r\n data: data.map((item, index) => ({\r\n name: item.label,\r\n value: item.value,\r\n label: {\r\n rich: {\r\n value: {\r\n fontSize: 14,\r\n fontWeight: 700,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n lineHeight: 18,\r\n },\r\n },\r\n },\r\n })),\r\n },\r\n ],\r\n graphic: [\r\n {\r\n type: 'text',\r\n left: 'center',\r\n top: showLegend ? '42%' : '48%',\r\n style: {\r\n text: `${total}`,\r\n textAlign: 'center',\r\n fill: UI_CHART_TOKENS.centerText,\r\n fontSize: 24,\r\n fontWeight: 700,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n },\r\n ],\r\n };\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'lib-donut-chart',\r\n standalone: true,\r\n imports: [BaseChart, CommonModule],\r\n templateUrl: './donut-chart.html',\r\n styleUrl: './donut-chart.css',\r\n})\r\nexport class DonutChart {\r\n title = input<string>('Donut Chart');\r\n data = input.required<ChartItem[]>();\r\n \r\n // Drill-down inputs\r\n drillDown = input<boolean>(false);\r\n groupByPrefix = input<number>(0);\r\n\r\n // Outputs\r\n sectionClick = output<ChartItem>();\r\n \r\n isExpanded = signal(false);\r\n drilledGroup = signal<string | null>(null);\r\n\r\n toggleExpand = () => this.isExpanded.update(v => !v);\r\n\r\n // Data processing logic\r\n displayData = computed<ChartItem[]>(() => {\r\n const rawData = this.data();\r\n const prefixLen = this.groupByPrefix();\r\n const currentGroup = this.drilledGroup();\r\n\r\n if (!this.drillDown() || prefixLen <= 0) {\r\n return rawData;\r\n }\r\n\r\n if (currentGroup) {\r\n // Filter detailed items that match the prefix\r\n return rawData.filter(item => item.label.startsWith(currentGroup));\r\n } else {\r\n // Group items by prefix\r\n const groups = new Map<string, number>();\r\n rawData.forEach(item => {\r\n const prefix = item.label.substring(0, prefixLen);\r\n groups.set(prefix, (groups.get(prefix) || 0) + item.value);\r\n });\r\n return Array.from(groups.entries()).map(([label, value]) => ({ label, value }));\r\n }\r\n });\r\n\r\n options = computed<Record<string, unknown>>(() =>\r\n buildDonutChartOptions(this.displayData())\r\n );\r\n\r\n onChartClick(event: any) {\r\n const clickedItem: ChartItem = {\r\n label: event.name,\r\n value: event.value\r\n };\r\n\r\n this.sectionClick.emit(clickedItem);\r\n\r\n if (this.drillDown() && this.groupByPrefix() > 0 && !this.drilledGroup()) {\r\n this.drilledGroup.set(clickedItem.label);\r\n }\r\n }\r\n\r\n resetDrillDown() {\r\n this.drilledGroup.set(null);\r\n }\r\n}\r\n","<div class=\"donut-chart-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"donut-chart-header\">\r\n <h3 class=\"donut-chart-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" (chartClick)=\"onChartClick($event)\" class=\"chart-wrapper\" />\r\n \r\n @if (drilledGroup()) {\r\n <button class=\"back-btn\" (click)=\"resetDrillDown()\" type=\"button\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n <span>Volver</span>\r\n </button>\r\n }\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}","import { Component, computed, input, signal } from '@angular/core';\nimport { UI_CHART_TOKENS, BaseChart } from '../base/base-chart';\n\nexport interface HeatmapDataItem {\n /** x-axis index or label */\n x: number;\n /** y-axis index or label */\n y: number;\n /** cell value */\n value: number;\n}\n\nexport interface HeatmapConfig {\n /** Labels for the x-axis (columns) */\n xLabels: string[];\n /** Labels for the y-axis (rows) */\n yLabels: string[];\n /** Data points as [xIndex, yIndex, value] */\n data: HeatmapDataItem[];\n /** Minimum value for the color scale (auto-calculated if omitted) */\n min?: number;\n /** Maximum value for the color scale (auto-calculated if omitted) */\n max?: number;\n}\n\nfunction buildHeatmapOptions(config: HeatmapConfig) {\n const { xLabels, yLabels, data } = config;\n\n // Flatten values to compute min/max for the visual map\n const values = data.map(d => d.value);\n const minVal = config.min ?? (values.length > 0 ? Math.min(...values) : 0);\n const maxVal = config.max ?? (values.length > 0 ? Math.max(...values) : 100);\n\n // Build the series data as [x, y, value]\n const seriesData = data.map(d => [d.x, d.y, d.value]);\n\n return {\n animation: true,\n grid: {\n left: 8,\n right: 60,\n top: 16,\n bottom: 48,\n containLabel: true,\n },\n tooltip: {\n trigger: 'item',\n position: 'top',\n backgroundColor: UI_CHART_TOKENS.tooltipBg,\n borderColor: UI_CHART_TOKENS.tooltipBorder,\n borderWidth: 1,\n textStyle: {\n color: UI_CHART_TOKENS.text,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n extraCssText: `\n border-radius: 12px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.08);\n padding: 10px 12px;\n `,\n formatter: (params: any) => {\n const xLabel = xLabels[params.data[0]] ?? params.data[0];\n const yLabel = yLabels[params.data[1]] ?? params.data[1];\n const val = params.data[2];\n return `<strong>${yLabel}</strong> - <strong>${xLabel}</strong><br/><strong>${val} Comparendos</strong>`;\n },\n },\n xAxis: {\n type: 'category',\n data: xLabels,\n position: 'top',\n splitArea: {\n show: true,\n areaStyle: {\n color: ['rgba(255, 255, 255, 0.05)', 'rgba(0, 0, 0, 0.02)']\n }\n },\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n interval: 0,\n rotate: xLabels.length > 8 ? 45 : 0,\n },\n },\n yAxis: {\n type: 'category',\n data: yLabels,\n splitArea: {\n show: true,\n areaStyle: {\n color: ['rgba(255, 255, 255, 0.05)', 'rgba(0, 0, 0, 0.02)']\n }\n },\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n },\n visualMap: {\n min: minVal,\n max: maxVal,\n orient: 'horizontal',\n left: 'center',\n bottom: '0',\n itemWidth: 12,\n itemHeight: 120,\n textStyle: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 11,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n inRange: {\n color: [\n '#f0f4d3', // lightest — UI green tint\n '#d9df88', // light\n '#c4d600', // mid\n '#92a00e', // dark\n '#61661F', // darkest — secondary token\n ],\n },\n },\n series: [\n {\n name: 'Heatmap',\n type: 'heatmap',\n data: seriesData,\n label: {\n show: true,\n color: UI_CHART_TOKENS.text,\n fontSize: 11,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowColor: 'rgba(0,0,0,0.15)',\n },\n },\n itemStyle: {\n borderWidth: 2,\n /* borderColor: '#ffffff', */\n borderRadius: 4,\n },\n },\n ],\n };\n}\n\n@Component({\n selector: 'lib-heatmap',\n imports: [BaseChart],\n templateUrl: './heatmap.html',\n styleUrl: './heatmap.css',\n})\nexport class Heatmap {\n title = input<string>('Heatmap');\n config = input<HeatmapConfig>({ xLabels: [], yLabels: [], data: [] });\n\n isExpanded = signal(false);\n\n toggleExpand() {\n this.isExpanded.update((value) => !value);\n }\n\n options = computed(() => buildHeatmapOptions(this.config()));\n}\n","<div class=\"heatmap-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"heatmap-header\">\r\n <h3 class=\"heatmap-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" class=\"chart-wrapper\" />\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, effect, input } from '@angular/core';\r\n\r\nexport interface GeoPoint {\r\n subpoenaNumber: string;\r\n latitude: number;\r\n longitude: number;\r\n locationLabel: string;\r\n dateTime: string;\r\n infractionCode: string;\r\n plate: string;\r\n immobilized: boolean;\r\n}\r\n\r\nexport interface GeoMapResponse {\r\n points: GeoPoint[];\r\n total: number;\r\n showing: number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-geo-api-maps',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './geo-api-maps.html',\r\n styleUrl: './geo-api-maps.css',\r\n})\r\nexport class GeoAPIMaps implements AfterViewInit {\r\n points = input<GeoPoint[]>([]);\r\n public map!: google.maps.Map;\r\n private markers: google.maps.marker.AdvancedMarkerElement[] = [];\r\n\r\n constructor() {\r\n effect(() => {\r\n const pts = this.points();\r\n if (this.map && pts.length > 0) {\r\n this.renderPoints(pts);\r\n }\r\n });\r\n }\r\n \r\n ngAfterViewInit() {\r\n this.initMap();\r\n }\r\n\r\n private initMap() {\r\n const mapElement = document.getElementById('map');\r\n if (!mapElement) return;\r\n\r\n this.map = new google.maps.Map(mapElement, {\r\n center: { lat: 10.96854, lng: -74.78132 }, // Barranquilla\r\n zoom: 13,\r\n clickableIcons: false,\r\n mapId: '1b033ea586ba5df9c6dc091a',\r\n\r\n // Opciones para ocultar controles\r\n mapTypeControl: false, // quita el botón \"Mapa/Satélite\"\r\n streetViewControl: true, // quita Street View\r\n fullscreenControl: false, // quita fullscreen\r\n zoomControl: true, // opcional, dejar zoom\r\n rotateControl: false, // oculta el control de rotación (flechas)\r\n\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.TOP_LEFT // mueve el zoom a la parte superior izquierda\r\n },\r\n });\r\n\r\n // Render points if they already exist when map is ready\r\n if (this.points().length > 0) {\r\n this.renderPoints(this.points());\r\n }\r\n }\r\n\r\n public goToLocation(lat: number, lng: number) {\r\n if (!this.map) return;\r\n\r\n const position: google.maps.LatLngLiteral = { lat, lng };\r\n\r\n new google.maps.marker.AdvancedMarkerElement({\r\n position,\r\n map: this.map,\r\n });\r\n\r\n this.map.panTo(position);\r\n this.map.setZoom(18);\r\n }\r\n\r\n private clearMarkers() {\r\n this.markers.forEach(m => m.map = null);\r\n this.markers = [];\r\n }\r\n \r\n private renderPoints(points: GeoPoint[]) {\r\n this.clearMarkers();\r\n\r\n const infoWindow = new google.maps.InfoWindow();\r\n let lockedMarker: google.maps.marker.AdvancedMarkerElement | null = null;\r\n\r\n points.forEach(point => {\r\n const dot = document.createElement('div');\r\n dot.style.width = '16px';\r\n dot.style.height = '16px';\r\n dot.style.borderRadius = '50%';\r\n dot.style.backgroundColor = point.immobilized ? '#ef4444' : '#3b82f6';\r\n dot.style.border = '2px solid white';\r\n dot.style.boxShadow = '0 2px 4px rgba(0,0,0,0.2)';\r\n dot.style.cursor = 'pointer';\r\n\r\n const marker = new google.maps.marker.AdvancedMarkerElement({\r\n position: { lat: point.latitude, lng: point.longitude },\r\n map: this.map,\r\n content: dot,\r\n });\r\n\r\n const content = `\r\n <div style=\"padding: 0 12px 12px 12px; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; min-width: 200px; color: #374151;\">\r\n <div style=\"font-weight: 700; font-size: 15px; color: #111827; margin-bottom: 8px; line-height: 1.2;\">\r\n ${point.subpoenaNumber}\r\n </div>\r\n <div style=\"font-size: 14px; color: #4b5563; margin-bottom: 4px;\">\r\n ${point.locationLabel}\r\n </div>\r\n <div style=\"font-size: 14px; color: #6b7280; margin-bottom: 4px;\">\r\n ${point.dateTime.replace('T', ' - ').substring(0, 18)}\r\n </div>\r\n <div style=\"display: flex; flex-direction: column; gap: 4px; margin-top: 4px;\">\r\n <div style=\"font-size: 13px;\">\r\n <span style=\"color: #9ca3af;\">Infracción:</span> \r\n <span style=\"font-weight: 500; color: #374151;\">${point.infractionCode}</span>\r\n </div>\r\n <div style=\"font-size: 13px;\">\r\n <span style=\"color: #9ca3af;\">Placa:</span> \r\n <span style=\"font-weight: 500; color: #374151;\">${point.plate}</span>\r\n </div>\r\n <div style=\"display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; margin-top: 4px; color: ${point.immobilized ? '#ef4444' : '#3b82f6'};\">\r\n <span style=\"width: 8px; height: 8px; border-radius: 50%; background-color: ${point.immobilized ? '#ef4444' : '#3b82f6'};\"></span>\r\n ${point.immobilized ? 'Inmovilizado' : 'Normal'}\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n marker.addListener('mouseover', () => {\r\n if (!lockedMarker) {\r\n infoWindow.setContent(content);\r\n infoWindow.open(this.map, marker);\r\n }\r\n });\r\n\r\n marker.addListener('mouseout', () => {\r\n if (!lockedMarker) {\r\n infoWindow.close();\r\n }\r\n });\r\n\r\n marker.addListener('click', () => {\r\n lockedMarker = marker;\r\n infoWindow.setContent(content);\r\n infoWindow.open(this.map, marker);\r\n });\r\n\r\n infoWindow.addListener('closeclick', () => {\r\n lockedMarker = null;\r\n });\r\n\r\n this.markers.push(marker);\r\n });\r\n\r\n // Auto-center and zoom to show all points\r\n if (points.length > 0) {\r\n const bounds = new google.maps.LatLngBounds();\r\n points.forEach(p => bounds.extend({ lat: p.latitude, lng: p.longitude }));\r\n this.map.fitBounds(bounds);\r\n }\r\n }\r\n}\r\n","<div id=\"map\"></div>\r\n","import { Component, input, signal } from '@angular/core';\r\nimport { GeoAPIMaps, GeoPoint } from '../../map/geo-api-maps/geo-api-maps';\r\n\r\n@Component({\r\n selector: 'lib-map-geo',\r\n imports: [GeoAPIMaps],\r\n templateUrl: './map-geo.html',\r\n styleUrl: './map-geo.css',\r\n})\r\nexport class MapGeo {\r\n title = input<string>('Mapa Geográfico');\r\n isExpanded = signal(false);\r\n points = input<GeoPoint[]>([]);\r\n\r\n toggleExpand() {\r\n this.isExpanded.update((value) => !value);\r\n }\r\n}\r\n","<div class=\"map-geo-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"map-geo-header\">\r\n <h3 class=\"map-geo-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <div class=\"chart-wrapper\">\r\n <lib-geo-api-maps [points]=\"points()\" />\r\n </div>\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}","import { Component, computed, input, signal } from '@angular/core';\nimport { Table, TableColumn, TableRow } from \"../../table/table\";\nimport { NotFoundSection } from \"../../not-found-section/not-found-section\";\nimport { PaginationComponent } from \"../../pagination/pagination\";\n\n@Component({\n selector: 'lib-table-chart',\n imports: [Table, NotFoundSection, PaginationComponent],\n templateUrl: './table-chart.html',\n styleUrl: './table-chart.css',\n})\nexport class TableChart {\n title = input<string>('Table Chart');\n columns = input<TableColumn[]>([]);\n data = input<TableRow[]>([]);\n totalItems = input<number>(0);\n itemsPerPage = input<number>(10);\n collapsedRows = input<number>(7);\n\n isExpanded = signal<boolean>(false);\n localPage = signal<number>(1);\n\n toggleExpand() {\n this.isExpanded.update((value) => !value);\n if (!this.isExpanded()) {\n this.localPage.set(1);\n }\n }\n\n displayedData = computed(() => {\n const isExpanded = this.isExpanded();\n const data = this.data();\n\n if (!isExpanded) {\n return data.slice(0, this.collapsedRows());\n }\n\n const pageSize = this.itemsPerPage();\n const start = (this.localPage() - 1) * pageSize;\n return data.slice(start, start + pageSize);\n });\n\n onPageChange(page: number) {\n this.localPage.set(page);\n }\n}\n","<div class=\"table-chart-container\" [class.expanded]=\"isExpanded()\">\n <div class=\"table-chart-header\">\n <h3 class=\"table-chart-title\">{{ title() }}</h3>\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\"\n [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\n @if (isExpanded()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-minimize-2\">\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\" />\n <line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-maximize-2\">\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\" />\n <line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\" />\n </svg>\n }\n </button>\n </div>\n <div class=\"chart-wrapper\">\n @if (data().length > 0) {\n <lib-table [columns]=\"columns()\" [data]=\"displayedData()\" [showActions]=\"false\" />\n @if (isExpanded() && totalItems() > itemsPerPage()) {\n <lib-pagination [totalItems]=\"totalItems()\" [pageSize]=\"itemsPerPage()\" [(page)]=\"localPage\" />\n }\n } @else {\n <div class=\"no-data\">\n <lib-not-found-section [showButton]=\"false\" />\n </div>\n }\n </div>\n</div>\n@if (isExpanded()) {\n<div class=\"overlay\" (click)=\"toggleExpand()\"></div>\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, input } from '@angular/core';\r\n\r\nexport const Colors = {\r\n primary: '#4B5E05',\r\n secondary: '#063546',\r\n tertiary: '#6B0518',\r\n quaternary: '#F57C00',\r\n};\r\n\r\nexport type KpiColorType = 'primary' | 'secondary' | 'tertiary' | 'quaternary' | string;\r\n\r\n@Component({\r\n selector: 'lib-kpi-card',\r\n imports: [CommonModule],\r\n templateUrl: './kpi-card.html',\r\n styleUrl: './kpi-card.css',\r\n})\r\nexport class KpiCard {\r\n title = input<string>('Titulo');\r\n description = input<string>();\r\n value = input<number | string>('0');\r\n iconColor = input<KpiColorType>('primary');\r\n\r\n resolvedIconColor = computed(() => {\r\n const color = this.iconColor();\r\n // Revisa si es un predeterminado, si no, lo asume como hex code.\r\n return (Colors as Record<string, string>)[color] || color;\r\n });\r\n}\r\n","<div class=\"kpi-card\">\n <div class=\"kpi-card-text\">\n <h3 class=\"kpi-title\">{{ title() }}</h3>\n @if (description()) {\n <p class=\"kpi-description\">{{ description() }}</p>\n } @else {\n <div class=\"kpi-description\">\n <ng-content select=\"[description]\"></ng-content>\n </div>\n }\n <h2 class=\"kpi-value\">{{ value() }}</h2>\n </div>\n <div class=\"kpi-icon-container\" [style.--kpi-base-color]=\"resolvedIconColor()\">\n <ng-content select=\"[icon]\"></ng-content>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output, ViewChild, ElementRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-load-image',\r\n imports: [CommonModule],\r\n templateUrl: './load-image.html',\r\n styleUrl: './load-image.css',\r\n})\r\nexport class LoadImage {\r\n @Input() title: string = 'Imagen';\r\n @Input() description: string = 'Sube una imagen';\r\n @Input() recommendedSize: string = 'PNG · JPG · SVG · Recomendado: 300x100 px';\r\n \r\n // Ícono del título modificable por el usuario\r\n @Input() titleIcon: string = 'icon-upload';\r\n\r\n // URL de imagen por defecto (útil para mostrar imágenes traídas desde un bucket/backend)\r\n @Input() set imageUrl(url: string | null | undefined) {\r\n if (url) {\r\n this.imageSrc = url;\r\n }\r\n }\r\n\r\n @Output() imageLoaded = new EventEmitter<File | null>();\r\n\r\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\r\n\r\n imageSrc: string | null = null;\r\n isDragging = false;\r\n \r\n // Lightbox & Zoom\r\n isExpanded = false;\r\n zoomScale = 1;\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = true;\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = false;\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = false;\r\n\r\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\r\n this.handleFile(event.dataTransfer.files[0]);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.handleFile(input.files[0]);\r\n }\r\n }\r\n\r\n triggerFileInput() {\r\n this.fileInput.nativeElement.click();\r\n }\r\n\r\n handleFile(file: File) {\r\n if (!file.type.match(/image\\/*/)) return;\r\n \r\n // Emitimos el archivo original\r\n this.imageLoaded.emit(file);\r\n\r\n // Creamos la previsualización\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n this.imageSrc = e.target.result;\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n removeImage() {\r\n this.imageSrc = null;\r\n this.imageLoaded.emit(null);\r\n if (this.fileInput?.nativeElement) {\r\n this.fileInput.nativeElement.value = '';\r\n }\r\n }\r\n\r\n changeImage() {\r\n this.triggerFileInput();\r\n }\r\n\r\n expandImage() {\r\n this.isExpanded = true;\r\n this.zoomScale = 1;\r\n }\r\n\r\n closeLightbox() {\r\n this.isExpanded = false;\r\n }\r\n\r\n zoomIn() {\r\n this.zoomScale += 0.2;\r\n }\r\n\r\n zoomOut() {\r\n if (this.zoomScale > 0.4) {\r\n this.zoomScale -= 0.2;\r\n }\r\n }\r\n\r\n zoomReset() {\r\n this.zoomScale = 1;\r\n }\r\n}\r\n","<div class=\"load-image-container\">\n <!-- Header Info -->\n <div class=\"header-info\">\n <div class=\"title-section\">\n <i class=\"icon\" [ngClass]=\"titleIcon\"></i>\n <div class=\"text-group\">\n <h3 class=\"title\">\n {{ title }}\n @if (imageSrc) {\n <span class=\"badge-cargado\">CARGADO</span>\n }\n </h3>\n <p class=\"description\">{{ description }}</p>\n </div>\n </div>\n </div>\n\n <hr class=\"divider\" />\n\n <!-- Upload / Preview Box -->\n <div class=\"box-area\" \n [class.empty]=\"!imageSrc\" \n [class.dragging]=\"isDragging\"\n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\" \n (drop)=\"onDrop($event)\"\n (click)=\"!imageSrc ? triggerFileInput() : null\">\n \n <input type=\"file\" #fileInput (change)=\"onFileSelected($event)\" accept=\".png, .jpg, .jpeg, .svg\" hidden>\n\n <!-- Estado: Vacío (Drag and Drop) -->\n @if (!imageSrc) {\n <div class=\"upload-state\">\n <i class=\"icon-big icon-upload\"></i>\n <p class=\"upload-text\">Arrastra aquí o haz clic para seleccionar</p>\n <p class=\"upload-hint\">{{ recommendedSize }}</p>\n </div>\n }\n\n <!-- Estado: Cargado (Preview) -->\n @if (imageSrc) {\n <div class=\"preview-state\">\n <img [src]=\"imageSrc\" alt=\"Preview\">\n \n <!-- Hover overlay de acciones -->\n <div class=\"actions-overlay\">\n <button class=\"action-btn btn-white\" (click)=\"$event.stopPropagation(); expandImage()\">\n <i class=\"icon-small icon-expand\"></i> <span class=\"action-text\">Ampliar</span>\n </button>\n <button class=\"action-btn btn-white\" (click)=\"$event.stopPropagation(); changeImage()\">\n <i class=\"icon-small icon-change\"></i> <span class=\"action-text\">Cambiar</span>\n </button>\n <button class=\"action-btn btn-outline\" (click)=\"$event.stopPropagation(); removeImage()\">\n <i class=\"icon-small icon-delete\"></i> <span class=\"action-text\">Eliminar</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer Actions / Info -->\n <div class=\"footer-area\">\n @if (!imageSrc) {\n <div class=\"footer-text\">\n </div>\n <button class=\"btn-subir\" (click)=\"triggerFileInput()\">\n <i class=\"icon-small icon-upload\"></i> Subir\n </button>\n } @else {\n <div class=\"footer-text-loaded\">\n <span>Recomendado: 300x100 px</span>\n <span class=\"hint-italic\">Pasar el mouse por encima para acciones</span>\n </div>\n }\n </div>\n</div>\n\n<!-- Modal Lightbox (Pantalla completa) -->\n@if (isExpanded) {\n <div class=\"lightbox-overlay\" (click)=\"closeLightbox()\">\n <!-- Top Bar -->\n <div class=\"top-bar-lightbox\" (click)=\"$event.stopPropagation()\">\n <div class=\"zoom-controls\">\n <button class=\"btn-icon\" (click)=\"zoomIn()\">\n <i class=\"icon-small icon-plus\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"zoomOut()\">\n <i class=\"icon-small icon-minus\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"zoomReset()\">\n <i class=\"icon-small icon-expand\"></i>\n </button>\n </div>\n <button class=\"btn-close\" (click)=\"closeLightbox()\">&#x2715;</button>\n </div>\n\n <!-- Centro: Imagen Expandida -->\n <div class=\"lightbox-content\" (click)=\"$event.stopPropagation()\">\n <img [src]=\"imageSrc\" [style.transform]=\"'scale(' + zoomScale + ')'\" alt=\"Expanded image\" class=\"zoomable-image\">\n </div>\n \n <!-- Parte Inferior -->\n <div class=\"bottom-bar-lightbox\" (click)=\"$event.stopPropagation()\">\n <span class=\"lightbox-title\">{{ title }}</span>\n <span class=\"zoom-percentage\">{{ (zoomScale * 100) | number:'1.0-0' }}%</span>\n </div>\n </div>\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';\r\nimport { PdfViewerService } from '../../services/pdf-viewer/pdf-viewer.service';\r\n\r\nconst IMAGE_EXTENSIONS = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|avif)(\\?.*)?$/i;\r\n\r\n@Component({\r\n selector: 'lib-pdf-viewer',\r\n imports: [],\r\n templateUrl: './pdf-viewer.html',\r\n styleUrl: './pdf-viewer.css',\r\n})\r\nexport class PdfViewer {\r\n private pdfViewerService = inject(PdfViewerService);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n currentIndex = signal(0);\r\n\r\n get isShowModal() {\r\n return this.pdfViewerService.showModalDocuments();\r\n }\r\n\r\n doc = computed(() => this.pdfViewerService.selectedPdf());\r\n\r\n currentUrl = computed(() => this.doc()?.urls[this.currentIndex()] ?? '');\r\n\r\n hasMultiple = computed(() => (this.doc()?.urls.length ?? 0) > 1);\r\n\r\n isImage = computed(() => {\r\n const d = this.doc();\r\n if (!d) return false;\r\n if (d.type === 'image') return true;\r\n if (d.type === 'pdf') return false;\r\n // Detectar por la primera URL\r\n return IMAGE_EXTENSIONS.test(d.urls[0] ?? '');\r\n });\r\n\r\n constructor() {\r\n // Reiniciar al índice 0 cada vez que cambia el documento\r\n effect(() => {\r\n this.doc();\r\n this.currentIndex.set(0);\r\n });\r\n }\r\n\r\n prev() {\r\n if (this.currentIndex() > 0) this.currentIndex.update(i => i - 1);\r\n }\r\n\r\n next() {\r\n const total = this.doc()?.urls.length ?? 0;\r\n if (this.currentIndex() < total - 1) this.currentIndex.update(i => i + 1);\r\n }\r\n\r\n getSafePdfUrl(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n\r\n getSafeImageUrl(url: string): SafeUrl {\r\n return this.sanitizer.bypassSecurityTrustUrl(url);\r\n }\r\n\r\n closeModal() {\r\n this.pdfViewerService.closeModal();\r\n this.pdfViewerService.setSelectedPdf(null);\r\n }\r\n}\r\n","@if (isShowModal) {\r\n<section class=\"modal-container\" (click)=\"closeModal()\">\r\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\r\n\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title\" [title]=\"doc()?.name || ''\">\r\n {{ doc()?.name || 'Documento' }}\r\n </h1>\r\n @if (hasMultiple()) {\r\n <span class=\"gallery-counter-header\">\r\n {{ currentIndex() + 1 }} / {{ doc()!.urls.length }}\r\n </span>\r\n }\r\n <button type=\"button\" class=\"close-btn\" (click)=\"closeModal()\">&times;</button>\r\n </div>\r\n\r\n <div class=\"modal-body\">\r\n @if (doc(); as d) {\r\n @if (isImage()) {\r\n <div class=\"image-wrapper\">\r\n @if (hasMultiple()) {\r\n <button type=\"button\" class=\"gallery-arrow gallery-arrow--prev\"\r\n [disabled]=\"currentIndex() === 0\"\r\n (click)=\"prev()\">\r\n &#8249;\r\n </button>\r\n }\r\n <img [src]=\"getSafeImageUrl(currentUrl())\" [alt]=\"d.name\" class=\"image-viewer\" />\r\n @if (hasMultiple()) {\r\n <button type=\"button\" class=\"gallery-arrow gallery-arrow--next\"\r\n [disabled]=\"currentIndex() === d.urls.length - 1\"\r\n (click)=\"next()\">\r\n &#8250;\r\n </button>\r\n }\r\n </div>\r\n @if (hasMultiple()) {\r\n <div class=\"gallery-dots\">\r\n @for (url of d.urls; track $index) {\r\n <button type=\"button\" class=\"gallery-dot\"\r\n [class.gallery-dot--active]=\"$index === currentIndex()\"\r\n (click)=\"currentIndex.set($index)\">\r\n </button>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <iframe [src]=\"getSafePdfUrl(currentUrl())\" class=\"pdf-viewer\" frameborder=\"0\"></iframe>\r\n }\r\n } @else {\r\n <p class=\"no-doc\">No hay documento disponible</p>\r\n }\r\n </div>\r\n\r\n </div>\r\n</section>\r\n}","import { Component, output, signal, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-document-upload',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './documents-upload.html',\r\n styleUrl: './documents-upload.css'\r\n})\r\nexport class DocumentUpload {\r\n filesChanged = output<File[]>();\r\n\r\n files = signal<File[]>([]);\r\n isDragging = signal<boolean>(false);\r\n\r\n label = input<string>('Arrastra los archivos aquí o haz clic para seleccionar');\r\n helperText = input<string>('Máximo 25 MB por archivo');\r\n /** Valor para el atributo accept del input (ej: \".pdf\", \"image/*\", \".pdf,.png\") */\r\n accept = input<string>('.pdf,application/pdf');\r\n maxSizeMB = input<number>(25);\r\n multiple = input<boolean>(true);\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n this.isDragging.set(true);\r\n }\r\n\r\n onDragLeave(): void {\r\n this.isDragging.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.isDragging.set(false);\r\n const droppedFiles = Array.from(event.dataTransfer?.files ?? []);\r\n this.processFiles(droppedFiles);\r\n }\r\n\r\n onFileSelect(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const selectedFiles = Array.from(input.files ?? []);\r\n this.processFiles(selectedFiles);\r\n input.value = '';\r\n }\r\n\r\n private isFileTypeValid(file: File): boolean {\r\n const accept = this.accept();\r\n if (!accept) return true;\r\n\r\n return accept.split(',').map(t => t.trim()).some(type => {\r\n if (type.startsWith('.')) return file.name.toLowerCase().endsWith(type.toLowerCase());\r\n if (type.endsWith('/*')) return file.type.startsWith(type.split('/')[0] + '/');\r\n return file.type === type;\r\n });\r\n }\r\n\r\n private processFiles(newFiles: File[]): void {\r\n const valid = newFiles.filter(f => {\r\n if (!this.isFileTypeValid(f)) {\r\n alert(`El archivo \"${f.name}\" no tiene un formato permitido.`);\r\n return false;\r\n }\r\n if (f.size > this.maxSizeMB() * 1024 * 1024) {\r\n alert(`El archivo \"${f.name}\" supera los ${this.maxSizeMB()} MB.`);\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n this.files.update(current => [...current, ...valid]);\r\n this.filesChanged.emit(this.files());\r\n }\r\n\r\n removeFile(file: File): void {\r\n this.files.update(current => current.filter(f => f !== file));\r\n this.filesChanged.emit(this.files());\r\n }\r\n\r\n formatSize(bytes: number): string {\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\r\n return (bytes / 1024 / 1024).toFixed(2) + ' MB';\r\n }\r\n\r\n getFileExtension(file: File): string {\r\n return file.name.split('.').pop()?.toUpperCase() ?? 'FILE';\r\n }\r\n}","<div class=\"upload-container\" (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave()\" (drop)=\"onDrop($event)\"\r\n [class.dragging]=\"isDragging()\">\r\n\r\n <input type=\"file\" #fileInput [accept]=\"accept()\" [multiple]=\"multiple()\" (change)=\"onFileSelect($event)\" hidden />\r\n\r\n <div class=\"upload-zone\" (click)=\"fileInput.click()\">\r\n <svg class=\"upload-icon\" viewBox=\"0 0 486.3 486.3\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g>\r\n <path d=\"M395.5,135.8c-5.2-30.9-20.5-59.1-43.9-80.5c-26-23.8-59.8-36.9-95-36.9c-27.2,0-53.7,7.8-76.4,22.5 c-18.9,12.2-34.6,28.7-45.7,48.1c-4.8-0.9-9.8-1.4-14.8-1.4c-42.5,0-77.1,34.6-77.1,77.1c0,5.5,0.6,10.8,1.6,16 C16.7,200.7,0,232.9,0,267.2c0,27.7,10.3,54.6,29.1,75.9c19.3,21.8,44.8,34.7,72,36.2c0.3,0,0.5,0,0.8,0h86 c7.5,0,13.5-6,13.5-13.5s-6-13.5-13.5-13.5h-85.6C61.4,349.8,27,310.9,27,267.1c0-28.3,15.2-54.7,39.7-69 c5.7-3.3,8.1-10.2,5.9-16.4c-2-5.4-3-11.1-3-17.2c0-27.6,22.5-50.1,50.1-50.1c5.9,0,11.7,1,17.1,3c6.6,2.4,13.9-0.6,16.9-6.9 c18.7-39.7,59.1-65.3,103-65.3c59,0,107.7,44.2,113.3,102.8c0.6,6.1,5.2,11,11.2,12c44.5,7.6,78.1,48.7,78.1,95.6 c0,49.7-39.1,92.9-87.3,96.6h-73.7c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5h74.2c0.3,0,0.6,0,1,0c30.5-2.2,59-16.2,80.2-39.6 c21.1-23.2,32.6-53,32.6-84C486.2,199.5,447.9,149.6,395.5,135.8z\"/>\r\n <path d=\"M324.2,280c5.3-5.3,5.3-13.8,0-19.1l-71.5-71.5c-2.5-2.5-6-4-9.5-4s-7,1.4-9.5,4l-71.5,71.5c-5.3,5.3-5.3,13.8,0,19.1 c2.6,2.6,6.1,4,9.5,4s6.9-1.3,9.5-4l48.5-48.5v222.9c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5V231.5l48.5,48.5 C310.4,285.3,318.9,285.3,324.2,280z\"/>\r\n </g>\r\n </svg>\r\n <p class=\"upload-label\"><strong>{{ label() }}</strong></p>\r\n <small class=\"upload-helper\">{{ helperText() }}</small>\r\n </div>\r\n\r\n @if (files().length > 0) {\r\n <div class=\"files-row\">\r\n @for (file of files(); track file.name) {\r\n <div class=\"file-card\">\r\n <button type=\"button\" class=\"file-card-remove\" (click)=\"removeFile(file)\" title=\"Eliminar archivo\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\r\n </svg>\r\n </button>\r\n <svg class=\"file-card-icon\" viewBox=\"0 0 64 64\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12 4 L12 60 L52 60 L52 20 L36 4 Z\" fill=\"#e3e3d1\" stroke=\"#8a9a2f\" stroke-width=\"2.5\" stroke-linejoin=\"round\"/>\r\n <path d=\"M36 4 L36 20 L52 20\" fill=\"none\" stroke=\"#8a9a2f\" stroke-width=\"2.5\" stroke-linejoin=\"round\"/>\r\n <rect x=\"20\" y=\"30\" width=\"24\" height=\"2.5\" rx=\"1.25\" fill=\"#8a9a2f\"/>\r\n <rect x=\"20\" y=\"37\" width=\"24\" height=\"2.5\" rx=\"1.25\" fill=\"#8a9a2f\"/>\r\n <rect x=\"20\" y=\"44\" width=\"16\" height=\"2.5\" rx=\"1.25\" fill=\"#8a9a2f\"/>\r\n </svg>\r\n <span class=\"file-card-ext\">{{ getFileExtension(file) }}</span>\r\n <span class=\"file-card-name\" [title]=\"file.name\">{{ file.name }}</span>\r\n <span class=\"file-card-size\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>","// src/app/components/public-api.ts\n\n// Exportar los componentes\n\nexport * from './lib/components/pagination/pagination';\nexport * from './lib/components/table/table';\nexport * from './lib/interfaces/filters';\n\nexport * from './lib/components/date-time-picker/date-time-picker';\nexport * from './lib/components/date-time-filter/date-time-filter';\nexport * from './lib/components/input-number-filter/input-number-filter';\nexport * from './lib/components/input-select-filter/input-select-filter';\nexport * from './lib/components/input-text-filter/input-text-filter';\n\nexport * from './lib/components/input/input';\nexport * from './lib/components/select-custom-search/select-custom-search';\nexport * from './lib/components/dynamic-form-fields/dynamic-form-fields';\nexport * from './lib/components/wizard-form/wizard-form';\nexport * from './lib/components/modal-form/modal-form';\n\nexport * from './lib/components/dialog-alert/dialog-alert';\nexport * from './lib/components/dialog-confirmation/dialog-confirmation';\n\nexport * from './lib/helpers/toast-helper';\n\nexport * from './lib/components/not-found-modal/not-found-modal';\n\nexport * from './lib/components/loader/loader';\nexport * from './lib/components/progress-bar/progress-bar';\nexport * from './lib/services/progress/progress-service';\nexport * from './lib/components/processing-overlay/processing-overlay';\n\nexport * from './lib/components/info-group/info-group'\nexport * from './lib/components/feature-card/feature-card'\n\nexport * from './lib/components/side-card/side-card'\nexport * from './lib/components/side-card-detail/side-card-detail'\nexport * from './lib/components/devices-carousel/devices-carousel'\n\nexport * from './lib/components/title-filters/title-filters'\n\nexport * from './lib/components/notification-modal/notification-modal'\n\nexport * from './lib/components/footer/footer'\n\nexport * from './lib/components/button-cards/button-cards'\nexport * from './lib/components/tabs/tabs'\n\nexport * from './lib/components/not-found-section/not-found-section'\n\nexport * from './lib/components/toast/toast'\nexport * from './lib/services/toast/toast-service'\n\nexport * from './lib/components/card-content/card-content'\nexport * from './lib/components/button/button'\nexport * from './lib/components/input-time-filter/input-time-filter'\nexport * from './lib/components/toggle-custom/toggle-custom'\n\nexport * from './lib/components/option-card/option-card'\nexport * from './lib/components/quick-access-cards/quick-access-cards'\n\nexport * from './lib/components/charts/bar-chart/bar-chart'\nexport * from './lib/components/charts/base/base-chart'\nexport * from './lib/components/charts/line-chart/line-chart'\nexport * from './lib/components/charts/donut-chart/donut-chart'\nexport * from './lib/components/charts/heatmap/heatmap'\nexport * from './lib/components/charts/map-geo/map-geo'\nexport * from './lib/components/charts/table-chart/table-chart'\n\nexport * from './lib/components/kpi-card/kpi-card'\n\nexport * from './lib/components/map/geo-api-maps/geo-api-maps'\nexport * from './lib/components/load-image/load-image'\n\nexport * from './lib/components/pdf-viewer/pdf-viewer'\nexport * from './lib/services/pdf-viewer/pdf-viewer.service'\n\nexport * from './lib/components/documents-upload/documents-upload'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","Input","i1.ProgressFormService","BarChart","LineChart"],"mappings":"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"}
1
+ {"version":3,"file":"sapenlinea-components.mjs","sources":["../../../projects/sapenlinea-components/src/lib/components/pagination/pagination.ts","../../../projects/sapenlinea-components/src/lib/components/pagination/pagination.html","../../../projects/sapenlinea-components/src/lib/services/pdf-viewer/pdf-viewer.service.ts","../../../projects/sapenlinea-components/src/lib/components/table/table.ts","../../../projects/sapenlinea-components/src/lib/components/table/table.html","../../../projects/sapenlinea-components/src/lib/components/date-time-picker/date-time-picker.ts","../../../projects/sapenlinea-components/src/lib/components/date-time-picker/date-time-picker.html","../../../projects/sapenlinea-components/src/lib/components/date-time-filter/date-time-filter.ts","../../../projects/sapenlinea-components/src/lib/components/date-time-filter/date-time-filter.html","../../../projects/sapenlinea-components/src/lib/components/input-number-filter/input-number-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-number-filter/input-number-filter.html","../../../projects/sapenlinea-components/src/lib/components/input-select-filter/input-select-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-select-filter/input-select-filter.html","../../../projects/sapenlinea-components/src/lib/components/input-text-filter/input-text-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-text-filter/input-text-filter.html","../../../projects/sapenlinea-components/src/lib/components/input/input.ts","../../../projects/sapenlinea-components/src/lib/components/input/input.html","../../../projects/sapenlinea-components/src/lib/components/select-custom-search/select-custom-search.ts","../../../projects/sapenlinea-components/src/lib/components/select-custom-search/select-custom-search.html","../../../projects/sapenlinea-components/src/lib/components/toggle-custom/toggle-custom.ts","../../../projects/sapenlinea-components/src/lib/components/toggle-custom/toggle-custom.html","../../../projects/sapenlinea-components/src/lib/components/dynamic-form-fields/dynamic-form-fields.ts","../../../projects/sapenlinea-components/src/lib/components/dynamic-form-fields/dynamic-form-fields.html","../../../projects/sapenlinea-components/src/lib/components/wizard-form/wizard-form.ts","../../../projects/sapenlinea-components/src/lib/components/wizard-form/wizard-form.html","../../../projects/sapenlinea-components/src/lib/helpers/toast-helper.ts","../../../projects/sapenlinea-components/src/lib/components/button/button.ts","../../../projects/sapenlinea-components/src/lib/components/button/button.html","../../../projects/sapenlinea-components/src/lib/components/modal-form/modal-form.ts","../../../projects/sapenlinea-components/src/lib/components/modal-form/modal-form.html","../../../projects/sapenlinea-components/src/lib/components/dialog-alert/dialog-alert.ts","../../../projects/sapenlinea-components/src/lib/components/dialog-alert/dialog-alert.html","../../../projects/sapenlinea-components/src/lib/components/dialog-confirmation/dialog-confirmation.ts","../../../projects/sapenlinea-components/src/lib/components/dialog-confirmation/dialog-confirmation.html","../../../projects/sapenlinea-components/src/lib/components/not-found-modal/not-found-modal.ts","../../../projects/sapenlinea-components/src/lib/components/not-found-modal/not-found-modal.html","../../../projects/sapenlinea-components/src/lib/components/loader/loader.ts","../../../projects/sapenlinea-components/src/lib/components/loader/loader.html","../../../projects/sapenlinea-components/src/lib/services/progress/progress-service.ts","../../../projects/sapenlinea-components/src/lib/components/progress-bar/progress-bar.ts","../../../projects/sapenlinea-components/src/lib/components/progress-bar/progress-bar.html","../../../projects/sapenlinea-components/src/lib/components/processing-overlay/processing-overlay.ts","../../../projects/sapenlinea-components/src/lib/components/processing-overlay/processing-overlay.html","../../../projects/sapenlinea-components/src/lib/components/info-group/info-group.ts","../../../projects/sapenlinea-components/src/lib/components/info-group/info-group.html","../../../projects/sapenlinea-components/src/lib/components/feature-card/feature-card.ts","../../../projects/sapenlinea-components/src/lib/components/feature-card/feature-card.html","../../../projects/sapenlinea-components/src/lib/components/side-card/side-card.ts","../../../projects/sapenlinea-components/src/lib/components/side-card/side-card.html","../../../projects/sapenlinea-components/src/lib/components/side-card-detail/side-card-detail.ts","../../../projects/sapenlinea-components/src/lib/components/side-card-detail/side-card-detail.html","../../../projects/sapenlinea-components/src/lib/components/devices-carousel/devices-carousel.ts","../../../projects/sapenlinea-components/src/lib/components/devices-carousel/devices-carousel.html","../../../projects/sapenlinea-components/src/lib/components/input-time-filter/input-time-filter.ts","../../../projects/sapenlinea-components/src/lib/components/input-time-filter/input-time-filter.html","../../../projects/sapenlinea-components/src/lib/components/title-filters/title-filters.ts","../../../projects/sapenlinea-components/src/lib/components/title-filters/title-filters.html","../../../projects/sapenlinea-components/src/lib/components/notification-modal/notification-modal.ts","../../../projects/sapenlinea-components/src/lib/components/notification-modal/notification-modal.html","../../../projects/sapenlinea-components/src/lib/components/footer/footer.ts","../../../projects/sapenlinea-components/src/lib/components/footer/footer.html","../../../projects/sapenlinea-components/src/lib/components/button-cards/button-cards.ts","../../../projects/sapenlinea-components/src/lib/components/button-cards/button-cards.html","../../../projects/sapenlinea-components/src/lib/components/card-content/card-content.ts","../../../projects/sapenlinea-components/src/lib/components/card-content/card-content.html","../../../projects/sapenlinea-components/src/lib/components/tabs/tabs.ts","../../../projects/sapenlinea-components/src/lib/components/tabs/tabs.html","../../../projects/sapenlinea-components/src/lib/components/not-found-section/not-found-section.ts","../../../projects/sapenlinea-components/src/lib/components/not-found-section/not-found-section.html","../../../projects/sapenlinea-components/src/lib/services/toast/toast-service.ts","../../../projects/sapenlinea-components/src/lib/components/toast/toast.ts","../../../projects/sapenlinea-components/src/lib/components/toast/toast.html","../../../projects/sapenlinea-components/src/lib/components/option-card/option-card.ts","../../../projects/sapenlinea-components/src/lib/components/option-card/option-card.html","../../../projects/sapenlinea-components/src/lib/components/quick-access-cards/quick-access-cards.ts","../../../projects/sapenlinea-components/src/lib/components/quick-access-cards/quick-access-cards.html","../../../projects/sapenlinea-components/src/lib/components/charts/base/base-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/base/base-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/bar-chart/bar-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/bar-chart/bar-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/line-chart/line-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/line-chart/line-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/donut-chart/donut-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/donut-chart/donut-chart.html","../../../projects/sapenlinea-components/src/lib/components/charts/heatmap/heatmap.ts","../../../projects/sapenlinea-components/src/lib/components/charts/heatmap/heatmap.html","../../../projects/sapenlinea-components/src/lib/components/map/geo-api-maps/geo-api-maps.ts","../../../projects/sapenlinea-components/src/lib/components/map/geo-api-maps/geo-api-maps.html","../../../projects/sapenlinea-components/src/lib/components/charts/map-geo/map-geo.ts","../../../projects/sapenlinea-components/src/lib/components/charts/map-geo/map-geo.html","../../../projects/sapenlinea-components/src/lib/components/charts/table-chart/table-chart.ts","../../../projects/sapenlinea-components/src/lib/components/charts/table-chart/table-chart.html","../../../projects/sapenlinea-components/src/lib/components/kpi-card/kpi-card.ts","../../../projects/sapenlinea-components/src/lib/components/kpi-card/kpi-card.html","../../../projects/sapenlinea-components/src/lib/components/load-image/load-image.ts","../../../projects/sapenlinea-components/src/lib/components/load-image/load-image.html","../../../projects/sapenlinea-components/src/lib/components/pdf-viewer/pdf-viewer.ts","../../../projects/sapenlinea-components/src/lib/components/pdf-viewer/pdf-viewer.html","../../../projects/sapenlinea-components/src/lib/components/documents-upload/documents-upload.ts","../../../projects/sapenlinea-components/src/lib/components/documents-upload/documents-upload.html","../../../projects/sapenlinea-components/src/public-api.ts","../../../projects/sapenlinea-components/src/sapenlinea-components.ts"],"sourcesContent":["import { Component, computed, input, model, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-pagination',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './pagination.html',\r\n styleUrls: ['./pagination.css']\r\n})\r\nexport class PaginationComponent {\r\n // Inputs as Models/Signals\r\n page = model(1);\r\n pageSize = model(10);\r\n totalItems = input(0);\r\n\r\n showPageSizeSelector = input(false);\r\n pageSizeOptions = input([10, 20, 30, 50]);\r\n\r\n // Internal state\r\n isOpen = signal(false);\r\n showPageSizeMenu = signal(false);\r\n\r\n totalPages = computed(() => {\r\n const size = this.pageSize();\r\n const total = this.totalItems();\r\n return size > 0 ? Math.ceil(total / size) : 1;\r\n });\r\n\r\n visiblePages = computed(() => {\r\n const total = this.totalPages();\r\n const current = this.page();\r\n\r\n // Configuración de cuantos números mostrar a los lados del actual\r\n const siblingCount = 1;\r\n const totalNumbers = siblingCount + 5; // siblingCount + first + last + current + 2*dots\r\n\r\n // Si el total de páginas es menor que los números que queremos mostrar, mostrar todo\r\n if (totalNumbers >= total) {\r\n return Array.from({ length: total }, (_, i) => i + 1);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(current - siblingCount, 1);\r\n const rightSiblingIndex = Math.min(current + siblingCount, total);\r\n\r\n const shouldShowLeftDots = leftSiblingIndex > 2;\r\n const shouldShowRightDots = rightSiblingIndex < total - 2;\r\n\r\n const firstPageIndex = 1;\r\n const lastPageIndex = total;\r\n\r\n // Caso 1: Solo puntos a la derecha\r\n // 1 2 3 4 5 ... 20\r\n if (!shouldShowLeftDots && shouldShowRightDots) {\r\n const leftRangeCount = 3 + 2 * siblingCount;\r\n const leftRange = Array.from({ length: leftRangeCount }, (_, i) => i + 1);\r\n return [...leftRange, '...', total];\r\n }\r\n\r\n // Caso 2: Solo puntos a la izquierda\r\n // 1 ... 16 17 18 19 20\r\n if (shouldShowLeftDots && !shouldShowRightDots) {\r\n const rightRangeCount = 3 + 2 * siblingCount;\r\n const rightRange = Array.from({ length: rightRangeCount }, (_, i) => total - rightRangeCount + i + 1);\r\n return [firstPageIndex, '...', ...rightRange];\r\n }\r\n\r\n // Caso 3: Puntos a ambos lados\r\n // 1 ... 9 10 11 ... 20\r\n if (shouldShowLeftDots && shouldShowRightDots) {\r\n const middleRange = Array.from(\r\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\r\n (_, i) => leftSiblingIndex + i\r\n );\r\n return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex];\r\n }\r\n\r\n // Fallback (no debería ocurrir con la lógica actual si totalNumbers >= total cubre los casos pequeños)\r\n return Array.from({ length: total }, (_, i) => i + 1);\r\n });\r\n\r\n onPageClick(p: number | string) {\r\n if (typeof p === 'number') {\r\n this.goToPage(p);\r\n }\r\n }\r\n\r\n isPageActive(p: number | string) {\r\n return typeof p === 'number' && this.page() === p;\r\n }\r\n\r\n goToPage(p: number | string) {\r\n if (typeof p !== 'number') return;\r\n this.page.set(p);\r\n }\r\n\r\n togglePageSizeMenu() {\r\n this.isOpen.update(v => !v);\r\n this.showPageSizeMenu.update(v => !v);\r\n }\r\n\r\n selectPageSize(size: number) {\r\n this.pageSize.set(size);\r\n this.showPageSizeMenu.set(false);\r\n this.isOpen.set(false);\r\n }\r\n}\r\n","<div class=\"pagination-container\">\r\n <div class=\"pagination\" role=\"navigation\" aria-label=\"Pagination\">\r\n <!-- Botón doble atrás -->\r\n <button class=\"icon-button\" (click)=\"goToPage(1)\" [disabled]=\"page() === 1\" aria-label=\"Ir a la primera página\">\r\n ««\r\n </button>\r\n\r\n <!-- Botón atrás -->\r\n <button class=\"icon-button\" (click)=\"goToPage(page() - 1)\" [disabled]=\"page() === 1\"\r\n aria-label=\"Ir a la página anterior\">\r\n «\r\n </button>\r\n\r\n <!-- Números de página -->\r\n <div class=\"pages\">\r\n @for (p of visiblePages(); track $index) {\r\n <button class=\"page-btn\" [class.active]=\"p === page()\" [disabled]=\"p === '...'\" (click)=\"goToPage(p)\"\r\n [attr.aria-current]=\"p === page() ? 'page' : null\"\r\n [attr.aria-label]=\"p === '...' ? 'Más páginas' : 'Ir a la página ' + p\">\r\n {{ p }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Botón siguiente -->\r\n <button class=\"icon-button\" (click)=\"goToPage(page() + 1)\" [disabled]=\"page() === totalPages()\"\r\n aria-label=\"Ir a la página siguiente\">\r\n »\r\n </button>\r\n\r\n <!-- Botón doble adelante -->\r\n <button class=\"icon-button\" (click)=\"goToPage(totalPages())\" [disabled]=\"page() === totalPages()\"\r\n aria-label=\"Ir a la última página\">\r\n »»\r\n </button>\r\n </div>\r\n\r\n <!-- Selector Items por página -->\r\n @if (showPageSizeSelector() && totalPages() > 1) {\r\n <div class=\"pagination-v-4\">\r\n <div class=\"label-pagination\">Items por página</div>\r\n <div class=\"elements-pagination\">\r\n <div class=\"split-button\" (click)=\"togglePageSizeMenu()\">\r\n <div class=\"leading-button\">\r\n <div class=\"state-layer\">\r\n <div class=\"label\">{{ pageSize() }}</div>\r\n </div>\r\n </div>\r\n <div class=\"trailing-button\">\r\n <div class=\"arrow\" [class.open]=\"isOpen()\">\r\n <svg class=\"arrow\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Menú desplegable -->\r\n @if (showPageSizeMenu()) {\r\n <div class=\"page-size-menu\">\r\n @for (opt of pageSizeOptions(); track $index) {\r\n <div class=\"menu-option\" [class.active]=\"opt === pageSize()\" (click)=\"selectPageSize(opt)\">\r\n {{ opt }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Injectable, signal } from '@angular/core';\r\n\r\nexport type FileViewerType = 'pdf' | 'image';\r\n\r\nexport interface FileViewerDoc {\r\n name: string;\r\n /** Una o varias URLs del archivo a visualizar */\r\n urls: string[];\r\n /** Si no se indica, se detecta automáticamente por la extensión de la primera URL */\r\n type?: FileViewerType;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PdfViewerService {\r\n showModalDocuments = signal(false);\r\n selectedPdf = signal<FileViewerDoc | null>(null);\r\n\r\n openModal() {\r\n this.showModalDocuments.set(true);\r\n }\r\n\r\n closeModal() {\r\n this.showModalDocuments.set(false);\r\n }\r\n\r\n setSelectedPdf(pdf: FileViewerDoc | null) {\r\n this.selectedPdf.set(pdf);\r\n }\r\n\r\n /** Abre el visor directamente con el documento indicado */\r\n open(doc: FileViewerDoc) {\r\n this.selectedPdf.set(doc);\r\n this.showModalDocuments.set(true);\r\n }\r\n}","import { AfterViewInit, Component, computed, ElementRef, HostListener, inject, input, output, QueryList, signal, ViewChildren } from '@angular/core';\r\nimport { UpperCasePipe } from '@angular/common';\r\nimport { PdfViewerService } from '../../services/pdf-viewer/pdf-viewer.service';\r\n\r\nexport interface TableColumn {\r\n key: string;\r\n label: string;\r\n type?: 'text' | 'number' | 'money' | 'date' | 'datetime' | 'percentage' | 'status' | 'icon-button' | 'email' | 'grade';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n sortable?: boolean;\r\n showActions?: boolean;\r\n\r\n icon?: string;\r\n iconKey?: string;\r\n\r\n totalizable?: boolean;\r\n}\r\n\r\nexport interface SubColumn {\r\n key: string;\r\n label: string;\r\n type?: 'text' | 'number' | 'money' | 'date' | 'datetime' | 'percentage' | 'status' | 'icon-button' | 'email'| 'grade';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n}\r\n\r\nexport interface ColumnGroupItem {\r\n key: string;\r\n label: string;\r\n description: string;\r\n type?: 'checkbox' | 'number' | 'icon-button' | 'percentage';\r\n icon?: string;\r\n iconKey?: string;\r\n /** Key del row que contiene la URL del archivo a visualizar al hacer click en el checkbox marcado */\r\n fileUrlKey?: string;\r\n /** Key del row para el nombre del archivo en el viewer (opcional, por defecto usa label) */\r\n fileNameKey?: string;\r\n}\r\n\r\nexport interface ColumnGroup {\r\n groupLabel: string;\r\n columns: ColumnGroupItem[];\r\n}\r\n\r\nexport interface TableRow {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface TableAction {\r\n key: string;\r\n icon: string;\r\n label: string;\r\n}\r\n\r\nexport interface StatusToneMap {\r\n [statusKey: string]: StatusTone;\r\n}\r\n\r\nexport type StatusTone =\r\n | 'success'\r\n | 'error'\r\n | 'warning'\r\n | 'info'\r\n | 'neutral';\r\n\r\nconst STATUS_TONE_STYLES: Record<StatusTone, { bg: string; color: string }> = {\r\n success: { bg: '#9ED89D', color: '#006D2F' },\r\n error: { bg: '#D89D9D', color: '#CF0707' },\r\n warning: { bg: '#D8BF9D', color: '#CF6507' },\r\n info: { bg: '#9DAFD8', color: '#0746CF' },\r\n neutral: { bg: '#BAC2BB', color: '#40484C' },\r\n};\r\n\r\nconst ICON_COLOR_MAP: Record<string, string> = {\r\n 'icon-delete': '#CF0707',\r\n 'icon-deactivate': '#CF0707',\r\n\r\n 'icon-edit': '#596300',\r\n 'icon-refresh': '#596300',\r\n\r\n 'icon-activate': '#006D2F',\r\n\r\n 'icon-view': '#063546',\r\n 'icon-add': '#063546',\r\n 'icon-file': '#40484C',\r\n\r\n 'icon-sanction': '#CF6507',\r\n};\r\n\r\n// Instancia única reutilizada para formatear moneda — evita crearla en cada render\r\nconst currencyFormatter = new Intl.NumberFormat('es-CO', {\r\n style: 'currency',\r\n currency: 'COP',\r\n minimumFractionDigits: 0,\r\n});\r\n\r\n@Component({\r\n selector: 'lib-table',\r\n imports: [UpperCasePipe],\r\n standalone: true,\r\n templateUrl: './table.html',\r\n styleUrl: './table.css',\r\n})\r\nexport class Table implements AfterViewInit {\r\n private pdfViewerService = inject(PdfViewerService);\r\n columns = input<TableColumn[]>([]);\r\n data = input<TableRow[]>([]);\r\n actions = input<TableAction[] | ((row: TableRow) => TableAction[])>([] as TableAction[]);\r\n showActions = input<boolean>(true);\r\n\r\n openedMenu = signal<number | null>(null);\r\n selectedRow = signal<TableRow | null>(null);\r\n sortColumn = signal<string | null>(null);\r\n sortDirection = signal<'asc' | 'desc'>('desc');\r\n\r\n optionSelected = output<{ action: string; row: TableRow }>();\r\n iconAction = output<{ action: string; row: TableRow }>();\r\n\r\n statusToneMap = input<StatusToneMap>({});\r\n statusEnumMap = input<Record<number | string, string>>({});\r\n\r\n subColumns = input<SubColumn[]>([]);\r\n expandedRowId = signal<number | string | null>(null);\r\n isRowExpandable = input<(row: TableRow) => boolean>(() => false);\r\n expandedChildren = input<(row: TableRow) => TableRow[] | null>(() => null);\r\n rowIdKey = input<string>('id');\r\n\r\n showSelection = input<boolean>(false);\r\n selectedRows = signal<Set<string | number>>(new Set());\r\n\r\n showTotals = input<boolean>(false);\r\n\r\n columnGroups = input<ColumnGroup[]>([]);\r\n columnGroupChange = output<{ key: string; row: TableRow; value: any }>();\r\n\r\n readonly hasColumnGroups = computed(() => this.columnGroups().length > 0);\r\n\r\n readonly totalGroupSubColumns = computed(() =>\r\n this.columnGroups().reduce((sum, g) => sum + g.columns.length, 0)\r\n );\r\n\r\n readonly totalColspan = computed(() =>\r\n this.columns().length\r\n + this.totalGroupSubColumns()\r\n + (this.showActions() ? 1 : 0)\r\n + (this.showSelection() ? 1 : 0)\r\n );\r\n\r\n @ViewChildren('statusChip') chips!: QueryList<ElementRef>;\r\n\r\n ngAfterViewInit() {\r\n this.recalculateStatusChipWidth();\r\n\r\n this.chips.changes.subscribe(() => {\r\n this.recalculateStatusChipWidth();\r\n });\r\n }\r\n\r\n toggleMenu(index: number) {\r\n this.openedMenu.set(this.openedMenu() === index ? null : index);\r\n }\r\n\r\n onOptionClick(option: TableAction, row: TableRow) {\r\n this.optionSelected.emit({ action: option.label, row });\r\n this.openedMenu.set(null);\r\n }\r\n\r\n openModal(row: TableRow, event?: MouseEvent) {\r\n event?.stopPropagation();\r\n\r\n if (this.selectedRow()?.['id'] === row['id']) {\r\n this.selectedRow.set(null);\r\n } else {\r\n this.selectedRow.set(row);\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.menu-acciones')) {\r\n this.selectedRow.set(null);\r\n }\r\n }\r\n\r\n getAlignment(col: TableColumn | SubColumn): string {\r\n if (col.align && col.align !== 'auto') return col.align;\r\n\r\n switch (col.type) {\r\n case 'number':\r\n case 'money':\r\n case 'percentage':\r\n return 'right';\r\n case 'status':\r\n case 'grade':\r\n return 'center';\r\n case 'email':\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n formatValue(col: TableColumn | SubColumn, value: any): string {\r\n if (value === null || value === undefined) return '';\r\n\r\n switch (col.type) {\r\n case 'money':\r\n return currencyFormatter.format(value);\r\n\r\n case 'number':\r\n return String(value);\r\n\r\n case 'percentage':\r\n return `${value}%`;\r\n\r\n case 'date':\r\n return this.formatDateValue(value);\r\n\r\n case 'datetime':\r\n return this.formatDateTimeValue(value);\r\n\r\n case 'email':\r\n return String(value).toLowerCase();\r\n\r\n case 'grade':\r\n return `${value}°`;\r\n\r\n default:\r\n return String(value);\r\n }\r\n }\r\n\r\n getActionColor(action: TableAction): string {\r\n return ICON_COLOR_MAP[action.icon] ?? '#40484C'; // fallback neutral\r\n }\r\n\r\n getStatusLabel(value: any): string {\r\n if (value === null || value === undefined) return '';\r\n return this.statusEnumMap()?.[value] ?? String(value);\r\n }\r\n\r\n getStatusStyle(value: any) {\r\n if (value === null || value === undefined) {\r\n return STATUS_TONE_STYLES.neutral;\r\n }\r\n\r\n const mapped = this.statusEnumMap()?.[value] ?? value;\r\n const key = this.normalizeStatus(mapped);\r\n const tone = this.statusToneMap()?.[key] ?? 'neutral';\r\n\r\n return STATUS_TONE_STYLES[tone];\r\n }\r\n\r\n private normalizeStatus(value: any): string {\r\n return String(value ?? '')\r\n .toLowerCase()\r\n .trim()\r\n .replace(/\\s+/g, '_');\r\n }\r\n\r\n private formatDateValue(value: any): string {\r\n if (!value) return '';\r\n\r\n const str = String(value).trim();\r\n\r\n // Si ya está exactamente en formato dd/mm/yyyy → no tocar\r\n const alreadyFormatted = /^\\d{2}\\/\\d{2}\\/\\d{4}$/;\r\n if (alreadyFormatted.test(str)) {\r\n return str;\r\n }\r\n\r\n let day: string | number;\r\n let month: string | number;\r\n let year: string | number;\r\n\r\n // Formato tipo yyyy-mm-dd o yyyy-m-d\r\n const isoMatch = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(str);\r\n if (isoMatch) {\r\n year = isoMatch[1];\r\n month = isoMatch[2];\r\n day = isoMatch[3];\r\n }\r\n // Formato tipo d/m/yyyy o dd/mm/yyyy sin ceros\r\n else {\r\n const slashMatch = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(str);\r\n if (slashMatch) {\r\n day = slashMatch[1];\r\n month = slashMatch[2];\r\n year = slashMatch[3];\r\n } else {\r\n // Fallback: intentar con Date\r\n const d = new Date(str);\r\n if (isNaN(d.getTime())) return str;\r\n\r\n day = d.getDate();\r\n month = d.getMonth() + 1;\r\n year = d.getFullYear();\r\n }\r\n }\r\n\r\n const dd = String(day).padStart(2, '0');\r\n const mm = String(month).padStart(2, '0');\r\n const yyyy = String(year);\r\n\r\n return `${dd}/${mm}/${yyyy}`;\r\n }\r\n\r\n private formatDateTimeValue(value: any): string {\r\n if (!value) return '';\r\n\r\n const str = String(value).trim();\r\n \r\n // Si ya está exactamente en formato dd/mm/yyyy hh:mm AM/PM → no tocar\r\n const alreadyFormattedDt = /^\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2} (AM|PM)$/i;\r\n // Si viene exactamente como fecha sin hora → no tocar tampoco\r\n const alreadyFormattedDate = /^\\d{2}\\/\\d{2}\\/\\d{4}$/;\r\n \r\n if (alreadyFormattedDt.test(str) || alreadyFormattedDate.test(str)) {\r\n return str;\r\n }\r\n\r\n let day: string | number;\r\n let month: string | number;\r\n let year: string | number;\r\n let hours: string | number = 0;\r\n let minutes: string | number = 0;\r\n let hasTime = false;\r\n\r\n // Matches 'YYYY-MM-DD' taking optional ' HH:mm' or 'THH:mm'\r\n const isoMatch = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[\\sT](\\d{1,2}):(\\d{1,2})(?::\\d{1,2})?(?:\\.\\d+Z?)?)?$/.exec(str);\r\n \r\n // Matches 'D/M/YYYY' with optional ' HH:mm'\r\n const slashMatch = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})(?:[\\s](\\d{1,2}):(\\d{1,2})(?::\\d{1,2})?)?$/.exec(str);\r\n \r\n if (isoMatch) {\r\n year = isoMatch[1];\r\n month = isoMatch[2];\r\n day = isoMatch[3];\r\n if (isoMatch[4]) {\r\n hours = parseInt(isoMatch[4], 10);\r\n minutes = parseInt(isoMatch[5], 10);\r\n hasTime = true;\r\n }\r\n } else if (slashMatch) {\r\n day = slashMatch[1];\r\n month = slashMatch[2];\r\n year = slashMatch[3];\r\n if (slashMatch[4]) {\r\n hours = parseInt(slashMatch[4], 10);\r\n minutes = parseInt(slashMatch[5], 10);\r\n hasTime = true;\r\n }\r\n } else {\r\n // Fallback: intentar con Date puro\r\n let d = new Date(value);\r\n if (isNaN(d.getTime()) && typeof value === 'string') {\r\n d = new Date(value.replace(' ', 'T'));\r\n }\r\n\r\n if (isNaN(d.getTime())) return str;\r\n\r\n day = d.getDate();\r\n month = d.getMonth() + 1;\r\n year = d.getFullYear();\r\n hours = d.getHours();\r\n minutes = d.getMinutes();\r\n \r\n // Try to determine if the purely parsed date had any time component. If hours/min are zero, \r\n // assume it didn't unless proven otherwise, though standard behavior is to just print it.\r\n // But we will print the time portion anyway to be safe.\r\n hasTime = true; \r\n }\r\n\r\n const dd = String(day).padStart(2, '0');\r\n const mm = String(month).padStart(2, '0');\r\n const yyyy = String(year);\r\n\r\n if (!hasTime) {\r\n return `${dd}/${mm}/${yyyy}`;\r\n }\r\n\r\n let h = Number(hours);\r\n const m = String(minutes).padStart(2, '0');\r\n const ampm = h >= 12 ? 'PM' : 'AM';\r\n \r\n h = h % 12;\r\n h = h ? h : 12; // 0 becomes 12\r\n const hh = String(h).padStart(2, '0');\r\n\r\n return `${dd}/${mm}/${yyyy} ${hh}:${m} ${ampm}`;\r\n }\r\n\r\n\r\n /**\r\n * Devuelve las acciones para una fila.\r\n * Puede ser que `actions` sea un arreglo (se muestra tal cual) o una función\r\n * que recibe la fila y retorna las acciones correspondientes.\r\n */\r\n getActionsForRow(row: TableRow): TableAction[] {\r\n const acts = this.actions();\r\n if (!acts) return [];\r\n if (typeof acts === 'function') {\r\n try {\r\n return acts(row) ?? [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n return acts;\r\n\r\n }\r\n\r\n // computed: solo recalcula cuando cambian data, sortColumn o sortDirection\r\n readonly sortedData = computed(() => {\r\n const col = this.sortColumn();\r\n if (!col) return this.data();\r\n\r\n const dir = this.sortDirection();\r\n\r\n return [...this.data()].sort((a, b) => {\r\n const x = a[col] ?? '';\r\n const y = b[col] ?? '';\r\n\r\n if (this.isDate(x) && this.isDate(y)) {\r\n return dir === 'asc'\r\n ? new Date(x).getTime() - new Date(y).getTime()\r\n : new Date(y).getTime() - new Date(x).getTime();\r\n }\r\n\r\n if (!isNaN(Number(x)) && !isNaN(Number(y))) {\r\n return dir === 'asc' ? Number(x) - Number(y) : Number(y) - Number(x);\r\n }\r\n\r\n return dir === 'asc'\r\n ? x.toString().localeCompare(y.toString())\r\n : y.toString().localeCompare(x.toString());\r\n });\r\n });\r\n\r\n isDate(value: any): boolean {\r\n return (\r\n typeof value === 'string' &&\r\n value.length > 5 &&\r\n !isNaN(Date.parse(value))\r\n );\r\n }\r\n\r\n onSort(col: TableColumn) {\r\n if (this.sortColumn() === col.key) {\r\n // cambiar asc <-> desc\r\n this.sortDirection.set(\r\n this.sortDirection() === 'asc' ? 'desc' : 'asc'\r\n );\r\n } else {\r\n // nueva columna → empieza en desc (más reciente primero)\r\n this.sortColumn.set(col.key);\r\n this.sortDirection.set('desc');\r\n }\r\n }\r\n\r\n onIconColumnClick(col: TableColumn, row: TableRow, event: MouseEvent) {\r\n event.stopPropagation();\r\n\r\n this.iconAction.emit({\r\n action: col.iconKey ?? col.key,\r\n row\r\n });\r\n }\r\n\r\n private recalculateStatusChipWidth() {\r\n const chipEls = this.chips.map(c => c.nativeElement);\r\n\r\n if (!chipEls.length) return;\r\n\r\n // reset previo\r\n chipEls.forEach(el => (el.style.width = 'auto'));\r\n\r\n const widths = chipEls.map(el => el.scrollWidth);\r\n const maxContentWidth = Math.max(...widths);\r\n\r\n chipEls.forEach(el => {\r\n el.style.width = `${maxContentWidth}px`;\r\n });\r\n }\r\n\r\n private getRowId(row: TableRow): string | number | null {\r\n return row?.[this.rowIdKey()];\r\n }\r\n\r\n toggleRowExpand(row: TableRow, event?: MouseEvent) {\r\n event?.stopPropagation();\r\n if (!this.isRowExpandable()(row)) return;\r\n\r\n const id = this.getRowId(row);\r\n this.expandedRowId.set(\r\n this.expandedRowId() === id ? null : id\r\n );\r\n }\r\n\r\n isExpanded(row: TableRow): boolean {\r\n return this.expandedRowId() === this.getRowId(row);\r\n }\r\n\r\n getChildRows(row: TableRow): TableRow[] {\r\n const provider = this.expandedChildren();\r\n if (!provider) return [];\r\n return provider(row) ?? [];\r\n }\r\n\r\n toggleAllRows(checked: boolean) {\r\n if (!checked) {\r\n this.selectedRows.set(new Set());\r\n return;\r\n }\r\n\r\n const allIds = this.sortedData().map(row => row['id']);\r\n this.selectedRows.set(new Set(allIds));\r\n }\r\n\r\n toggleRow(row: any, checked: boolean) {\r\n const next = new Set(this.selectedRows());\r\n\r\n checked ? next.add(row.id) : next.delete(row.id);\r\n this.selectedRows.set(next);\r\n }\r\n\r\n isRowSelected(row: any): boolean {\r\n return this.selectedRows().has(row.id);\r\n }\r\n\r\n isAllSelected(): boolean {\r\n const sorted = this.sortedData();\r\n return sorted.length > 0 && this.selectedRows().size === sorted.length;\r\n }\r\n\r\n getMoneyTotal(col: any): number {\r\n if (col.type !== 'money' || !col.totalizable) return 0;\r\n\r\n return this.sortedData().reduce((acc, row) => {\r\n const value = Number(row[col.key]);\r\n return acc + (isNaN(value) ? 0 : value);\r\n }, 0);\r\n }\r\n\r\n getGradeStyle(value: number): { bg: string; color: string } {\r\n if (value >= 0 && value <= 0.9) return { bg: '#9ED89D', color: '#006D2F' };\r\n if (value > 0.9 && value <= 2.9) return { bg: '#D8BF9D', color: '#CF6507' };\r\n if (value > 2.9 && value <= 4) return { bg: '#D89D9D', color: '#CF0707' };\r\n return { bg: '#BAC2BB', color: '#40484C' };\r\n }\r\n\r\n onGroupItemChange(col: ColumnGroupItem, row: TableRow, value: any) {\r\n this.columnGroupChange.emit({ key: col.key, row, value });\r\n }\r\n\r\n onGroupIconClick(col: ColumnGroupItem, row: TableRow, event: MouseEvent) {\r\n event.stopPropagation();\r\n this.iconAction.emit({ action: col.iconKey ?? col.key, row });\r\n }\r\n\r\n /** Indica si el checkbox marcado tiene un archivo asociado para visualizar */\r\n hasCheckboxFile(col: ColumnGroupItem, row: TableRow): boolean {\r\n if (!row[col.key]) return false;\r\n if (col.fileUrlKey) return !!row[col.fileUrlKey];\r\n return typeof row[col.key] === 'string' && !!row[col.key];\r\n }\r\n\r\n onGroupCheckboxClick(col: ColumnGroupItem, row: TableRow, event: MouseEvent) {\r\n event.stopPropagation();\r\n if (!row[col.key]) return;\r\n\r\n const raw = col.fileUrlKey\r\n ? row[col.fileUrlKey]\r\n : typeof row[col.key] === 'string' ? row[col.key] : null;\r\n\r\n const urls: string[] = Array.isArray(raw)\r\n ? raw.filter(Boolean)\r\n : raw ? [raw] : [];\r\n\r\n if (!urls.length) return;\r\n\r\n const name = col.fileNameKey ? row[col.fileNameKey] : col.label;\r\n this.pdfViewerService.open({ name, urls });\r\n }\r\n}\r\n","<div class=\"table-wrapper\">\n <table class=\"inner-table\">\n <thead>\n <!-- Fila 1 -->\n <tr>\n\n @if (showSelection()) {\n <th class=\"checkbox-header\" [attr.rowspan]=\"hasColumnGroups() ? 2 : null\">\n <label class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [checked]=\"isAllSelected()\" (change)=\"toggleAllRows($event.target.checked)\" />\n <span class=\"checkmark\"></span>\n </label>\n </th>\n }\n\n @for (col of columns(); track col.key) {\n <th (click)=\"col.sortable !== false && onSort(col)\" [class.sortable]=\"col.sortable !== false\"\n [class]=\"getAlignment(col)\" [attr.rowspan]=\"hasColumnGroups() ? 2 : null\">\n {{ col.label }}\n\n <!-- iconos de orden opcionales -->\n @if (sortColumn() === col.key) {\n <span class=\"sort-icon\">\n {{ sortDirection() === 'asc' ? '▲' : '▼' }}\n </span>\n }\n </th>\n }\n\n <!-- headers de grupo (colspan = número de sub-columnas) -->\n @for (group of columnGroups(); track group.groupLabel) {\n <th class=\"column-group-header\" [attr.colspan]=\"group.columns.length\">\n {{ group.groupLabel }}\n </th>\n }\n\n <!-- columna para acciones -->\n @if (showActions()) {\n <th class=\"actions-header\" [attr.rowspan]=\"hasColumnGroups() ? 2 : null\">Acciones</th>\n }\n </tr>\n\n <!-- Fila 2: sub-headers de grupo (solo si hay groups) -->\n @if (hasColumnGroups()) {\n <tr>\n @for (group of columnGroups(); track group.groupLabel) {\n @for (subCol of group.columns; track subCol.key) {\n <th class=\"column-group-sub-header\">{{ subCol.label }}</th>\n }\n }\n </tr>\n }\n </thead>\n\n <tbody>\n @for (row of sortedData(); track row['id']) {\n <tr class=\"parent-row\"\n [class.expandable]=\"isRowExpandable()(row)\"\n [class.expanded]=\"isExpanded(row)\"\n [class.selected]=\"isRowSelected(row)\"\n (click)=\"toggleRowExpand(row, $event)\">\n\n @if (showSelection()) {\n <td class=\"checkbox-cell\">\n <label class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\" [checked]=\"isRowSelected(row)\" (change)=\"toggleRow(row, $event.target.checked)\" />\n <span class=\"checkmark\"></span>\n </label>\n </td>\n }\n\n @for (col of columns(); track col.key) {\n <td [class]=\"getAlignment(col)\">\n @if (col.type === 'status') { @let style =\n getStatusStyle(row[col.key]);\n <span #statusChip class=\"status-chip\" [style.background-color]=\"style.bg\" [style.color]=\"style.color\">\n {{ getStatusLabel(row[col.key]) }}\n </span>\n\n } @else if (col.type === 'icon-button') {\n\n <button (click)=\"onIconColumnClick(col, row, $event)\">\n <span class=\"icon\" [class]=\"col.icon\"></span>\n </button>\n } @else if (col.type === 'grade') {\n @let style = getGradeStyle(row[col.key]);\n <span class=\"status-chip\" [style.background-color]=\"style.bg\" [style.color]=\"style.color\">\n {{ formatValue(col, row[col.key]) }}\n </span>\n } @else {\n {{ formatValue(col, row[col.key]) }}\n\n }\n </td>\n }\n\n <!-- Celdas de grupo -->\n @for (group of columnGroups(); track group.groupLabel) {\n @for (subCol of group.columns; track subCol.key) {\n <td class=\"column-group-cell\">\n @if (!subCol.type || subCol.type === 'checkbox') {\n <label class=\"custom-checkbox\"\n [class.custom-checkbox--file]=\"hasCheckboxFile(subCol, row)\"\n (click)=\"onGroupCheckboxClick(subCol, row, $event)\">\n <input type=\"checkbox\" disabled [checked]=\"row[subCol.key]\" />\n <span class=\"checkmark\"></span>\n </label>\n } @else if (subCol.type === 'number') {\n {{ row[subCol.key] }}\n } @else if (subCol.type === 'percentage') {\n {{ row[subCol.key] }}%\n } @else if (subCol.type === 'icon-button') {\n <button (click)=\"onGroupIconClick(subCol, row, $event)\">\n <span class=\"icon\" [class]=\"subCol.icon\"></span>\n </button>\n }\n </td>\n }\n }\n\n <!-- Celda de acciones -->\n @if (showActions()) {\n <td class=\"acciones-cell\">\n <div class=\"menu-acciones\">\n <button class=\"icon-button\" (click)=\"openModal(row); $event.stopPropagation()\">\n <div class=\"content\">\n <div class=\"state-layer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"more-vert\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </svg>\n </div>\n </div>\n </button>\n @if(selectedRow()?.['id'] === row['id']){\n <div class=\"modal-options-table\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content-table\">\n <ul>\n @for (option of getActionsForRow(row); track $index) {\n <li class=\"option-item-table\" [style.color]=\"getActionColor(option)\"\n (click)=\"onOptionClick(option, row)\">\n <span class=\"icon\" [class]=\"option.icon\"></span>\n <span class=\"label\">{{ option.label }}</span>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n </td>\n }\n </tr>\n <!-- Subfilas (solo si es expandible y está expandida) -->\n @if (isRowExpandable()(row) && isExpanded(row)) {\n <tr class=\"child-row child-header-row\">\n <td class=\"child-cell-full\"\n [attr.colspan]=\"totalColspan()\">\n <div class=\"child-grid\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\">\n <span class=\"child-label\">{{ subCol.label }}</span>\n </div>\n }\n </div>\n </td>\n </tr>\n\n @for (child of getChildRows(row); track child['id']) {\n <tr class=\"child-row\">\n <td class=\"child-cell-full\" [attr.colspan]=\"totalColspan()\">\n <div class=\"child-grid\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\">\n\n @if (subCol.type === 'status') {\n @let style = getStatusStyle(child[subCol.key]);\n <span class=\"status-chip child-status-chip\" [style.background-color]=\"style.bg\"\n [style.color]=\"style.color\">\n {{ getStatusLabel(child[subCol.key]) }}\n </span>\n } @else {\n <span class=\"child-value\">\n {{ formatValue(subCol, child[subCol.key]) }}\n </span>\n }\n\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n }\n @if (showTotals()) {\n <tr class=\"total-row\">\n \n <!-- checkbox -->\n @if (showSelection()) {\n <td class=\"checkbox-cell\"></td>\n }\n \n @for (col of columns(); track col.key) {\n <td [class]=\"getAlignment(col)\">\n \n @if (col.type === 'money' && col.totalizable) {\n {{ formatValue(col, getMoneyTotal(col)) }}\n } @else if (col === columns()[0]) {\n <strong>Total</strong>\n }\n \n </td>\n }\n\n <!-- celdas vacías para sub-columnas de grupo -->\n @for (group of columnGroups(); track group.groupLabel) {\n @for (subCol of group.columns; track subCol.key) {\n <td></td>\n }\n }\n \n @if (showActions()) {\n <td></td>\n }\n \n </tr>\n }\n\n <!-- Fila de leyenda (solo si hay columnGroups) -->\n @for (group of columnGroups(); track group.groupLabel) {\n <tr class=\"legend-row\">\n <td class=\"legend-cell\" [attr.colspan]=\"totalColspan()\">\n <span class=\"legend-title\">{{ group.groupLabel | uppercase }}:</span>\n @for (col of group.columns; track col.key; let last = $last) {\n <span class=\"legend-item\">{{ col.label }}:\n {{ col.description }}{{ last ? '' : ' · ' }}</span>\n }\n </td>\n </tr>\n }\n \n </tbody>\n </table>\n</div>","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTimeMode, Hour12 } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-date-time-picker',\r\n imports: [],\r\n templateUrl: './date-time-picker.html',\r\n styleUrl: './date-time-picker.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateTimePicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateTimePicker implements ControlValueAccessor, OnDestroy {\r\n mode = input<DateTimeMode>('date');\r\n placeholder = input<string>('Seleccionar fecha');\r\n minDate = input<Date | null>(null);\r\n maxDate = input<Date | null>(null);\r\n\r\n dateChange = output<Date | null>();\r\n\r\n isOpen = signal<boolean>(false);\r\n openUpward = signal<boolean>(false);\r\n selectedDate = signal<Date | null>(null);\r\n isDisabled = signal<boolean>(false);\r\n isTouched = signal<boolean>(false);\r\n readonly = input<boolean>(false);\r\n\r\n isBlocked = computed(() => this.isDisabled() || this.readonly());\r\n\r\n // Texto que escribe el usuario (DD/MM/YYYY)\r\n inputTextValue = signal<string>('');\r\n\r\n // Navegación del calendario\r\n currentMonth = signal(new Date().getMonth());\r\n currentYear = signal(new Date().getFullYear());\r\n\r\n // Hora en formato 24h (para el backend)\r\n selectedHour = signal(0);\r\n selectedMinute = signal(0);\r\n \r\n // Estado AM/PM\r\n selectedAmPm = signal<'AM' | 'PM'>('AM');\r\n\r\n private documentClickListener?: (event: Event) => void;\r\n\r\n /**\r\n * Valor que se muestra en el campo de texto.\r\n * Siempre muestra la fecha en formato DD/MM/YYYY.\r\n */\r\n displayValue = computed(() => {\r\n const text = this.inputTextValue().trim();\r\n if (text) {\r\n return text;\r\n }\r\n\r\n const date = this.selectedDate();\r\n if (!date) return '';\r\n\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n });\r\n\r\n monthName = computed(() => {\r\n const months = [\r\n 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\r\n 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'\r\n ];\r\n return months[this.currentMonth()];\r\n });\r\n\r\n calendarDays = computed(() => {\r\n const year = this.currentYear();\r\n const month = this.currentMonth();\r\n const firstDay = new Date(year, month, 1);\r\n const lastDay = new Date(year, month + 1, 0);\r\n const daysInMonth = lastDay.getDate();\r\n const startingDayOfWeek = firstDay.getDay();\r\n\r\n const days: (number | null)[] = [];\r\n\r\n // Días vacíos al inicio\r\n for (let i = 0; i < startingDayOfWeek; i++) {\r\n days.push(null);\r\n }\r\n\r\n // Días del mes\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n days.push(day);\r\n }\r\n\r\n return days;\r\n });\r\n\r\n // Horas en formato 12h\r\n hours12 = computed((): Hour12[] => {\r\n return Array.from({ length: 12 }, (_, i) => {\r\n const hour12 = i === 0 ? 12 : i;\r\n return {\r\n value: hour12,\r\n display: hour12.toString().padStart(2, '0')\r\n };\r\n });\r\n });\r\n\r\n // Hora seleccionada en formato 12h\r\n selectedHour12 = computed(() => {\r\n const hour24 = this.selectedHour();\r\n if (hour24 === 0) return 12;\r\n if (hour24 > 12) return hour24 - 12;\r\n return hour24;\r\n });\r\n\r\n minutes = computed(() => Array.from({ length: 60 }, (_, i) => i));\r\n\r\n private onChange = (value: any) => {};\r\n private onTouched = () => {};\r\n\r\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {}\r\n\r\n ngOnDestroy() {\r\n this.removeDocumentListener();\r\n }\r\n\r\n writeValue(value: any): void {\r\n let date: Date | null = null;\r\n\r\n if (value instanceof Date) {\r\n date = value;\r\n } else if (typeof value === 'string' && value) {\r\n // Manejar tanto fechas ISO como otros formatos de string\r\n const parsedDate = new Date(value);\r\n if (!isNaN(parsedDate.getTime())) {\r\n date = parsedDate;\r\n }\r\n }\r\n\r\n if (date) {\r\n this.updateInternalState(date);\r\n } else {\r\n this.resetInternalState();\r\n }\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.set(isDisabled);\r\n }\r\n\r\n toggle() {\r\n if (this.isBlocked()) return;\r\n\r\n this.markAsTouched();\r\n\r\n if (this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n open() {\r\n if (this.isBlocked()) return;\r\n\r\n this.markAsTouched();\r\n\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n this.openUpward.set(spaceBelow < 420);\r\n\r\n this.isOpen.set(true);\r\n this.addDocumentListener();\r\n\r\n // Si hay fecha seleccionada, navegar a ese mes/año\r\n const selected = this.selectedDate();\r\n if (selected) {\r\n this.currentMonth.set(selected.getMonth());\r\n this.currentYear.set(selected.getFullYear());\r\n }\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.removeDocumentListener();\r\n this.markAsTouched();\r\n }\r\n\r\n selectDay(day: number | null) {\r\n if (!day || this.isBlocked()) return;\r\n\r\n const newDate = new Date(\r\n this.currentYear(),\r\n this.currentMonth(),\r\n day,\r\n this.selectedHour(),\r\n this.selectedMinute()\r\n );\r\n\r\n if (this.isDateDisabled(newDate)) return;\r\n\r\n this.updateInternalState(newDate);\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n\r\n // Solo cerrar automáticamente si es modo 'date'\r\n if (this.mode() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n setHour12(hour12: number) {\r\n if (this.isBlocked()) return;\r\n\r\n // Convertir de 12h a 24h\r\n let hour24: number;\r\n const amPm = this.selectedAmPm();\r\n \r\n if (hour12 === 12) {\r\n hour24 = amPm === 'AM' ? 0 : 12;\r\n } else {\r\n hour24 = amPm === 'AM' ? hour12 : hour12 + 12;\r\n }\r\n\r\n this.selectedHour.set(hour24);\r\n this.updateDateTime();\r\n }\r\n\r\n setMinute(minute: number) {\r\n if (this.isBlocked()) return;\r\n\r\n this.selectedMinute.set(minute);\r\n this.updateDateTime();\r\n }\r\n\r\n setAmPm(amPm: 'AM' | 'PM') {\r\n if (this.isBlocked()) return;\r\n\r\n const currentHour24 = this.selectedHour();\r\n const currentHour12 = this.selectedHour12();\r\n let newHour24: number;\r\n\r\n if (amPm === 'AM') {\r\n newHour24 = currentHour12 === 12 ? 0 : currentHour12;\r\n } else {\r\n newHour24 = currentHour12 === 12 ? 12 : currentHour12 + 12;\r\n }\r\n\r\n this.selectedAmPm.set(amPm);\r\n this.selectedHour.set(newHour24);\r\n this.updateDateTime();\r\n }\r\n\r\n previousMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n\r\n if (currentMonth === 0) {\r\n this.currentMonth.set(11);\r\n this.currentYear.set(currentYear - 1);\r\n } else {\r\n this.currentMonth.set(currentMonth - 1);\r\n }\r\n }\r\n\r\n nextMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n\r\n if (currentMonth === 11) {\r\n this.currentMonth.set(0);\r\n this.currentYear.set(currentYear + 1);\r\n } else {\r\n this.currentMonth.set(currentMonth + 1);\r\n }\r\n }\r\n\r\n previousYear() {\r\n this.currentYear.set(this.currentYear() - 1);\r\n }\r\n\r\n nextYear() {\r\n this.currentYear.set(this.currentYear() + 1);\r\n }\r\n\r\n today() {\r\n const today = new Date();\r\n this.updateInternalState(today);\r\n this.onChange(today.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(today);\r\n\r\n if (this.mode() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n clear() {\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.markAsTouched();\r\n this.dateChange.emit(null);\r\n this.close();\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (this.isBlocked()) return;\r\n\r\n if (event.key === 'Escape') {\r\n this.close();\r\n } else if (event.key === 'Tab') {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n }\r\n\r\n isDaySelected(day: number | null): boolean {\r\n if (!day) return false;\r\n const selected = this.selectedDate();\r\n if (!selected) return false;\r\n\r\n return (\r\n selected.getDate() === day &&\r\n selected.getMonth() === this.currentMonth() &&\r\n selected.getFullYear() === this.currentYear()\r\n );\r\n }\r\n\r\n isToday(day: number | null): boolean {\r\n if (!day) return false;\r\n const today = new Date();\r\n return (\r\n today.getDate() === day &&\r\n today.getMonth() === this.currentMonth() &&\r\n today.getFullYear() === this.currentYear()\r\n );\r\n }\r\n\r\n isDayDisabled(day: number | null): boolean {\r\n if (!day) return true;\r\n \r\n const date = new Date(this.currentYear(), this.currentMonth(), day);\r\n return this.isDateDisabled(date);\r\n }\r\n\r\n isDateDisabled(date: Date): boolean {\r\n const minDate = this.minDate();\r\n const maxDate = this.maxDate();\r\n\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n\r\n return false;\r\n }\r\n\r\n private updateDateTime() {\r\n const selected = this.selectedDate();\r\n if (!selected) return;\r\n\r\n const newDate = new Date(selected);\r\n newDate.setHours(this.selectedHour());\r\n newDate.setMinutes(this.selectedMinute());\r\n\r\n this.updateInternalState(newDate);\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n }\r\n\r\n // Manejo de input de texto (DD/MM/YYYY)\r\n onInputChange(event: Event) {\r\n if (this.isBlocked()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value;\r\n\r\n // Eliminar todo lo que no sea número\r\n const numbersOnly = value.replace(/\\D/g, '');\r\n\r\n // Limitar a 8 dígitos (DDMMYYYY)\r\n const limitedNumbers = numbersOnly.slice(0, 8);\r\n\r\n // Formatear con barras: DD/MM/YYYY\r\n let formatted = '';\r\n if (limitedNumbers.length > 0) {\r\n formatted = limitedNumbers.slice(0, 2);\r\n if (limitedNumbers.length > 2) {\r\n formatted += '/' + limitedNumbers.slice(2, 4);\r\n }\r\n if (limitedNumbers.length > 4) {\r\n formatted += '/' + limitedNumbers.slice(4, 8);\r\n }\r\n }\r\n\r\n this.inputTextValue.set(formatted);\r\n input.value = formatted;\r\n\r\n this.markAsTouched();\r\n\r\n // Solo intentamos parsear cuando tenemos DD/MM/YYYY completo (10 caracteres)\r\n if (formatted.length === 10) {\r\n const parsedDate = this.parseDateInput(formatted);\r\n\r\n if (parsedDate) {\r\n if (this.isDateDisabled(parsedDate)) {\r\n // Está fuera de rango, dejamos el texto pero no cambiamos el valor\r\n return;\r\n }\r\n\r\n this.updateInternalState(parsedDate);\r\n this.onChange(parsedDate.toISOString());\r\n this.dateChange.emit(parsedDate);\r\n }\r\n } else if (formatted.trim() === '') {\r\n // Si el campo queda vacío, limpiamos el valor\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.dateChange.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Selects the date segment (DD, MM, or YYYY) under the cursor on click,\r\n * mimicking native date-input block-editing behavior.\r\n * Format: DD/MM/YYYY → segments at positions 0-1, 3-4, 6-9\r\n */\r\n onInputClick(event: Event) {\r\n event.stopPropagation();\r\n if (this.isBlocked()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const pos = input.selectionStart ?? 0;\r\n const value = input.value;\r\n\r\n // Only do segment selection when the value looks like a date (has slashes)\r\n if (!value || !value.includes('/')) return;\r\n\r\n // Determine which segment the cursor is in\r\n // DD = 0..1, slash at 2, MM = 3..4, slash at 5, YYYY = 6..9\r\n let start: number;\r\n let end: number;\r\n\r\n if (pos <= 2) {\r\n // Day segment\r\n start = 0;\r\n end = 2;\r\n } else if (pos <= 5) {\r\n // Month segment\r\n start = 3;\r\n end = 5;\r\n } else {\r\n // Year segment\r\n start = 6;\r\n end = 10;\r\n }\r\n\r\n // Use setTimeout to override the browser's default selection behavior\r\n setTimeout(() => {\r\n input.setSelectionRange(start, end);\r\n }, 0);\r\n }\r\n\r\n onInputFocus() {\r\n if (this.isBlocked()) return;\r\n this.open();\r\n }\r\n\r\n private parseDateInput(input: string): Date | null {\r\n if (!input || input.trim() === '') return null;\r\n\r\n const match = input.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (match) {\r\n const day = parseInt(match[1], 10);\r\n const month = parseInt(match[2], 10) - 1;\r\n const year = parseInt(match[3], 10);\r\n\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n const date = new Date(year, month, day);\r\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\r\n return date;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private formatDateForInput(date: Date): string {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n\r\n private updateInternalState(date: Date) {\r\n this.selectedDate.set(date);\r\n this.currentMonth.set(date.getMonth());\r\n this.currentYear.set(date.getFullYear());\r\n this.selectedHour.set(date.getHours());\r\n this.selectedMinute.set(date.getMinutes());\r\n this.selectedAmPm.set(date.getHours() >= 12 ? 'PM' : 'AM');\r\n\r\n const formatted = this.formatDateForInput(date);\r\n this.inputTextValue.set(formatted);\r\n }\r\n\r\n private resetInternalState() {\r\n this.selectedDate.set(null);\r\n this.inputTextValue.set('');\r\n this.selectedHour.set(0);\r\n this.selectedMinute.set(0);\r\n this.selectedAmPm.set('AM');\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private addDocumentListener() {\r\n if (this.documentClickListener) {\r\n this.removeDocumentListener();\r\n }\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.documentClickListener = (event: Event) => {\r\n const target = event.target as Node;\r\n if (!this.elementRef.nativeElement.contains(target)) {\r\n this.ngZone.run(() => {\r\n if (this.isOpen()) {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n });\r\n }\r\n };\r\n\r\n setTimeout(() => {\r\n document.addEventListener('click', this.documentClickListener!, true);\r\n }, 10);\r\n });\r\n }\r\n\r\n private removeDocumentListener() {\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n this.documentClickListener = undefined;\r\n }\r\n }\r\n\r\n public markTouched() {\r\n this.markAsTouched();\r\n }\r\n\r\n /**\r\n * Obtiene la fecha seleccionada en formato ISO string\r\n * @returns string ISO o null si no hay fecha seleccionada\r\n */\r\n public getISOString(): string | null {\r\n const date = this.selectedDate();\r\n return date ? date.toISOString() : null;\r\n }\r\n\r\n /**\r\n * Establece la fecha desde un string ISO\r\n * @param isoString - Fecha en formato ISO\r\n */\r\n public setFromISOString(isoString: string | null): void {\r\n if (isoString) {\r\n const date = new Date(isoString);\r\n if (!isNaN(date.getTime())) {\r\n this.writeValue(date);\r\n this.onChange(isoString);\r\n }\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}","<div class=\"datetime-container\">\r\n <div\r\n class=\"datetime-header\"\r\n [class.active]=\"isOpen()\"\r\n [class.disabled]=\"isBlocked()\"\r\n [class.readonly]=\"isBlocked()\"\r\n (click)=\"!isBlocked() && toggle()\"\r\n (keydown)=\"!isBlocked() && onKeyDown($event)\"\r\n tabindex=\"0\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"datetime-input\"\r\n [value]=\"displayValue()\"\r\n [placeholder]=\"placeholder()\"\r\n (input)=\"onInputChange($event)\"\r\n (click)=\"onInputClick($event)\"\r\n (focus)=\"!isBlocked() && onInputFocus()\"\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"readonly()\"\r\n />\r\n\r\n <div class=\"header-icons\">\r\n @if (selectedDate()) {\r\n <span\r\n class=\"clear-icon\"\r\n (click)=\"!isBlocked() && clear(); $event.stopPropagation()\"\r\n title=\"Limpiar\"\r\n >\r\n ×\r\n </span>\r\n }\r\n <span class=\"arrow\" [class.open]=\"isOpen()\"></span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (isOpen()) {\r\n<div class=\"dropdown\" [class.dropdown--upward]=\"openUpward()\">\r\n <div class=\"datetime-content\">\r\n <!-- Sección del calendario -->\r\n <div class=\"calendar-section\">\r\n <!-- Navegación del calendario -->\r\n <div class=\"calendar-nav\">\r\n <div class=\"nav-section\">\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"previousYear()\"\r\n title=\"Año anterior\"\r\n >\r\n ‹‹\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"previousMonth()\"\r\n title=\"Mes anterior\"\r\n >\r\n ‹\r\n </button>\r\n </div>\r\n\r\n <div class=\"current-date\">{{ monthName() }} {{ currentYear() }}</div>\r\n\r\n <div class=\"nav-section\">\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"nextMonth()\"\r\n title=\"Siguiente mes\"\r\n >\r\n ›\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"nav-btn\"\r\n (click)=\"nextYear()\"\r\n title=\"Siguiente año\"\r\n >\r\n ››\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Días de la semana -->\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\">Dom</div>\r\n <div class=\"weekday\">Lun</div>\r\n <div class=\"weekday\">Mar</div>\r\n <div class=\"weekday\">Mié</div>\r\n <div class=\"weekday\">Jue</div>\r\n <div class=\"weekday\">Vie</div>\r\n <div class=\"weekday\">Sáb</div>\r\n </div>\r\n\r\n <!-- Días del mes -->\r\n <div class=\"calendar-grid\">\r\n @for (day of calendarDays(); track $index) {\r\n <div\r\n class=\"calendar-day\"\r\n [class.selected]=\"isDaySelected(day)\"\r\n [class.today]=\"isToday(day)\"\r\n [class.disabled]=\"isDayDisabled(day)\"\r\n [class.empty]=\"!day\"\r\n (click)=\"selectDay(day)\"\r\n >\r\n {{ day || '' }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Selector de tiempo (solo si mode === 'datetime') -->\r\n @if (mode() === 'datetime') {\r\n <div class=\"time-section\">\r\n <div class=\"time-header\">Horario</div>\r\n\r\n <div class=\"time-selectors\">\r\n <div class=\"time-group\">\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Hora</div>\r\n <div class=\"time-scroll\">\r\n @for (hour of hours12(); track hour.value) {\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"hour.value === selectedHour12()\"\r\n (click)=\"setHour12(hour.value)\"\r\n >\r\n {{ hour.display }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator-vertical\">:</div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Min</div>\r\n <div class=\"time-scroll\">\r\n @for (minute of minutes(); track minute) {\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"minute === selectedMinute()\"\r\n (click)=\"setMinute(minute)\"\r\n >\r\n {{ minute.toString().padStart(2, '0') }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">AM/PM</div>\r\n <div class=\"time-scroll ampm\">\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"selectedAmPm() === 'AM'\"\r\n (click)=\"setAmPm('AM')\"\r\n >\r\n AM\r\n </div>\r\n <div\r\n class=\"time-option\"\r\n [class.selected]=\"selectedAmPm() === 'PM'\"\r\n (click)=\"setAmPm('PM')\"\r\n >\r\n PM\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Botones de acción -->\r\n <div class=\"action-buttons\">\r\n <button type=\"button\" class=\"action-btn secondary\" (click)=\"today()\">\r\n Hoy\r\n </button>\r\n @if (mode() === 'datetime') {\r\n <button type=\"button\" class=\"action-btn primary\" (click)=\"close()\">\r\n Aceptar\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n effect,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { DateFilterSelection, DateTimeMode, FilterItem, Hour12 } from '../../interfaces/filters';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-date-time-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './date-time-filter.html',\r\n styleUrl: './date-time-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateTimeFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateTimeFilter implements ControlValueAccessor, OnDestroy {\r\n @ViewChild('chip') chipRef!: ElementRef<HTMLElement>;\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n\r\n // Outputs\r\n dateSelected = output<DateFilterSelection>();\r\n dateChange = output<Date | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n activeFilterType = signal<string | null>(null);\r\n isOpen = signal(false);\r\n selectedDate = signal<Date | null>(null);\r\n inputTextValue = signal<string>('');\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n dropdownDirection = signal<'left' | 'right'>('right');\r\n\r\n // Máscara visual dinámica para la guía de fecha __/__/____\r\n // Devuelve un arreglo de caracteres con flag \"filled\" para poder dar color distinto\r\n inputMask = computed(() => {\r\n const raw = this.inputTextValue() || '';\r\n const numbersOnly = raw.replace(/\\D/g, '');\r\n\r\n const template: { char: string; filled: boolean }[] = [\r\n { char: 'd', filled: false },\r\n { char: 'd', filled: false },\r\n { char: '/', filled: false },\r\n { char: 'm', filled: false },\r\n { char: 'm', filled: false },\r\n { char: '/', filled: false },\r\n { char: 'y', filled: false },\r\n { char: 'y', filled: false },\r\n { char: 'y', filled: false },\r\n { char: 'y', filled: false },\r\n ];\r\n\r\n let index = 0;\r\n\r\n for (let i = 0; i < template.length && index < numbersOnly.length; i++) {\r\n if (template[i].char === '/') continue;\r\n template[i] = { char: numbersOnly[index++], filled: true };\r\n }\r\n\r\n // Cuando se completa el segmento, el slash correspondiente pasa a \"filled\"\r\n if (numbersOnly.length >= 2) {\r\n template[2] = { char: '/', filled: true }; // después de DD\r\n }\r\n if (numbersOnly.length >= 4) {\r\n template[5] = { char: '/', filled: true }; // después de MM\r\n }\r\n\r\n return template; // para usar en el template y colorear por carácter\r\n });\r\n\r\n clearTrigger = input<number>(0);\r\n\r\n // Computed Properties based on active filter\r\n activeFilter = computed(() => {\r\n const type = this.activeFilterType();\r\n return this.filters().find(f => f.value === type) || null;\r\n });\r\n\r\n mode = computed<DateTimeMode>(() => {\r\n const filter = this.activeFilter();\r\n return filter?.type === 'datetime' ? 'datetime' : 'date';\r\n });\r\n\r\n placeholder = computed(() => this.activeFilter()?.placeholder || 'Seleccionar fecha');\r\n minDate = computed(() => this.activeFilter()?.minDate || null);\r\n maxDate = computed(() => this.activeFilter()?.maxDate || null);\r\n filterValue = computed(() => this.activeFilter()?.value || '');\r\n\r\n // Calendar Navigation\r\n currentMonth = signal(new Date().getMonth());\r\n currentYear = signal(new Date().getFullYear());\r\n\r\n // Time State\r\n selectedHour = signal(0);\r\n selectedMinute = signal(0);\r\n selectedAmPm = signal<'AM' | 'PM'>('AM');\r\n\r\n private documentClickListener?: (event: Event) => void;\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.clear();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeDocumentListener();\r\n }\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n\r\n if (this.isOpen()) {\r\n this.close();\r\n }\r\n\r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | Date | null): void {\r\n let date: Date | null = null;\r\n\r\n if (value instanceof Date) {\r\n date = value;\r\n } else if (typeof value === 'string' && value) {\r\n const parsedDate = new Date(value);\r\n if (!isNaN(parsedDate.getTime())) {\r\n date = parsedDate;\r\n }\r\n }\r\n\r\n if (date) {\r\n this.updateInternalState(date);\r\n } else {\r\n this.resetInternalState();\r\n }\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.set(isDisabled);\r\n }\r\n\r\n toggle(filterValue: string) {\r\n this.activeFilterType.set(filterValue);\r\n\r\n if (this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n private calculateDropdownDirectionFromChip(): void {\r\n const chip = this.chipRef?.nativeElement;\r\n if (!chip) return;\r\n\r\n const rect = chip.getBoundingClientRect();\r\n const spaceRight = window.innerWidth - rect.right;\r\n\r\n if (spaceRight < 400) {\r\n this.dropdownDirection.set('left');\r\n } else {\r\n this.dropdownDirection.set('right');\r\n }\r\n }\r\n\r\n open() {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n this.isOpen.set(true);\r\n\r\n this.calculateDropdownDirectionFromChip();\r\n\r\n this.addDocumentListener();\r\n\r\n const selected = this.selectedDate();\r\n if (selected) {\r\n this.currentMonth.set(selected.getMonth());\r\n this.currentYear.set(selected.getFullYear());\r\n }\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.removeDocumentListener();\r\n this.markAsTouched();\r\n }\r\n\r\n // Calendar Logic\r\n selectDay(day: number | null) {\r\n if (!day || this.isDisabled()) return;\r\n\r\n const newDate = new Date(\r\n this.currentYear(),\r\n this.currentMonth(),\r\n day,\r\n this.selectedHour(),\r\n this.selectedMinute()\r\n );\r\n\r\n if (this.isDateDisabled(newDate)) return;\r\n\r\n this.updateInternalState(newDate);\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n\r\n this.dateSelected.emit({\r\n filter: this.filterValue(),\r\n value: newDate,\r\n });\r\n\r\n if (this.mode() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n displayValue = computed(() => {\r\n const date = this.selectedDate();\r\n if (!date) return '';\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n };\r\n\r\n if (this.mode() === 'datetime') {\r\n options.hour = '2-digit';\r\n options.minute = '2-digit';\r\n options.hour12 = true;\r\n }\r\n\r\n return date.toLocaleDateString('es-ES', options);\r\n });\r\n\r\n // Input text handling\r\n onInputChange(event: Event, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value;\r\n\r\n // Remove all non-numeric characters\r\n const numbersOnly = value.replace(/\\D/g, '');\r\n\r\n // Limit to 8 digits (DD/MM/YYYY)\r\n const limitedNumbers = numbersOnly.slice(0, 8);\r\n\r\n // Format with slashes: DD/MM/YYYY\r\n let formatted = '';\r\n if (limitedNumbers.length > 0) {\r\n formatted = limitedNumbers.slice(0, 2);\r\n if (limitedNumbers.length > 2) {\r\n formatted += '/' + limitedNumbers.slice(2, 4);\r\n }\r\n if (limitedNumbers.length > 4) {\r\n formatted += '/' + limitedNumbers.slice(4, 8);\r\n }\r\n }\r\n\r\n // Update the input value\r\n this.inputTextValue.set(formatted);\r\n input.value = formatted;\r\n\r\n this.markAsTouched();\r\n\r\n // Only parse when we have a complete date (DD/MM/YYYY = 10 characters)\r\n if (formatted.length === 10) {\r\n const parsedDate = this.parseDateInput(formatted);\r\n\r\n if (parsedDate) {\r\n if (this.isDateDisabled(parsedDate)) {\r\n return;\r\n }\r\n\r\n this.updateInternalState(parsedDate);\r\n this.onChange(parsedDate.toISOString());\r\n this.dateChange.emit(parsedDate);\r\n this.dateSelected.emit({\r\n filter: filterValue,\r\n value: parsedDate,\r\n });\r\n }\r\n } else if (formatted.trim() === '') {\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.dateChange.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Selects the date segment (DD, MM, or YYYY) under the cursor on click,\r\n * mimicking native date-input block-editing behavior.\r\n * Format: DD/MM/YYYY → segments at positions 0-1, 3-4, 6-9\r\n */\r\n onInputClick(event: Event, filterValue: string) {\r\n event.stopPropagation();\r\n if (this.isDisabled()) return;\r\n\r\n this.activeFilterType.set(filterValue);\r\n\r\n const input = event.target as HTMLInputElement;\r\n const pos = input.selectionStart ?? 0;\r\n const value = input.value;\r\n\r\n // Only do segment selection when the value looks like a date (has slashes)\r\n if (!value || !value.includes('/')) return;\r\n\r\n // Determine which segment the cursor is in\r\n // DD = 0..1, slash at 2, MM = 3..4, slash at 5, YYYY = 6..9\r\n let start: number;\r\n let end: number;\r\n\r\n if (pos <= 2) {\r\n start = 0;\r\n end = 2;\r\n } else if (pos <= 5) {\r\n start = 3;\r\n end = 5;\r\n } else {\r\n start = 6;\r\n end = 10;\r\n }\r\n\r\n // Use setTimeout to override the browser's default selection behavior\r\n setTimeout(() => {\r\n input.setSelectionRange(start, end);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Handles keyboard navigation for segment-based date editing.\r\n * - Tab / ArrowRight: move to next segment\r\n * - Shift+Tab / ArrowLeft: move to previous segment\r\n * - ArrowUp / ArrowDown: increment/decrement current segment\r\n * - Enter: close dropdown and emit\r\n */\r\n onInputKeyDown(event: KeyboardEvent, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const value = input.value;\r\n\r\n // Handle Enter key\r\n if (event.key === 'Enter') {\r\n if (this.isOpen()) {\r\n this.close();\r\n }\r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n return;\r\n }\r\n\r\n // Only handle segment navigation when value has slashes (date format)\r\n if (!value || !value.includes('/')) return;\r\n\r\n const pos = input.selectionStart ?? 0;\r\n\r\n // Determine current segment: 0 = day, 1 = month, 2 = year\r\n let currentSegment: number;\r\n if (pos <= 2) {\r\n currentSegment = 0;\r\n } else if (pos <= 5) {\r\n currentSegment = 1;\r\n } else {\r\n currentSegment = 2;\r\n }\r\n\r\n // Segment ranges\r\n const segments = [\r\n { start: 0, end: 2 }, // DD\r\n { start: 3, end: 5 }, // MM\r\n { start: 6, end: 10 }, // YYYY\r\n ];\r\n\r\n if (event.key === 'Tab') {\r\n if (event.shiftKey) {\r\n // Move to previous segment\r\n if (currentSegment > 0) {\r\n event.preventDefault();\r\n const prev = segments[currentSegment - 1];\r\n setTimeout(() => input.setSelectionRange(prev.start, prev.end), 0);\r\n }\r\n // If at first segment, let Tab work normally (move focus out)\r\n } else {\r\n // Move to next segment\r\n if (currentSegment < 2) {\r\n event.preventDefault();\r\n const next = segments[currentSegment + 1];\r\n setTimeout(() => input.setSelectionRange(next.start, next.end), 0);\r\n }\r\n // If at last segment, let Tab work normally (move focus out)\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n if (currentSegment < 2) {\r\n event.preventDefault();\r\n const next = segments[currentSegment + 1];\r\n setTimeout(() => input.setSelectionRange(next.start, next.end), 0);\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n if (currentSegment > 0) {\r\n event.preventDefault();\r\n const prev = segments[currentSegment - 1];\r\n setTimeout(() => input.setSelectionRange(prev.start, prev.end), 0);\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n\r\n // Parse current value\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (!match) return;\r\n\r\n let day = parseInt(match[1], 10);\r\n let month = parseInt(match[2], 10);\r\n let year = parseInt(match[3], 10);\r\n const delta = event.key === 'ArrowUp' ? 1 : -1;\r\n\r\n if (currentSegment === 0) {\r\n // Increment/decrement day\r\n day += delta;\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day < 1) day = maxDay;\r\n if (day > maxDay) day = 1;\r\n } else if (currentSegment === 1) {\r\n // Increment/decrement month\r\n month += delta;\r\n if (month < 1) month = 12;\r\n if (month > 12) month = 1;\r\n // Clamp day to valid range for new month\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n } else {\r\n // Increment/decrement year\r\n year += delta;\r\n if (year < 1900) year = 1900;\r\n if (year > 2100) year = 2100;\r\n // Clamp day (for leap year changes on Feb 29)\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n }\r\n\r\n const newFormatted = `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}`;\r\n this.inputTextValue.set(newFormatted);\r\n input.value = newFormatted;\r\n\r\n // Parse and update if valid\r\n const parsedDate = this.parseDateInput(newFormatted);\r\n if (parsedDate && !this.isDateDisabled(parsedDate)) {\r\n this.updateInternalState(parsedDate);\r\n this.onChange(parsedDate.toISOString());\r\n this.dateChange.emit(parsedDate);\r\n this.dateSelected.emit({ filter: filterValue, value: parsedDate });\r\n }\r\n\r\n // Re-select the same segment\r\n const seg = segments[currentSegment];\r\n setTimeout(() => input.setSelectionRange(seg.start, seg.end), 0);\r\n return;\r\n }\r\n\r\n // Handle Escape\r\n if (event.key === 'Escape') {\r\n this.close();\r\n return;\r\n }\r\n }\r\n\r\n onInputFocus(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n this.activeFilterType.set(filterValue);\r\n this.open();\r\n }\r\n\r\n private parseDateInput(input: string): Date | null {\r\n if (!input || input.trim() === '') return null;\r\n\r\n // Only accept DD/MM/YYYY format\r\n const match = input.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (match) {\r\n const day = parseInt(match[1], 10);\r\n const month = parseInt(match[2], 10) - 1;\r\n const year = parseInt(match[3], 10);\r\n\r\n // Validate date\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n const date = new Date(year, month, day);\r\n // Check if date is valid (handles invalid dates like 31/02/2024)\r\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\r\n return date;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n monthName = computed(() => {\r\n const months = [\r\n 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',\r\n 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'\r\n ];\r\n return months[this.currentMonth()];\r\n });\r\n\r\n calendarDays = computed(() => {\r\n const year = this.currentYear();\r\n const month = this.currentMonth();\r\n const firstDay = new Date(year, month, 1);\r\n const lastDay = new Date(year, month + 1, 0);\r\n const daysInMonth = lastDay.getDate();\r\n const startingDayOfWeek = firstDay.getDay();\r\n\r\n const days: (number | null)[] = [];\r\n for (let i = 0; i < startingDayOfWeek; i++) days.push(null);\r\n for (let day = 1; day <= daysInMonth; day++) days.push(day);\r\n return days;\r\n });\r\n\r\n hours12 = computed((): Hour12[] => {\r\n return Array.from({ length: 12 }, (_, i) => {\r\n const hour12 = i === 0 ? 12 : i;\r\n return {\r\n value: hour12,\r\n display: hour12.toString().padStart(2, '0')\r\n };\r\n });\r\n });\r\n\r\n selectedHour12 = computed(() => {\r\n const hour24 = this.selectedHour();\r\n if (hour24 === 0) return 12;\r\n if (hour24 > 12) return hour24 - 12;\r\n return hour24;\r\n });\r\n\r\n minutes = computed(() => Array.from({ length: 60 }, (_, i) => i));\r\n\r\n // Helper methods\r\n private updateInternalState(date: Date) {\r\n this.selectedDate.set(date);\r\n this.currentMonth.set(date.getMonth());\r\n this.currentYear.set(date.getFullYear());\r\n this.selectedHour.set(date.getHours());\r\n this.selectedMinute.set(date.getMinutes());\r\n this.selectedAmPm.set(date.getHours() >= 12 ? 'PM' : 'AM');\r\n\r\n // Update input text value to match the formatted date\r\n const formatted = this.formatDateForInput(date);\r\n this.inputTextValue.set(formatted);\r\n }\r\n\r\n private resetInternalState() {\r\n this.selectedDate.set(null);\r\n this.inputTextValue.set('');\r\n this.selectedHour.set(0);\r\n this.selectedMinute.set(0);\r\n this.selectedAmPm.set('AM');\r\n }\r\n\r\n private formatDateForInput(date: Date): string {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private addDocumentListener() {\r\n if (this.documentClickListener) this.removeDocumentListener();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.documentClickListener = (event: Event) => {\r\n const target = event.target as Node;\r\n if (!this.elementRef.nativeElement.contains(target)) {\r\n this.ngZone.run(() => {\r\n if (this.isOpen()) {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n });\r\n }\r\n };\r\n setTimeout(() => document.addEventListener('click', this.documentClickListener!, true), 10);\r\n });\r\n }\r\n\r\n private removeDocumentListener() {\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n this.documentClickListener = undefined;\r\n }\r\n }\r\n\r\n // Navigation methods\r\n previousMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n if (currentMonth === 0) {\r\n this.currentMonth.set(11);\r\n this.currentYear.set(currentYear - 1);\r\n } else {\r\n this.currentMonth.set(currentMonth - 1);\r\n }\r\n }\r\n\r\n nextMonth() {\r\n const currentMonth = this.currentMonth();\r\n const currentYear = this.currentYear();\r\n if (currentMonth === 11) {\r\n this.currentMonth.set(0);\r\n this.currentYear.set(currentYear + 1);\r\n } else {\r\n this.currentMonth.set(currentMonth + 1);\r\n }\r\n }\r\n\r\n previousYear() { this.currentYear.set(this.currentYear() - 1); }\r\n nextYear() { this.currentYear.set(this.currentYear() + 1); }\r\n\r\n today() {\r\n const today = new Date();\r\n this.updateInternalState(today);\r\n this.onChange(today.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(today);\r\n this.dateSelected.emit({ filter: this.filterValue(), value: today });\r\n if (this.mode() === 'date') this.close();\r\n }\r\n\r\n clear() {\r\n this.resetInternalState();\r\n this.onChange(null);\r\n this.markAsTouched();\r\n this.dateChange.emit(null);\r\n this.close();\r\n }\r\n\r\n // Time setters\r\n setHour12(hour12: number) {\r\n if (this.isDisabled()) return;\r\n const amPm = this.selectedAmPm();\r\n const hour24 = hour12 === 12 ? (amPm === 'AM' ? 0 : 12) : (amPm === 'AM' ? hour12 : hour12 + 12);\r\n this.selectedHour.set(hour24);\r\n this.updateDateTime();\r\n }\r\n\r\n setMinute(minute: number) {\r\n if (this.isDisabled()) return;\r\n this.selectedMinute.set(minute);\r\n this.updateDateTime();\r\n }\r\n\r\n setAmPm(amPm: 'AM' | 'PM') {\r\n if (this.isDisabled()) return;\r\n const currentHour12 = this.selectedHour12();\r\n const newHour24 = amPm === 'AM' ? (currentHour12 === 12 ? 0 : currentHour12) : (currentHour12 === 12 ? 12 : currentHour12 + 12);\r\n this.selectedAmPm.set(amPm);\r\n this.selectedHour.set(newHour24);\r\n this.updateDateTime();\r\n }\r\n\r\n private updateDateTime() {\r\n const selected = this.selectedDate();\r\n if (!selected) return;\r\n const newDate = new Date(selected);\r\n newDate.setHours(this.selectedHour());\r\n newDate.setMinutes(this.selectedMinute());\r\n this.selectedDate.set(newDate);\r\n\r\n // Update input text value\r\n const formatted = this.formatDateForInput(newDate);\r\n this.inputTextValue.set(formatted);\r\n\r\n this.onChange(newDate.toISOString());\r\n this.markAsTouched();\r\n this.dateChange.emit(newDate);\r\n this.dateSelected.emit({\r\n filter: this.filterValue(),\r\n value: newDate,\r\n });\r\n }\r\n\r\n // Validation helpers\r\n isDaySelected(day: number | null): boolean {\r\n if (!day) return false;\r\n const selected = this.selectedDate();\r\n return !!selected && selected.getDate() === day && selected.getMonth() === this.currentMonth() && selected.getFullYear() === this.currentYear();\r\n }\r\n\r\n isToday(day: number | null): boolean {\r\n if (!day) return false;\r\n const today = new Date();\r\n return today.getDate() === day && today.getMonth() === this.currentMonth() && today.getFullYear() === this.currentYear();\r\n }\r\n\r\n isDayDisabled(day: number | null): boolean {\r\n if (!day) return true;\r\n return this.isDateDisabled(new Date(this.currentYear(), this.currentMonth(), day));\r\n }\r\n\r\n isDateDisabled(date: Date): boolean {\r\n const minDate = this.minDate();\r\n const maxDate = this.maxDate();\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n return false;\r\n }\r\n}","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip-input-wrapper\" #chip [class.has-value]=\"selectedDate() || inputTextValue()\"\r\n [class.active]=\"activeFilterType() === item.value\">\r\n <!-- Etiqueta flotante -->\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'dd/mm/aaaa' }}</label>\r\n\r\n <!-- Máscara de guía de fecha dinámica (__/__/____) -->\r\n <div class=\"chip-input-mask\">\r\n @for (part of inputMask(); track $index) {\r\n <span class=\"mask-char\" [class.mask-char-filled]=\"part.filled\" [class.mask-char-placeholder]=\"!part.filled\">\r\n {{ part.char }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <input type=\"text\" [value]=\"inputTextValue()\" (input)=\"onInputChange($event, item.value)\"\r\n (click)=\"onInputClick($event, item.value)\"\r\n (focus)=\"onInputFocus(item.value)\" [placeholder]=\"item.placeholder || 'Seleccionar Fecha'\" class=\"chip-input\"\r\n [disabled]=\"isDisabled()\" (keydown)=\"onInputKeyDown($event, item.value)\" />\r\n\r\n <button type=\"button\" class=\"calendar-icon-button\" (click)=\"toggle(item.value)\" title=\"Abrir calendario\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-calendar-event\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M4 5m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z\" />\r\n <path d=\"M16 3l0 4\" />\r\n <path d=\"M8 3l0 4\" />\r\n <path d=\"M4 11l16 0\" />\r\n <path d=\"M8 15h2v2h-2z\" />\r\n </svg>\r\n </button>\r\n\r\n @if (isOpen() && activeFilterType() === item.value) {\r\n <div class=\"dropdown\" [class.open-left]=\"dropdownDirection() === 'left'\">\r\n <div class=\"datetime-content\">\r\n <!-- Sección del calendario -->\r\n <div class=\"calendar-section\">\r\n <!-- Navegación -->\r\n <div class=\"calendar-nav\">\r\n <div class=\"nav-section\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousYear()\" title=\"Año anterior\">\r\n ‹‹\r\n </button>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousMonth()\" title=\"Mes anterior\">\r\n ‹\r\n </button>\r\n </div>\r\n\r\n <div class=\"current-date\">\r\n {{ monthName() }} {{ currentYear() }}\r\n </div>\r\n\r\n <div class=\"nav-section\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextMonth()\" title=\"Siguiente mes\">\r\n ›\r\n </button>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextYear()\" title=\"Siguiente año\">\r\n ››\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Días de la semana -->\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\">Dom</div>\r\n <div class=\"weekday\">Lun</div>\r\n <div class=\"weekday\">Mar</div>\r\n <div class=\"weekday\">Mié</div>\r\n <div class=\"weekday\">Jue</div>\r\n <div class=\"weekday\">Vie</div>\r\n <div class=\"weekday\">Sáb</div>\r\n </div>\r\n\r\n <!-- Días -->\r\n <div class=\"calendar-grid\">\r\n @for (day of calendarDays(); track $index) {\r\n <div class=\"calendar-day\" [class.selected]=\"isDaySelected(day)\" [class.today]=\"isToday(day)\"\r\n [class.disabled]=\"isDayDisabled(day)\" [class.empty]=\"!day\" (click)=\"selectDay(day)\">\r\n {{ day || \"\" }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- TIME PICKER -->\r\n @if (mode() === 'datetime') {\r\n <div class=\"time-section\">\r\n <div class=\"time-header\">Horario</div>\r\n\r\n <div class=\"time-selectors\">\r\n <div class=\"time-group\">\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Hora</div>\r\n <div class=\"time-scroll\">\r\n @for (hour of hours12(); track hour.value) {\r\n <div class=\"time-option\" [class.selected]=\"hour.value === selectedHour12()\"\r\n (click)=\"setHour12(hour.value)\">\r\n {{ hour.display }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator-vertical\">:</div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">Min</div>\r\n <div class=\"time-scroll\">\r\n @for (minute of minutes(); track minute) {\r\n <div class=\"time-option\" [class.selected]=\"minute === selectedMinute()\" (click)=\"setMinute(minute)\">\r\n {{ minute.toString().padStart(2, \"0\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-column\">\r\n <div class=\"time-label\">AM/PM</div>\r\n <div class=\"time-scroll ampm\">\r\n <div class=\"time-option\" [class.selected]=\"selectedAmPm() === 'AM'\" (click)=\"setAmPm('AM')\">\r\n AM\r\n </div>\r\n <div class=\"time-option\" [class.selected]=\"selectedAmPm() === 'PM'\" (click)=\"setAmPm('PM')\">\r\n PM\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- botones -->\r\n <div class=\"action-buttons\">\r\n <button type=\"button\" class=\"action-btn secondary\" (click)=\"today()\">\r\n Hoy\r\n </button>\r\n\r\n @if (mode() === 'datetime') {\r\n <button type=\"button\" class=\"action-btn primary\" (click)=\"close()\">\r\n Aceptar\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n effect,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FilterItem } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-input-number-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule],\r\n templateUrl: './input-number-filter.html',\r\n styleUrl: './input-number-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputNumberFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputNumberFilter implements ControlValueAccessor, OnDestroy {\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n clearTrigger = input<number>(0); // Increment this to trigger a clear\r\n\r\n // Outputs\r\n filterSelected = output<{ filter: string; value: string }>();\r\n valueChange = output<string | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n filterValues = signal<Record<string, string>>({});\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor() {\r\n // Watch for clear trigger changes\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n // No cleanup needed\r\n }\r\n\r\n private resetAllFilters() {\r\n this.filterValues.set({});\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | null): void {\r\n // Not used for multiple inputs\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.set(isDisabled);\r\n }\r\n\r\n // Public Methods\r\n onInputChange(event: Event, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const value = (event.target as HTMLInputElement).value;\r\n\r\n this.updateFilterValue(filterValue, value);\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n private updateFilterValue(filterValue: string, value: string) {\r\n this.markAsTouched();\r\n\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [filterValue]: value\r\n }));\r\n\r\n const normalized = value || null;\r\n\r\n this.onChange(normalized);\r\n this.valueChange.emit(normalized);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: value,\r\n });\r\n }\r\n\r\n clearFilter(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n\r\n // Limpiar el valor del filtro específico\r\n this.filterValues.update(current => {\r\n const updated = { ...current };\r\n delete updated[filterValue];\r\n return updated;\r\n });\r\n\r\n // Emitir eventos\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: '',\r\n });\r\n }\r\n\r\n increment(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const currentValue = this.filterValues()[filterValue];\r\n const numeric = currentValue !== undefined && currentValue !== null && currentValue !== ''\r\n ? parseFloat(currentValue)\r\n : 0;\r\n\r\n const next = isNaN(numeric) ? 0 : numeric + 1;\r\n this.updateFilterValue(filterValue, String(next));\r\n }\r\n\r\n decrement(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const currentValue = this.filterValues()[filterValue];\r\n const numeric = currentValue !== undefined && currentValue !== null && currentValue !== ''\r\n ? parseFloat(currentValue)\r\n : 0;\r\n\r\n const next = isNaN(numeric) ? 0 : numeric - 1;\r\n this.updateFilterValue(filterValue, String(next));\r\n }\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n \r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n}\r\n","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip-input-wrapper\" [class.has-value]=\"filterValues()[item.value]\">\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Escribir Número' }}</label>\r\n <input\r\n type=\"number\"\r\n [value]=\"filterValues()[item.value] || ''\"\r\n (input)=\"onInputChange($event, item.value)\"\r\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Escribir Número')\"\r\n class=\"chip-input\"\r\n [disabled]=\"isDisabled()\"\r\n (keydown)=\"onEnter($event)\"\r\n />\r\n <div class=\"right-controls\">\r\n @if (filterValues()[item.value]) {\r\n <button type=\"button\" class=\"clear-button\" (click)=\"clearFilter(item.value)\" title=\"Limpiar\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n }\r\n <div class=\"spinner-buttons\">\r\n <button\r\n type=\"button\"\r\n class=\"spinner-button spinner-button-up\"\r\n (click)=\"increment(item.value)\"\r\n title=\"Aumentar\"\r\n >\r\n ▲\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"spinner-button spinner-button-down\"\r\n (click)=\"decrement(item.value)\"\r\n title=\"Disminuir\"\r\n >\r\n ▼\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n effect,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FilterItem } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-input-select-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule],\r\n templateUrl: './input-select-filter.html',\r\n styleUrl: './input-select-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputSelectFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputSelectFilter implements ControlValueAccessor, OnDestroy {\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n clearTrigger = input<number>(0); // Increment this to trigger a clear\r\n\r\n // Outputs\r\n filterSelected = output<{ filter: string; value: string }>();\r\n valueChange = output<string | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n activeFilterType = signal<string | null>(null);\r\n isOpen = signal(false);\r\n selectedLabel = signal<string>('');\r\n filterValues = signal<Record<string, string>>({});\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n searchTerm = signal('');\r\n\r\n // Computed Properties based on active filter\r\n activeFilter = computed(() => {\r\n const type = this.activeFilterType();\r\n return this.filters().find(f => f.value === type) || null;\r\n });\r\n\r\n placeholder = computed(() => this.activeFilter()?.placeholder || 'Seleccionar...');\r\n filterValueKey = computed(() => this.activeFilter()?.value || '');\r\n options = computed(() => this.activeFilter()?.options || []);\r\n filteredOptions = computed(() => {\r\n const term = this.searchTerm().toLowerCase().trim();\r\n const opts = this.options();\r\n\r\n if (!term) return opts;\r\n\r\n return opts.filter(option =>\r\n option.label.toLowerCase().includes(term) ||\r\n option.value.toString().toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n private documentClickListener?: (event: Event) => void;\r\n private documentClickTimer: ReturnType<typeof setTimeout> | null = null;\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {\r\n // Watch for clear trigger changes\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeDocumentListener();\r\n if (this.documentClickTimer !== null) {\r\n clearTimeout(this.documentClickTimer);\r\n this.documentClickTimer = null;\r\n }\r\n }\r\n\r\n private resetAllFilters() {\r\n this.filterValues.set({});\r\n this.selectedLabel.set('');\r\n this.activeFilterType.set(null);\r\n this.isOpen.set(false);\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | null): void {\r\n // If we had a way to map value back to label without activeFilter, we would do it here.\r\n // For now, we might need to rely on the consumer or just show the value if label not found.\r\n // But since we only know options when activeFilter is set, this is tricky.\r\n // However, usually writeValue is for the form control value.\r\n // Let's just store it.\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.set(isDisabled);\r\n }\r\n\r\n // Public Methods\r\n toggle(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n if (this.activeFilterType() === filterValue && this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.activeFilterType.set(filterValue);\r\n this.open();\r\n }\r\n }\r\n\r\n open() {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n this.isOpen.set(true);\r\n this.addDocumentListener();\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.removeDocumentListener();\r\n this.markAsTouched();\r\n }\r\n\r\n selectOption(option: { label: string; value: string }) {\r\n this.selectedLabel.set(option.label);\r\n\r\n const type = this.activeFilterType();\r\n if (type) {\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [type]: option.label // Show label in chip\r\n }));\r\n }\r\n\r\n this.onChange(option.value);\r\n this.valueChange.emit(option.value);\r\n this.filterSelected.emit({\r\n filter: this.filterValueKey(),\r\n value: option.value,\r\n });\r\n this.close();\r\n // this.enterPressed.emit();\r\n }\r\n\r\n clear() {\r\n this.selectedLabel.set('');\r\n const type = this.activeFilterType();\r\n if (type) {\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [type]: ''\r\n }));\r\n }\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n this.searchTerm.set('');\r\n this.close();\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n onInputChange(event: Event, filterType: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const target = event.target as HTMLInputElement;\r\n const value = target.value;\r\n\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [filterType]: value,\r\n }));\r\n\r\n this.searchTerm.set(value);\r\n this.activeFilterType.set(filterType);\r\n\r\n if (!this.isOpen()) {\r\n this.open();\r\n }\r\n }\r\n\r\n onFocusFilter(filterType: string) {\r\n if (this.isDisabled()) return;\r\n\r\n this.activeFilterType.set(filterType);\r\n const currentValue = this.filterValues()[filterType] || '';\r\n this.searchTerm.set(currentValue);\r\n\r\n if (!this.isOpen()) {\r\n this.open();\r\n }\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n } else if (event.key === 'Enter') {\r\n const filtered = this.filteredOptions();\r\n if (filtered.length > 0) {\r\n this.selectOption(filtered[0]);\r\n }\r\n }\r\n }\r\n\r\n /* onKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n return;\r\n }\r\n } */\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n \r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n\r\n /* onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // 🔹 Caso 1: no está abierto → solo abrir\r\n if (!this.isOpen()) {\r\n this.open();\r\n return;\r\n }\r\n\r\n // 🔹 Caso 2: está abierto → seleccionar primera opción\r\n const options = this.filteredOptions();\r\n if (options.length > 0) {\r\n this.selectOption(options[0]);\r\n }\r\n } */\r\n\r\n private addDocumentListener() {\r\n if (this.documentClickListener) this.removeDocumentListener();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.documentClickListener = (event: Event) => {\r\n const target = event.target as Node;\r\n if (!this.elementRef.nativeElement.contains(target)) {\r\n this.ngZone.run(() => {\r\n if (this.isOpen()) {\r\n this.markAsTouched();\r\n this.close();\r\n }\r\n });\r\n }\r\n };\r\n // Guardamos el handle para poder cancelar si el componente se destruye\r\n // antes de que el timeout dispare\r\n this.documentClickTimer = setTimeout(() => {\r\n this.documentClickTimer = null;\r\n document.addEventListener('click', this.documentClickListener!, true);\r\n }, 10);\r\n });\r\n }\r\n\r\n private removeDocumentListener() {\r\n if (this.documentClickTimer !== null) {\r\n clearTimeout(this.documentClickTimer);\r\n this.documentClickTimer = null;\r\n }\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n this.documentClickListener = undefined;\r\n }\r\n }\r\n}\r\n","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip\" [class.active]=\"activeFilterType() === item.value\" [class.has-value]=\"filterValues()[item.value]\">\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Seleccionar' }}</label>\r\n <div class=\"content-chip\">\r\n <input type=\"text\" class=\"chip-input\" [value]=\"filterValues()[item.value] || ''\"\r\n (input)=\"onInputChange($event, item.value)\" (focus)=\"onFocusFilter(item.value)\"\r\n (click)=\"$event.stopPropagation()\" (keydown)=\"onKeyDown($event)\" (keydown)=\"onEnter($event)\"\r\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Seleccionar')\"\r\n [disabled]=\"isDisabled()\" />\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-list\" (click)=\"onFocusFilter(item.value)\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M9 6l11 0\" />\r\n <path d=\"M9 12l11 0\" />\r\n <path d=\"M9 18l11 0\" />\r\n <path d=\"M5 6l0 .01\" />\r\n <path d=\"M5 12l0 .01\" />\r\n <path d=\"M5 18l0 .01\" />\r\n </svg>\r\n </div>\r\n\r\n @if (isOpen() && activeFilterType() === item.value) {\r\n <div class=\"dropdown\">\r\n <div class=\"options-list\">\r\n <!-- Opción por defecto sin valor -->\r\n <div class=\"option-item option-default\" (click)=\"clear()\">\r\n {{ 'Seleccionar' }}\r\n </div>\r\n @for (option of filteredOptions(); track option.value) {\r\n <div class=\"option-item\" (click)=\"selectOption(option)\">\r\n {{ option.label }}\r\n </div>\r\n }\r\n @if (filteredOptions().length === 0) {\r\n <div class=\"no-options\">No hay opciones</div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n effect,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FilterItem } from '../../interfaces/filters';\r\n\r\n@Component({\r\n selector: 'lib-input-text-filter',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule],\r\n templateUrl: './input-text-filter.html',\r\n styleUrl: './input-text-filter.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputTextFilter),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputTextFilter implements ControlValueAccessor, OnDestroy {\r\n // Inputs\r\n filters = input<FilterItem[]>([]);\r\n clearTrigger = input<number>(0); // Increment this to trigger a clear\r\n\r\n // Outputs\r\n filterSelected = output<{ filter: string; value: string }>();\r\n valueChange = output<string | null>();\r\n enterPressed = output<void>();\r\n\r\n // Internal State\r\n filterValues = signal<Record<string, string>>({});\r\n isDisabled = signal(false);\r\n isTouched = signal(false);\r\n\r\n private onChange: (value: string | null) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor() {\r\n // Watch for clear trigger changes\r\n effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n // No cleanup needed\r\n }\r\n\r\n private resetAllFilters() {\r\n this.filterValues.set({});\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: string | null): void {\r\n // Not used for multiple inputs\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.set(isDisabled);\r\n }\r\n\r\n // Public Methods\r\n onInputChange(event: Event, filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n const value = (event.target as HTMLInputElement).value;\r\n \r\n this.markAsTouched();\r\n \r\n // Actualizar el valor del filtro específico\r\n this.filterValues.update(current => ({\r\n ...current,\r\n [filterValue]: value\r\n }));\r\n\r\n // Emitir eventos\r\n this.onChange(value || null);\r\n this.valueChange.emit(value || null);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: value,\r\n });\r\n }\r\n\r\n clearFilter(filterValue: string) {\r\n if (this.isDisabled()) return;\r\n\r\n this.markAsTouched();\r\n \r\n // Limpiar el valor del filtro específico\r\n this.filterValues.update(current => {\r\n const updated = { ...current };\r\n delete updated[filterValue];\r\n return updated;\r\n });\r\n\r\n // Emitir eventos\r\n this.onChange(null);\r\n this.valueChange.emit(null);\r\n this.filterSelected.emit({\r\n filter: filterValue,\r\n value: '',\r\n });\r\n }\r\n\r\n private markAsTouched() {\r\n if (!this.isTouched()) {\r\n this.isTouched.set(true);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n onEnter(event: KeyboardEvent) {\r\n if (event.key !== 'Enter') return;\r\n \r\n event.preventDefault();\r\n this.enterPressed.emit();\r\n }\r\n}\r\n","<div class=\"filter-chips\">\r\n @for (item of filters(); track item.value) {\r\n <div class=\"chip-input-wrapper\" [class.has-value]=\"filterValues()[item.value]\">\r\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Escribir' }}</label>\r\n <input type=\"text\" [value]=\"filterValues()[item.value] || ''\" (input)=\"onInputChange($event, item.value)\"\r\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Escribir')\"\r\n class=\"chip-input\" [disabled]=\"isDisabled()\" (keydown)=\"onEnter($event)\" />\r\n @if (filterValues()[item.value]) {\r\n <button type=\"button\" class=\"clear-button\" (click)=\"clearFilter(item.value)\" title=\"Limpiar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>","import { Component, input, model, output, signal, ElementRef, inject, effect } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-input',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './input.html',\r\n styleUrl: './input.css',\r\n})\r\nexport class Input {\r\n private readonly el = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n const v = this.value();\r\n const inputEl = this.el.nativeElement.querySelector('input');\r\n if (inputEl && inputEl.value !== v) {\r\n inputEl.value = v;\r\n }\r\n });\r\n }\r\n\r\n mode = input<'search' | 'select'>('search');\r\n placeholder = input<string>();\r\n type = input<string>('text');\r\n value = model<string>('');\r\n maxLength = input<number | null>(null);\r\n uppercase = input<boolean>(false);\r\n regex = input<RegExp | null>(null);\r\n onSearch = output<string>();\r\n onSelect = output<string>();\r\n onClear = output<void>();\r\n\r\n options = input<{ code: string; name: string }[]>([]);\r\n showDropdown = signal(false);\r\n\r\n clear() {\r\n this.value.set('');\r\n this.onClear.emit();\r\n }\r\n\r\n search() {\r\n this.onSearch.emit(this.value());\r\n }\r\n\r\n handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n let inputValue = target.value;\r\n\r\n if (this.type() === 'number') {\r\n inputValue = inputValue.replace(/[^0-9]/g, '');\r\n }\r\n\r\n const max = this.maxLength();\r\n if (max !== null && inputValue.length > max) {\r\n inputValue = inputValue.slice(0, max);\r\n }\r\n\r\n if (this.uppercase()) {\r\n inputValue = inputValue.toUpperCase();\r\n }\r\n\r\n const currentRegex = this.regex();\r\n if (currentRegex && inputValue !== '') {\r\n const pattern = new RegExp(currentRegex);\r\n if (!pattern.test(inputValue)) {\r\n inputValue = this.value();\r\n }\r\n }\r\n\r\n target.value = inputValue;\r\n this.value.set(inputValue);\r\n }\r\n\r\n selectOption(option: any) {\r\n this.value.set(`${option.code} - ${option.name}`);\r\n this.showDropdown.set(false);\r\n }\r\n \r\n openSelect() {\r\n this.showDropdown.set(!this.showDropdown());\r\n }\r\n}\r\n","<div class=\"input-wrapper\">\r\n <input\r\n [type]=\"type()\"\r\n [placeholder]=\"placeholder()\"\r\n class=\"custom-input\"\r\n [value]=\"value()\"\r\n [attr.maxlength]=\"maxLength()\"\r\n [style.text-transform]=\"uppercase() ? 'uppercase' : null\"\r\n (input)=\"handleInput($event)\"\r\n (keyup.enter)=\"search()\"\r\n />\r\n\r\n @if (value() && mode() === 'search') {\r\n <button class=\"clear-btn\" (click)=\"clear()\" type=\"button\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n } @if (mode() === 'search') {\r\n <button class=\"search-btn\" (click)=\"search()\" type=\"button\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"56\"\r\n height=\"56\"\r\n fill=\"none\"\r\n viewBox=\"0 0 56 56\"\r\n >\r\n <g clip-path=\"url(#clip0_190_2403)\">\r\n <path\r\n fill=\"#454733\"\r\n d=\"M31.755 30.255h-.79l-.28-.27a6.47 6.47 0 0 0 1.57-4.23 6.5 6.5 0 1 0-6.5 6.5c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99 1.49-1.49zm-6 0c-2.49 0-4.5-2.01-4.5-4.5s2.01-4.5 4.5-4.5 4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_190_2403\">\r\n <rect width=\"56\" height=\"56\" fill=\"#fff\" rx=\"28\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n } @else {\r\n <button class=\"select-btn\" (click)=\"openSelect()\" type=\"button\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-chevron-down\"\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M6 9l6 6l6 -6\" />\r\n </svg>\r\n </button>\r\n }\r\n</div>\r\n\r\n@if (showDropdown()) {\r\n <div class=\"dropdown-menu\">\r\n @for (option of options(); track option.code) {\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <span class=\"code\">{{ option.code }}</span>\r\n <span class=\"dash\">-</span>\r\n <span class=\"name\">{{ option.name }}</span>\r\n </button>\r\n }\r\n </div>\r\n}","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n HostListener,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\ninterface Option {\r\n value: any;\r\n label: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-select-custom-search',\r\n imports: [],\r\n templateUrl: './select-custom-search.html',\r\n styleUrl: './select-custom-search.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectCustomSearch),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SelectCustomSearch implements ControlValueAccessor {\r\n options = input<Option[]>([]);\r\n placeholder = input<string>('Seleccionar opción');\r\n\r\n selectionChange = output<Option | null>();\r\n\r\n isOpen = signal(false);\r\n openUpward = signal(false);\r\n searchTerm = signal('');\r\n selectedValue = signal<any>(null);\r\n isDisabled = signal(false);\r\n\r\n readonly = input<boolean>(false);\r\n\r\n isBlocked = computed(() => this.isDisabled() || this.readonly());\r\n\r\n selectedOption = computed(() => {\r\n const value = this.selectedValue();\r\n return this.options().find((option) => option.value === value) || null;\r\n });\r\n\r\n filteredOptions = computed(() => {\r\n const term = this.searchTerm().toLowerCase().trim();\r\n const opts = this.options();\r\n\r\n if (!term) return opts;\r\n\r\n return opts.filter(\r\n (option) =>\r\n option.label.toLowerCase().includes(term) ||\r\n option.value.toString().toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n private onChange = (value: any) => {};\r\n private onTouched = () => {};\r\n\r\n constructor(private elementRef: ElementRef) {}\r\n\r\n writeValue(value: any): void {\r\n this.selectedValue.set(value);\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.set(isDisabled); \r\n }\r\n\r\n toggle() {\r\n \r\n if (this.isBlocked()) return;\r\n \r\n if (this.isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n open() {\r\n\r\n if (this.isBlocked()) return;\r\n\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n this.openUpward.set(spaceBelow < 260);\r\n\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n\r\n setTimeout(() => {\r\n const input =\r\n this.elementRef.nativeElement.querySelector('.search-input');\r\n if (input) input.focus();\r\n });\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n }\r\n\r\n selectOption(option: Option) {\r\n\r\n if (this.isBlocked()) return;\r\n \r\n this.selectedValue.set(option.value);\r\n this.onChange(option.value);\r\n this.onTouched();\r\n this.selectionChange.emit(option);\r\n this.close();\r\n }\r\n\r\n clearSelection() {\r\n if (this.isBlocked()) return;\r\n\r\n this.selectedValue.set(null);\r\n this.onChange(null);\r\n this.onTouched();\r\n this.selectionChange.emit(null);\r\n this.close();\r\n }\r\n\r\n onSearch(event: Event) {\r\n\r\n if (this.isBlocked()) return;\r\n \r\n const target = event.target as HTMLInputElement;\r\n this.searchTerm.set(target.value);\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n\r\n if (this.isBlocked()) return;\r\n \r\n if (event.key === 'Escape') {\r\n this.close();\r\n } else if (event.key === 'Enter') {\r\n const filtered = this.filteredOptions();\r\n if (filtered.length > 0) {\r\n this.selectOption(filtered[0]);\r\n }\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: Event) {\r\n \r\n if (!this.isBlocked() && !this.elementRef.nativeElement.contains(event.target as Node)) {\r\n this.close();\r\n }\r\n }\r\n}","<div class=\"select-container\">\r\n <div\r\n class=\"select-header\"\r\n [class.active]=\"isOpen()\"\r\n [class.disabled]=\"isBlocked()\"\r\n [class.readonly]=\"isBlocked()\"\r\n (click)=\"!isBlocked() && toggle()\"\r\n (keydown)=\"!isBlocked() && onKeyDown($event)\"\r\n tabindex=\"0\"\r\n >\r\n <span class=\"selected-text\" [class.placeholder]=\"!selectedOption()\">\r\n {{ selectedOption()?.label || placeholder() }}\r\n </span>\r\n\r\n <span class=\"arrow\" [class.open]=\"isOpen()\"></span>\r\n </div>\r\n\r\n @if (isOpen()) {\r\n <div class=\"dropdown\" [class.dropdown--upward]=\"openUpward()\">\r\n <input\r\n type=\"text\"\r\n class=\"search-input\"\r\n [value]=\"searchTerm()\"\r\n placeholder=\"Buscar...\"\r\n (input)=\"!isBlocked() &&onSearch($event)\"\r\n (keydown)=\"!isBlocked() && onKeyDown($event)\"\r\n />\r\n\r\n @if (filteredOptions().length > 0) {\r\n <div class=\"options\">\r\n <div\r\n class=\"option default-option\"\r\n [class.selected]=\"selectedValue() === null\"\r\n (click)=\"!isBlocked() && clearSelection()\"\r\n >\r\n {{ placeholder() }}\r\n </div>\r\n @for (option of filteredOptions(); track option.value) {\r\n <div\r\n class=\"option\"\r\n [class.selected]=\"option.value === selectedValue()\"\r\n (click)=\"!isBlocked() && selectOption(option)\"\r\n [attr.disabled]=\"isBlocked()\"\r\n >\r\n {{ option.label }}\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"no-results\">No se encontraron resultados</div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nexport type ToggleCustomKey = string | number;\r\n\r\nexport interface ToggleCustomChange {\r\n key: ToggleCustomKey | undefined;\r\n checked: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-toggle-custom',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './toggle-custom.html',\r\n styleUrl: './toggle-custom.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ToggleCustom),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class ToggleCustom implements ControlValueAccessor {\r\n label = input<string>('');\r\n /** Referencia estable del toggle (p. ej. id de negocio) para lógica en el padre. */\r\n key = input<ToggleCustomKey | undefined>(undefined);\r\n disabled = input(false, { transform: booleanAttribute });\r\n checked = model<boolean>(false);\r\n\r\n /** Emite al cambiar por interacción del usuario (incluye `key` para identificar la instancia). */\r\n toggleChange = output<ToggleCustomChange>();\r\n\r\n private onChange: (value: boolean) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n isDisabledByControl = false;\r\n\r\n get isDisabled(): boolean {\r\n return this.isDisabledByControl || this.disabled();\r\n }\r\n\r\n toggle() {\r\n if (this.isDisabled) return;\r\n const next = !this.checked();\r\n this.checked.set(next);\r\n this.toggleChange.emit({ key: this.key(), checked: next });\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: boolean): void {\r\n this.checked.set(!!value);\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => 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.isDisabledByControl = isDisabled;\r\n }\r\n}\r\n","<label\r\n class=\"toggle-wrapper\"\r\n [class.disabled]=\"isDisabled\"\r\n [attr.data-toggle-key]=\"key() !== undefined ? key() : null\"\r\n>\r\n <div class=\"toggle-track\" [class.checked]=\"checked()\" (click)=\"toggle()\">\r\n <div class=\"toggle-thumb\"></div>\r\n </div>\r\n @if (label()) {\r\n <span class=\"toggle-label\">{{ label() }}</span>\r\n }\r\n</label>\r\n","import { Component, input, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormArray,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { Subscription } from 'rxjs';\r\nimport { SelectCustomSearch } from '../select-custom-search/select-custom-search';\r\nimport { DateTimePicker } from '../date-time-picker/date-time-picker';\r\nimport { ToggleCustom } from '../toggle-custom/toggle-custom';\r\n\r\ntype FieldType =\r\n | 'text'\r\n | 'email'\r\n | 'number'\r\n | 'date'\r\n | 'datetime-local'\r\n | 'select'\r\n | 'radio'\r\n | 'checkbox'\r\n | 'textarea'\r\n | 'disabled'\r\n | 'password'\r\n | 'time'\r\n | 'file'\r\n | 'toggle';\r\n\r\nexport interface Option {\r\n value: string | number | boolean;\r\n label: string;\r\n subtitle?: string;\r\n}\r\n\r\nexport interface FieldConfig {\r\n key: string;\r\n label?: string;\r\n type: FieldType;\r\n placeholder?: string;\r\n required?: boolean;\r\n options?: Option[];\r\n col?: number;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n matchWith?: string;\r\n copyFrom?: string;\r\n pattern?: string;\r\n patternType?:\r\n | 'numbers'\r\n | 'phone'\r\n | 'custom'\r\n | 'text'\r\n | 'username'\r\n | 'alphanumeric';\r\n\r\n minDate?: Date;\r\n maxDate?: Date;\r\n variant?: 'cards';\r\n /**\r\n * Solo para checkbox.\r\n * Fields con el mismo nombre se comportan como radio: al marcar uno se desmarcan los demás.\r\n */\r\n radioGroup?: string;\r\n /**\r\n * Solo para checkbox.\r\n * Fields con el mismo nombre permiten selección múltiple pero impiden quedar todos desmarcados.\r\n */\r\n atLeastOneGroup?: string;\r\n /** Controla si el texto de las opciones se muestra en mayúsculas. Default: true */\r\n uppercase?: boolean;\r\n}\r\n\r\nexport interface SectionConfig {\r\n title?: string;\r\n description?: string;\r\n fields: FieldConfig[];\r\n}\r\n\r\ninterface RealTimeCopyItem {\r\n fieldKey: string;\r\n subscription: Subscription;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-dynamic-form-fields',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, SelectCustomSearch, DateTimePicker, ToggleCustom],\r\n templateUrl: './dynamic-form-fields.html',\r\n styleUrl: './dynamic-form-fields.css',\r\n})\r\nexport class DynamicFormFields implements OnInit, OnDestroy {\r\n form = input.required<FormGroup>();\r\n sections = input<SectionConfig[]>([]);\r\n compact = input<boolean>(false);\r\n\r\n private copyFromSubscriptions: Subscription[] = [];\r\n private realTimeCopySubscriptions: RealTimeCopyItem[] = [];\r\n\r\n ngOnInit(): void {\r\n setTimeout(() => {\r\n this.setupCopyFromLogic();\r\n }, 100);\r\n }\r\n\r\n getDatePickerMode(fieldType: FieldType): 'date' | 'datetime' {\r\n return fieldType === 'datetime-local' ? 'datetime' : 'date';\r\n }\r\n\r\n private setupCopyFromLogic(): void {\r\n this.sections().forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (field.copyFrom) {\r\n this.setupFieldCopy(field);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private setupFieldCopy(field: FieldConfig): void {\r\n const targetControl = this.form().get(field.key);\r\n if (!targetControl) return;\r\n\r\n const sourceControl = this.form().get(field.copyFrom!);\r\n if (!sourceControl) return;\r\n\r\n const triggerFieldKey = this.findTriggerField();\r\n\r\n if (!triggerFieldKey) {\r\n this.setupSimpleCopy(sourceControl, targetControl);\r\n return;\r\n }\r\n\r\n const triggerControl = this.form().get(triggerFieldKey);\r\n if (!triggerControl) {\r\n this.setupSimpleCopy(sourceControl, targetControl);\r\n return;\r\n }\r\n\r\n const subscription = triggerControl.valueChanges.subscribe(\r\n (shouldCopy: boolean) => {\r\n if (shouldCopy) {\r\n targetControl.setValue(sourceControl.value);\r\n targetControl.disable();\r\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\r\n } else {\r\n targetControl.enable();\r\n\r\n targetControl.setValue('');\r\n this.removeRealTimeCopy(field.key);\r\n }\r\n }\r\n );\r\n\r\n this.copyFromSubscriptions.push(subscription);\r\n\r\n if (triggerControl.value === true) {\r\n targetControl.setValue(sourceControl.value);\r\n targetControl.disable();\r\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\r\n }\r\n }\r\n\r\n private findTriggerField(): string {\r\n for (const section of this.sections()) {\r\n const triggerField = section.fields.find(\r\n (f) =>\r\n f.type === 'radio' &&\r\n (f.key.includes('is_owner') || f.key.includes('infractor-owner'))\r\n );\r\n if (triggerField) return triggerField.key;\r\n }\r\n return '';\r\n }\r\n\r\n private setupSimpleCopy(\r\n sourceControl: AbstractControl,\r\n targetControl: AbstractControl\r\n ): void {\r\n const subscription = sourceControl.valueChanges.subscribe((value) => {\r\n targetControl.setValue(value);\r\n });\r\n this.copyFromSubscriptions.push(subscription);\r\n }\r\n\r\n private setupRealTimeCopy(\r\n sourceControl: AbstractControl,\r\n targetControl: AbstractControl,\r\n fieldKey: string\r\n ): void {\r\n this.removeRealTimeCopy(fieldKey);\r\n\r\n const subscription = sourceControl.valueChanges.subscribe((value) => {\r\n targetControl.setValue(value);\r\n });\r\n\r\n this.realTimeCopySubscriptions.push({\r\n fieldKey,\r\n subscription,\r\n });\r\n }\r\n\r\n private removeRealTimeCopy(fieldKey: string): void {\r\n const index = this.realTimeCopySubscriptions.findIndex(\r\n (item) => item.fieldKey === fieldKey\r\n );\r\n if (index >= 0) {\r\n this.realTimeCopySubscriptions[index].subscription.unsubscribe();\r\n this.realTimeCopySubscriptions.splice(index, 1);\r\n }\r\n }\r\n\r\n /** toggle, checkbox y radio siempre ocupan la fila completa (12 cols) */\r\n isGroupType(type: FieldType): boolean {\r\n return type === 'toggle';\r\n }\r\n\r\n getFieldRuns(fields: FieldConfig[]): { isGroup: boolean; fields: FieldConfig[] }[] {\r\n const runs: { isGroup: boolean; fields: FieldConfig[] }[] = [];\r\n for (const f of fields) {\r\n const isGroup = this.isGroupType(f.type);\r\n const last = runs[runs.length - 1];\r\n if (last && last.isGroup === isGroup) {\r\n last.fields.push(f);\r\n } else {\r\n runs.push({ isGroup, fields: [f] });\r\n }\r\n }\r\n return runs;\r\n }\r\n\r\n ctrl = (key: string): AbstractControl | null => this.form().get(key);\r\n\r\n getCheckboxArray(key: string): FormControl[] | undefined {\r\n return (this.form().get(key) as FormArray)?.controls as FormControl[];\r\n }\r\n\r\n onCheckboxChange(event: Event, fieldKey: string, optionIndex: number) {\r\n const checkbox = event.target as HTMLInputElement;\r\n const checkboxArray = this.getCheckboxArray(fieldKey);\r\n checkboxArray?.[optionIndex]?.setValue(checkbox.checked);\r\n }\r\n\r\n onCheckboxInteract(event: Event, field: FieldConfig, optionIndex: number) {\r\n if (field.disabled || field.readonly) {\r\n (event.target as HTMLInputElement).checked = !!this.getCheckboxArray(field.key)?.[optionIndex]?.value;\r\n return;\r\n }\r\n const { key, radioGroup, atLeastOneGroup } = field;\r\n\r\n if (radioGroup) {\r\n this.getCheckboxArray(key)?.forEach((ctrl, i) => ctrl.setValue(i === optionIndex));\r\n this.sections().forEach(sec =>\r\n sec.fields\r\n .filter(f => f.radioGroup === radioGroup && f.key !== key)\r\n .forEach(f => this.getCheckboxArray(f.key)?.forEach(ctrl => ctrl.setValue(false)))\r\n );\r\n return;\r\n }\r\n\r\n if (atLeastOneGroup) {\r\n const checkbox = event.target as HTMLInputElement;\r\n if (!checkbox.checked) {\r\n const anyOtherInSameField = this.getCheckboxArray(key)?.some((ctrl, i) => i !== optionIndex && ctrl.value);\r\n const anyOtherInOtherFields = this.sections().some(sec =>\r\n sec.fields\r\n .filter(f => f.atLeastOneGroup === atLeastOneGroup && f.key !== key)\r\n .some(f => this.getCheckboxArray(f.key)?.some(ctrl => ctrl.value))\r\n );\r\n if (!anyOtherInSameField && !anyOtherInOtherFields) { checkbox.checked = true; return; }\r\n }\r\n this.onCheckboxChange(event, key, optionIndex);\r\n return;\r\n }\r\n\r\n this.onCheckboxChange(event, key, optionIndex);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.copyFromSubscriptions.forEach((sub) => sub.unsubscribe());\r\n this.realTimeCopySubscriptions.forEach((item) =>\r\n item.subscription.unsubscribe()\r\n );\r\n }\r\n\r\n onCancel(): void {\r\n }\r\n\r\n onEnter(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') return;\r\n \r\n const target = event.target as HTMLElement;\r\n \r\n // Permitir salto de línea en textarea con Shift+Enter\r\n if (target.tagName === 'TEXTAREA' && event.shiftKey) return;\r\n \r\n event.preventDefault();\r\n this.focusNextElement(target);\r\n }\r\n\r\n onUppercaseInput(event: Event, fieldType: string, key: string) {\r\n if (['email', 'password'].includes(fieldType)) return;\r\n \r\n const control = this.form().get(key);\r\n if (!control) return;\r\n \r\n const value = control.value;\r\n if (typeof value !== 'string') return;\r\n \r\n const upperValue = value.toUpperCase();\r\n \r\n if (value !== upperValue) {\r\n control.setValue(upperValue);\r\n }\r\n }\r\n \r\n private focusNextElement(current: HTMLElement): void {\r\n const form = current.closest('form');\r\n if (!form) return;\r\n \r\n const focusable = Array.from(\r\n form.querySelectorAll<HTMLElement>(\r\n 'input:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly]), select:not([disabled]), button:not([disabled])'\r\n )\r\n );\r\n \r\n const index = focusable.indexOf(current);\r\n \r\n // Si hay siguiente input → foco\r\n if (index >= 0 && index < focusable.length - 1) {\r\n focusable[index + 1].focus();\r\n return;\r\n }\r\n \r\n // Si es el último → submit\r\n const submitBtn = form.querySelector<HTMLButtonElement>(\r\n 'button[type=\"submit\"]'\r\n );\r\n \r\n submitBtn?.click();\r\n }\r\n \r\n}\r\n","@if (form()) {\n<form class=\"form\" [formGroup]=\"form()\" [class.form--compact]=\"compact()\" (keydown)=\"onEnter($event)\">\n @for (sec of sections(); track $index) {\n <section class=\"section\">\n @if (sec.title) {\n <h3 class=\"section-title\">{{ sec.title }}</h3>\n } @if (sec.description) {\n <p class=\"section-desc\">{{ sec.description }}</p>\n }\n\n <div class=\"grid\">\n @for (run of getFieldRuns(sec.fields); track $index) {\n\n @if (run.isGroup) {\n <!-- toggle: wrapper que siempre ocupa la fila completa -->\n <div class=\"col col--group-wrapper\">\n @for (f of run.fields; track f.key) {\n <div class=\"group-item\">\n <lib-toggle-custom [key]=\"f.key\" [label]=\"f.label ?? ''\" [formControlName]=\"f.key\" />\n </div>\n }\n </div>\n\n } @else {\n <!-- Campos normales (incluye checkbox y radio con su col configurable) -->\n @for (f of run.fields; track f.key) {\n <div class=\"col\" [style.--col-span]=\"f.col || 6\">\n @if (['text','number','email', 'password', 'time'].includes(f.type))\n {\n <input\n class=\"input\"\n [type]=\"f.type\"\n [placeholder]=\"f.placeholder\"\n [formControlName]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n (input)=\"onUppercaseInput($event, f.type, f.key)\"\n />\n } @if (['date', 'datetime-local'].includes(f.type)) {\n <lib-date-time-picker\n [mode]=\"getDatePickerMode(f.type)\"\n [placeholder]=\"\n f.placeholder ||\n (f.type === 'date'\n ? 'Seleccionar fecha'\n : 'Seleccionar fecha y hora')\n \"\n [formControlName]=\"f.key\"\n [minDate]=\"f.minDate || null\"\n [maxDate]=\"f.maxDate || null\"\n [readonly]=\"f.readonly || false\"\n />\n } @if (f.type === 'textarea') {\n <textarea\n class=\"input textarea\"\n [placeholder]=\"f.placeholder\"\n [formControlName]=\"f.key\"\n rows=\"6\"\n [readonly]=\"f.readonly || false\"\n ></textarea>\n } @if (f.type === 'select') {\n <lib-select-custom-search\n [options]=\"f.options ?? []\"\n [placeholder]=\"f.placeholder || 'Seleccionar...'\"\n [formControlName]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n />\n } @if (f.type === 'radio') {\n <div class=\"radio-group\">\n @for (o of f.options ?? []; track o.value) {\n <label class=\"radio\">\n <input\n type=\"radio\"\n [value]=\"o.value\"\n [formControlName]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n />\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">{{ o.label }}</span>\n </label>\n }\n </div>\n } @if (f.type === 'checkbox') {\n <div class=\"checkbox-group\"\n [class.checkbox-group--cards]=\"f.variant === 'cards'\"\n [class.checkbox-group--lowercase]=\"f.uppercase === false\"\n [class.checkbox-group--readonly]=\"f.readonly && !f.disabled\">\n @for (o of f.options ?? []; track o.value) {\n <label class=\"checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"getCheckboxArray(f.key)?.at($index)?.value\"\n (change)=\"onCheckboxInteract($event, f, $index)\"\n [disabled]=\"f.disabled || f.readonly || false\"\n />\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-text\">\n <span class=\"checkbox-label\">{{ o.label }}</span>\n @if (o.subtitle) {\n <span class=\"checkbox-subtitle\">{{ o.subtitle }}</span>\n }\n </span>\n </label>\n }\n </div>\n } @if (f.type === 'disabled') {\n <input\n class=\"input input--disabled\"\n [placeholder]=\"f.placeholder || 'Automático'\"\n disabled\n />\n } @if (ctrl(f.key)?.touched && ctrl(f.key)?.invalid) {\n <div class=\"error\">\n @if (ctrl(f.key)?.errors?.['required']) {\n <span>Campo requerido</span>\n } @if (ctrl(f.key)?.errors?.['email']) {\n <span>Correo inválido</span>\n } @if (ctrl(f.key)?.errors?.['pattern']) {\n <span>\n @switch (f.patternType) { @case ('numbers') { Solo se permiten\n números } @case ('phone') { Formato de teléfono inválido } @case\n ('text') { Solo se permiten letras y espacios } @case ('username') {\n Solo se permiten letras, números, puntos y guiones bajos (no al\n inicio ni al final) } @case ('alphanumeric') { Solo se permiten\n letras y números } @default { Formato inválido } }\n </span>\n } @if (ctrl(f.key)?.errors?.['notMatching']) {\n <span>Las contraseñas no coinciden</span>\n }\n </div>\n }\n\n @if(f.label && f.type !== 'toggle') {\n <label\n [class.label-radio]=\"f.type === 'radio'\"\n [class.label-checkbox]=\"f.type === 'checkbox'\"\n [class.label-disabled]=\"f.readonly || f.disabled\"\n class=\"label\"\n >\n {{ f.label }} </label>\n }\n </div>\n }\n }\n\n }\n </div>\n </section>\n }\n</form>\n}\n","import {\r\n Component,\r\n DestroyRef,\r\n inject,\r\n input,\r\n output,\r\n computed,\r\n effect,\r\n} from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { ModalFormStep } from '../modal-form/modal-form';\r\n\r\n@Component({\r\n selector: 'lib-wizard-form',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './wizard-form.html',\r\n styleUrl: './wizard-form.css',\r\n})\r\nexport class WizardForm {\r\n form = input<FormGroup>();\r\n currentStep = input<number>(1);\r\n steps = input<ModalFormStep[]>([]);\r\n\r\n canContinue = output<boolean>();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private groupSubs: Subscription[] = [];\r\n\r\n // Devuelve la key del paso\r\n currentStepKey = computed(() => {\r\n const index = this.currentStep() - 1;\r\n return this.steps()[index]?.key ?? null;\r\n });\r\n\r\n // Devuelve el subform correspondiente\r\n currentGroup = computed(() => {\r\n const key = this.currentStepKey();\r\n return key ? (this.form()?.get(key) as FormGroup) : null;\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const group = this.currentGroup();\r\n\r\n // Limpiar subscriptions del grupo anterior antes de crear las nuevas\r\n this.groupSubs.forEach(s => s.unsubscribe());\r\n this.groupSubs = [];\r\n\r\n if (!group) {\r\n this.canContinue.emit(false);\r\n return;\r\n }\r\n\r\n this.canContinue.emit(group.valid);\r\n\r\n this.groupSubs.push(\r\n group.statusChanges.subscribe(() => this.canContinue.emit(group.valid)),\r\n group.valueChanges.subscribe(() => this.canContinue.emit(group.valid))\r\n );\r\n });\r\n\r\n // Garantizar limpieza al destruir el componente\r\n this.destroyRef.onDestroy(() => {\r\n this.groupSubs.forEach(s => s.unsubscribe());\r\n });\r\n }\r\n\r\n currentGroupComponent = computed(() => {\r\n const index = this.currentStep() - 1;\r\n return this.steps()[index].component;\r\n });\r\n}\r\n","<ng-container>\r\n\r\n @if (currentGroup()) {\r\n <ng-container\r\n *ngComponentOutlet=\"currentGroupComponent(); inputs: { group: currentGroup() }\"\r\n ></ng-container>\r\n }\r\n\r\n</ng-container>\r\n","import PubSub from 'pubsub-js';\r\n\r\nexport const TOAST_EVENTS = {\r\n SHOW_TOAST: 'SHOW_TOAST',\r\n SHOW_TOAST_WITH_ACTION: 'SHOW_TOAST_WITH_ACTION',\r\n HIDE_TOAST: 'HIDE_TOAST',\r\n} as const;\r\n\r\nexport interface ToastData {\r\n description: string;\r\n duration?: number;\r\n buttonText?: string;\r\n action?: () => void;\r\n}\r\n\r\n\r\nexport class ToastHelper {\r\n \r\n static show(description: string, duration?: number) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST, {\r\n description,\r\n duration,\r\n });\r\n }\r\n\r\n static showWithAction(\r\n description: string,\r\n buttonText: string,\r\n action: () => void,\r\n duration?: number\r\n ) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST_WITH_ACTION, {\r\n description,\r\n buttonText,\r\n action,\r\n duration,\r\n });\r\n }\r\n\r\n \r\n static success(message: string, duration?: number) {\r\n this.show(`${message}`, duration);\r\n }\r\n\r\n\r\n static error(message: string, duration?: number) {\r\n this.show(`${message}`, duration || 6000); \r\n }\r\n\r\n\r\n static warning(message: string, duration?: number) {\r\n this.show(`${message}`, duration);\r\n }\r\n\r\n \r\n static info(message: string, duration?: number) {\r\n this.show(`ℹ${message}`, duration);\r\n }\r\n\r\n\r\n static hide() {\r\n PubSub.publish(TOAST_EVENTS.HIDE_TOAST);\r\n }\r\n\r\n \r\n static showUndo(\r\n message: string,\r\n undoAction: () => void,\r\n duration: number = 8000\r\n ) {\r\n this.showWithAction(message, 'Deshacer', undoAction, duration);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './button.html',\r\n styleUrl: './button.css',\r\n})\r\nexport class Button {\r\n /**\r\n * Variante visual del botón.\r\n * - primary: fondo #596300\r\n * - secondary: fondo #dee58f\r\n * - outline: fondo transparente, borde y texto con mismo color\r\n */\r\n variant = input<'primary' | 'secondary' | 'outline'>('primary');\r\n\r\n /** Tipo nativo del botón */\r\n type = input<'button' | 'submit'>('button');\r\n\r\n /** Estado deshabilitado */\r\n disabled = input<boolean>(false);\r\n\r\n /** Ocupa todo el ancho del contenedor */\r\n fullWidth = input<boolean>(false);\r\n\r\n /** Tamaño del botón: por defecto (grande) o compacto */\r\n size = input<'default' | 'compact'>('default');\r\n\r\n /** Evento click del botón */\r\n clicked = output<MouseEvent>();\r\n\r\n handleClick(event: MouseEvent) {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.clicked.emit(event);\r\n }\r\n}\r\n","<button\r\n class=\"sl-btn\"\r\n [class.sl-btn--primary]=\"variant() === 'primary'\"\r\n [class.sl-btn--secondary]=\"variant() === 'secondary'\"\r\n [class.sl-btn--outline]=\"variant() === 'outline'\"\r\n [class.sl-btn--compact]=\"size() === 'compact'\"\r\n [class.sl-btn--full]=\"fullWidth()\"\r\n [attr.type]=\"type()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"handleClick($event)\"\r\n>\r\n <ng-content></ng-content>\r\n</button>\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n Type,\r\n} from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { WizardForm } from '../wizard-form/wizard-form';\r\nimport { ToastHelper } from '../../helpers/toast-helper';\r\nimport { Button } from '../button/button';\r\n\r\nexport interface ModalFormStep {\r\n key: string;\r\n label: string;\r\n component: Type<any>;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-modal-form',\r\n standalone: true,\r\n imports: [CommonModule, WizardForm, Button],\r\n templateUrl: './modal-form.html',\r\n styleUrl: './modal-form.css',\r\n})\r\nexport class ModalForm {\r\n isFull = input<boolean>(false);\r\n scrollBody = input<boolean>(false);\r\n title = input<string>('Formulario');\r\n subtitle = input<string | null>('');\r\n submitLabel = input<string>('Guardar');\r\n\r\n form = input<FormGroup>();\r\n steps = input<ModalFormStep[]>([]);\r\n\r\n currentStep = signal<number>(1);\r\n canContinue = signal<boolean>(false);\r\n\r\n onSubmit = output<{form: any; evidence?: File}>();\r\n onCancel = output<void>();\r\n evidenceChange = output<File>();\r\n\r\n evidenceFile = signal<File | null>(null);\r\n evidenceFileName = signal<string | null>(null);\r\n showActionsLeft = input<boolean>(false);\r\n\r\n evidenceLabel = input<string>('Cargar archivo');\r\n evidenceHelperText = input<string>('Formato admitido');\r\n evidenceAccept = input<string>('application/pdf');\r\n maxSizeMB = input<number>(25);\r\n\r\n hiddenFooterActions = input<boolean>(false);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.steps().length) {\r\n this.canContinue.set(true);\r\n } else {\r\n this.currentStep.set(1);\r\n }\r\n });\r\n }\r\n\r\n nextStep() {\r\n if (this.currentStep() < this.steps().length) {\r\n this.currentStep.update(v => v + 1);\r\n }\r\n }\r\n\r\n prevStep() {\r\n if (this.currentStep() > 1) {\r\n this.currentStep.update(v => v - 1);\r\n }\r\n }\r\n\r\n submitForm() {\r\n this.onSubmit.emit({\r\n form: this.form()?.value,\r\n evidence: this.evidenceFileName() ? (this.evidenceFile() as File) : undefined\r\n });\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files?.length) return;\r\n\r\n const file = input.files[0];\r\n\r\n if (!this.evidenceAccept().includes(file.type)) {\r\n ToastHelper.warning('Tipo de archivo no permitido');\r\n input.value = '';\r\n return;\r\n }\r\n\r\n // Tamaño máximo 25MB\r\n if (file.size > this.maxSizeMB() * 1024 * 1024) {\r\n ToastHelper.warning(`El archivo no puede superar los ${this.maxSizeMB}MB`);\r\n input.value = '';\r\n return;\r\n }\r\n\r\n this.evidenceFile.set(file);\r\n this.evidenceFileName.set(file.name);\r\n this.evidenceChange.emit(file);\r\n }\r\n}","<div class=\"modal-form-container\" [class.expanded]=\"isFull()\" [class.no-scroll]=\"!scrollBody()\">\r\n <div class=\"header-content\">\r\n <div class=\"header-top\">\r\n <div class=\"header-text\">\r\n <h1>{{ title() }}</h1>\r\n @if(subtitle()){\r\n <p>{{ subtitle() }}</p>\r\n }\r\n </div>\r\n \r\n <button class=\"close-btn\" type=\"button\" (click)=\"onCancel.emit()\">\r\n ✕\r\n </button>\r\n </div>\r\n </div>\r\n\r\n @if (steps() && steps().length > 1) {\r\n <div class=\"steps\">\r\n @for (step of steps(); track $index) {\r\n <div class=\"step\" [class.step-active]=\"currentStep() === $index + 1\"\r\n [class.step-completed]=\"currentStep() > $index + 1\">\r\n @if (currentStep() > $index + 1) {\r\n <span class=\"check-icon\">✔</span>\r\n }\r\n <span>Paso {{ $index + 1 }}: {{ step.label }}</span>\r\n </div>\r\n\r\n @if ($index < steps().length - 1) { <span class=\"separator\">›</span>\r\n } }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <div class=\"body-content\" [class.scrollable]=\"scrollBody()\" [class.no-scroll]=\"!scrollBody()\">\r\n @if (!steps() || !steps().length) {\r\n <ng-content></ng-content>\r\n } @else {\r\n <!-- Render dinámico del paso actual -->\r\n <lib-wizard-form [form]=\"form()\" [currentStep]=\"currentStep()\" [steps]=\"steps()\"\r\n (canContinue)=\"canContinue.set($event)\"></lib-wizard-form>\r\n }\r\n </div>\r\n\r\n @if (!hiddenFooterActions()) {\r\n <div class=\"actions\">\r\n @if (showActionsLeft()){\r\n <div class=\"actions-left\">\r\n <p class=\"file-type\">{{ evidenceHelperText() }}</p>\r\n <lib-button variant=\"outline\" type=\"button\" (clicked)=\"fileInput.click()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"upload-icon icon icon-tabler icons-tabler-outline icon-tabler-cloud-upload\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1\" />\r\n <path d=\"M9 15l3 -3l3 3\" />\r\n <path d=\"M12 12l0 9\" />\r\n </svg>\r\n <span class=\"label-button\">\r\n {{ evidenceFileName() || evidenceLabel() }}\r\n </span>\r\n </lib-button>\r\n <input #fileInput type=\"file\" hidden [accept]=\"evidenceAccept()\" (change)=\"onFileSelected($event)\" />\r\n </div>\r\n }\r\n\r\n <div class=\"actions-right\">\r\n @if (!steps() || steps().length <= 1) { \r\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\r\n Cancelar\r\n </lib-button>\r\n } @else if (currentStep() === 1) {\r\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\r\n Cancelar\r\n </lib-button>\r\n } @else {\r\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"prevStep()\">\r\n Volver\r\n </lib-button>\r\n }\r\n\r\n <lib-button\r\n variant=\"primary\"\r\n type=\"button\"\r\n [disabled]=\"!canContinue()\"\r\n (clicked)=\"!steps() || !steps().length ? submitForm() : (currentStep() === steps().length ? submitForm() : nextStep())\"\r\n >\r\n {{ !steps() || !steps().length ? submitLabel() : currentStep() ===\r\n steps().length ? submitLabel() : 'Continuar' }}\r\n </lib-button>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';\r\nimport { DynamicFormFields, FieldConfig, SectionConfig } from '../dynamic-form-fields/dynamic-form-fields';\r\n\r\n@Component({\r\n selector: 'lib-dialog-alert-component',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicFormFields],\r\n templateUrl: './dialog-alert.html',\r\n styleUrl: './dialog-alert.css',\r\n})\r\nexport class DialogAlertComponent implements OnInit, OnChanges {\r\n @Input() title: string = 'Mensaje';\r\n @Input() message!: string;\r\n @Input() type: 'warning' | 'error' | 'info' | 'success' = 'info';\r\n /** Acción asociada al alert (ej: 'desactivar', 'eliminar', 'anular', 'sancionar') */\r\n @Input() action?: string;\r\n /** Forzar mostrar el campo razón si se necesita */\r\n @Input() showReason: boolean = false;\r\n @Input() confirm: boolean = false;\r\n @Input() confirmLabel: string = 'Aceptar';\r\n @Output() close = new EventEmitter<boolean>();\r\n /** Emite la razón escrita cuando aplica */\r\n @Input() reasonOptions: { label: string; value: any }[] = [];\r\n @Output() confirmReason = new EventEmitter<{\r\n reason?: string;\r\n observations?: string;\r\n }>();\r\n\r\n icon = ':fuente_de_información:';\r\n\r\n // Formulario interno que pasaremos a dynamic-form-fields\r\n form: FormGroup = new FormGroup({ reason: new FormControl('') });\r\n\r\n // Secciones para dynamic-form-fields\r\n sections: SectionConfig[] = [];\r\n\r\n // Calcula si se debe mostrar el campo razón\r\n get isReasonNeeded(): boolean {\r\n const action = (this.action || '').toLowerCase();\r\n const actionsRequiringReason = ['deactivate', 'delete', 'anulate', 'sancionar', 'active'];\r\n return this.showReason || actionsRequiringReason.includes(action);\r\n }\r\n\r\n ngOnInit() {\r\n this.updateFormAndSections();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['action'] || changes['showReason'] || changes['type']) {\r\n this.updateFormAndSections();\r\n }\r\n }\r\n\r\n private updateFormAndSections() {\r\n // Preparar form y sections según si la razón es necesaria\r\n if (this.isReasonNeeded) {\r\n this.form = new FormGroup({ reason: new FormControl('', [Validators.required]), observations: new FormControl('') });\r\n const reasonSection: SectionConfig[] = [\r\n {\r\n fields: [\r\n {\r\n key: \"reason\",\r\n label: \"Razón\",\r\n type: \"select\",\r\n placeholder: \"Seleccionar\",\r\n required: true,\r\n col: 12,\r\n options: this.reasonOptions ?? [],\r\n },\r\n {\r\n key: \"observations\",\r\n label: \"Observaciones\",\r\n type: \"textarea\",\r\n placeholder: \"Escriba las observaciones...\",\r\n col: 12,\r\n }\r\n ],\r\n },\r\n ];\r\n this.sections = reasonSection;\r\n } else {\r\n this.form = new FormGroup({ reason: new FormControl('') });\r\n this.sections = [];\r\n }\r\n }\r\n\r\n onConfirm() {\r\n if (this.isReasonNeeded && !this.form.get('reason')?.value?.trim().length) {\r\n return;\r\n }\r\n \r\n const reason = this.form.get('reason')?.value;\r\n const observations = this.form.get('observations')?.value;\r\n \r\n this.confirmReason.emit({\r\n reason: reason || undefined,\r\n observations: observations || undefined,\r\n });\r\n \r\n this.close.emit(true);\r\n }\r\n\r\n onCancel() {\r\n this.close.emit(false);\r\n }\r\n}","<div class=\"modal-backdrop\" (click)=\"onCancel()\">\r\n <div class=\"modal-card\" [class.modal-card-compact]=\"!isReasonNeeded\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n @if(type != 'info') {\r\n <div class=\"icono-container\" [ngClass]=\"type\">\r\n @if (type === 'success') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n } @else if(type === 'error') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-x\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M10 10l4 4m0 -4l-4 4\" />\r\n </svg>\r\n } @else if (type === 'warning') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-alert-triangle\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M12 9v4\" />\r\n <path\r\n d=\"M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0\" />\r\n <path d=\"M12 16h.01\" />\r\n </svg>\r\n }\r\n </div>\r\n }\r\n <h2>{{ title }}</h2>\r\n </div>\r\n\r\n <div class=\"modal-body\">\r\n <p>{{ message }}</p>\r\n <lib-dynamic-form-fields [form]=\"form\" [sections]=\"sections\"></lib-dynamic-form-fields>\r\n </div>\r\n <div class=\"modal-footer\">\r\n @if (confirm) {\r\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\r\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\r\n } @else {\r\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport interface DialogItem {\r\n key: string;\r\n label: string;\r\n value: string | number | Date;\r\n expandible?: boolean;\r\n children?: DialogItem[];\r\n}\r\n\r\n@Component({\r\n selector: 'lib-dialog-confirmation',\r\n imports: [CommonModule],\r\n templateUrl: './dialog-confirmation.html',\r\n styleUrl: './dialog-confirmation.css',\r\n})\r\nexport class DialogConfirmation {\r\n @Input() title: string = 'TITULO';\r\n @Input() message: string = '';\r\n @Input() confirm: boolean = false;\r\n @Input() confirmLabel: string = 'Aceptar';\r\n @Input() items: DialogItem[] = [];\r\n @Input() btnMap: boolean = false;\r\n @Input() type: 'info' | 'default' = 'default';\r\n\r\n @Output() close = new EventEmitter<boolean>();\r\n\r\n expandedIndex: number | null = null;\r\n\r\n toggle(index: number) {\r\n this.expandedIndex = this.expandedIndex === index ? null : index;\r\n }\r\n\r\n onConfirm() {\r\n this.close.emit(true);\r\n }\r\n\r\n onCancel() {\r\n this.close.emit(false);\r\n }\r\n}\r\n","<div class=\"modal-backdrop\" (click)=\"onCancel()\">\r\n <div class=\"modal-card\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n <div class=\"modal-header-title\">\r\n <div class=\"icon-container\" class=\"icono-container\" [ngClass]=\"type\">\r\n @if(type === 'info') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n }\r\n </div>\r\n <h2>{{ title }}</h2>\r\n <p class=\"modal-header-message\">{{ message }}</p>\r\n </div>\r\n <button class=\"close-btn\" (click)=\"onCancel()\" aria-label=\"Cerrar\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M18 6l-12 12\" />\r\n <path d=\"M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"info-container\" [class.expanded]=\"expandedIndex !== null\">\r\n @for (item of items; track item.key; let i = $index) {\r\n\r\n <div class=\"info-item\">\r\n <div class=\"info-main\" [class.info-main-expanded]=\"item.expandible\" (click)=\"item.expandible && toggle(i)\">\r\n <span class=\"label\">{{ item.label }} @if (item.expandible) {\r\n <span class=\"arrow\"> {{ expandedIndex === i ? '▲' : '▼' }} </span>\r\n }\r\n </span>\r\n <span class=\"value\"> {{ item.value }} </span>\r\n </div>\r\n\r\n @if (expandedIndex === i && item.children?.length) {\r\n <div class=\"info-children\">\r\n @for (child of item.children; track child.key) {\r\n <div class=\"info-item child-item\">\r\n <div class=\"info-main\">\r\n <span class=\"label\">{{ child.label }}</span>\r\n <span class=\"value\">{{ child.value }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n }\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n @if (confirm) {\r\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\r\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\r\n @if(btnMap) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\r\n <path fill=\"#fff\"\r\n d=\"M10.85 16.608v1.684a8.3 8.3 0 0 0 4.433-1.842L14.1 15.258a6.6 6.6 0 0 1-3.25 1.35M3.358 10c0-3.375 2.525-6.175 5.792-6.608V1.708C4.958 2.15 1.692 5.7 1.692 10s3.266 7.85 7.458 8.292v-1.684C5.883 16.175 3.358 13.375 3.358 10m13.267-.833h1.683a8.3 8.3 0 0 0-1.841-4.434l-1.192 1.192a6.56 6.56 0 0 1 1.35 3.242M15.283 3.55a8.3 8.3 0 0 0-4.433-1.842v1.684a6.6 6.6 0 0 1 3.25 1.35zm-.008 10.533 1.192 1.184a8.3 8.3 0 0 0 1.841-4.434h-1.683a6.6 6.6 0 0 1-1.35 3.25\" />\r\n <path fill=\"#fff\"\r\n d=\"M13.333 9.25c0-2.075-1.583-3.417-3.333-3.417S6.667 7.175 6.667 9.25c0 1.383 1.108 3.025 3.333 4.917 2.225-1.892 3.333-3.534 3.333-4.917M10 10a.893.893 0 0 1 0-1.783A.893.893 0 0 1 10 10\" />\r\n </svg>\r\n }\r\n {{ confirmLabel }}\r\n </button>\r\n } @else {\r\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\r\n @if(btnMap) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\r\n <path fill=\"#fff\"\r\n d=\"M10.85 16.608v1.684a8.3 8.3 0 0 0 4.433-1.842L14.1 15.258a6.6 6.6 0 0 1-3.25 1.35M3.358 10c0-3.375 2.525-6.175 5.792-6.608V1.708C4.958 2.15 1.692 5.7 1.692 10s3.266 7.85 7.458 8.292v-1.684C5.883 16.175 3.358 13.375 3.358 10m13.267-.833h1.683a8.3 8.3 0 0 0-1.841-4.434l-1.192 1.192a6.56 6.56 0 0 1 1.35 3.242M15.283 3.55a8.3 8.3 0 0 0-4.433-1.842v1.684a6.6 6.6 0 0 1 3.25 1.35zm-.008 10.533 1.192 1.184a8.3 8.3 0 0 0 1.841-4.434h-1.683a6.6 6.6 0 0 1-1.35 3.25\" />\r\n <path fill=\"#fff\"\r\n d=\"M13.333 9.25c0-2.075-1.583-3.417-3.333-3.417S6.667 7.175 6.667 9.25c0 1.383 1.108 3.025 3.333 4.917 2.225-1.892 3.333-3.534 3.333-4.917M10 10a.893.893 0 0 1 0-1.783A.893.893 0 0 1 10 10\" />\r\n </svg>\r\n }\r\n {{ confirmLabel }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { Component, input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-not-found-modal',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './not-found-modal.html',\r\n styleUrl: './not-found-modal.css',\r\n})\r\nexport class NotFoundModal {\r\n isVisible = input<boolean>(false);\r\n title = input<string>('Documento no encontrado');\r\n message = input<string>('No encontrado');\r\n\r\n onClose = output<void>();\r\n\r\n onOverlayClick(event: Event) {\r\n if (event.target === event.currentTarget) {\r\n this.onClose.emit();\r\n }\r\n }\r\n\r\n onAccept() {\r\n this.onClose.emit();\r\n }\r\n}\r\n","<div\r\n class=\"modal-overlay\"\r\n (click)=\"onOverlayClick($event)\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n <div class=\"icon-container\">\r\n <svg\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"error-icon\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#ef4444\" stroke-width=\"2\" />\r\n <path\r\n d=\"M15 9l-6 6\"\r\n stroke=\"#ef4444\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M9 9l6 6\"\r\n stroke=\"#ef4444\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <h2 class=\"modal-title\">{{ title() }}</h2>\r\n </div>\r\n\r\n <div class=\"modal-body\">\r\n <p class=\"modal-message\">{{ message() }}</p>\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button\r\n class=\"btn-primary\"\r\n (click)=\"onAccept()\"\r\n type=\"button\"\r\n [attr.aria-label]=\"'Cerrar modal de documento no encontrado'\"\r\n >\r\n Aceptar\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-loader',\r\n imports: [],\r\n templateUrl: './loader.html',\r\n styleUrl: './loader.css'\r\n})\r\nexport class Loader {\r\n\r\n}\r\n","<div class=\"loader-overlay\">\r\n <div class=\"loader\"></div>\r\n</div>\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\ninterface StepConfig {\r\n title: string;\r\n key: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProgressFormService {\r\n currentPage = signal(1);\r\n totalPages = signal(6);\r\n\r\n private stepsConfig: { [key: number]: StepConfig } = {\r\n 1: { title: 'Paso 1', key: 'step1' },\r\n 2: { title: 'Paso 2', key: 'step2' },\r\n };\r\n\r\n resetData() {\r\n this.currentPage.set(1);\r\n }\r\n\r\n getProgressText() {\r\n return `${this.currentPage()}/${this.totalPages()}`;\r\n }\r\n\r\n getCurrentPageTitle(): string {\r\n const currentPage = this.currentPage();\r\n return this.stepsConfig[currentPage]?.title || `Página ${currentPage}`;\r\n }\r\n\r\n nextPage(): boolean {\r\n const current = this.currentPage();\r\n\r\n if (current < this.totalPages()) {\r\n this.currentPage.set(current + 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n prevPage(): boolean {\r\n const current = this.currentPage();\r\n\r\n if (current > 1) {\r\n this.currentPage.set(current - 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getProgressPercentage(): number {\r\n const current = this.currentPage();\r\n const total = this.totalPages();\r\n return Math.round((current / total) * 100);\r\n }\r\n}\r\n","import { Component, Input, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ProgressFormService } from '../../services/progress/progress-service';\r\n\r\n@Component({\r\n selector: 'lib-progress-bar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './progress-bar.html',\r\n styleUrl: './progress-bar.css',\r\n})\r\nexport class ProgressBar {\r\n constructor(public progress: ProgressFormService) {}\r\n title = input<string>('');\r\n current = input<number>(1);\r\n total = input<number>(1);\r\n\r\n get percentage() {\r\n return Math.round((this.current() / this.total()) * 100);\r\n }\r\n\r\n get text() {\r\n return `Paso ${this.current()} de ${this.total()}`;\r\n }\r\n}\r\n","<div class=\"progress-container\">\r\n <div class=\"progress-header\">\r\n <span class=\"progress-title\">{{ title() }}</span>\r\n <span class=\"progress-fraction\">{{ text }}</span>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div\r\n class=\"progress-fill\"\r\n [style.width.%]=\"percentage\"\r\n ></div>\r\n </div>\r\n</div>\r\n","import { Component, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-processing-overlay',\r\n imports: [],\r\n templateUrl: './processing-overlay.html',\r\n styleUrl: './processing-overlay.css',\r\n})\r\nexport class ProcessingOverlay {\r\n loadingText = input<string>('Cargando...');\r\n}\r\n","<div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <figure>\r\n <svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M58.8943 10.1325C61.244 6.40017 66.7559 6.40017 69.1056 10.1325L74.7379 19.079C76.2827 21.5328 79.399 22.5304 82.1127 21.4398L92.0068 17.4636C96.1345 15.8048 100.594 18.9967 100.268 23.3769L99.487 33.8765C99.2728 36.7562 101.199 39.368 104.045 40.0572L114.422 42.57C118.751 43.6183 120.454 48.783 117.577 52.138L110.681 60.18C108.79 62.3857 108.79 65.6141 110.681 67.8198L117.577 75.8619C120.454 79.2169 118.751 84.3816 114.422 85.4298L104.045 87.9427C101.199 88.6319 99.2728 91.2436 99.487 94.1234L100.268 104.623C100.594 109.003 96.1345 112.195 92.0069 110.536L82.1127 106.56C79.399 105.469 76.2827 106.467 74.7379 108.921L69.1056 117.867C66.756 121.6 61.244 121.6 58.8943 117.867L53.2621 108.921C51.7173 106.467 48.6009 105.469 45.8872 106.56L35.9931 110.536C31.8655 112.195 27.4062 109.003 27.732 104.623L28.5129 94.1234C28.7271 91.2436 26.8011 88.6319 23.955 87.9427L13.5783 85.4299C9.24928 84.3816 7.546 79.2169 10.4228 75.8619L17.3186 67.8198C19.21 65.6141 19.21 62.3857 17.3186 60.18L10.4228 52.138C7.546 48.783 9.24928 43.6183 13.5783 42.57L23.955 40.0572C26.8011 39.368 28.7271 36.7562 28.5129 33.8765L27.732 23.3769C27.4062 18.9967 31.8655 15.8048 35.9931 17.4636L45.8872 21.4398C48.6009 22.5304 51.7173 21.5328 53.2621 19.079L58.8943 10.1325Z\" fill=\"#BFD100\"/>\r\n </svg> \r\n </figure>\r\n <p class=\"loading-text\">{{ loadingText() }}</p>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input, signal } from '@angular/core';\r\n\r\nexport interface InfoItem {\r\n label: string;\r\n value: string | boolean | null | undefined;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-info-group',\r\n imports: [CommonModule],\r\n templateUrl: './info-group.html',\r\n styleUrl: './info-group.css',\r\n})\r\nexport class InfoGroup {\r\n type = input<'success' | 'error' | 'info'>('info');\r\n showBox = input<boolean>(false)\r\n // modo info\r\n items = input<InfoItem[]>([]);\r\n title = input<string | null>(null);\r\n titleAlign = input<'center' | 'left' | 'right'>('center');\r\n\r\n // modo comparación\r\n itemsLeft = input<InfoItem[]>([]);\r\n itemsRight = input<InfoItem[]>([]);\r\n titleLeft = input<string | null>(null);\r\n titleRight = input<string | null>(null);\r\n\r\n // modo box\r\n fullName = input<string | null>(null);\r\n typeDocument = input<string | null>(null);\r\n document = input<string | null>(null);\r\n}","@if (!showBox()) {\r\n<div class=\"info-card\">\r\n @if (title()) {\r\n <h3 class=\"info-title\" [style.text-align]=\"titleAlign()\">{{ title() }}</h3>\r\n }\r\n\r\n @if (itemsLeft().length || itemsRight().length) {\r\n <div class=\"compare-grid\">\r\n <div class=\"compare-col\">\r\n @if (titleLeft()) {\r\n <span class=\"col-title\">{{ titleLeft() }}</span>\r\n }\r\n @for (item of itemsLeft(); track item.label) {\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">{{ item.label }}</span>\r\n <span class=\"info-value\">\r\n {{ item.value === true ? \"SI\" : item.value === false ? \"NO\" : item.value || \"-\" }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"compare-divider\"></div>\r\n <div class=\"compare-col\">\r\n @if (titleRight()) {\r\n <span class=\"col-title\">{{ titleRight() }}</span>\r\n }\r\n @for (item of itemsRight(); track item.label) {\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">{{ item.label }}</span>\r\n <span class=\"info-value\">\r\n {{ item.value === true ? \"SI\" : item.value === false ? \"NO\" : item.value || \"-\" }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"info-grid\">\r\n @for (item of items(); track item.label) {\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">{{ item.label }}</span>\r\n <span class=\"info-value\">\r\n {{ item.value === true ? \"SI\" : item.value === false ? \"NO\" : item.value\r\n || \"-\" }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n} \r\n\r\n@if (showBox()) {\r\n<div class=\"person-box\" [ngClass]=\"type()\" >\r\n <span class=\"person-name\">{{ fullName() || '-' }}</span>\r\n <span class=\"divider\"></span>\r\n <span class=\"person-doc\">{{ typeDocument() }} {{ document() || '-' }}</span>\r\n</div>\r\n}\r\n","import { Component, computed, effect, input, model, signal, ElementRef, ViewChild, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type FeatureType = 'money' | 'percentage' | 'measurement' | 'date';\nexport type MeasurementUnit = 'km' | 'km/h' | 'm' | 'cm';\n\nexport interface Feature {\n key?: number | string;\n icon?: string;\n title: string;\n description: string | null | undefined;\n /** Tipo de dato para formatear la descripción */\n type?: FeatureType;\n /** Unidad de medida (solo aplica cuando type = 'measurement') */\n unit?: MeasurementUnit;\n /** Código de moneda ISO 4217 (default: 'COP'). Solo aplica cuando type = 'money' */\n currency?: string;\n /** Locale para formateo numérico (default: 'es-CO') */\n locale?: string;\n /** Indica si la descripción es editable */\n editable?: boolean;\n /** Límite inferior para valores numéricos */\n min?: number;\n /** Límite superior para valores numéricos */\n max?: number;\n}\n\n@Component({\n selector: 'lib-feature-card',\n standalone: true,\n templateUrl: './feature-card.html',\n styleUrls: ['./feature-card.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FeatureCard),\n multi: true,\n },\n ],\n})\nexport class FeatureCard implements ControlValueAccessor {\n /** Objeto feature (con soporte para binding bidireccional vía señales) */\n feature = model<Feature | undefined>();\n \n showLeading = input<boolean>(false);\n showTrailling = input<boolean>(false);\n\n /** Valor interno de la descripción mientras se edita */\n descriptionValue = signal<string>('');\n isEditingDescription = signal<boolean>(false);\n isDisabled = signal<boolean>(false);\n\n @ViewChild('descriptionInput')\n descriptionInput?: ElementRef<HTMLInputElement>;\n\n onChange = (_: any) => {};\n onTouched = () => {};\n\n /** Descripción formateada según el tipo de feature */\n readonly formattedDescription = computed(() => {\n const raw = this.descriptionValue();\n const feat = this.feature();\n if (!feat?.type) return raw;\n\n const numValue = Number(raw);\n\n switch (feat.type) {\n case 'money': {\n if (isNaN(numValue)) return raw;\n const locale = feat.locale ?? 'es-CO';\n const currency = feat.currency ?? 'COP';\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(numValue);\n }\n case 'percentage':\n return isNaN(numValue) ? raw : `${numValue}%`;\n case 'measurement':\n if (isNaN(numValue)) return raw;\n return feat.unit ? `${numValue} ${feat.unit}` : `${numValue}`;\n case 'date': {\n const d = new Date(raw);\n if (isNaN(d.getTime())) return raw;\n const dd = String(d.getDate()).padStart(2, '0');\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const yyyy = d.getFullYear();\n return `${dd}/${mm}/${yyyy}`;\n }\n default:\n return raw;\n }\n });\n\n constructor() {\n // Sincroniza el valor interno cuando cambia el objeto feature inicial\n effect(() => {\n const feat = this.feature();\n this.descriptionValue.set(feat?.description ?? '');\n });\n }\n\n // --- ControlValueAccessor Implementation ---\n\n writeValue(value: string | number | undefined | null): void {\n const nextDescription = value == null ? '' : String(value);\n \n // Solo actualizamos el valor visual (descriptionValue)\n this.descriptionValue.set(nextDescription);\n \n // Mantenemos sincronizado el objeto base\n const current = this.feature();\n if (current) {\n // Modificamos el objeto feature subyacente para no perder la configuración\n this.feature.set({ ...current, description: nextDescription });\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n // --- Event Handlers ---\n\n onDescriptionInput(event: Event) {\n if (this.isDisabled()) return;\n \n const target = event.target as HTMLInputElement;\n let nextDescription = target.value;\n \n const currentFeature = this.feature();\n \n // Validar y filtrar entrada para tipos numéricos\n if (currentFeature?.type && ['money', 'percentage', 'measurement'].includes(currentFeature.type)) {\n // Permitir solo números y punto decimal\n nextDescription = nextDescription.replace(/[^0-9.]/g, '');\n \n // Evitar múltiples puntos decimales\n const parts = nextDescription.split('.');\n if (parts.length > 2) {\n nextDescription = parts[0] + '.' + parts.slice(1).join('');\n }\n\n // Aplicar límite máximo en tiempo real\n if (currentFeature.max !== undefined && nextDescription !== '' && nextDescription !== '.') {\n const numericValue = parseFloat(nextDescription);\n if (!isNaN(numericValue) && numericValue > currentFeature.max) {\n nextDescription = currentFeature.max.toString();\n }\n }\n\n // Sincronizar el valor visual del input si cambió por el filtrado o límite\n if (target.value !== nextDescription) {\n target.value = nextDescription;\n }\n }\n\n this.descriptionValue.set(nextDescription);\n \n if (currentFeature) {\n const updatedFeature = { ...currentFeature, description: nextDescription };\n // Actualiza vía señal (model 2-way binding)\n this.feature.set(updatedFeature);\n }\n // Notifica al formulario (Reactive Forms) - Emitimos solo el valor\n this.onChange(nextDescription);\n this.onTouched();\n }\n\n onEditIconClick() {\n if (!this.showTrailling() || this.isDisabled()) return;\n this.isEditingDescription.set(true);\n\n // Asegura el foco una vez que el input se renderiza.\n setTimeout(() => {\n this.descriptionInput?.nativeElement?.focus();\n this.descriptionInput?.nativeElement?.select();\n }, 0);\n }\n\n onDescriptionBlur() {\n this.isEditingDescription.set(false);\n\n // Aplicar límite mínimo al perder el foco (para evitar interrumpir mientras se escribe)\n const currentFeature = this.feature();\n if (currentFeature?.type && ['money', 'percentage', 'measurement'].includes(currentFeature.type) && currentFeature.min !== undefined) {\n const currentRaw = this.descriptionValue();\n const numericValue = parseFloat(currentRaw);\n \n if (!isNaN(numericValue) && numericValue < currentFeature.min) {\n const clampedValue = currentFeature.min.toString();\n this.descriptionValue.set(clampedValue);\n \n const updatedFeature = { ...currentFeature, description: clampedValue };\n this.feature.set(updatedFeature);\n this.onChange(clampedValue);\n }\n }\n\n this.onTouched();\n }\n}\n","<div class=\"feature-card\" [class.feature-card--editing]=\"isEditingDescription()\">\n @if(showLeading()){\n <div class=\"feature-icon-leading\">\n <img [src]=\"feature()?.icon\" alt=\"{{ feature()?.title }}\" />\n </div>\n }\n \n <div class=\"feature-content\">\n <p>{{ feature()!.title }}</p>\n @if (showTrailling()) {\n <div class=\"feature-description-editable\">\n @if (isEditingDescription()) {\n <input\n #descriptionInput\n class=\"feature-description-input\"\n type=\"text\"\n [value]=\"descriptionValue()\"\n [disabled]=\"isDisabled()\"\n (input)=\"onDescriptionInput($event)\"\n (blur)=\"onDescriptionBlur()\"\n aria-label=\"Description\"\n autofocus\n />\n } @else {\n <h3>{{ formattedDescription() }}</h3>\n }\n </div>\n } @else {\n <h3>{{ formattedDescription() }}</h3>\n }\n </div>\n\n @if(showTrailling()){\n <button\n type=\"button\"\n class=\"feature-icon-trailling\"\n [disabled]=\"isDisabled()\"\n (click)=\"onEditIconClick()\"\n aria-label=\"Editar description\"\n >\n <span class=\"description-edit-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, Input, Output, AfterViewInit, OnDestroy, ViewChild, OnChanges } from '@angular/core';\r\n\r\nexport interface SideCardItem {\r\n key: number;\r\n label: string;\r\n value: string | number;\r\n}\r\n\r\nexport interface SideCardSection {\r\n title?: string;\r\n items?: SideCardItem[];\r\n showSlider?: boolean;\r\n sliderLabel?: string;\r\n sliderValue?: number; \r\n sliderUnit?: string;\r\n\r\n buttonSectionLabel?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-side-card',\r\n imports: [CommonModule],\r\n templateUrl: './side-card.html',\r\n styleUrl: './side-card.css',\r\n})\r\nexport class SideCard implements AfterViewInit, OnChanges, OnDestroy {\r\n @ViewChild('SideCard', { static: true })\r\n wrapper!: ElementRef<HTMLElement>;\r\n \r\n @Input() isFloating = true;\r\n isCompact = false;\r\n // Header\r\n @Input() modeSideCard: 'create' | 'edit' | 'info' = 'create';\r\n @Input() showTypeSelector = true;\r\n selectedType: 'radial' | 'poligonal' = 'radial';\r\n @Output() btnClickIcon = new EventEmitter<void>();\r\n\r\n // Input\r\n @Input() placeholder = 'NOMBRE';\r\n @Input() value = '';\r\n\r\n @Output() valueChange = new EventEmitter<string>();\r\n @Output() typeChange = new EventEmitter<'radial' | 'poligonal'>();\r\n\r\n @Input() statusValue: 1 | 2 = 1; // backend value\r\n @Output() statusChange = new EventEmitter<1 | 2>();\r\n\r\n // Sections\r\n @Input() sections: SideCardSection[] = [];\r\n\r\n @Output() sectionButtonClick = new EventEmitter<SideCardSection>();\r\n\r\n // Slider\r\n @Input() min = 0;\r\n @Input() max = 1000;\r\n sliderLabel = 'Radio';\r\n sliderUnit = 'km';\r\n\r\n sliderValue = 0;\r\n @Output() sliderChange = new EventEmitter<number>();\r\n\r\n //actions\r\n @Input() showBtnPrimary = false;\r\n @Input() primaryButtonLabel = 'Aceptar';\r\n \r\n @Input() showBtnSecondary = false;\r\n @Input() secondaryButtonLabel = 'Cancelar';\r\n\r\n @Output() buttonClick = new EventEmitter<'primary' | 'secondary'>();\r\n\r\n private ro!: ResizeObserver;\r\n \r\n get statusLabel(): string {\r\n return this.statusValue === 1 ? 'Activo' : 'Inactivo';\r\n }\r\n\r\n get statusClass(): string {\r\n return this.statusValue === 1\r\n ? 'status-chip-active'\r\n : 'status-chip-inactive';\r\n }\r\n\r\n get sliderPercentage(): string {\r\n const max = this.max || 1000;\r\n return ((this.sliderValue / max) * 100) + '%';\r\n }\r\n\r\n // Inicializa slider cuando llegan secciones\r\n ngOnChanges() {\r\n const section = this.sections.find(s => s.showSlider);\r\n\r\n if (section) {\r\n this.sliderLabel = section.sliderLabel || 'Radio';\r\n this.sliderUnit = section.sliderUnit || 'km';\r\n this.sliderValue = section.sliderValue ?? 0;\r\n } \r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ro = new ResizeObserver(entries => {\r\n const rect = entries[0].contentRect;\r\n this.updateCompact(rect.width, rect.height);\r\n });\r\n \r\n this.ro.observe(this.wrapper.nativeElement);\r\n \r\n // evaluación inicial\r\n const rect = this.wrapper.nativeElement.getBoundingClientRect();\r\n this.updateCompact(rect.width, rect.height);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ro?.disconnect();\r\n }\r\n\r\n selectType(type: 'radial' | 'poligonal') {\r\n this.selectedType = type;\r\n this.typeChange.emit(type);\r\n }\r\n\r\n onInput(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input.value;\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n focusInput(input: HTMLInputElement) {\r\n input.focus();\r\n }\r\n\r\n onSliderChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n this.sliderValue = Number(input.value);\r\n this.sliderChange.emit(this.sliderValue);\r\n }\r\n\r\n onButtonSectionClick(section: SideCardSection) {\r\n this.sectionButtonClick.emit(section);\r\n }\r\n\r\n onButtonClick(type: 'primary' | 'secondary') {\r\n this.buttonClick.emit(type);\r\n }\r\n\r\n changeStatusLabel() {\r\n if (this.modeSideCard !== 'edit') return;\r\n\r\n this.statusValue = this.statusValue === 1 ? 2 : 1;\r\n this.statusChange.emit(this.statusValue);\r\n }\r\n\r\n buttonClickIcon() {\r\n this.btnClickIcon.emit();\r\n }\r\n\r\n private updateCompact(width: number, height: number) {\r\n this.isCompact =\r\n width <= 299 ||\r\n height <= 360;\r\n }\r\n}\r\n","<div #SideCard class=\"side-card-wrapper\">\r\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\r\n <div class=\"element-header\">\r\n @if (modeSideCard === 'create' && showTypeSelector) {\r\n <div class=\"button-group\">\r\n <button class=\"btn-type\" [class.active]=\"selectedType === 'radial'\" (click)=\"selectType('radial')\">\r\n Radial\r\n </button>\r\n <button class=\"btn-type\" [class.active]=\"selectedType === 'poligonal'\" (click)=\"selectType('poligonal')\">\r\n Poligonal\r\n </button>\r\n </div>\r\n }\r\n <div class=\"text-container\">\r\n <input #inputRef type=\"text\" class=\"input-field\" [placeholder]=\"placeholder\" [value]=\"value\"\r\n (input)=\"onInput($event)\" [disabled]=\"modeSideCard === 'info'\" />\r\n @if(modeSideCard === 'create' || modeSideCard === 'edit'){\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-edit\" (click)=\"focusInput(inputRef)\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\" />\r\n <path d=\"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415\" />\r\n <path d=\"M16 5l3 3\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-settings\" (click)=\"buttonClickIcon()\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065\" />\r\n <path d=\"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0\" />\r\n </svg>\r\n }\r\n </div>\r\n\r\n @if(modeSideCard === 'edit' || modeSideCard === 'info'){\r\n <span #statusChip class=\"status-chip\" [class.status-chip--disabled]=\"modeSideCard === 'info'\" [ngClass]=\"statusClass\" (click)=\"changeStatusLabel()\">\r\n {{ statusLabel }}\r\n </span>\r\n }\r\n </div>\r\n @for (section of sections; track section.title) {\r\n <div class=\"element-section\">\r\n <h3>{{ section.title }}</h3>\r\n\r\n <div class=\"element-content\">\r\n @if (section.items?.length) { @for (item of section.items; track\r\n item.label) {\r\n <div class=\"element-item\">\r\n <span class=\"label\">{{ item.label }}</span>\r\n <span class=\"value\">{{ item.value }}</span>\r\n </div>\r\n } } @if (section.showSlider) {\r\n <div class=\"element-item\">\r\n <span class=\"label\">{{ sliderLabel }}</span>\r\n <span class=\"value\">{{ sliderValue }} {{ sliderUnit }}</span>\r\n </div>\r\n @if (modeSideCard !== 'info') {\r\n <input type=\"range\" class=\"slider\" [min]=\"min\" [max]=\"max\" [value]=\"sliderValue\"\r\n [style.--slider-value]=\"sliderPercentage\" step=\"0.01\" (input)=\"onSliderChange($event)\" />\r\n }} @if (section.buttonSectionLabel && modeSideCard !== 'info') {\r\n <button class=\"btn-assign\" (click)=\"onButtonSectionClick(section)\">{{ section.buttonSectionLabel }}</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"side-card-actions\">\r\n @if (showBtnPrimary) {\r\n <button class=\"btn-primary\" (click)=\"onButtonClick('primary')\">{{ primaryButtonLabel }}</button>\r\n }\r\n @if (showBtnSecondary) {\r\n <button class=\"btn-secondary\" (click)=\"onButtonClick('secondary')\">{{ secondaryButtonLabel }}</button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';\r\nimport { SideCardSection } from '../side-card/side-card';\r\n\r\n@Component({\r\n selector: 'lib-side-card-detail',\r\n imports: [CommonModule],\r\n templateUrl: './side-card-detail.html',\r\n styleUrl: './side-card-detail.css',\r\n})\r\nexport class SideCardDetail implements AfterViewInit, OnDestroy{\r\n @ViewChild('SideCard', { static: true })\r\n wrapper!: ElementRef<HTMLElement>;\r\n\r\n @Input() isFloating = true;\r\n isCompact = false;\r\n\r\n nowLabel = 'Ahora mismo';\r\n agoLabel = 'Hace';\r\n\r\n // showMessageModal = false;\r\n\r\n // Header\r\n @Input() title = 'Titulo';\r\n @Input() subtitle = 'Subtitulo'\r\n @Output() btnClickIcon = new EventEmitter<'back' | 'location' | 'message'>();\r\n\r\n @Input() statusValue: 1 | 2 = 1; // backend value\r\n @Output() statusChange = new EventEmitter<1 | 2>();\r\n\r\n // Sections\r\n @Input() sections: SideCardSection[] = [];\r\n\r\n activeTab: 'principal' | 'historial' = 'principal';\r\n @Output() tabChange = new EventEmitter<'principal' | 'historial'>();\r\n\r\n private ro!: ResizeObserver;\r\n\r\n ngAfterViewInit() {\r\n this.ro = new ResizeObserver(entries => {\r\n const rect = entries[0].contentRect;\r\n this.updateCompact(rect.width, rect.height);\r\n });\r\n \r\n this.ro.observe(this.wrapper.nativeElement);\r\n \r\n // evaluación inicial\r\n const rect = this.wrapper.nativeElement.getBoundingClientRect();\r\n this.updateCompact(rect.width, rect.height);\r\n }\r\n \r\n ngOnDestroy() {\r\n this.ro?.disconnect();\r\n }\r\n\r\n get statusLabel(): string {\r\n return this.statusValue === 1 ? 'Dentro de geocerca' : 'Fuera de geocerca';\r\n }\r\n\r\n get statusClass(): string {\r\n return this.statusValue === 1\r\n ? 'status-chip-active'\r\n : 'status-chip-inactive';\r\n }\r\n\r\n buttonClickIcon(type: 'back' | 'location' | 'message') {\r\n /* if (type === 'message') {\r\n this.showMessageModal = !this.showMessageModal;\r\n return;\r\n } */\r\n \r\n this.btnClickIcon.emit(type);\r\n }\r\n\r\n setTab(tab: 'principal' | 'historial') {\r\n this.activeTab = tab;\r\n this.tabChange.emit(tab);\r\n }\r\n\r\n getIndicatorLeft(): string {\r\n return this.activeTab === 'principal' ? '0%' : '50%';\r\n }\r\n\r\n isDateValue(value: any): boolean {\r\n if (!value) return false;\r\n return (\r\n typeof value === 'string' &&\r\n !isNaN(Date.parse(value))\r\n );\r\n }\r\n\r\n getRelativeTime(date: string | Date | number): string {\r\n const d = new Date(date);\r\n const now = new Date();\r\n\r\n if (isNaN(d.getTime())) return '';\r\n\r\n const diff = Math.floor((now.getTime() - d.getTime()) / 1000);\r\n\r\n if (diff < 10) return this.nowLabel;\r\n\r\n const units = [\r\n { singular: 'Segundo', plural: 'Segundos', value: 60 },\r\n { singular: 'Minuto', plural: 'Minutos', value: 60 },\r\n { singular: 'Hora', plural: 'Horas', value: 24 },\r\n { singular: 'Día', plural: 'Días', value: 7 },\r\n { singular: 'Semana', plural: 'Semanas', value: 4 },\r\n { singular: 'Mes', plural: 'Meses', value: 12 },\r\n { singular: 'Año', plural: 'Años', value: Infinity }\r\n ];\r\n\r\n let value = diff;\r\n let unit = units[0];\r\n\r\n for (let i = 0; i < units.length; i++) {\r\n if (value < units[i].value) {\r\n unit = units[i];\r\n break;\r\n }\r\n value = Math.floor(value / units[i].value);\r\n }\r\n\r\n const label = value === 1 ? unit.singular : unit.plural;\r\n\r\n return `${this.agoLabel} ${value} ${label}`;\r\n }\r\n\r\n private updateCompact(width: number, height: number) {\r\n this.isCompact =\r\n width <= 312 ||\r\n height <= 460;\r\n }\r\n\r\n /* onNotify(message: string) {\r\n console.log('Mensaje recibido:', message);\r\n\r\n this.showMessageModal = false;\r\n } */\r\n}\r\n","<div #SideCard class=\"side-card-wrapper\">\r\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\r\n <div class=\"element-header\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-arrow-left\" (click)=\"buttonClickIcon('back')\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M5 12l12 0\" />\r\n <path d=\"M5 12l4 5\" />\r\n <path d=\"M5 12l4 -5\" />\r\n </svg>\r\n\r\n <div class=\"text-container\">\r\n <span class=\"title\"> {{ title }} </span>\r\n <span class=\"subtitle\"> {{ subtitle }} </span>\r\n <div class=\"container-chip\">\r\n <span #statusChip class=\"status-chip\" [ngClass]=\"statusClass\">\r\n {{ statusLabel }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"right-icons\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\"\r\n class=\"icon icon-tabler icons-tabler-filled icon-tabler-current-location\"\r\n (click)=\"buttonClickIcon('location')\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M12 1a1 1 0 0 1 1 1v1.055a9.004 9.004 0 0 1 7.946 7.945h1.054a1 1 0 0 1 0 2h-1.055a9.004 9.004 0 0 1 -7.944 7.945l-.001 1.055a1 1 0 0 1 -2 0v-1.055a9.004 9.004 0 0 1 -7.945 -7.944l-1.055 -.001a1 1 0 0 1 0 -2h1.055a9.004 9.004 0 0 1 7.945 -7.945v-1.055a1 1 0 0 1 1 -1m0 4a7 7 0 1 0 0 14a7 7 0 0 0 0 -14m0 3a4 4 0 1 1 -4 4l.005 -.2a4 4 0 0 1 3.995 -3.8\" />\r\n </svg>\r\n\r\n <!-- message + modal -->\r\n <div class=\"message-icon-wrapper\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-message-circle\"\r\n (click)=\"buttonClickIcon('message')\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1\" />\r\n </svg>\r\n\r\n <!-- @if (showMessageModal) {\r\n <div class=\"message-modal-anchor\">\r\n <lib-notification-modal (buttonClick)=\"onNotify($event)\" />\r\n </div>\r\n } -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"side-tabs\">\r\n <div class=\"tab\" [class.active]=\"activeTab === 'principal'\" (click)=\"setTab('principal')\">\r\n Principal\r\n </div>\r\n\r\n <div class=\"tab\" [class.active]=\"activeTab === 'historial'\" (click)=\"setTab('historial')\">\r\n Historial\r\n </div>\r\n\r\n <div class=\"tab-indicator\" [style.left]=\"getIndicatorLeft()\"></div>\r\n </div>\r\n <div class=\"body-content\">\r\n @for (section of sections; track section.title) {\r\n <div class=\"element-section\">\r\n <h3>{{ section.title }}</h3>\r\n\r\n <div class=\"element-content\">\r\n @if (section.items?.length) { @for (item of section.items; track\r\n item.key) {\r\n <div class=\"element-item\">\r\n <span class=\"label\">{{ item.label }}</span>\r\n <span class=\"value\">{{ isDateValue(item.value) ? getRelativeTime(item.value) : item.value }}</span>\r\n </div>\r\n } }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';\r\n\r\nexport interface DeviceStatus {\r\n geofence: 'inside' | 'outside';\r\n wifi?: boolean;\r\n bluetooth?: boolean;\r\n gps?: boolean;\r\n signalStatus?: 0 | 1 | 2 | 3 | 4;\r\n batteryPercentage?: string;\r\n}\r\n\r\nexport interface DeviceCard {\r\n androidId: string;\r\n code: string;\r\n name: string;\r\n geofenceName: string;\r\n deviceInfo: string;\r\n status: DeviceStatus;\r\n lastUpdate: string | Date | number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-devices-carousel',\r\n imports: [CommonModule],\r\n templateUrl: './devices-carousel.html',\r\n styleUrl: './devices-carousel.css',\r\n})\r\nexport class DevicesCarousel implements AfterViewInit {\r\n @Input() devices: DeviceCard[] = [];\r\n nowLabel = 'AHORA MISMO';\r\n agoLabel = 'HACE';\r\n\r\n canScrollLeft = false;\r\n canScrollRight = false;\r\n\r\n @Output() btnClickIcon = new EventEmitter<DeviceCard>();\r\n\r\n @ViewChild('list', { static: false }) listRef!: ElementRef<HTMLElement>;\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n this.updateScrollButtons();\r\n }\r\n\r\n onScroll(el: HTMLElement) {\r\n this.updateScrollButtons(el);\r\n }\r\n\r\n updateScrollButtons(el?: HTMLElement) {\r\n const element = el ?? this.listRef?.nativeElement;\r\n if (!element) return;\r\n\r\n this.canScrollLeft = element.scrollLeft > 0;\r\n\r\n this.canScrollRight =\r\n element.scrollLeft + element.clientWidth < element.scrollWidth - 1;\r\n }\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => {\r\n this.updateScrollButtons();\r\n });\r\n }\r\n\r\n scroll(el: HTMLElement, dir: 'left' | 'right') {\r\n const amount = 300;\r\n\r\n el.scrollBy({\r\n left: dir === 'right' ? amount : -amount,\r\n behavior: 'smooth'\r\n });\r\n\r\n setTimeout(() => this.updateScrollButtons(el), 300);\r\n }\r\n\r\n getGeofenceClass(state: string) {\r\n return state === 'inside' ? 'badge-inside' : 'badge-outside';\r\n }\r\n\r\n getSignalClass(level: 0 | 1 | 2 | 3 | 4) {\r\n return 'signal-' + level;\r\n }\r\n\r\n getBatteryLevel(battery?: string): 0 | 1 | 2 | 3 | 4 {\r\n if (!battery) return 0;\r\n \r\n const value = parseInt(battery.replace('%', ''), 10);\r\n \r\n if (isNaN(value) || value <= 5) return 0;\r\n if (value <= 25) return 1;\r\n if (value <= 50) return 2;\r\n if (value <= 75) return 3;\r\n return 4;\r\n }\r\n\r\n getRelativeTime(date: string | Date | number): string {\r\n const d = new Date(date);\r\n const now = new Date();\r\n\r\n if (isNaN(d.getTime())) return 'FECHA INVÁLIDA';\r\n\r\n const diff = Math.floor((now.getTime() - d.getTime()) / 1000);\r\n\r\n if (diff < 10) return this.nowLabel;\r\n\r\n const units = [\r\n { singular: 'SEGUNDO', plural: 'SEGUNDOS', value: 60 },\r\n { singular: 'MINUTO', plural: 'MINUTOS', value: 60 },\r\n { singular: 'HORA', plural: 'HORAS', value: 24 },\r\n { singular: 'DÍA', plural: 'DÍAS', value: 7 },\r\n { singular: 'SEMANA', plural: 'SEMANAS', value: 4 },\r\n { singular: 'MES', plural: 'MESES', value: 12 },\r\n { singular: 'AÑO', plural: 'AÑOS', value: Infinity }\r\n ];\r\n\r\n let value = diff;\r\n let unit = units[0];\r\n\r\n for (let i = 0; i < units.length; i++) {\r\n if (value < units[i].value) {\r\n unit = units[i];\r\n break;\r\n }\r\n value = Math.floor(value / units[i].value);\r\n }\r\n\r\n const label = value === 1 ? unit.singular : unit.plural;\r\n\r\n return `${this.agoLabel} ${value} ${label}`;\r\n }\r\n\r\n buttonClickIcon(dc: DeviceCard) {\r\n this.btnClickIcon.emit(dc);\r\n }\r\n}\r\n","<div class=\"carousel-container\">\r\n <div class=\"carousel-wrapper\">\r\n\r\n @if (canScrollLeft) {\r\n <button class=\"nav left\" (click)=\"scroll(list,'left')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-chevron-left\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" stroke=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path d=\"m15 6-6 6 6 6\" />\r\n </svg>\r\n </button>\r\n }\r\n\r\n <div class=\"carousel-mask\">\r\n <div class=\"carousel-list\" #list (scroll)=\"onScroll(list)\">\r\n @for (d of devices; track d.androidId) {\r\n <div class=\"device-card\">\r\n <div class=\"card-header\">\r\n <div class=\"header-title-wrapper\">\r\n <span class=\"code\">{{ d.code }} - {{ d.name }}</span>\r\n <span class=\"geofence\">{{ d.geofenceName }}</span>\r\n </div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\"\r\n class=\"target icon icon-tabler icons-tabler-filled icon-tabler-current-location\"\r\n (click)=\"buttonClickIcon(d)\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path\r\n d=\"M12 1a1 1 0 0 1 1 1v1.055A9.004 9.004 0 0 1 20.946 11H22a1 1 0 0 1 0 2h-1.055a9.004 9.004 0 0 1-7.944 7.945L13 22a1 1 0 0 1-2 0v-1.055a9.004 9.004 0 0 1-7.945-7.944L2 13a1 1 0 0 1 0-2h1.055A9.004 9.004 0 0 1 11 3.055V2a1 1 0 0 1 1-1m0 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14m0 3a4 4 0 1 1-4 4l.005-.2A4 4 0 0 1 12 8\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"device-info\">\r\n <span>{{ d.deviceInfo }}</span>\r\n <div class=\"icons\">\r\n @if (d.status.wifi) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\">\r\n <title>En Línea</title>\r\n <path fill=\"#454733\"\r\n d=\"M.833 7.314 2.5 8.98c4.142-4.141 10.858-4.141 15 0l1.667-1.666C14.108 2.255 5.9 2.255.833 7.314M7.5 13.98l2.5 2.5 2.5-2.5a3.53 3.53 0 0 0-5 0m-3.333-3.333 1.666 1.667c2.3-2.3 6.034-2.3 8.334 0l1.666-1.667c-3.216-3.217-8.441-3.217-11.666 0\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Fuera de Línea</title>\r\n <path fill=\"#454733\"\r\n d=\"m17.5 10.142 1.667-1.667C16.058 5.367 11.775 4.183 7.75 4.883l2.15 2.15a10.62 10.62 0 0 1 7.6 3.109m-1.667 1.666a8.25 8.25 0 0 0-3.1-1.941l2.517 2.516zM7.5 15.142l2.5 2.5 2.5-2.5a3.53 3.53 0 0 0-5 0m-4.658-12.8L1.667 3.517l2.541 2.541A13.1 13.1 0 0 0 .833 8.475L2.5 10.142a10.5 10.5 0 0 1 3.475-2.317l1.867 1.867a8.2 8.2 0 0 0-3.675 2.116l1.666 1.667a5.83 5.83 0 0 1 4.075-1.717l5.9 5.9 1.175-1.175z\" />\r\n </svg>\r\n } @if (getBatteryLevel(d.status.batteryPercentage) >= 4) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>76-100%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562-1.25h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625V6.938c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 3) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>51-75%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562 4.375h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 2) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>21-50%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562 10h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625m0 5.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 1) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>1-20%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187zm1.562 15.625h11.875c.345 0 .625.28.625.625v3.438c0 .345-.28.625-.625.625H10.062a.625.625 0 0 1-.625-.625v-3.438c0-.345.28-.625.625-.625\" />\r\n </g>\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\r\n viewBox=\"0 0 32 32\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>0%</title>\r\n <path\r\n d=\"M12.563 1c-.937 0-1.25.211-1.25 1.25v.937H8.5c-1.847 0-2.187.341-2.187 2.187v23.438c0 1.847.341 2.187 2.187 2.187h15c1.847 0 2.187-.341 2.187-2.187V5.374c0-1.847-.341-2.187-2.187-2.187h-2.813V2.25c0-1.038-.312-1.25-1.25-1.25zM8.5 7.563c0-2.5-.312-2.187 2.187-2.187h10.625c2.5 0 2.187-.312 2.187 2.187v19.063c0 2.5.312 2.187-2.187 2.187H10.687c-2.5 0-2.187.312-2.187-2.187z\" />\r\n </g>\r\n </svg>\r\n }\r\n @if (d.status.signalStatus! >= 4) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Excelente</title>\r\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667z\" />\r\n </svg>\r\n } @else if (d.status.signalStatus! == 3) { <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>Buena</title>\r\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\r\n <path id=\"Combined-Shape\"\r\n d=\"M426.667 0v341.333H0zM384 88.747l-85.334 68.266v141.653H384z\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n } @else if (d.status.signalStatus! == 2) { <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>Regular</title>\r\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\r\n <path id=\"Combined-Shape\"\r\n d=\"M426.667 0v341.333H0zM384 88.747 213.333 225.28v73.386H384z\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n } @else if (d.status.signalStatus! == 1) { <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <title>Mala</title>\r\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\r\n <path id=\"Combined-Shape\"\r\n d=\"M426.667 0v341.333H0zM384 88.747 170.666 259.413v39.253H384z\" />\r\n </g>\r\n </g>\r\n </g>\r\n </svg>\r\n } @else { <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Sin Señal</title>\r\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667zm15-1.666H5.692L16.667 5.692z\" />\r\n </svg>\r\n }\r\n @if (d.status.bluetooth) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Conectado</title>\r\n <path fill=\"#454733\"\r\n d=\"m15.296 6.425-4.758-4.758h-.834v6.325L5.88 4.167 4.704 5.342 9.363 10l-4.659 4.658 1.175 1.175 3.825-3.825v6.325h.834l4.758-4.758L11.713 10zM11.37 4.858l1.567 1.567-1.567 1.567zm1.567 8.717-1.567 1.567v-3.134z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <title>Desconectado</title>\r\n <path fill=\"#454733\"\r\n d=\"M10.833 4.858 12.4 6.425l-1.333 1.333 1.175 1.175 2.516-2.516L10 1.667h-.833v4.191l1.666 1.667zM4.508 3.333 3.333 4.508 8.825 10l-4.658 4.658 1.175 1.175 3.825-3.825v6.325H10l3.575-3.575 1.917 1.909 1.175-1.175zm6.325 11.809v-3.134l1.567 1.567z\" />\r\n </svg>\r\n }\r\n @if (d.status.gps) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <g clip-path=\"url(#clip0_3_9268)\">\r\n <title>Localizado</title>\r\n <path fill=\"#454733\"\r\n d=\"M10 6.667a3.332 3.332 0 1 0 0 6.666 3.332 3.332 0 1 0 0-6.666m7.45 2.5a7.495 7.495 0 0 0-6.617-6.617V.833H9.167V2.55A7.495 7.495 0 0 0 2.55 9.167H.833v1.666H2.55a7.495 7.495 0 0 0 6.617 6.617v1.717h1.666V17.45a7.495 7.495 0 0 0 6.617-6.617h1.717V9.167zM10 15.833A5.83 5.83 0 0 1 4.167 10 5.83 5.83 0 0 1 10 4.167 5.83 5.83 0 0 1 15.833 10 5.83 5.83 0 0 1 10 15.833\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3_9268\">\r\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\r\n viewBox=\"0 0 20 20\">\r\n <g clip-path=\"url(#clip0_3_9268)\">\r\n <title>No Localizado</title>\r\n <path fill=\"#454733\"\r\n d=\"M17.45 9.167a7.495 7.495 0 0 0-6.617-6.617V.833H9.167V2.55a7.4 7.4 0 0 0-2.309.65l1.275 1.275a5.83 5.83 0 0 1 7.392 7.392l1.275 1.275a7.4 7.4 0 0 0 .65-2.309h1.717V9.167zM2.5 3.558l1.7 1.7a7.5 7.5 0 0 0-1.65 3.909H.833v1.666H2.55a7.495 7.495 0 0 0 6.617 6.617v1.717h1.666V17.45a7.5 7.5 0 0 0 3.909-1.65l1.7 1.7 1.175-1.175L3.675 2.383zm11.058 11.059a5.829 5.829 0 0 1-8.175-8.175z\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3_9268\">\r\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <span class=\"badge\" [ngClass]=\"getGeofenceClass(d.status.geofence)\">\r\n {{ d.status.geofence === 'inside' ? 'DENTRO DE GEOCERCA' : 'FUERA DE GEOCERCA' }}\r\n </span>\r\n\r\n <span class=\"badge update\">{{ getRelativeTime(d.lastUpdate) }}</span>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (canScrollRight) {\r\n <button class=\"nav right\" (click)=\"scroll(list,'right')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-chevron-right\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" stroke=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path d=\"m9 6 6 6-6 6\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n</div>","import { CommonModule } from '@angular/common';\nimport {\n Component,\n effect,\n ElementRef,\n forwardRef,\n input,\n NgZone,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { FilterItem, Hour12 } from '../../interfaces/filters';\n\n@Component({\n selector: 'lib-input-time-filter',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './input-time-filter.html',\n styleUrl: './input-time-filter.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputTimeFilter),\n multi: true,\n },\n ],\n})\nexport class InputTimeFilter implements ControlValueAccessor, OnDestroy {\n // Inputs\n filters = input<FilterItem[]>([]);\n clearTrigger = input<number>(0);\n\n // Outputs\n filterSelected = output<{ filter: string; value: string }>();\n valueChange = output<string | null>();\n enterPressed = output<void>();\n\n // Estado interno\n filterValues = signal<Record<string, string>>({});\n activeFilterType = signal<string | null>(null);\n isOpen = signal<boolean>(false);\n\n // Estado de hora para el filtro activo\n selectedHour = signal<number>(0); // 0–23\n selectedMinute = signal<number>(0); // 0–59\n selectedAmPm = signal<'AM' | 'PM'>('AM');\n\n isDisabled = signal(false);\n isTouched = signal(false);\n\n // Listas derivadas para el dropdown\n hours12 = signal<Hour12[]>(\n Array.from({ length: 12 }, (_, i) => {\n const hour12 = i === 0 ? 12 : i;\n return {\n value: hour12,\n display: hour12.toString().padStart(2, '0'),\n };\n }),\n );\n\n get selectedHour12(): number {\n const hour24 = this.selectedHour();\n if (hour24 === 0) return 12;\n if (hour24 > 12) return hour24 - 12;\n return hour24;\n }\n\n minutes = signal<number[]>(Array.from({ length: 60 }, (_, i) => i));\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n private documentClickListener?: (event: Event) => void;\n\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {\n // Limpiar cuando cambie el trigger externo\n effect(() => {\n const trigger = this.clearTrigger();\n if (trigger > 0) {\n this.resetAllFilters();\n }\n });\n }\n\n ngOnDestroy() {\n this.removeDocumentListener();\n }\n\n // ControlValueAccessor\n writeValue(_value: string | null): void {\n // No se usa para múltiples filtros, se controla por filterValues\n }\n\n registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n // API pública\n toggleDropdown(filterValue: string) {\n if (this.isDisabled()) return;\n\n const isSame = this.activeFilterType() === filterValue;\n if (isSame && this.isOpen()) {\n this.closeDropdown();\n return;\n }\n\n this.activeFilterType.set(filterValue);\n this.syncTimeFromValue(filterValue);\n this.isOpen.set(true);\n this.addDocumentListener();\n }\n\n closeDropdown() {\n this.isOpen.set(false);\n this.removeDocumentListener();\n }\n\n onEnter(event: KeyboardEvent) {\n if (event.key !== 'Enter') return;\n event.preventDefault();\n this.closeDropdown();\n this.enterPressed.emit();\n }\n\n // Setters de tiempo\n setHour12(hour12: number) {\n if (this.isDisabled()) return;\n const amPm = this.selectedAmPm();\n const hour24 =\n hour12 === 12\n ? amPm === 'AM'\n ? 0\n : 12\n : amPm === 'AM'\n ? hour12\n : hour12 + 12;\n this.selectedHour.set(hour24);\n this.commitTime();\n }\n\n setMinute(minute: number) {\n if (this.isDisabled()) return;\n this.selectedMinute.set(minute);\n this.commitTime();\n }\n\n setAmPm(amPm: 'AM' | 'PM') {\n if (this.isDisabled()) return;\n const currentHour12 = this.selectedHour12;\n const newHour24 =\n amPm === 'AM'\n ? currentHour12 === 12\n ? 0\n : currentHour12\n : currentHour12 === 12\n ? 12\n : currentHour12 + 12;\n this.selectedAmPm.set(amPm);\n this.selectedHour.set(newHour24);\n this.commitTime();\n }\n\n clearActive(filterValue: string) {\n if (this.isDisabled()) return;\n this.markAsTouched();\n this.filterValues.update((current) => {\n const updated = { ...current };\n delete updated[filterValue];\n return updated;\n });\n\n this.onChange(null);\n this.valueChange.emit(null);\n this.filterSelected.emit({ filter: filterValue, value: '' });\n }\n\n // Internos\n private resetAllFilters() {\n this.filterValues.set({});\n this.onChange(null);\n this.valueChange.emit(null);\n this.isOpen.set(false);\n }\n\n private markAsTouched() {\n if (!this.isTouched()) {\n this.isTouched.set(true);\n this.onTouched();\n }\n }\n\n private syncTimeFromValue(filterValue: string) {\n const value = this.filterValues()[filterValue];\n if (!value) {\n this.selectedHour.set(0);\n this.selectedMinute.set(0);\n this.selectedAmPm.set('AM');\n return;\n }\n\n const [hh, mm] = value.split(':').map((v) => parseInt(v, 10));\n if (isNaN(hh) || isNaN(mm)) {\n this.selectedHour.set(0);\n this.selectedMinute.set(0);\n this.selectedAmPm.set('AM');\n return;\n }\n\n this.selectedHour.set(hh);\n this.selectedMinute.set(mm);\n this.selectedAmPm.set(hh >= 12 ? 'PM' : 'AM');\n }\n\n private commitTime() {\n const filterValue = this.activeFilterType();\n if (!filterValue) return;\n\n this.markAsTouched();\n\n const hh = this.selectedHour().toString().padStart(2, '0');\n const mm = this.selectedMinute().toString().padStart(2, '0');\n const timeString = `${hh}:${mm}`;\n\n this.filterValues.update((current) => ({\n ...current,\n [filterValue]: timeString,\n }));\n\n this.onChange(timeString);\n this.valueChange.emit(timeString);\n this.filterSelected.emit({\n filter: filterValue,\n value: timeString,\n });\n }\n\n private addDocumentListener() {\n this.removeDocumentListener();\n\n this.ngZone.runOutsideAngular(() => {\n this.documentClickListener = (event: Event) => {\n const target = event.target as Node;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.ngZone.run(() => {\n if (this.isOpen()) {\n this.closeDropdown();\n }\n });\n }\n };\n\n setTimeout(() => {\n document.addEventListener('click', this.documentClickListener!, true);\n }, 10);\n });\n }\n\n private removeDocumentListener() {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener, true);\n this.documentClickListener = undefined;\n }\n }\n}\n","<div class=\"filter-chips\">\n @for (item of filters(); track item.value) {\n <div\n class=\"chip-input-wrapper\"\n [class.has-value]=\"filterValues()[item.value]\"\n [class.active]=\"activeFilterType() === item.value && isOpen()\"\n >\n <label class=\"floating-label\">\n {{ item.placeholder || item.label || 'Seleccionar hora' }}\n </label>\n\n <input\n type=\"text\"\n class=\"chip-input\"\n [value]=\"filterValues()[item.value] || ''\"\n [placeholder]=\"item.placeholder || item.label || 'hh:mm'\"\n readonly\n [disabled]=\"isDisabled()\"\n (click)=\"toggleDropdown(item.value)\"\n (keydown)=\"onEnter($event)\"\n />\n\n <button\n type=\"button\"\n class=\"time-icon-button\"\n (click)=\"toggleDropdown(item.value)\"\n title=\"Seleccionar hora\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <polyline points=\"12 7 12 12 15 15\" />\n </svg>\n </button>\n\n @if (isOpen() && activeFilterType() === item.value) {\n <div class=\"dropdown\">\n <div class=\"datetime-content\">\n <div class=\"time-section\">\n <!-- <div class=\"time-header\">Horario</div> -->\n\n <div class=\"time-selectors\">\n <div class=\"time-group\">\n <div class=\"time-column\">\n <div class=\"time-label\">Hora</div>\n <div class=\"time-scroll\">\n @for (hour of hours12(); track hour.value) {\n <div\n class=\"time-option\"\n [class.selected]=\"hour.value === selectedHour12\"\n (click)=\"setHour12(hour.value)\"\n >\n {{ hour.display }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"time-separator-vertical\">:</div>\n\n <div class=\"time-column\">\n <div class=\"time-label\">Min</div>\n <div class=\"time-scroll\">\n @for (minute of minutes(); track minute) {\n <div\n class=\"time-option\"\n [class.selected]=\"minute === selectedMinute()\"\n (click)=\"setMinute(minute)\"\n >\n {{ minute.toString().padStart(2, '0') }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"time-column\">\n <div class=\"time-label\">AM/PM</div>\n <div class=\"time-scroll ampm\">\n <div\n class=\"time-option\"\n [class.selected]=\"selectedAmPm() === 'AM'\"\n (click)=\"setAmPm('AM')\"\n >\n AM\n </div>\n <div\n class=\"time-option\"\n [class.selected]=\"selectedAmPm() === 'PM'\"\n (click)=\"setAmPm('PM')\"\n >\n PM\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button\n type=\"button\"\n class=\"action-btn secondary\"\n (click)=\"clearActive(item.value)\"\n >\n Limpiar\n </button>\n <button\n type=\"button\"\n class=\"action-btn primary\"\n (click)=\"closeDropdown()\"\n >\n Aceptar\n </button>\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import { Component, computed, ElementRef, input, output, signal, ViewChild } from '@angular/core';\nimport { DateFilterSelection, FilterItem, FilterType, SelectedDatesMap } from '../../interfaces/filters';\nimport { InputNumberFilter } from '../input-number-filter/input-number-filter';\nimport { InputTextFilter } from '../input-text-filter/input-text-filter';\nimport { InputSelectFilter } from '../input-select-filter/input-select-filter';\nimport { DateTimeFilter } from '../date-time-filter/date-time-filter';\nimport { InputTimeFilter } from '../input-time-filter/input-time-filter';\nimport { Button } from '../button/button';\n\nexport interface TitleFilterConfig {\n type: FilterType;\n filters: FilterItem[];\n}\n\ntype FilterButtonMode = 'toggle' | 'action' | 'click' | 'clickRight';\n\n@Component({\n selector: 'lib-title-filters',\n imports: [InputNumberFilter, InputTextFilter, InputSelectFilter, DateTimeFilter, InputTimeFilter, Button],\n templateUrl: './title-filters.html',\n styleUrl: './title-filters.css',\n})\nexport class TitleFilters {\n @ViewChild('filtersContainer', { read: ElementRef })\n filtersContainer!: ElementRef<HTMLElement>;\n\n @ViewChild('submitBtn', { read: ElementRef })\n submitBtn?: ElementRef<HTMLElement>;\n\n showFilters = signal<boolean>(false);\n\n title = input<string>('Listado');\n filtersConfig = input<TitleFilterConfig[]>([]);\n\n filtersChange = output<Record<string, string | number | Date | null>>();\n\n applyFilters = output<void>();\n clearFilters = output<void>();\n\n clearFilterTrigger = signal(0);\n\n selectedDates = signal<SelectedDatesMap>({});\n selectedTextFilters = signal<Record<string, string>>({});\n\n buttonMode = input<FilterButtonMode>('toggle');\n filterButtonClicked = output<void>();\n\n // Botón de acción\n clickButtonIcon = input<string>('');\n clickButtonLabel = input<string>('Acción');\n alwaysShowFilters = input<boolean>(false);\n\n // Botón secundario\n showSecondaryButton = input<boolean>(false);\n secondaryButtonIcon = input<string>('icon-download');\n secondaryButtonLabel = input<string>('Exportar PDF');\n secondaryButtonClicked = output<void>();\n\n // Botón de exportar\n showButtonExport = input<boolean>(false);\n exportButtonIcon = input<string>('icon-export');\n exportButtonLabel = input<string>('Exportar CSV');\n exportButtonClicked = output<void>();\n\n // Botón de atrás\n showButtonBack = input<boolean>(false);\n clickButtonBack = output<void>();\n\n private emitAllFilters(\n textFilters: Record<string, string>,\n dateFilters: SelectedDatesMap\n ): void {\n this.filtersChange.emit({\n ...textFilters,\n ...dateFilters,\n });\n }\n\n private normalizeSelectOptions(options: any[]) {\n return options.map(opt => ({\n label: String(opt.label ?? opt.name ?? opt.text),\n value: String(opt.value ?? opt.code ?? opt.id),\n }));\n }\n\n private normalizeFilters(filters: FilterItem[]): FilterItem[] {\n return filters.map(filter => {\n if (!filter.options) return filter;\n\n return {\n ...filter,\n options: this.normalizeSelectOptions(filter.options),\n };\n });\n }\n\n normalizedFiltersConfig = computed<TitleFilterConfig[]>(() => {\n return this.filtersConfig().map(group => ({\n ...group,\n filters: this.normalizeFilters(group.filters),\n }));\n });\n\n\n onFilterButtonClick() {\n if (this.buttonMode() === 'toggle') {\n this.toggleFilters();\n } else {\n this.filterButtonClicked.emit();\n }\n }\n\n get filtersVisible(): boolean {\n return this.alwaysShowFilters() || this.showFilters();\n }\n\n toggleFilters(): void {\n this.showFilters.update((v) => !v);\n }\n\n clearAllFilters(): void {\n this.selectedDates.set({});\n this.selectedTextFilters.set({});\n this.clearFilterTrigger.update(v => v + 1);\n this.filtersChange.emit({});\n this.clearFilters.emit();\n }\n\n onApplyFilters(): void {\n this.applyFilters.emit();\n }\n\n onDateSelected(event: DateFilterSelection): void {\n this.selectedDates.update((current) => {\n const updated = {\n ...current,\n [event.filter]: event.value,\n };\n\n this.emitAllFilters(this.selectedTextFilters(), updated);\n return updated;\n });\n }\n\n onFilterSelected(event: { filter: string; value: string }): void {\n this.selectedTextFilters.update((current) => {\n const updated = {\n ...current,\n [event.filter]: event.value,\n };\n\n this.emitAllFilters(updated, this.selectedDates());\n return updated;\n });\n }\n\n focusNextFilter() {\n const container = this.filtersContainer?.nativeElement;\n if (!container) return;\n\n\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>(\n 'input:not([disabled]), textarea:not([disabled]), select:not([disabled])'\n )\n ).filter(el => el.offsetParent !== null); // solo visibles\n\n const active = document.activeElement as HTMLElement;\n const index = focusable.indexOf(active);\n\n // 👉 Si hay siguiente → foco\n if (index >= 0 && index < focusable.length - 1) {\n focusable[index + 1].focus();\n return;\n }\n\n // 👉 Si es el último → aplicar filtros\n this.onApplyFilters();\n }\n\n clickButton() {\n this.clickButtonBack.emit();\n }\n\n /* focusNextFilter() {\n const container = this.filtersContainer?.nativeElement;\n if (!container) return;\n\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>(\n '[tabindex], input:not([disabled]), button:not([disabled])'\n )\n ).filter(el => el.offsetParent !== null);\n\n const active = document.activeElement as HTMLElement;\n const index = focusable.indexOf(active);\n\n // 👉 siguiente foco\n if (index >= 0 && index < focusable.length - 1) {\n focusable[index + 1].focus();\n return;\n }\n\n // 👉 último → enfocar botón submit\n this.focusSubmitButton();\n }\n\n focusSubmitButton() {\n const btn = this.submitBtn?.nativeElement;\n if (!btn) return;\n\n btn.focus();\n } */\n}\n","<div class=\"header-container-table\">\n <div class=\"filters-dashboard-table\">\n <div class=\"left-title\">\n @if(showButtonBack()) {\n <div class=\"button-back\" (click)=\"clickButton()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"icon-tabler icons-tabler-outline icon-tabler-arrow-left\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M5 12l14 0\" />\n <path d=\"M5 12l6 6\" />\n <path d=\"M5 12l6 -6\" />\n </svg>\n </div>\n }\n <div class=\"title-table\">{{ title() }}</div>\n </div>\n\n @if (buttonMode() === 'toggle') {\n <div class=\"button-small-primary\" (click)=\"toggleFilters()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-filter\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z\" />\n </svg>\n <div class=\"label\">Filtros</div>\n </div>\n }\n @if (buttonMode() === 'action') {\n <div class=\"button-small-primary\" (click)=\"onFilterButtonClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\"\n d=\"M10.85 16.608v1.684a8.3 8.3 0 0 0 4.433-1.842L14.1 15.258a6.6 6.6 0 0 1-3.25 1.35M3.358 10c0-3.375 2.525-6.175 5.792-6.608V1.708C4.958 2.15 1.692 5.7 1.692 10s3.266 7.85 7.458 8.292v-1.684C5.883 16.175 3.358 13.375 3.358 10m13.267-.833h1.683a8.3 8.3 0 0 0-1.841-4.434l-1.192 1.192a6.56 6.56 0 0 1 1.35 3.242M15.283 3.55a8.3 8.3 0 0 0-4.433-1.842v1.684a6.6 6.6 0 0 1 3.25 1.35zm-.008 10.533 1.192 1.184a8.3 8.3 0 0 0 1.841-4.434h-1.683a6.6 6.6 0 0 1-1.35 3.25\" />\n <path fill=\"#fff\"\n d=\"M13.333 9.25c0-2.075-1.583-3.417-3.333-3.417S6.667 7.175 6.667 9.25c0 1.383 1.108 3.025 3.333 4.917 2.225-1.892 3.333-3.534 3.333-4.917M10 10a.893.893 0 0 1 0-1.783A.893.893 0 0 1 10 10\" />\n </svg>\n <div class=\"label\">Ir al Mapa</div>\n </div>\n }\n @if (buttonMode() === 'click') {\n <lib-button variant=\"primary\" (clicked)=\"onFilterButtonClick()\">\n @if (clickButtonIcon()) {\n <span class=\"btn-icon {{clickButtonIcon()}}\"></span>\n }\n {{ clickButtonLabel() }}\n </lib-button>\n }\n <div class=\"secondary-action-btn\">\n @if (showSecondaryButton()) {\n <lib-button variant=\"secondary\" (clicked)=\"secondaryButtonClicked.emit()\">\n @if (secondaryButtonIcon()) {\n <span class=\"btn-icon {{secondaryButtonIcon()}}\"></span>\n }\n {{ secondaryButtonLabel() }}\n </lib-button>\n }\n @if (showButtonExport()) {\n <lib-button variant=\"outline\" (clicked)=\"exportButtonClicked.emit()\">\n <span class=\"btn-icon {{exportButtonIcon()}}\"></span>\n {{ exportButtonLabel() }}\n </lib-button>\n }\n @if (buttonMode() === 'clickRight') {\n <lib-button variant=\"primary\" (clicked)=\"onFilterButtonClick()\">\n @if (clickButtonIcon()) {\n <span class=\"btn-icon {{clickButtonIcon()}}\"></span>\n }\n {{ clickButtonLabel() }}\n </lib-button>\n }\n </div>\n </div>\n\n @if (filtersVisible) {\n <div class=\"filters-container\" #filtersContainer>\n <div class=\"filters-wrapper\">\n\n @for (config of normalizedFiltersConfig(); track $index) {\n @switch (config.type) {\n @case ('text') {\n <lib-input-text-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('number') {\n <lib-input-number-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('select') {\n <lib-input-select-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('date') {\n <lib-date-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (dateSelected)=\"onDateSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('time') {\n <lib-input-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n }\n }\n\n <div class=\"actions\">\n <lib-button #submitBtn tabindex=\"0\" [size]=\"'compact'\" (click)=\"onApplyFilters()\"\n (keydown.enter)=\"onApplyFilters()\">\n Aplicar Filtros\n </lib-button>\n\n <lib-button [variant]=\"'outline'\" [size]=\"'compact'\" (click)=\"clearAllFilters()\">\n Borrar Filtros\n </lib-button>\n </div>\n </div>\n </div>\n }\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'lib-notification-modal',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './notification-modal.html',\r\n styleUrl: './notification-modal.css',\r\n})\r\nexport class NotificationModal {\r\n @ViewChild('messageInput') messageInput!: ElementRef<HTMLTextAreaElement>;\r\n\r\n mode: 'list' | 'edit' = 'list';\r\n\r\n messageControl = new FormControl<string>('', { nonNullable: true });\r\n\r\n @Input() titulo = 'Notificar a este Agente';\r\n @Output() buttonClick = new EventEmitter<string>();\r\n\r\n\r\n itemLabel = '¡URGENTE!';\r\n btnLabel = 'Personalizado';\r\n\r\n defaultMessages = [\r\n '¡URGENTE!',\r\n '¡ALERTA!',\r\n '¡EMERGENCIA!'\r\n ];\r\n\r\n selectDefaultMessage(message: string) {\r\n this.mode = 'edit';\r\n this.messageControl.setValue(message);\r\n\r\n setTimeout(() => {\r\n const el = this.messageInput.nativeElement;\r\n el.focus();\r\n el.setSelectionRange(message.length, message.length);\r\n });\r\n }\r\n\r\n customMessage() {\r\n this.mode = 'edit';\r\n this.messageControl.reset('');\r\n\r\n setTimeout(() => {\r\n this.messageInput.nativeElement.focus();\r\n });\r\n }\r\n\r\n btnClick() {\r\n const value = this.messageControl.value.trim();\r\n if (!value) return;\r\n \r\n \r\n this.buttonClick.emit(value);\r\n }\r\n\r\n backToList() {\r\n this.mode = 'list';\r\n this.messageControl.reset('');\r\n }\r\n}\r\n","<div class=\"notification-modal-container\">\r\n <div class=\"notification-modal-header\">\r\n <h3>{{ titulo }}</h3>\r\n </div>\r\n <div class=\"notification-modal-body\">\r\n <!-- LISTA DE MENSAJES -->\r\n @if (mode === 'list') {\r\n <div class=\"default-message-list\">\r\n @for (msg of defaultMessages; track msg) {\r\n <div class=\"default-message-item\" (click)=\"selectDefaultMessage(msg)\">\r\n <span>{{ msg }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-send-2\" viewBox=\"0 0 24 24\">\r\n <path fill=\"none\" stroke=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path\r\n d=\"M4.698 4.034 21 12 4.698 19.966a.5.5 0 0 1-.546-.124.56.56 0 0 1-.12-.568L6.5 12 4.032 4.726a.56.56 0 0 1 .12-.568.5.5 0 0 1 .546-.124M6.5 12H21\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- EDICIÓN -->\r\n @if (mode === 'edit') {\r\n <div class=\"text-area-wrapper\">\r\n <textarea #messageInput class=\"message-textarea\" rows=\"5\" placeholder=\"Mensaje...\" [formControl]=\"messageControl\"></textarea>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"notification-modal-actions\">\r\n @if (mode === 'edit') {\r\n <button class=\"btn-back\" (click)=\"backToList()\">\r\n Volver\r\n </button>\r\n <button class=\"btn-custom\" [disabled]=\"!messageControl.value.trim()\" (click)=\"btnClick()\">\r\n Notificar\r\n </button>\r\n } @else {\r\n <button class=\"btn-custom\" (click)=\"customMessage()\">\r\n Personalizado\r\n </button>\r\n }\r\n </div>\r\n</div>","import { Component } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'app-footer',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './footer.html',\r\n styleUrl: './footer.css',\r\n})\r\nexport class Footer {\r\n}","<footer class=\"footer\">\r\n © 2026 <span>PAICO · Sistemas y Aplicaciones en Línea.</span> Todos los derechos reservados.\r\n</footer>\r\n","import { Component, output, computed, input, signal } from '@angular/core';\r\n\r\nexport type OpcionButtonVariant = 'success' | 'danger';\r\n\r\ninterface ValidationOption {\r\n label: string;\r\n subtitle: string;\r\n variant: OpcionButtonVariant;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-button-cards',\r\n imports: [],\r\n templateUrl: './button-cards.html',\r\n styleUrl: './button-cards.css',\r\n})\r\nexport class ButtonCards {\r\n groupCard = input<Boolean>(false);\r\n label = input<string>();\r\n subtitle = input<string>();\r\n variant = input<OpcionButtonVariant>('success');\r\n\r\n // Estado interno\r\n selectedSingle = signal(false);\r\n selectedGroup = signal<OpcionButtonVariant | null>('success');\r\n\r\n // Output\r\n selectedChange = output<OpcionButtonVariant>();\r\n\r\n // Computeds\r\n isSuccess = computed(() => this.variant() === 'success');\r\n isDanger = computed(() => this.variant() === 'danger');\r\n\r\n options = computed<ValidationOption[]>(() => [\r\n {\r\n label: 'Aprobar Evidencia',\r\n subtitle: 'La evidencia cumple con los requisitos',\r\n variant: 'success'\r\n },\r\n {\r\n label: 'Rechazar Evidencia',\r\n subtitle: 'La evidencia no cumple con los requisitos',\r\n variant: 'danger'\r\n }\r\n ]);\r\n\r\n toggleSingle() {\r\n this.selectedSingle.update(v => !v);\r\n this.selectedChange.emit(this.variant());\r\n }\r\n\r\n selectGroup(option: OpcionButtonVariant) {\r\n this.selectedGroup.set(option);\r\n this.selectedChange.emit(option);\r\n }\r\n\r\n isSelected(option: OpcionButtonVariant) {\r\n return this.selectedGroup() === option;\r\n }\r\n}\r\n","@if (!groupCard()) {\r\n\r\n<!-- MODO SINGLE -->\r\n<button class=\"opcion-boton\" [class.opcion-activa]=\"selectedSingle()\"\r\n [class.opcion-success]=\"selectedSingle() && isSuccess()\" [class.opcion-danger]=\"selectedSingle() && isDanger()\"\r\n (click)=\"toggleSingle()\">\r\n\r\n <div class=\"opcion-contenido\">\r\n <div class=\"opcion-icono-container\" [class.icono-activo]=\"selectedSingle()\">\r\n\r\n @if (isSuccess()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\" [class.icon-success]=\"selectedSingle() && isSuccess()\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n } @else if(isDanger()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-x\" [class.icon-danger]=\"selectedSingle() && isDanger()\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M10 10l4 4m0 -4l-4 4\" />\r\n </svg>\r\n }\r\n </div>\r\n\r\n <div class=\"opcion-textos\">\r\n <div class=\"opcion-titulo\" [class.titulo-success]=\"selectedSingle() && isSuccess()\"\r\n [class.titulo-danger]=\"selectedSingle() && isDanger()\">\r\n {{ label() }}\r\n </div>\r\n\r\n <div class=\"opcion-subtitulo\" [class.subtitulo-success]=\"selectedSingle() && isSuccess()\"\r\n [class.subtitulo-danger]=\"selectedSingle() && isDanger()\">\r\n {{ subtitle() }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (selectedSingle()) {\r\n <div class=\"indicador-seleccion\">\r\n <div class=\"indicador-punto\" [class.punto-success]=\"isSuccess()\" [class.punto-danger]=\"isDanger()\">\r\n </div>\r\n </div>\r\n }\r\n</button>\r\n\r\n} @else {\r\n<!-- MODO GROUP -->\r\n<div class=\"columnCards\">\r\n @for (option of options(); track option.variant) {\r\n <button class=\"opcion-boton\" [class.opcion-activa]=\"isSelected(option.variant)\"\r\n [class.opcion-success]=\"isSelected(option.variant) && option.variant === 'success'\"\r\n [class.opcion-danger]=\"isSelected(option.variant) && option.variant === 'danger'\"\r\n (click)=\"selectGroup(option.variant)\">\r\n <div class=\"opcion-contenido\">\r\n <div class=\"opcion-icono-container\">\r\n @if (option.variant === 'success') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-check\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M9 12l2 2l4 -4\" />\r\n </svg>\r\n } @else if(option.variant === 'danger') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-circle-x\" [class.icon-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\r\n <path d=\"M10 10l4 4m0 -4l-4 4\" />\r\n </svg>\r\n }\r\n </div>\r\n\r\n <div class=\"opcion-textos\">\r\n <div class=\"opcion-titulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\r\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\r\n {{ option.label }}\r\n </div>\r\n\r\n <div class=\"opcion-subtitulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\r\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\r\n {{ option.subtitle }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (isSelected(option.variant)) {\r\n <div class=\"indicador-seleccion\">\r\n <div class=\"indicador-punto\" [class.punto-success]=\"option.variant === 'success'\"\r\n [class.punto-danger]=\"option.variant === 'danger'\">\r\n </div>\r\n </div>\r\n }\r\n </button>\r\n }\r\n</div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, input, model, output } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { SectionConfig, DynamicFormFields } from '../dynamic-form-fields/dynamic-form-fields';\r\nimport { Input } from \"../input/input\";\r\n\r\n/** Colores predefinidos para el fondo de la card */\r\nexport const CARD_BG = {\r\n default: '#EBE8D6',\r\n light: '#ededdf',\r\n} as const;\r\n\r\nexport type CardBgPreset = keyof typeof CARD_BG;\r\n\r\n@Component({\r\n selector: 'lib-card-content',\r\n imports: [CommonModule, DynamicFormFields, Input],\r\n templateUrl: './card-content.html',\r\n styleUrl: './card-content.css',\r\n})\r\nexport class CardContent {\r\n title = input<string>('Título de sección');\r\n isForm = input<boolean>(false);\r\n form = input<FormGroup>();\r\n sections = input<SectionConfig[]>([]);\r\n variant = input<string>('default');\r\n sectionNumber = input<number | null>(null);\r\n compact = input<boolean>(false);\r\n searchRegex = input<RegExp | null>(null);\r\n\r\n /**\r\n * Color de fondo de la card.\r\n * Acepta un preset ('beige' | 'white') o cualquier valor CSS válido (hex, rgb, etc.).\r\n * Por defecto 'beige' (#EBE8D6).\r\n */\r\n bgColor = input<CardBgPreset | string>('default');\r\n\r\n /** Muestra la barra de búsqueda */\r\n withSearch = input<boolean>(false);\r\n /** Placeholder del input de búsqueda */\r\n searchPlaceholder = input<string>('Buscar...');\r\n /** Valor del input de búsqueda (two-way binding con [(searchValue)]) */\r\n searchValue = model<string>('');\r\n /** Se emite al presionar Enter o el botón buscar */\r\n onSearch = output<string>();\r\n /** Se emite al borrar el valor del input */\r\n onSearchClear = output<void>();\r\n\r\n /** Resuelve preset → hex, o pasa directo si es un color custom */\r\n readonly resolvedBg = computed(() => {\r\n const c = this.bgColor();\r\n return (CARD_BG as Record<string, string>)[c] ?? c;\r\n });\r\n\r\n /** Aplica background y --sl-form-surface juntos para que los labels siempre coincidan */\r\n readonly cardStyles = computed(() => ({\r\n 'background': this.resolvedBg(),\r\n '--sl-form-surface': this.resolvedBg(),\r\n }));\r\n}\r\n","<div class=\"card\" [style]=\"cardStyles()\">\r\n @if (variant() === 'default') {\r\n <div class=\"card-header\">\r\n <p>{{ title() }}</p>\r\n </div>\r\n }\r\n @if (variant() === 'numeric') {\r\n <div class=\"card-header-numeric\">\r\n <span class=\"card-header-icon\">\r\n <svg viewBox=\"0 0 24 24\" class=\"card-header-icon-svg\" aria-hidden=\"true\" focusable=\"false\">\r\n <circle cx=\"12\" cy=\"12\" r=\"12\" class=\"card-header-icon-circle\" />\r\n <text x=\"12\" y=\"12\" text-anchor=\"middle\" dominant-baseline=\"central\" class=\"card-header-icon-text\">\r\n {{ sectionNumber() }}\r\n </text>\r\n </svg>\r\n </span>\r\n <p>{{ title() }}</p>\r\n </div>\r\n }\r\n <div class=\"card-content\">\r\n @if (isForm()) {\r\n @if (withSearch()) {\r\n <div class=\"search-wrapper\">\r\n <lib-input\r\n mode=\"search\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n [(value)]=\"searchValue\"\r\n (onSearch)=\"onSearch.emit($event)\"\r\n (onClear)=\"onSearchClear.emit()\"\r\n [regex]=\"searchRegex()\"\r\n />\r\n </div>\r\n }\r\n <lib-dynamic-form-fields [form]=\"form()!\" [sections]=\"sections()!\" [compact]=\"compact()\" />\r\n } @else {\r\n <ng-content></ng-content>\r\n }\r\n </div>\r\n</div>","import { Component, computed, DestroyRef, effect, inject, input, model, output, signal, viewChildren } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { CardContent, CardBgPreset } from '../card-content/card-content';\r\nimport { DynamicFormFields, SectionConfig } from '../dynamic-form-fields/dynamic-form-fields';\r\nimport { InfoGroup, InfoItem } from '../info-group/info-group';\r\nimport { Input } from '../input/input';\r\n\r\nexport type TabId = string | number;\r\n\r\nexport interface TabCardConfig {\r\n title: string;\r\n // --- Modo formulario (existente) ---\r\n isForm?: boolean;\r\n form?: FormGroup;\r\n sections?: SectionConfig[];\r\n compact?: boolean;\r\n variant?: 'default' | 'numeric';\r\n sectionNumber?: number | null;\r\n withSearch?: boolean;\r\n searchPlaceholder?: string;\r\n /** Color de fondo de la card. Acepta preset ('default' | 'light') o cualquier valor CSS. */\r\n bgColor?: CardBgPreset | string;\r\n /** Callback al buscar (Enter o botón buscar) */\r\n onSearch?: (value: string) => void;\r\n /** Callback al limpiar el input de búsqueda */\r\n onSearchClear?: () => void;\r\n /** Regex para validar el input de búsqueda */\r\n searchRegex?: RegExp | null;\r\n // --- Modo info-group ---\r\n /** Modo info: items en grid de dos columnas. */\r\n infoItems?: InfoItem[];\r\n infoTitleAlign?: 'center' | 'left' | 'right';\r\n /** Modo comparación: columnas independientes. */\r\n infoItemsLeft?: InfoItem[];\r\n infoItemsRight?: InfoItem[];\r\n infoTitleLeft?: string;\r\n infoTitleRight?: string;\r\n}\r\n\r\nexport interface TabTogglesConfig {\r\n /** FormGroup que respalda los toggles — los cambios se emiten automáticamente. */\r\n form: FormGroup;\r\n /** Secciones con fields de tipo 'toggle'. */\r\n sections: SectionConfig[];\r\n}\r\n\r\nexport interface TabSearchConfig {\r\n /** Placeholder del input de búsqueda */\r\n placeholder?: string;\r\n /** Callback al buscar (Enter o botón buscar) */\r\n onSearch?: (value: string) => void;\r\n /** Callback al limpiar el input de búsqueda */\r\n onClear?: () => void;\r\n /** Regex para validar el input de búsqueda */\r\n searchRegex?: RegExp | null;\r\n}\r\n\r\nexport interface TabItem {\r\n id: TabId;\r\n label: string;\r\n disabled?: boolean;\r\n /** Si se define, el componente renderiza automáticamente las cards al seleccionar el tab */\r\n cards?: TabCardConfig[];\r\n /** Toggles opcionales a mostrar encima de las cards (respaldados por FormGroup). */\r\n toggles?: TabTogglesConfig;\r\n /** Barra de búsqueda opcional a mostrar encima de las cards */\r\n search?: TabSearchConfig;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-tabs',\r\n imports: [CardContent, InfoGroup, DynamicFormFields, Input],\r\n templateUrl: './tabs.html',\r\n styleUrl: './tabs.css',\r\n})\r\nexport class Tabs {\r\n tabs = input<TabItem[]>([]);\r\n activeTab = input<TabId | null>(null);\r\n /**\r\n * Cuando es true, bloquea el cambio de tab si el formulario del tab actual\r\n * tiene campos inválidos. Útil para flujos de registro.\r\n * Para vistas de detalle dejar en false (default).\r\n */\r\n validateOnTabChange = input<boolean>(false);\r\n\r\n tabChange = output<TabId>();\r\n activeTabChange = output<TabId>();\r\n /** Emite el id del tab actual cuando la validación impide el cambio */\r\n tabValidationFailed = output<TabId>();\r\n\r\n private internalActive = signal<TabId | null>(null);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private validitySubs: Subscription[] = [];\r\n\r\n /**\r\n * Indica si todos los formularios del tab activo son válidos.\r\n * Se actualiza reactivamente cuando cambia la validez de cualquier campo.\r\n * true cuando el tab no tiene formularios (navegación libre).\r\n */\r\n readonly currentTabValid = signal<boolean>(true);\r\n\r\n /** Valor interno del buscador (para usar el componente `lib-input` en modo búsqueda) */\r\n readonly searchValue = model<string>('');\r\n\r\n constructor() {\r\n // Mantiene currentTabValid sincronizado con la validez real de los forms del tab activo\r\n effect(() => {\r\n const cards = this.activeCards();\r\n\r\n this.validitySubs.forEach(s => s.unsubscribe());\r\n this.validitySubs = [];\r\n\r\n const formCards = cards?.filter(c => c.isForm && c.form) ?? [];\r\n\r\n if (!formCards.length) {\r\n this.currentTabValid.set(true);\r\n return;\r\n }\r\n\r\n const updateValidity = () =>\r\n this.currentTabValid.set(formCards.every(c => c.form!.valid));\r\n\r\n updateValidity();\r\n\r\n formCards.forEach(c => {\r\n this.validitySubs.push(\r\n c.form!.statusChanges.subscribe(() => updateValidity())\r\n );\r\n });\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.validitySubs.forEach(s => s.unsubscribe());\r\n });\r\n\r\n effect(() => {\r\n const list = this.tabs();\r\n const external = this.activeTab();\r\n const internal = this.internalActive();\r\n\r\n if (!list.length) {\r\n if (internal !== null) this.internalActive.set(null);\r\n return;\r\n }\r\n\r\n const isValid = (id: TabId | null) => !!id && list.some(t => t.id === id);\r\n\r\n const next: TabId =\r\n isValid(external) ? external! :\r\n isValid(internal) ? internal! :\r\n list[0].id;\r\n\r\n if (internal !== next) {\r\n this.internalActive.set(next);\r\n }\r\n });\r\n }\r\n\r\n readonly active = computed<TabId | null>(() => {\r\n const list = this.tabs();\r\n if (!list.length) return null;\r\n\r\n const external = this.activeTab();\r\n if (external && list.some(t => t.id === external)) return external;\r\n\r\n return this.internalActive() ?? list[0].id;\r\n });\r\n\r\n readonly count = computed(() => Math.max(this.tabs().length, 1));\r\n\r\n readonly indicatorWidth = computed(() => `${100 / this.count()}%`);\r\n\r\n readonly activeIndex = computed(() => {\r\n const list = this.tabs();\r\n const a = this.active();\r\n if (!list.length || !a) return 0;\r\n const idx = list.findIndex(t => t.id === a);\r\n return idx >= 0 ? idx : 0;\r\n });\r\n\r\n readonly indicatorLeft = computed(() => `${(100 / this.count()) * this.activeIndex()}%`);\r\n\r\n /** Cards del tab activo — null si el tab no tiene cards definidas */\r\n readonly activeCards = computed<TabCardConfig[] | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n return tab?.cards ?? null;\r\n });\r\n\r\n /** Toggles del tab activo */\r\n readonly activeTabToggles = computed<TabTogglesConfig | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n return tab?.toggles ?? null;\r\n });\r\n\r\n /** Search del tab activo */\r\n readonly activeTabSearch = computed<TabSearchConfig | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n return tab?.search ?? null;\r\n });\r\n\r\n /** Placeholder de búsqueda del tab activo (siempre string) */\r\n readonly tabSearchPlaceholder = computed(() => {\r\n return this.activeTabSearch()?.placeholder ?? 'Buscar...';\r\n });\r\n\r\n childCards = viewChildren(CardContent);\r\n\r\n setTab(tabId: TabId) {\r\n if (tabId === this.active()) return;\r\n\r\n if (this.validateOnTabChange() && !this.isCurrentTabValid()) {\r\n this.tabValidationFailed.emit(this.active()!);\r\n return;\r\n }\r\n\r\n this.searchValue.set('');\r\n this.childCards().forEach(c => c.searchValue.set(''));\r\n this.internalActive.set(tabId);\r\n this.activeTabChange.emit(tabId);\r\n this.tabChange.emit(tabId);\r\n }\r\n\r\n /**\r\n * Valida los formularios del tab activo.\r\n * Marca todos los campos como touched para que los errores sean visibles.\r\n * Retorna true si todos los formularios son válidos (o si el tab no tiene forms).\r\n */\r\n private isCurrentTabValid(): boolean {\r\n const cards = this.activeCards();\r\n if (!cards) return true;\r\n\r\n const formCards = cards.filter(c => c.isForm && c.form);\r\n if (!formCards.length) return true;\r\n\r\n const allValid = formCards.every(c => c.form!.valid);\r\n\r\n if (!allValid) {\r\n formCards.forEach(c => c.form!.markAllAsTouched());\r\n }\r\n\r\n return allValid;\r\n }\r\n\r\n // Accesibilidad \r\n onTabKeydown(event: KeyboardEvent, currentId: TabId) {\r\n const key = event.key;\r\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End', 'Enter', ' '].includes(key)) return;\r\n\r\n event.preventDefault();\r\n\r\n if (key === 'Enter' || key === ' ') {\r\n this.setTab(currentId);\r\n this.focusTab(currentId);\r\n return;\r\n }\r\n\r\n const nextId =\r\n key === 'Home' ? this.firstEnabledId()\r\n : key === 'End' ? this.lastEnabledId()\r\n : key === 'ArrowRight' ? this.nextEnabledId(currentId, +1)\r\n : this.nextEnabledId(currentId, -1);\r\n\r\n if (!nextId) return;\r\n\r\n // mover foco\r\n this.focusTab(nextId);\r\n // comportamiento común: solo mover foco con flechas (no activar)\r\n // Si quieres activar también con flechas, descomenta:\r\n // this.setTab(nextId);\r\n }\r\n\r\n private enabledTabs(): TabItem[] {\r\n return this.tabs().filter(t => !t.disabled);\r\n }\r\n\r\n private firstEnabledId(): TabId | null {\r\n return this.enabledTabs()[0]?.id ?? null;\r\n }\r\n\r\n private lastEnabledId(): TabId | null {\r\n const list = this.enabledTabs();\r\n return list.length ? list[list.length - 1].id : null;\r\n }\r\n\r\n private nextEnabledId(currentId: TabId, delta: 1 | -1): TabId | null {\r\n const list = this.tabs();\r\n if (!list.length) return null;\r\n\r\n const idx = list.findIndex(t => t.id === currentId);\r\n if (idx < 0) return this.firstEnabledId();\r\n\r\n // buscar siguiente habilitado con wrap-around\r\n for (let step = 1; step <= list.length; step++) {\r\n const i = (idx + step * delta + list.length) % list.length;\r\n if (!list[i].disabled) return list[i].id;\r\n }\r\n return null;\r\n }\r\n\r\n private focusTab(tabId: TabId) {\r\n // IDs determinísticos para focus (ver template)\r\n const el = document.getElementById(this.tabDomId(tabId)) as HTMLButtonElement | null;\r\n el?.focus();\r\n }\r\n\r\n tabDomId(tabId: TabId) {\r\n return `lib-tab-${tabId}`;\r\n }\r\n}\r\n","<div class=\"side-tabs\" role=\"tablist\">\r\n @if (tabs().length > 0) {\r\n @for (t of tabs(); track t.id) {\r\n <button type=\"button\" class=\"tab\" role=\"tab\" [id]=\"tabDomId(t.id)\" [class.active]=\"t.id === active()\"\r\n [class.disabled]=\"!!t.disabled\" [attr.aria-selected]=\"t.id === active()\" [attr.aria-disabled]=\"!!t.disabled\"\r\n [disabled]=\"!!t.disabled\" [attr.tabindex]=\"t.id === active() ? 0 : -1\" (click)=\"setTab(t.id)\"\r\n (keydown)=\"onTabKeydown($event, t.id)\">\r\n {{ t.label }}\r\n </button>\r\n }\r\n <div class=\"tab-indicator\" [class.hidden]=\"active() === null\" [style.width]=\"indicatorWidth()\"\r\n [style.left]=\"indicatorLeft()\"></div>\r\n }\r\n</div>\r\n\r\n@if (activeCards(); as cards) {\r\n<div class=\"tab-panels\">\r\n @if (activeTabToggles(); as togglesCfg) {\r\n <div class=\"toggles-container\">\r\n <lib-dynamic-form-fields\r\n [form]=\"togglesCfg.form\"\r\n [sections]=\"togglesCfg.sections\"\r\n [compact]=\"true\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (activeTabSearch()) {\r\n <div class=\"search-container\">\r\n <lib-input\r\n mode=\"search\"\r\n [placeholder]=\"tabSearchPlaceholder()\"\r\n [(value)]=\"searchValue\"\r\n (onSearch)=\"activeTabSearch()?.onSearch?.($event)\"\r\n (onClear)=\"activeTabSearch()?.onClear?.()\"\r\n [regex]=\"activeTabSearch()?.searchRegex ?? null\"\r\n />\r\n </div>\r\n }\r\n\r\n @for (card of cards; track active() + '-' + $index) {\r\n @if (card.infoItems || card.infoItemsLeft || card.infoItemsRight) {\r\n <lib-info-group\r\n [title]=\"card.title\"\r\n [titleAlign]=\"card.infoTitleAlign ?? 'center'\"\r\n [items]=\"card.infoItems ?? []\"\r\n [itemsLeft]=\"card.infoItemsLeft ?? []\"\r\n [itemsRight]=\"card.infoItemsRight ?? []\"\r\n [titleLeft]=\"card.infoTitleLeft ?? null\"\r\n [titleRight]=\"card.infoTitleRight ?? null\"\r\n />\r\n } @else {\r\n <lib-card-content\r\n [title]=\"card.title\"\r\n [isForm]=\"card.isForm ?? false\"\r\n [form]=\"card.form\"\r\n [sections]=\"card.sections ?? []\"\r\n [compact]=\"card.compact ?? false\"\r\n [variant]=\"card.variant ?? 'default'\"\r\n [sectionNumber]=\"card.sectionNumber ?? null\"\r\n [withSearch]=\"card.withSearch ?? false\"\r\n [searchPlaceholder]=\"card.searchPlaceholder ?? 'Buscar...'\"\r\n [bgColor]=\"card.bgColor ?? 'default'\"\r\n (onSearch)=\"card.onSearch?.($event)\"\r\n (onSearchClear)=\"card.onSearchClear?.()\"\r\n [searchRegex]=\"card.searchRegex ?? null\"\r\n />\r\n }\r\n }\r\n</div>\r\n}","import { Component, input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-not-found-section',\r\n imports: [],\r\n templateUrl: './not-found-section.html',\r\n styleUrl: './not-found-section.css',\r\n})\r\nexport class NotFoundSection {\r\n title = input<string>('No hay datos');\r\n showButton = input<boolean>(true);\r\n buttonLabel = input<string>('Crear');\r\n\r\n openModal = output<void>();\r\n}\r\n","<div class=\"content-container\">\r\n <div class=\"no-data-container\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-inbox\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z\" />\r\n <path d=\"M4 13h3l3 3h4l3 -3h3\" />\r\n </svg>\r\n <div class=\"title2\">{{ title() }}</div>\r\n @if(showButton()){\r\n <button class=\"button-medium-primary\" (click)=\"openModal.emit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-plus\">\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M12 5l0 14\" />\r\n <path d=\"M5 12l14 0\" />\r\n </svg>\r\n <div class=\"label\">{{ buttonLabel() }}</div>\r\n </button>\r\n }\r\n </div>\r\n </div>","import { Injectable, signal } from '@angular/core';\r\nimport PubSub from 'pubsub-js';\r\nimport { ToastData, TOAST_EVENTS } from '../../helpers/toast-helper';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ToastService {\r\n currentToast = signal<ToastData | null>(null);\r\n isVisible = signal(false);\r\n\r\n private timeoutId: any;\r\n private subscriptionTokens: string[] = [];\r\n\r\n constructor() {\r\n this.initializePubSubListeners();\r\n }\r\n\r\n private initializePubSubListeners() {\r\n const showToastToken = PubSub.subscribe(\r\n TOAST_EVENTS.SHOW_TOAST,\r\n (msg: string, data: ToastData) => {\r\n this.showToast(data);\r\n }\r\n );\r\n\r\n const showToastWithActionToken = PubSub.subscribe(\r\n TOAST_EVENTS.SHOW_TOAST_WITH_ACTION,\r\n (\r\n msg: string,\r\n data: {\r\n description: string;\r\n buttonText: string;\r\n action: () => void;\r\n duration?: number;\r\n }\r\n ) => {\r\n this.showToastWithAction(\r\n data.description,\r\n data.buttonText,\r\n data.action,\r\n data.duration\r\n );\r\n }\r\n );\r\n\r\n const hideToastToken = PubSub.subscribe(TOAST_EVENTS.HIDE_TOAST, () => {\r\n this.hideToast();\r\n });\r\n\r\n this.subscriptionTokens = [\r\n showToastToken,\r\n showToastWithActionToken,\r\n hideToastToken,\r\n ];\r\n }\r\n\r\n showToast(data: ToastData) {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n }\r\n\r\n this.currentToast.set(data);\r\n this.isVisible.set(true);\r\n\r\n const duration = data.duration || 4000;\r\n this.timeoutId = setTimeout(() => {\r\n this.hideToast();\r\n }, duration);\r\n }\r\n\r\n showToastWithAction(\r\n description: string,\r\n buttonText: string,\r\n action: () => void,\r\n duration?: number\r\n ) {\r\n this.showToast({\r\n description,\r\n buttonText,\r\n action,\r\n duration,\r\n });\r\n }\r\n\r\n hideToast() {\r\n this.isVisible.set(false);\r\n\r\n setTimeout(() => {\r\n this.currentToast.set(null);\r\n }, 300);\r\n\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptionTokens.forEach((token) => {\r\n PubSub.unsubscribe(token);\r\n });\r\n }\r\n\r\n static publishToast(data: ToastData) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST, data);\r\n }\r\n\r\n static publishToastWithAction(\r\n description: string,\r\n buttonText: string,\r\n action: () => void,\r\n duration?: number\r\n ) {\r\n PubSub.publish(TOAST_EVENTS.SHOW_TOAST_WITH_ACTION, {\r\n description,\r\n buttonText,\r\n action,\r\n duration,\r\n });\r\n }\r\n\r\n static publishHideToast() {\r\n PubSub.publish(TOAST_EVENTS.HIDE_TOAST);\r\n }\r\n}\r\n","import { Component, computed, inject } from '@angular/core';\r\nimport { ToastService } from '../../services/toast/toast-service';\r\n\r\n\r\n@Component({\r\n selector: 'lib-toast',\r\n templateUrl: './toast.html',\r\n styleUrls: ['./toast.css'],\r\n})\r\nexport class Toast {\r\n public toastService = inject(ToastService);\r\n\r\n isShowToast = computed(() => this.toastService.isVisible());\r\n\r\n close() {\r\n this.toastService.hideToast();\r\n }\r\n executeAction() {\r\n const currentToast = this.toastService.currentToast();\r\n if (currentToast?.action) {\r\n currentToast.action();\r\n }\r\n }\r\n}\r\n","@if (isShowToast()) {\r\n<div class=\"toast\" [class.show]=\"toastService.isVisible()\">\r\n <div class=\"toast-body\">\r\n <div class=\"toast-header\">\r\n <span class=\"toast-message\">\r\n {{\r\n toastService.currentToast()?.description\r\n }}\r\n </span>\r\n <button class=\"btn-close\" (click)=\"close()\" aria-label=\"Cerrar\">\r\n &times;\r\n </button>\r\n </div>\r\n\r\n @if (toastService.currentToast()?.buttonText &&\r\n toastService.currentToast()?.action) {\r\n <div class=\"toast-footer\">\r\n <button\r\n class=\"btn-action\"\r\n (click)=\"executeAction()\"\r\n [attr.aria-label]=\"toastService.currentToast()?.buttonText\"\r\n >\r\n {{ toastService.currentToast()?.buttonText }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n}","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-option-card',\r\n imports: [],\r\n templateUrl: './option-card.html',\r\n styleUrl: './option-card.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OptionCard {\r\n mode = input<'default' | 'quick-access'>('default');\r\n label = input.required<string>();\r\n description = input<string>('');\r\n buttonBg = input<string>();\r\n iconBg = input<string>();\r\n\r\n clickAction = output<void>();\r\n\r\n onClick(): void {\r\n this.clickAction.emit();\r\n }\r\n}\r\n","<button type=\"button\" class=\"option-btn\" (click)=\"onClick()\" [style.--btn-bg]=\"buttonBg()\" [style.--icon-bg]=\"iconBg()\">\r\n <!-- Ícono (proyectado) -->\r\n <div class=\"option-btn-wrapper\" [class.option-btn-wrapper--quick-access]=\"mode() === 'quick-access'\">\r\n <div class=\"option-btn-icon\">\r\n <ng-content select=\"[icon]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Contenido -->\r\n <div class=\"option-btn-content\">\r\n <div class=\"option-btn-header\">\r\n <h3 class=\"option-btn-title\">\r\n {{ label() }}\r\n </h3>\r\n\r\n @if (mode() === 'default') {\r\n <span class=\"option-btn-chevron\">›</span>\r\n }\r\n </div>\r\n\r\n @if (description()) {\r\n <p class=\"option-btn-description\">\r\n {{ description() }}\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n</button>","import { Component, input, output } from '@angular/core';\nimport { OptionCard } from \"../option-card/option-card\";\n\nexport interface QuickAccessItem {\n id: string;\n label: string;\n description: string;\n icon: string; // CSS icon class name, e.g. 'icon-settings'\n iconBg?: string;\n}\n\n@Component({\n selector: 'lib-quick-access-cards',\n imports: [OptionCard],\n templateUrl: './quick-access-cards.html',\n styleUrl: './quick-access-cards.css',\n})\nexport class QuickAccessCards {\n title = input<string>('Accesos Rápidos');\n items = input<QuickAccessItem[]>([]);\n\n clickAction = output<QuickAccessItem>();\n\n onOptionClick(item: QuickAccessItem): void {\n this.clickAction.emit(item);\n }\n}\n","<h2 class=\"quick-access-title\">{{ title() }}</h2>\n<div class=\"quick-access-grid\">\n @for (item of items(); track item.id) {\n <lib-option-card [label]=\"item.label\" [description]=\"item.description\" [iconBg]=\"item.iconBg\"\n [mode]=\"'quick-access'\" (clickAction)=\"onOptionClick(item)\">\n <span icon [class]=\"item.icon\"></span>\n </lib-option-card>\n }\n</div>","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { BarChart, HeatmapChart, LineChart, PieChart } from 'echarts/charts';\r\nimport * as echarts from 'echarts/core';\r\nimport { NgxEchartsDirective, provideEchartsCore } from 'ngx-echarts';\r\nimport { GraphicComponent, GridComponent } from 'echarts/components';\r\nimport { TooltipComponent, DataZoomComponent, VisualMapComponent, LegendComponent } from 'echarts/components';\r\nimport { CanvasRenderer } from 'echarts/renderers';\r\n\r\n\r\necharts.use([\r\n BarChart,\r\n LineChart,\r\n PieChart,\r\n HeatmapChart,\r\n GridComponent,\r\n TooltipComponent,\r\n CanvasRenderer,\r\n GraphicComponent,\r\n DataZoomComponent,\r\n VisualMapComponent,\r\n LegendComponent\r\n]);\r\n\r\nexport interface BarSeries {\r\n name: string;\r\n data: number[];\r\n color?: string;\r\n}\r\n\r\nexport interface LineSeries {\r\n name: string;\r\n data: number[];\r\n color?: string;\r\n}\r\n\r\nexport interface ChartItem {\r\n label: string;\r\n value: number;\r\n}\r\n\r\nexport const UI_CHART_TOKENS = {\r\n fontFamily: 'Inter, sans-serif',\r\n text: '#1f2937',\r\n muted: '#6b7280',\r\n grid: '#e5e7eb',\r\n tooltipBg: '#ffffff',\r\n tooltipBorder: '#e5e7eb',\r\n primary: '#596300',\r\n primarySoft: '#eef4d3',\r\n secondary: '#61661F',\r\n secondarySoft: '#eef4d3',\r\n axis: '#8f948d',\r\n areaTop: 'rgba(201, 214, 108, 0.50)',\r\n areaBottom: 'rgba(201, 214, 108, 0.05)',\r\n labelLine: '#7f8572',\r\n centerText: '#202020',\r\n donutPalette: [\r\n '#6b7319', // olive green (brand)\r\n '#d9df88', // lime soft\r\n '#92001f', // burgundy\r\n '#003f55', // deep teal\r\n '#7c7d63', // sage\r\n '#c4d600', // chartreuse\r\n '#37add1', // sky blue\r\n '#9fc6da', // light steel blue\r\n '#d4883a', // warm amber\r\n '#8b5e3c', // terracotta\r\n '#6a4c93', // dusty purple\r\n '#1b998b', // jade green\r\n '#e07a5f', // coral clay\r\n '#3d405b', // charcoal slate\r\n '#f2cc8f', // sand gold\r\n '#81b29a', // mint sage\r\n '#b56576', // rose mauve\r\n '#355070', // navy steel\r\n '#eaac8b', // peach\r\n '#a7c957', // spring green\r\n ],\r\n};\r\n\r\n@Component({\r\n selector: 'lib-base-chart',\r\n imports: [NgxEchartsDirective],\r\n providers: [provideEchartsCore({ echarts })],\r\n templateUrl: './base-chart.html',\r\n styleUrl: './base-chart.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BaseChart {\r\n options = input.required<Record<string, unknown>>();\r\n chartClick = output<any>();\r\n\r\n onChartClick(event: any) {\r\n this.chartClick.emit(event);\r\n }\r\n}\r\n","<div echarts class=\"ui-base-chart\" [options]=\"options()\" [autoResize]=\"true\" (chartClick)=\"onChartClick($event)\">\r\n</div>","import { Component, computed, input, signal } from '@angular/core';\r\nimport { UI_CHART_TOKENS, BaseChart, ChartItem, BarSeries } from '../base/base-chart';\r\n\r\nfunction buildBarChartOptions(data: ChartItem[], multiSeries?: BarSeries[], horizontal = false) {\r\n const showScroll = data.length > 12;\r\n const zoomEnd = showScroll ? Math.floor((12 / data.length) * 100) : 100;\r\n const isMulti = !!multiSeries && multiSeries.length > 0;\r\n\r\n const xAxisData = data.map(item => item.label);\r\n\r\n const series = isMulti \r\n ? multiSeries!.map((s, index) => ({\r\n name: s.name,\r\n type: 'bar',\r\n data: s.data,\r\n barMaxWidth: 32,\r\n itemStyle: {\r\n color: s.color || UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n },\r\n label: {\r\n show: true,\r\n position: horizontal ? 'right' : 'top',\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 10,\r\n },\r\n }))\r\n : [\r\n {\r\n type: 'bar',\r\n data: data.map(item => item.value),\r\n barWidth: 32,\r\n itemStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n },\r\n emphasis: {\r\n itemStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n },\r\n },\r\n label: {\r\n show: true,\r\n position: horizontal ? 'right' : 'top',\r\n color: '#374151',\r\n fontSize: 12,\r\n },\r\n },\r\n ];\r\n\r\n return {\r\n animation: true,\r\n grid: {\r\n left: horizontal ? 16 : 8,\r\n right: horizontal ? 40 : 8,\r\n top: isMulti ? 40 : 16,\r\n bottom: showScroll ? 46 : 32,\r\n containLabel: true,\r\n },\r\n legend: {\r\n show: isMulti,\r\n top: 0,\r\n icon: 'roundRect',\r\n itemWidth: 14,\r\n itemHeight: 14,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n }\r\n },\r\n ...(showScroll && {\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n ...(horizontal ? { yAxisIndex: [0] } : { xAxisIndex: [0] }),\r\n start: 0,\r\n end: zoomEnd,\r\n },\r\n {\r\n type: 'slider',\r\n show: true,\r\n ...(horizontal ? { yAxisIndex: [0], right: 10, width: 16 } : { xAxisIndex: [0], bottom: 10, height: 16 }),\r\n start: 0,\r\n end: zoomEnd,\r\n fillerColor: 'rgba(97, 102, 31, 0.2)',\r\n borderColor: 'transparent',\r\n backgroundColor: 'rgba(97, 102, 31, 0.05)',\r\n dataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.4 },\r\n areaStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.1 }\r\n },\r\n selectedDataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.8 },\r\n areaStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.3 }\r\n },\r\n handleIcon: 'path://M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z',\r\n handleSize: '120%',\r\n handleStyle: {\r\n color: '#fff',\r\n borderColor: UI_CHART_TOKENS.secondary,\r\n borderWidth: 1.5,\r\n shadowBlur: 3,\r\n shadowColor: 'rgba(97, 102, 31, 0.3)',\r\n shadowOffsetX: 1,\r\n shadowOffsetY: 1\r\n },\r\n moveHandleStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n opacity: 0.6\r\n },\r\n textStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n fontWeight: 500\r\n }\r\n }\r\n ]\r\n }),\r\n tooltip: {\r\n trigger: 'axis',\r\n axisPointer: {\r\n type: 'shadow',\r\n },\r\n backgroundColor: UI_CHART_TOKENS.tooltipBg,\r\n borderColor: UI_CHART_TOKENS.tooltipBorder,\r\n borderWidth: 1,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.text,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n extraCssText: `\r\n border-radius: 12px;\r\n box-shadow: 0 8px 24px rgba(0,0,0,0.08);\r\n padding: 10px 12px;\r\n `,\r\n },\r\n xAxis: horizontal\r\n ? {\r\n type: 'value',\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n }\r\n : {\r\n type: 'category',\r\n data: xAxisData,\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n interval: 0,\r\n rotate: data.length > 6 ? 45 : 0,\r\n width: 80,\r\n overflow: 'truncate',\r\n },\r\n },\r\n yAxis: horizontal\r\n ? {\r\n type: 'category',\r\n data: xAxisData,\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n width: 100,\r\n overflow: 'truncate',\r\n },\r\n }\r\n : {\r\n type: 'value',\r\n axisLine: { show: true },\r\n axisTick: { show: true },\r\n splitLine: {\r\n show: true,\r\n lineStyle: { color: UI_CHART_TOKENS.muted, type: 'dashed', width: 1, opacity: 0.1 },\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n },\r\n series: series,\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bar-chart',\r\n imports: [BaseChart],\r\n templateUrl: './bar-chart.html',\r\n styleUrl: './bar-chart.css',\r\n})\r\nexport class BarChart {\r\n title = input<string>('Bar Chart');\r\n data = input<ChartItem[]>([]);\r\n multiSeries = input<BarSeries[]>();\r\n horizontal = input<boolean>(false);\r\n\r\n isExpanded = signal(false);\r\n toggleExpand = () => this.isExpanded.update(v => !v);\r\n\r\n options = computed(() =>\r\n buildBarChartOptions(this.data(), this.multiSeries(), this.horizontal()),\r\n );\r\n}\r\n","<div class=\"bar-chart-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"bar-chart-header\">\r\n <h3 class=\"bar-chart-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" class=\"chart-wrapper\" />\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}\r\n","import { Component, computed, input, signal } from '@angular/core';\r\nimport { BaseChart, ChartItem, LineSeries, UI_CHART_TOKENS } from \"../base/base-chart\";\r\nimport * as echarts from 'echarts/core';\r\n\r\n function buildLineChartOptions(data: ChartItem[], multiSeries?: LineSeries[]) {\r\n const isMulti = !!multiSeries && multiSeries.length > 0;\r\n const showScroll = data.length > 12;\r\n const zoomEnd = showScroll ? Math.floor((12 / data.length) * 100) : 100;\r\n\r\n return {\r\n animation: true,\r\n backgroundColor: 'transparent',\r\n grid: {\r\n left: 16,\r\n right: 16,\r\n top: isMulti ? 40 : 20,\r\n bottom: showScroll ? 46 : 16,\r\n containLabel: true,\r\n },\r\n legend: {\r\n show: isMulti,\r\n top: 0,\r\n icon: 'circle',\r\n itemWidth: 10,\r\n itemHeight: 10,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n }\r\n },\r\n ...(showScroll && {\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n xAxisIndex: [0],\r\n start: 0,\r\n end: zoomEnd,\r\n },\r\n {\r\n type: 'slider',\r\n show: true,\r\n xAxisIndex: [0],\r\n start: 0,\r\n end: zoomEnd,\r\n bottom: 10,\r\n height: 16,\r\n fillerColor: 'rgba(97, 102, 31, 0.2)',\r\n borderColor: 'transparent',\r\n backgroundColor: 'rgba(97, 102, 31, 0.05)',\r\n dataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.4 },\r\n areaStyle: { color: UI_CHART_TOKENS.muted, opacity: 0.1 }\r\n },\r\n selectedDataBackground: {\r\n lineStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.8 },\r\n areaStyle: { color: UI_CHART_TOKENS.secondary, opacity: 0.3 }\r\n },\r\n handleIcon: 'path://M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z',\r\n handleSize: '120%',\r\n handleStyle: {\r\n color: '#fff',\r\n borderColor: UI_CHART_TOKENS.secondary,\r\n borderWidth: 1.5,\r\n shadowBlur: 3,\r\n shadowColor: 'rgba(97, 102, 31, 0.3)',\r\n shadowOffsetX: 1,\r\n shadowOffsetY: 1\r\n },\r\n moveHandleStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n opacity: 0.6\r\n },\r\n textStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n fontWeight: 500\r\n }\r\n }\r\n ]\r\n }),\r\n tooltip: {\r\n trigger: 'axis',\r\n backgroundColor: UI_CHART_TOKENS.tooltipBg,\r\n borderColor: UI_CHART_TOKENS.tooltipBorder,\r\n borderWidth: 1,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.text,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n extraCssText: `\r\n border-radius: 10px;\r\n box-shadow: 0 8px 24px rgba(0,0,0,0.10);\r\n padding: 8px 10px;\r\n `,\r\n axisPointer: {\r\n type: 'line',\r\n lineStyle: {\r\n color: '#bfc4a6',\r\n width: 1,\r\n type: 'dashed',\r\n },\r\n },\r\n },\r\n xAxis: {\r\n type: 'category',\r\n boundaryGap: false,\r\n data: data.map(item => item.label),\r\n axisLine: {\r\n show: true,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.axis,\r\n width: 1,\r\n },\r\n },\r\n axisTick: {\r\n show: true,\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n interval: 0,\r\n rotate: data.length > 6 ? 45 : 0,\r\n width: 80,\r\n overflow: 'truncate',\r\n margin: 10,\r\n },\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n type: 'dotted',\r\n width: 1,\r\n opacity: 0.1,\r\n },\r\n },\r\n },\r\n yAxis: {\r\n type: 'value',\r\n min: 0,\r\n axisLine: {\r\n show: true,\r\n },\r\n axisTick: {\r\n show: true,\r\n },\r\n axisLabel: {\r\n color: UI_CHART_TOKENS.muted,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n margin: 8,\r\n },\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n type: 'dotted',\r\n width: 1,\r\n opacity: 0.1,\r\n },\r\n },\r\n },\r\n series: isMulti\r\n ? multiSeries!.map((s, index) => ({\r\n name: s.name,\r\n type: 'line',\r\n smooth: true,\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n data: s.data,\r\n itemStyle: {\r\n color: s.color || UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n },\r\n lineStyle: {\r\n color: s.color || UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n width: 2,\r\n },\r\n emphasis: {\r\n focus: 'series',\r\n itemStyle: {\r\n borderWidth: 2,\r\n borderColor: '#fff',\r\n shadowBlur: 6,\r\n shadowColor: 'rgba(0,0,0,0.15)',\r\n },\r\n },\r\n }))\r\n : [\r\n {\r\n type: 'line',\r\n smooth: true,\r\n symbol: data.length === 1 ? 'circle' : 'none',\r\n symbolSize: 8,\r\n data: data.map(item => item.value),\r\n itemStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n },\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.secondary,\r\n width: 2,\r\n },\r\n areaStyle: {\r\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\r\n { offset: 0, color: UI_CHART_TOKENS.areaTop },\r\n { offset: 1, color: UI_CHART_TOKENS.areaBottom },\r\n ]),\r\n },\r\n },\r\n ],\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'lib-line-chart',\r\n imports: [BaseChart],\r\n templateUrl: './line-chart.html',\r\n styleUrl: './line-chart.css',\r\n})\r\nexport class LineChart {\r\n title = input<string>('Line Chart');\r\n data = input.required<ChartItem[]>();\r\n multiSeries = input<LineSeries[]>();\r\n\r\n isExpanded = signal(false);\r\n toggleExpand = () => this.isExpanded.update(v => !v);\r\n\r\n options = computed<Record<string, unknown>>(() =>\r\n buildLineChartOptions(this.data(), this.multiSeries())\r\n );\r\n}\r\n","<div class=\"line-chart-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"line-chart-header\">\r\n <h3 class=\"line-chart-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" class=\"chart-wrapper\" />\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}\r\n","import { Component, computed, input, output, signal } from '@angular/core';\r\nimport { BaseChart, ChartItem, UI_CHART_TOKENS } from \"../base/base-chart\";\r\nimport { CommonModule } from '@angular/common';\r\n\r\nfunction getTotal(data: ChartItem[]): number {\r\n return data.reduce((acc, item) => acc + item.value, 0);\r\n}\r\n\r\nfunction buildDonutChartOptions(data: ChartItem[]): Record<string, unknown> {\r\n const total = getTotal(data);\r\n const showLegend = data.length > 10;\r\n const splitLegend = data.length > 14;\r\n\r\n let legendConfig: any = {};\r\n if (showLegend) {\r\n if (splitLegend) {\r\n const half = Math.ceil(data.length / 2);\r\n const leftData = data.slice(0, half).map(d => d.label);\r\n const rightData = data.slice(half).map(d => d.label);\r\n\r\n legendConfig = {\r\n legend: [\r\n {\r\n data: leftData,\r\n type: 'scroll',\r\n orient: 'vertical',\r\n left: '5%',\r\n top: 'center',\r\n itemWidth: 12,\r\n itemHeight: 12,\r\n itemGap: 10,\r\n textStyle: {\r\n fontSize: 11,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.muted,\r\n },\r\n pageTextStyle: { color: UI_CHART_TOKENS.muted },\r\n pageIconColor: UI_CHART_TOKENS.centerText,\r\n pageIconInactiveColor: '#ccc',\r\n },\r\n {\r\n data: rightData,\r\n type: 'scroll',\r\n orient: 'vertical',\r\n right: '5%',\r\n top: 'center',\r\n itemWidth: 12,\r\n itemHeight: 12,\r\n itemGap: 10,\r\n textStyle: {\r\n fontSize: 11,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.muted,\r\n },\r\n pageTextStyle: { color: UI_CHART_TOKENS.muted },\r\n pageIconColor: UI_CHART_TOKENS.centerText,\r\n pageIconInactiveColor: '#ccc',\r\n }\r\n ]\r\n };\r\n } else {\r\n legendConfig = {\r\n legend: {\r\n type: 'scroll',\r\n orient: 'vertical',\r\n right: '5%',\r\n top: 'center',\r\n itemWidth: 12,\r\n itemHeight: 12,\r\n itemGap: 10,\r\n textStyle: {\r\n fontSize: 11,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.muted,\r\n },\r\n pageTextStyle: {\r\n color: UI_CHART_TOKENS.muted,\r\n },\r\n pageIconColor: UI_CHART_TOKENS.centerText,\r\n pageIconInactiveColor: '#ccc',\r\n }\r\n };\r\n }\r\n }\r\n\r\n let centerX = '50%';\r\n if (showLegend) {\r\n centerX = splitLegend ? '50%' : '35%';\r\n }\r\n\r\n return {\r\n animation: true,\r\n backgroundColor: 'transparent',\r\n color: UI_CHART_TOKENS.donutPalette,\r\n dataZoom: [\r\n {\r\n type: 'inside',\r\n xAxisIndex: [0],\r\n start: 0,\r\n end: 100,\r\n },\r\n ],\r\n tooltip: {\r\n trigger: 'item',\r\n backgroundColor: '#ffffff',\r\n borderColor: '#d9dcc7',\r\n borderWidth: 1,\r\n textStyle: {\r\n color: UI_CHART_TOKENS.text,\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n extraCssText: `\r\n border-radius: 10px;\r\n box-shadow: 0 8px 24px rgba(0,0,0,0.10);\r\n padding: 8px 10px;\r\n `,\r\n formatter: (params: any) => `${params.name}: ${params.value}`,\r\n },\r\n ...legendConfig,\r\n series: [\r\n {\r\n type: 'pie',\r\n radius: ['44%', '72%'],\r\n center: [centerX, '50%'],\r\n avoidLabelOverlap: true,\r\n minAngle: 4,\r\n itemStyle: {\r\n borderWidth: 0,\r\n },\r\n label: {\r\n show: !showLegend,\r\n position: 'outside',\r\n formatter: (params: any) => {\r\n return `{label|${params.name}}\\n{value|${params.value}}`;\r\n },\r\n rich: {\r\n label: {\r\n fontSize: 12,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.muted,\r\n lineHeight: 16,\r\n },\r\n value: {\r\n fontSize: 14,\r\n fontWeight: 700,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n lineHeight: 18,\r\n },\r\n },\r\n },\r\n labelLine: {\r\n show: !showLegend,\r\n length: 12,\r\n length2: 20,\r\n lineStyle: {\r\n color: UI_CHART_TOKENS.labelLine,\r\n width: 1,\r\n },\r\n },\r\n data: data.map((item, index) => ({\r\n name: item.label,\r\n value: item.value,\r\n label: {\r\n rich: {\r\n value: {\r\n fontSize: 14,\r\n fontWeight: 700,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n color: UI_CHART_TOKENS.donutPalette[index % UI_CHART_TOKENS.donutPalette.length],\r\n lineHeight: 18,\r\n },\r\n },\r\n },\r\n })),\r\n },\r\n ],\r\n title: {\r\n text: `${total}`,\r\n left: centerX,\r\n top: '48%',\r\n textAlign: 'center',\r\n textVerticalAlign: 'middle',\r\n textStyle: {\r\n color: UI_CHART_TOKENS.centerText,\r\n fontSize: 24,\r\n fontWeight: 700,\r\n fontFamily: UI_CHART_TOKENS.fontFamily,\r\n },\r\n },\r\n };\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'lib-donut-chart',\r\n standalone: true,\r\n imports: [BaseChart, CommonModule],\r\n templateUrl: './donut-chart.html',\r\n styleUrl: './donut-chart.css',\r\n})\r\nexport class DonutChart {\r\n title = input<string>('Donut Chart');\r\n data = input.required<ChartItem[]>();\r\n \r\n // Drill-down inputs\r\n drillDown = input<boolean>(false);\r\n groupByPrefix = input<number>(0);\r\n\r\n // Outputs\r\n sectionClick = output<ChartItem>();\r\n \r\n isExpanded = signal(false);\r\n drilledGroup = signal<string | null>(null);\r\n\r\n toggleExpand = () => this.isExpanded.update(v => !v);\r\n\r\n // Data processing logic\r\n displayData = computed<ChartItem[]>(() => {\r\n const rawData = this.data();\r\n const prefixLen = this.groupByPrefix();\r\n const currentGroup = this.drilledGroup();\r\n\r\n if (!this.drillDown() || prefixLen <= 0) {\r\n return rawData;\r\n }\r\n\r\n if (currentGroup) {\r\n // Filter detailed items that match the prefix\r\n return rawData.filter(item => item.label.startsWith(currentGroup));\r\n } else {\r\n // Group items by prefix\r\n const groups = new Map<string, number>();\r\n rawData.forEach(item => {\r\n const prefix = item.label.substring(0, prefixLen);\r\n groups.set(prefix, (groups.get(prefix) || 0) + item.value);\r\n });\r\n return Array.from(groups.entries()).map(([label, value]) => ({ label, value }));\r\n }\r\n });\r\n\r\n options = computed<Record<string, unknown>>(() =>\r\n buildDonutChartOptions(this.displayData())\r\n );\r\n\r\n onChartClick(event: any) {\r\n const clickedItem: ChartItem = {\r\n label: event.name,\r\n value: event.value\r\n };\r\n\r\n this.sectionClick.emit(clickedItem);\r\n\r\n if (this.drillDown() && this.groupByPrefix() > 0 && !this.drilledGroup()) {\r\n this.drilledGroup.set(clickedItem.label);\r\n }\r\n }\r\n\r\n resetDrillDown() {\r\n this.drilledGroup.set(null);\r\n }\r\n}\r\n","<div class=\"donut-chart-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"donut-chart-header\">\r\n <h3 class=\"donut-chart-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" (chartClick)=\"onChartClick($event)\" class=\"chart-wrapper\" />\r\n \r\n @if (drilledGroup()) {\r\n <button class=\"back-btn\" (click)=\"resetDrillDown()\" type=\"button\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n <span>Volver</span>\r\n </button>\r\n }\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}","import { Component, computed, input, signal } from '@angular/core';\nimport { UI_CHART_TOKENS, BaseChart } from '../base/base-chart';\n\nexport interface HeatmapDataItem {\n /** x-axis index or label */\n x: number;\n /** y-axis index or label */\n y: number;\n /** cell value */\n value: number;\n}\n\nexport interface HeatmapConfig {\n /** Labels for the x-axis (columns) */\n xLabels: string[];\n /** Labels for the y-axis (rows) */\n yLabels: string[];\n /** Data points as [xIndex, yIndex, value] */\n data: HeatmapDataItem[];\n /** Minimum value for the color scale (auto-calculated if omitted) */\n min?: number;\n /** Maximum value for the color scale (auto-calculated if omitted) */\n max?: number;\n}\n\nfunction buildHeatmapOptions(config: HeatmapConfig) {\n const { xLabels, yLabels, data } = config;\n\n // Flatten values to compute min/max for the visual map\n const values = data.map(d => d.value);\n const minVal = config.min ?? (values.length > 0 ? Math.min(...values) : 0);\n const maxVal = config.max ?? (values.length > 0 ? Math.max(...values) : 100);\n\n // Build the series data as [x, y, value]\n const seriesData = data.map(d => [d.x, d.y, d.value]);\n\n return {\n animation: true,\n grid: {\n left: 8,\n right: 60,\n top: 16,\n bottom: 48,\n containLabel: true,\n },\n tooltip: {\n trigger: 'item',\n position: 'top',\n backgroundColor: UI_CHART_TOKENS.tooltipBg,\n borderColor: UI_CHART_TOKENS.tooltipBorder,\n borderWidth: 1,\n textStyle: {\n color: UI_CHART_TOKENS.text,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n extraCssText: `\n border-radius: 12px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.08);\n padding: 10px 12px;\n `,\n formatter: (params: any) => {\n const xLabel = xLabels[params.data[0]] ?? params.data[0];\n const yLabel = yLabels[params.data[1]] ?? params.data[1];\n const val = params.data[2];\n return `<strong>${yLabel}</strong> - <strong>${xLabel}</strong><br/><strong>${val} Comparendos</strong>`;\n },\n },\n xAxis: {\n type: 'category',\n data: xLabels,\n position: 'top',\n splitArea: {\n show: true,\n areaStyle: {\n color: ['rgba(255, 255, 255, 0.05)', 'rgba(0, 0, 0, 0.02)']\n }\n },\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n interval: 0,\n rotate: xLabels.length > 8 ? 45 : 0,\n },\n },\n yAxis: {\n type: 'category',\n data: yLabels,\n splitArea: {\n show: true,\n areaStyle: {\n color: ['rgba(255, 255, 255, 0.05)', 'rgba(0, 0, 0, 0.02)']\n }\n },\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n },\n visualMap: {\n min: minVal,\n max: maxVal,\n calculable: false,\n orient: 'horizontal',\n left: 'center',\n bottom: '0',\n itemWidth: 12,\n itemHeight: 120,\n textStyle: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 11,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n inRange: {\n color: [\n '#f0f4d3', // lightest — UI green tint\n '#d9df88', // light\n '#c4d600', // mid\n '#92a00e', // dark\n '#61661F', // darkest — secondary token\n ],\n },\n },\n series: [\n {\n name: 'Heatmap',\n type: 'heatmap',\n data: seriesData,\n label: {\n show: true,\n color: UI_CHART_TOKENS.text,\n fontSize: 11,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowColor: 'rgba(0,0,0,0.15)',\n },\n },\n itemStyle: {\n borderWidth: 2,\n /* borderColor: '#ffffff', */\n borderRadius: 4,\n },\n },\n ],\n };\n}\n\n@Component({\n selector: 'lib-heatmap',\n imports: [BaseChart],\n templateUrl: './heatmap.html',\n styleUrl: './heatmap.css',\n})\nexport class Heatmap {\n title = input<string>('Heatmap');\n config = input<HeatmapConfig>({ xLabels: [], yLabels: [], data: [] });\n\n isExpanded = signal(false);\n\n toggleExpand() {\n this.isExpanded.update((value) => !value);\n }\n\n options = computed(() => buildHeatmapOptions(this.config()));\n}\n","<div class=\"heatmap-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"heatmap-header\">\r\n <h3 class=\"heatmap-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <lib-base-chart [options]=\"options()\" class=\"chart-wrapper\" />\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, effect, input } from '@angular/core';\r\n\r\nexport interface GeoPoint {\r\n subpoenaNumber: string;\r\n latitude: number;\r\n longitude: number;\r\n locationLabel: string;\r\n dateTime: string;\r\n infractionCode: string;\r\n plate: string;\r\n immobilized: boolean;\r\n}\r\n\r\nexport interface GeoMapResponse {\r\n points: GeoPoint[];\r\n total: number;\r\n showing: number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-geo-api-maps',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './geo-api-maps.html',\r\n styleUrl: './geo-api-maps.css',\r\n})\r\nexport class GeoAPIMaps implements AfterViewInit {\r\n points = input<GeoPoint[]>([]);\r\n public map!: google.maps.Map;\r\n private markers: google.maps.marker.AdvancedMarkerElement[] = [];\r\n\r\n constructor() {\r\n effect(() => {\r\n const pts = this.points();\r\n if (this.map && pts.length > 0) {\r\n this.renderPoints(pts);\r\n }\r\n });\r\n }\r\n \r\n ngAfterViewInit() {\r\n this.initMap();\r\n }\r\n\r\n private initMap() {\r\n const mapElement = document.getElementById('map');\r\n if (!mapElement) return;\r\n\r\n this.map = new google.maps.Map(mapElement, {\r\n center: { lat: 10.96854, lng: -74.78132 }, // Barranquilla\r\n zoom: 13,\r\n clickableIcons: false,\r\n mapId: '1b033ea586ba5df9c6dc091a',\r\n\r\n // Opciones para ocultar controles\r\n mapTypeControl: false, // quita el botón \"Mapa/Satélite\"\r\n streetViewControl: true, // quita Street View\r\n fullscreenControl: false, // quita fullscreen\r\n zoomControl: true, // opcional, dejar zoom\r\n rotateControl: false, // oculta el control de rotación (flechas)\r\n\r\n zoomControlOptions: {\r\n position: google.maps.ControlPosition.TOP_LEFT // mueve el zoom a la parte superior izquierda\r\n },\r\n });\r\n\r\n // Render points if they already exist when map is ready\r\n if (this.points().length > 0) {\r\n this.renderPoints(this.points());\r\n }\r\n }\r\n\r\n public goToLocation(lat: number, lng: number) {\r\n if (!this.map) return;\r\n\r\n const position: google.maps.LatLngLiteral = { lat, lng };\r\n\r\n new google.maps.marker.AdvancedMarkerElement({\r\n position,\r\n map: this.map,\r\n });\r\n\r\n this.map.panTo(position);\r\n this.map.setZoom(18);\r\n }\r\n\r\n private clearMarkers() {\r\n this.markers.forEach(m => m.map = null);\r\n this.markers = [];\r\n }\r\n \r\n private renderPoints(points: GeoPoint[]) {\r\n this.clearMarkers();\r\n\r\n const infoWindow = new google.maps.InfoWindow();\r\n let lockedMarker: google.maps.marker.AdvancedMarkerElement | null = null;\r\n\r\n points.forEach(point => {\r\n const dot = document.createElement('div');\r\n dot.style.width = '16px';\r\n dot.style.height = '16px';\r\n dot.style.borderRadius = '50%';\r\n dot.style.backgroundColor = point.immobilized ? '#ef4444' : '#3b82f6';\r\n dot.style.border = '2px solid white';\r\n dot.style.boxShadow = '0 2px 4px rgba(0,0,0,0.2)';\r\n dot.style.cursor = 'pointer';\r\n\r\n const marker = new google.maps.marker.AdvancedMarkerElement({\r\n position: { lat: point.latitude, lng: point.longitude },\r\n map: this.map,\r\n content: dot,\r\n });\r\n\r\n const content = `\r\n <div style=\"padding: 0 12px 12px 12px; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; min-width: 200px; color: #374151;\">\r\n <div style=\"font-weight: 700; font-size: 15px; color: #111827; margin-bottom: 8px; line-height: 1.2;\">\r\n ${point.subpoenaNumber}\r\n </div>\r\n <div style=\"font-size: 14px; color: #4b5563; margin-bottom: 4px;\">\r\n ${point.locationLabel}\r\n </div>\r\n <div style=\"font-size: 14px; color: #6b7280; margin-bottom: 4px;\">\r\n ${point.dateTime.replace('T', ' - ').substring(0, 18)}\r\n </div>\r\n <div style=\"display: flex; flex-direction: column; gap: 4px; margin-top: 4px;\">\r\n <div style=\"font-size: 13px;\">\r\n <span style=\"color: #9ca3af;\">Infracción:</span> \r\n <span style=\"font-weight: 500; color: #374151;\">${point.infractionCode}</span>\r\n </div>\r\n <div style=\"font-size: 13px;\">\r\n <span style=\"color: #9ca3af;\">Placa:</span> \r\n <span style=\"font-weight: 500; color: #374151;\">${point.plate}</span>\r\n </div>\r\n <div style=\"display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; margin-top: 4px; color: ${point.immobilized ? '#ef4444' : '#3b82f6'};\">\r\n <span style=\"width: 8px; height: 8px; border-radius: 50%; background-color: ${point.immobilized ? '#ef4444' : '#3b82f6'};\"></span>\r\n ${point.immobilized ? 'Inmovilizado' : 'Normal'}\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n marker.addListener('mouseover', () => {\r\n if (!lockedMarker) {\r\n infoWindow.setContent(content);\r\n infoWindow.open(this.map, marker);\r\n }\r\n });\r\n\r\n marker.addListener('mouseout', () => {\r\n if (!lockedMarker) {\r\n infoWindow.close();\r\n }\r\n });\r\n\r\n marker.addListener('click', () => {\r\n lockedMarker = marker;\r\n infoWindow.setContent(content);\r\n infoWindow.open(this.map, marker);\r\n });\r\n\r\n infoWindow.addListener('closeclick', () => {\r\n lockedMarker = null;\r\n });\r\n\r\n this.markers.push(marker);\r\n });\r\n\r\n // Auto-center and zoom to show all points\r\n if (points.length > 0) {\r\n const bounds = new google.maps.LatLngBounds();\r\n points.forEach(p => bounds.extend({ lat: p.latitude, lng: p.longitude }));\r\n this.map.fitBounds(bounds);\r\n }\r\n }\r\n}\r\n","<div id=\"map\"></div>\r\n","import { Component, input, signal } from '@angular/core';\r\nimport { GeoAPIMaps, GeoPoint } from '../../map/geo-api-maps/geo-api-maps';\r\n\r\n@Component({\r\n selector: 'lib-map-geo',\r\n imports: [GeoAPIMaps],\r\n templateUrl: './map-geo.html',\r\n styleUrl: './map-geo.css',\r\n})\r\nexport class MapGeo {\r\n title = input<string>('Mapa Geográfico');\r\n isExpanded = signal(false);\r\n points = input<GeoPoint[]>([]);\r\n\r\n toggleExpand() {\r\n this.isExpanded.update((value) => !value);\r\n }\r\n}\r\n","<div class=\"map-geo-container\" [class.expanded]=\"isExpanded()\">\r\n <div class=\"map-geo-header\">\r\n <h3 class=\"map-geo-title\">{{ title() }}</h3>\r\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\" [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\r\n @if (isExpanded()) {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-minimize-2\"><polyline points=\"4 14 10 14 10 20\"/><polyline points=\"20 10 14 10 14 4\"/><line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-maximize-2\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\"/><line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\"/></svg>\r\n }\r\n </button>\r\n </div>\r\n <div class=\"chart-wrapper\">\r\n <lib-geo-api-maps [points]=\"points()\" />\r\n </div>\r\n</div>\r\n@if (isExpanded()) {\r\n <div class=\"overlay\" (click)=\"toggleExpand()\"></div>\r\n}","import { Component, computed, input, signal } from '@angular/core';\nimport { Table, TableColumn, TableRow } from \"../../table/table\";\nimport { NotFoundSection } from \"../../not-found-section/not-found-section\";\nimport { PaginationComponent } from \"../../pagination/pagination\";\n\n@Component({\n selector: 'lib-table-chart',\n imports: [Table, NotFoundSection, PaginationComponent],\n templateUrl: './table-chart.html',\n styleUrl: './table-chart.css',\n})\nexport class TableChart {\n title = input<string>('Table Chart');\n columns = input<TableColumn[]>([]);\n data = input<TableRow[]>([]);\n totalItems = input<number>(0);\n itemsPerPage = input<number>(10);\n collapsedRows = input<number>(7);\n\n isExpanded = signal<boolean>(false);\n localPage = signal<number>(1);\n\n toggleExpand() {\n this.isExpanded.update((value) => !value);\n if (!this.isExpanded()) {\n this.localPage.set(1);\n }\n }\n\n displayedData = computed(() => {\n const isExpanded = this.isExpanded();\n const data = this.data();\n\n if (!isExpanded) {\n return data.slice(0, this.collapsedRows());\n }\n\n const pageSize = this.itemsPerPage();\n const start = (this.localPage() - 1) * pageSize;\n return data.slice(start, start + pageSize);\n });\n\n onPageChange(page: number) {\n this.localPage.set(page);\n }\n}\n","<div class=\"table-chart-container\" [class.expanded]=\"isExpanded()\">\n <div class=\"table-chart-header\">\n <h3 class=\"table-chart-title\">{{ title() }}</h3>\n <button class=\"expand-btn\" (click)=\"toggleExpand()\" type=\"button\"\n [attr.aria-label]=\"isExpanded() ? 'Minimize chart' : 'Maximize chart'\">\n @if (isExpanded()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-minimize-2\">\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" x2=\"21\" y1=\"10\" y2=\"3\" />\n <line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-maximize-2\">\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" x2=\"14\" y1=\"3\" y2=\"10\" />\n <line x1=\"3\" x2=\"10\" y1=\"21\" y2=\"14\" />\n </svg>\n }\n </button>\n </div>\n <div class=\"chart-wrapper\">\n @if (data().length > 0) {\n <lib-table [columns]=\"columns()\" [data]=\"displayedData()\" [showActions]=\"false\" />\n @if (isExpanded() && totalItems() > itemsPerPage()) {\n <lib-pagination [totalItems]=\"totalItems()\" [pageSize]=\"itemsPerPage()\" [(page)]=\"localPage\" />\n }\n } @else {\n <div class=\"no-data\">\n <lib-not-found-section [showButton]=\"false\" />\n </div>\n }\n </div>\n</div>\n@if (isExpanded()) {\n<div class=\"overlay\" (click)=\"toggleExpand()\"></div>\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, input } from '@angular/core';\r\n\r\nexport const Colors = {\r\n primary: '#4B5E05',\r\n secondary: '#063546',\r\n tertiary: '#6B0518',\r\n quaternary: '#F57C00',\r\n};\r\n\r\nexport type KpiColorType = 'primary' | 'secondary' | 'tertiary' | 'quaternary' | string;\r\n\r\n@Component({\r\n selector: 'lib-kpi-card',\r\n imports: [CommonModule],\r\n templateUrl: './kpi-card.html',\r\n styleUrl: './kpi-card.css',\r\n})\r\nexport class KpiCard {\r\n title = input<string>('Titulo');\r\n description = input<string>();\r\n value = input<number | string>('0');\r\n iconColor = input<KpiColorType>('primary');\r\n\r\n resolvedIconColor = computed(() => {\r\n const color = this.iconColor();\r\n // Revisa si es un predeterminado, si no, lo asume como hex code.\r\n return (Colors as Record<string, string>)[color] || color;\r\n });\r\n}\r\n","<div class=\"kpi-card\">\n <div class=\"kpi-card-text\">\n <h3 class=\"kpi-title\">{{ title() }}</h3>\n @if (description()) {\n <p class=\"kpi-description\">{{ description() }}</p>\n } @else {\n <div class=\"kpi-description\">\n <ng-content select=\"[description]\"></ng-content>\n </div>\n }\n <h2 class=\"kpi-value\">{{ value() }}</h2>\n </div>\n <div class=\"kpi-icon-container\" [style.--kpi-base-color]=\"resolvedIconColor()\">\n <ng-content select=\"[icon]\"></ng-content>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output, ViewChild, ElementRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-load-image',\r\n imports: [CommonModule],\r\n templateUrl: './load-image.html',\r\n styleUrl: './load-image.css',\r\n})\r\nexport class LoadImage {\r\n @Input() title: string = 'Imagen';\r\n @Input() description: string = 'Sube una imagen';\r\n @Input() recommendedSize: string = 'PNG · JPG · SVG · Recomendado: 300x100 px';\r\n \r\n // Ícono del título modificable por el usuario\r\n @Input() titleIcon: string = 'icon-upload';\r\n\r\n // URL de imagen por defecto (útil para mostrar imágenes traídas desde un bucket/backend)\r\n @Input() set imageUrl(url: string | null | undefined) {\r\n if (url) {\r\n this.imageSrc = url;\r\n }\r\n }\r\n\r\n @Output() imageLoaded = new EventEmitter<File | null>();\r\n\r\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\r\n\r\n imageSrc: string | null = null;\r\n isDragging = false;\r\n \r\n // Lightbox & Zoom\r\n isExpanded = false;\r\n zoomScale = 1;\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = true;\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = false;\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = false;\r\n\r\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\r\n this.handleFile(event.dataTransfer.files[0]);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.handleFile(input.files[0]);\r\n }\r\n }\r\n\r\n triggerFileInput() {\r\n this.fileInput.nativeElement.click();\r\n }\r\n\r\n handleFile(file: File) {\r\n if (!file.type.match(/image\\/*/)) return;\r\n \r\n // Emitimos el archivo original\r\n this.imageLoaded.emit(file);\r\n\r\n // Creamos la previsualización\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n this.imageSrc = e.target.result;\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n removeImage() {\r\n this.imageSrc = null;\r\n this.imageLoaded.emit(null);\r\n if (this.fileInput?.nativeElement) {\r\n this.fileInput.nativeElement.value = '';\r\n }\r\n }\r\n\r\n changeImage() {\r\n this.triggerFileInput();\r\n }\r\n\r\n expandImage() {\r\n this.isExpanded = true;\r\n this.zoomScale = 1;\r\n }\r\n\r\n closeLightbox() {\r\n this.isExpanded = false;\r\n }\r\n\r\n zoomIn() {\r\n this.zoomScale += 0.2;\r\n }\r\n\r\n zoomOut() {\r\n if (this.zoomScale > 0.4) {\r\n this.zoomScale -= 0.2;\r\n }\r\n }\r\n\r\n zoomReset() {\r\n this.zoomScale = 1;\r\n }\r\n}\r\n","<div class=\"load-image-container\">\n <!-- Header Info -->\n <div class=\"header-info\">\n <div class=\"title-section\">\n <i class=\"icon\" [ngClass]=\"titleIcon\"></i>\n <div class=\"text-group\">\n <h3 class=\"title\">\n {{ title }}\n @if (imageSrc) {\n <span class=\"badge-cargado\">CARGADO</span>\n }\n </h3>\n <p class=\"description\">{{ description }}</p>\n </div>\n </div>\n </div>\n\n <hr class=\"divider\" />\n\n <!-- Upload / Preview Box -->\n <div class=\"box-area\" \n [class.empty]=\"!imageSrc\" \n [class.dragging]=\"isDragging\"\n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\" \n (drop)=\"onDrop($event)\"\n (click)=\"!imageSrc ? triggerFileInput() : null\">\n \n <input type=\"file\" #fileInput (change)=\"onFileSelected($event)\" accept=\".png, .jpg, .jpeg, .svg\" hidden>\n\n <!-- Estado: Vacío (Drag and Drop) -->\n @if (!imageSrc) {\n <div class=\"upload-state\">\n <i class=\"icon-big icon-upload\"></i>\n <p class=\"upload-text\">Arrastra aquí o haz clic para seleccionar</p>\n <p class=\"upload-hint\">{{ recommendedSize }}</p>\n </div>\n }\n\n <!-- Estado: Cargado (Preview) -->\n @if (imageSrc) {\n <div class=\"preview-state\">\n <img [src]=\"imageSrc\" alt=\"Preview\">\n \n <!-- Hover overlay de acciones -->\n <div class=\"actions-overlay\">\n <button class=\"action-btn btn-white\" (click)=\"$event.stopPropagation(); expandImage()\">\n <i class=\"icon-small icon-expand\"></i> <span class=\"action-text\">Ampliar</span>\n </button>\n <button class=\"action-btn btn-white\" (click)=\"$event.stopPropagation(); changeImage()\">\n <i class=\"icon-small icon-change\"></i> <span class=\"action-text\">Cambiar</span>\n </button>\n <button class=\"action-btn btn-outline\" (click)=\"$event.stopPropagation(); removeImage()\">\n <i class=\"icon-small icon-delete\"></i> <span class=\"action-text\">Eliminar</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer Actions / Info -->\n <div class=\"footer-area\">\n @if (!imageSrc) {\n <div class=\"footer-text\">\n </div>\n <button class=\"btn-subir\" (click)=\"triggerFileInput()\">\n <i class=\"icon-small icon-upload\"></i> Subir\n </button>\n } @else {\n <div class=\"footer-text-loaded\">\n <span>Recomendado: 300x100 px</span>\n <span class=\"hint-italic\">Pasar el mouse por encima para acciones</span>\n </div>\n }\n </div>\n</div>\n\n<!-- Modal Lightbox (Pantalla completa) -->\n@if (isExpanded) {\n <div class=\"lightbox-overlay\" (click)=\"closeLightbox()\">\n <!-- Top Bar -->\n <div class=\"top-bar-lightbox\" (click)=\"$event.stopPropagation()\">\n <div class=\"zoom-controls\">\n <button class=\"btn-icon\" (click)=\"zoomIn()\">\n <i class=\"icon-small icon-plus\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"zoomOut()\">\n <i class=\"icon-small icon-minus\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"zoomReset()\">\n <i class=\"icon-small icon-expand\"></i>\n </button>\n </div>\n <button class=\"btn-close\" (click)=\"closeLightbox()\">&#x2715;</button>\n </div>\n\n <!-- Centro: Imagen Expandida -->\n <div class=\"lightbox-content\" (click)=\"$event.stopPropagation()\">\n <img [src]=\"imageSrc\" [style.transform]=\"'scale(' + zoomScale + ')'\" alt=\"Expanded image\" class=\"zoomable-image\">\n </div>\n \n <!-- Parte Inferior -->\n <div class=\"bottom-bar-lightbox\" (click)=\"$event.stopPropagation()\">\n <span class=\"lightbox-title\">{{ title }}</span>\n <span class=\"zoom-percentage\">{{ (zoomScale * 100) | number:'1.0-0' }}%</span>\n </div>\n </div>\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';\r\nimport { PdfViewerService } from '../../services/pdf-viewer/pdf-viewer.service';\r\n\r\nconst IMAGE_EXTENSIONS = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|avif)(\\?.*)?$/i;\r\n\r\n@Component({\r\n selector: 'lib-pdf-viewer',\r\n imports: [],\r\n templateUrl: './pdf-viewer.html',\r\n styleUrl: './pdf-viewer.css',\r\n})\r\nexport class PdfViewer {\r\n private pdfViewerService = inject(PdfViewerService);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n currentIndex = signal(0);\r\n\r\n get isShowModal() {\r\n return this.pdfViewerService.showModalDocuments();\r\n }\r\n\r\n doc = computed(() => this.pdfViewerService.selectedPdf());\r\n\r\n currentUrl = computed(() => this.doc()?.urls[this.currentIndex()] ?? '');\r\n\r\n hasMultiple = computed(() => (this.doc()?.urls.length ?? 0) > 1);\r\n\r\n isImage = computed(() => {\r\n const d = this.doc();\r\n if (!d) return false;\r\n if (d.type === 'image') return true;\r\n if (d.type === 'pdf') return false;\r\n // Detectar por la primera URL\r\n return IMAGE_EXTENSIONS.test(d.urls[0] ?? '');\r\n });\r\n\r\n constructor() {\r\n // Reiniciar al índice 0 cada vez que cambia el documento\r\n effect(() => {\r\n this.doc();\r\n this.currentIndex.set(0);\r\n });\r\n }\r\n\r\n prev() {\r\n if (this.currentIndex() > 0) this.currentIndex.update(i => i - 1);\r\n }\r\n\r\n next() {\r\n const total = this.doc()?.urls.length ?? 0;\r\n if (this.currentIndex() < total - 1) this.currentIndex.update(i => i + 1);\r\n }\r\n\r\n getSafePdfUrl(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n\r\n getSafeImageUrl(url: string): SafeUrl {\r\n return this.sanitizer.bypassSecurityTrustUrl(url);\r\n }\r\n\r\n closeModal() {\r\n this.pdfViewerService.closeModal();\r\n this.pdfViewerService.setSelectedPdf(null);\r\n }\r\n}\r\n","@if (isShowModal) {\r\n<section class=\"modal-container\" (click)=\"closeModal()\">\r\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\r\n\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title\" [title]=\"doc()?.name || ''\">\r\n {{ doc()?.name || 'Documento' }}\r\n </h1>\r\n @if (hasMultiple()) {\r\n <span class=\"gallery-counter-header\">\r\n {{ currentIndex() + 1 }} / {{ doc()!.urls.length }}\r\n </span>\r\n }\r\n <button type=\"button\" class=\"close-btn\" (click)=\"closeModal()\">&times;</button>\r\n </div>\r\n\r\n <div class=\"modal-body\">\r\n @if (doc(); as d) {\r\n @if (isImage()) {\r\n <div class=\"image-wrapper\">\r\n @if (hasMultiple()) {\r\n <button type=\"button\" class=\"gallery-arrow gallery-arrow--prev\"\r\n [disabled]=\"currentIndex() === 0\"\r\n (click)=\"prev()\">\r\n &#8249;\r\n </button>\r\n }\r\n <img [src]=\"getSafeImageUrl(currentUrl())\" [alt]=\"d.name\" class=\"image-viewer\" />\r\n @if (hasMultiple()) {\r\n <button type=\"button\" class=\"gallery-arrow gallery-arrow--next\"\r\n [disabled]=\"currentIndex() === d.urls.length - 1\"\r\n (click)=\"next()\">\r\n &#8250;\r\n </button>\r\n }\r\n </div>\r\n @if (hasMultiple()) {\r\n <div class=\"gallery-dots\">\r\n @for (url of d.urls; track $index) {\r\n <button type=\"button\" class=\"gallery-dot\"\r\n [class.gallery-dot--active]=\"$index === currentIndex()\"\r\n (click)=\"currentIndex.set($index)\">\r\n </button>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <iframe [src]=\"getSafePdfUrl(currentUrl())\" class=\"pdf-viewer\" frameborder=\"0\"></iframe>\r\n }\r\n } @else {\r\n <p class=\"no-doc\">No hay documento disponible</p>\r\n }\r\n </div>\r\n\r\n </div>\r\n</section>\r\n}","import { Component, output, signal, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-document-upload',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './documents-upload.html',\r\n styleUrl: './documents-upload.css'\r\n})\r\nexport class DocumentUpload {\r\n filesChanged = output<File[]>();\r\n\r\n files = signal<File[]>([]);\r\n isDragging = signal<boolean>(false);\r\n\r\n label = input<string>('Arrastra los archivos aquí o haz clic para seleccionar');\r\n helperText = input<string>('Máximo 25 MB por archivo');\r\n /** Valor para el atributo accept del input (ej: \".pdf\", \"image/*\", \".pdf,.png\") */\r\n accept = input<string>('.pdf,application/pdf');\r\n maxSizeMB = input<number>(25);\r\n multiple = input<boolean>(true);\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n this.isDragging.set(true);\r\n }\r\n\r\n onDragLeave(): void {\r\n this.isDragging.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.isDragging.set(false);\r\n const droppedFiles = Array.from(event.dataTransfer?.files ?? []);\r\n this.processFiles(droppedFiles);\r\n }\r\n\r\n onFileSelect(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const selectedFiles = Array.from(input.files ?? []);\r\n this.processFiles(selectedFiles);\r\n input.value = '';\r\n }\r\n\r\n private isFileTypeValid(file: File): boolean {\r\n const accept = this.accept();\r\n if (!accept) return true;\r\n\r\n return accept.split(',').map(t => t.trim()).some(type => {\r\n if (type.startsWith('.')) return file.name.toLowerCase().endsWith(type.toLowerCase());\r\n if (type.endsWith('/*')) return file.type.startsWith(type.split('/')[0] + '/');\r\n return file.type === type;\r\n });\r\n }\r\n\r\n private processFiles(newFiles: File[]): void {\r\n const valid = newFiles.filter(f => {\r\n if (!this.isFileTypeValid(f)) {\r\n alert(`El archivo \"${f.name}\" no tiene un formato permitido.`);\r\n return false;\r\n }\r\n if (f.size > this.maxSizeMB() * 1024 * 1024) {\r\n alert(`El archivo \"${f.name}\" supera los ${this.maxSizeMB()} MB.`);\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n this.files.update(current => [...current, ...valid]);\r\n this.filesChanged.emit(this.files());\r\n }\r\n\r\n removeFile(file: File): void {\r\n this.files.update(current => current.filter(f => f !== file));\r\n this.filesChanged.emit(this.files());\r\n }\r\n\r\n formatSize(bytes: number): string {\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\r\n return (bytes / 1024 / 1024).toFixed(2) + ' MB';\r\n }\r\n\r\n getFileExtension(file: File): string {\r\n return file.name.split('.').pop()?.toUpperCase() ?? 'FILE';\r\n }\r\n}","<div class=\"upload-container\" (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave()\" (drop)=\"onDrop($event)\"\r\n [class.dragging]=\"isDragging()\">\r\n\r\n <input type=\"file\" #fileInput [accept]=\"accept()\" [multiple]=\"multiple()\" (change)=\"onFileSelect($event)\" hidden />\r\n\r\n <div class=\"upload-zone\" (click)=\"fileInput.click()\">\r\n <svg class=\"upload-icon\" viewBox=\"0 0 486.3 486.3\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g>\r\n <path d=\"M395.5,135.8c-5.2-30.9-20.5-59.1-43.9-80.5c-26-23.8-59.8-36.9-95-36.9c-27.2,0-53.7,7.8-76.4,22.5 c-18.9,12.2-34.6,28.7-45.7,48.1c-4.8-0.9-9.8-1.4-14.8-1.4c-42.5,0-77.1,34.6-77.1,77.1c0,5.5,0.6,10.8,1.6,16 C16.7,200.7,0,232.9,0,267.2c0,27.7,10.3,54.6,29.1,75.9c19.3,21.8,44.8,34.7,72,36.2c0.3,0,0.5,0,0.8,0h86 c7.5,0,13.5-6,13.5-13.5s-6-13.5-13.5-13.5h-85.6C61.4,349.8,27,310.9,27,267.1c0-28.3,15.2-54.7,39.7-69 c5.7-3.3,8.1-10.2,5.9-16.4c-2-5.4-3-11.1-3-17.2c0-27.6,22.5-50.1,50.1-50.1c5.9,0,11.7,1,17.1,3c6.6,2.4,13.9-0.6,16.9-6.9 c18.7-39.7,59.1-65.3,103-65.3c59,0,107.7,44.2,113.3,102.8c0.6,6.1,5.2,11,11.2,12c44.5,7.6,78.1,48.7,78.1,95.6 c0,49.7-39.1,92.9-87.3,96.6h-73.7c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5h74.2c0.3,0,0.6,0,1,0c30.5-2.2,59-16.2,80.2-39.6 c21.1-23.2,32.6-53,32.6-84C486.2,199.5,447.9,149.6,395.5,135.8z\"/>\r\n <path d=\"M324.2,280c5.3-5.3,5.3-13.8,0-19.1l-71.5-71.5c-2.5-2.5-6-4-9.5-4s-7,1.4-9.5,4l-71.5,71.5c-5.3,5.3-5.3,13.8,0,19.1 c2.6,2.6,6.1,4,9.5,4s6.9-1.3,9.5-4l48.5-48.5v222.9c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5V231.5l48.5,48.5 C310.4,285.3,318.9,285.3,324.2,280z\"/>\r\n </g>\r\n </svg>\r\n <p class=\"upload-label\"><strong>{{ label() }}</strong></p>\r\n <small class=\"upload-helper\">{{ helperText() }}</small>\r\n </div>\r\n\r\n @if (files().length > 0) {\r\n <div class=\"files-row\">\r\n @for (file of files(); track file.name) {\r\n <div class=\"file-card\">\r\n <button type=\"button\" class=\"file-card-remove\" (click)=\"removeFile(file)\" title=\"Eliminar archivo\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\r\n </svg>\r\n </button>\r\n <svg class=\"file-card-icon\" viewBox=\"0 0 64 64\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12 4 L12 60 L52 60 L52 20 L36 4 Z\" fill=\"#e3e3d1\" stroke=\"#8a9a2f\" stroke-width=\"2.5\" stroke-linejoin=\"round\"/>\r\n <path d=\"M36 4 L36 20 L52 20\" fill=\"none\" stroke=\"#8a9a2f\" stroke-width=\"2.5\" stroke-linejoin=\"round\"/>\r\n <rect x=\"20\" y=\"30\" width=\"24\" height=\"2.5\" rx=\"1.25\" fill=\"#8a9a2f\"/>\r\n <rect x=\"20\" y=\"37\" width=\"24\" height=\"2.5\" rx=\"1.25\" fill=\"#8a9a2f\"/>\r\n <rect x=\"20\" y=\"44\" width=\"16\" height=\"2.5\" rx=\"1.25\" fill=\"#8a9a2f\"/>\r\n </svg>\r\n <span class=\"file-card-ext\">{{ getFileExtension(file) }}</span>\r\n <span class=\"file-card-name\" [title]=\"file.name\">{{ file.name }}</span>\r\n <span class=\"file-card-size\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>","// src/app/components/public-api.ts\n\n// Exportar los componentes\n\nexport * from './lib/components/pagination/pagination';\nexport * from './lib/components/table/table';\nexport * from './lib/interfaces/filters';\n\nexport * from './lib/components/date-time-picker/date-time-picker';\nexport * from './lib/components/date-time-filter/date-time-filter';\nexport * from './lib/components/input-number-filter/input-number-filter';\nexport * from './lib/components/input-select-filter/input-select-filter';\nexport * from './lib/components/input-text-filter/input-text-filter';\n\nexport * from './lib/components/input/input';\nexport * from './lib/components/select-custom-search/select-custom-search';\nexport * from './lib/components/dynamic-form-fields/dynamic-form-fields';\nexport * from './lib/components/wizard-form/wizard-form';\nexport * from './lib/components/modal-form/modal-form';\n\nexport * from './lib/components/dialog-alert/dialog-alert';\nexport * from './lib/components/dialog-confirmation/dialog-confirmation';\n\nexport * from './lib/helpers/toast-helper';\n\nexport * from './lib/components/not-found-modal/not-found-modal';\n\nexport * from './lib/components/loader/loader';\nexport * from './lib/components/progress-bar/progress-bar';\nexport * from './lib/services/progress/progress-service';\nexport * from './lib/components/processing-overlay/processing-overlay';\n\nexport * from './lib/components/info-group/info-group'\nexport * from './lib/components/feature-card/feature-card'\n\nexport * from './lib/components/side-card/side-card'\nexport * from './lib/components/side-card-detail/side-card-detail'\nexport * from './lib/components/devices-carousel/devices-carousel'\n\nexport * from './lib/components/title-filters/title-filters'\n\nexport * from './lib/components/notification-modal/notification-modal'\n\nexport * from './lib/components/footer/footer'\n\nexport * from './lib/components/button-cards/button-cards'\nexport * from './lib/components/tabs/tabs'\n\nexport * from './lib/components/not-found-section/not-found-section'\n\nexport * from './lib/components/toast/toast'\nexport * from './lib/services/toast/toast-service'\n\nexport * from './lib/components/card-content/card-content'\nexport * from './lib/components/button/button'\nexport * from './lib/components/input-time-filter/input-time-filter'\nexport * from './lib/components/toggle-custom/toggle-custom'\n\nexport * from './lib/components/option-card/option-card'\nexport * from './lib/components/quick-access-cards/quick-access-cards'\n\nexport * from './lib/components/charts/bar-chart/bar-chart'\nexport * from './lib/components/charts/base/base-chart'\nexport * from './lib/components/charts/line-chart/line-chart'\nexport * from './lib/components/charts/donut-chart/donut-chart'\nexport * from './lib/components/charts/heatmap/heatmap'\nexport * from './lib/components/charts/map-geo/map-geo'\nexport * from './lib/components/charts/table-chart/table-chart'\n\nexport * from './lib/components/kpi-card/kpi-card'\n\nexport * from './lib/components/map/geo-api-maps/geo-api-maps'\nexport * from './lib/components/load-image/load-image'\n\nexport * from './lib/components/pdf-viewer/pdf-viewer'\nexport * from './lib/services/pdf-viewer/pdf-viewer.service'\n\nexport * from './lib/components/documents-upload/documents-upload'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","Input","i1.ProgressFormService","BarChart","LineChart"],"mappings":"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"}