sapenlinea-components 0.12.95 → 0.12.97
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/components/icon-picker/icon-picker.utils.ts","../../../projects/sapenlinea-components/src/lib/services/pdf-viewer/pdf-viewer.service.ts","../../../projects/sapenlinea-components/src/lib/components/table/table-column-layout.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/lib/components/card-history/card-history.ts","../../../projects/sapenlinea-components/src/lib/components/card-history/card-history.html","../../../projects/sapenlinea-components/src/lib/components/signature/signature.ts","../../../projects/sapenlinea-components/src/lib/components/signature/signature.html","../../../projects/sapenlinea-components/src/lib/components/document-item/document-item.ts","../../../projects/sapenlinea-components/src/lib/components/document-item/document-item.html","../../../projects/sapenlinea-components/src/lib/components/rol-card/rol-card.ts","../../../projects/sapenlinea-components/src/lib/components/rol-card/rol-card.html","../../../projects/sapenlinea-components/src/lib/components/icon-picker/icon-picker-options.ts","../../../projects/sapenlinea-components/src/lib/components/icon-picker/icon-picker.ts","../../../projects/sapenlinea-components/src/lib/components/icon-picker/icon-picker.html","../../../projects/sapenlinea-components/src/lib/components/color-picker/color-picker-options.ts","../../../projects/sapenlinea-components/src/lib/components/color-picker/color-picker.ts","../../../projects/sapenlinea-components/src/lib/components/color-picker/color-picker.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-icon/module-card-icon.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-icon/module-card-icon.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-applicativo/module-card-applicativo.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-applicativo/module-card-applicativo.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-order.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-list/module-card-list.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-list/module-card-list.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 { IconPickerOption } from './icon-picker-options';\r\n\r\nexport type IconPickerValueType = 'css' | 'lucide';\r\n\r\nconst LUCIDE_PREFIX = 'lucide:';\r\n\r\nexport function isLucideIconValue(value: string | null | undefined): boolean {\r\n return !!value?.startsWith(LUCIDE_PREFIX);\r\n}\r\n\r\nexport function parseIconPickerValue(value: string): { type: IconPickerValueType; name: string } {\r\n if (value.startsWith(LUCIDE_PREFIX)) {\r\n return { type: 'lucide', name: value.slice(LUCIDE_PREFIX.length) };\r\n }\r\n return { type: 'css', name: value };\r\n}\r\n\r\nexport function getIconPickerOptionType(option: IconPickerOption): IconPickerValueType {\r\n if (option.type) return option.type;\r\n if (option.value.startsWith(LUCIDE_PREFIX)) return 'lucide';\r\n return 'css';\r\n}\r\n\r\nexport function toIconPickerStoredValue(option: IconPickerOption): string {\r\n const type = getIconPickerOptionType(option);\r\n if (type === 'lucide') {\r\n const name = option.value.startsWith(LUCIDE_PREFIX)\r\n ? option.value.slice(LUCIDE_PREFIX.length)\r\n : option.value;\r\n return `${LUCIDE_PREFIX}${name}`;\r\n }\r\n return option.value;\r\n}\r\n\r\nexport function getIconPickerOptionKey(option: IconPickerOption): string {\r\n return toIconPickerStoredValue(option);\r\n}\r\n\r\nexport function toLucidePascalCase(value: string): string {\r\n return value.replace(/(\\w)([a-z0-9]*)(_|-|\\s*)/g, (_match, first: string, rest: string) =>\r\n first.toUpperCase() + rest.toLowerCase());\r\n}\r\n\r\nexport function getIconPickerOptionLabel(option: IconPickerOption): string {\r\n if (option.label) return option.label;\r\n const { type, name } = parseIconPickerValue(toIconPickerStoredValue(option));\r\n if (type === 'lucide') return name.replace(/-/g, ' ');\r\n return name.replace(/^icon-/, '').replace(/-/g, ' ');\r\n}\r\n\r\n/** Resuelve si un valor de icono es CSS o Lucide (prefijo `lucide:` o legacy `iconType`) */\r\nexport function resolveIconKind(\r\n value: string | null | undefined,\r\n legacyType?: 'css' | 'lucide',\r\n): IconPickerValueType {\r\n if (isLucideIconValue(value)) return 'lucide';\r\n if (legacyType === 'lucide') return 'lucide';\r\n return 'css';\r\n}\r\n\r\n/** Nombre kebab-case del icono Lucide sin el prefijo */\r\nexport function getLucideIconName(value: string): string {\r\n if (isLucideIconValue(value)) {\r\n return parseIconPickerValue(value).name;\r\n }\r\n return value;\r\n}\r\n\r\n/** Clase CSS para iconos de icons.css; vacío si el valor es Lucide */\r\nexport function getCssIconClass(value: string): string {\r\n return resolveIconKind(value) === 'css' ? value : '';\r\n}\r\n","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}","/**\r\n * Matriz de decisión de anchos para columnas de lib-table.\r\n * Prioridad: overrides manuales → widthProfile → tipo de columna.\r\n */\r\n\r\nexport type ColumnWidthProfile = 'compact' | 'fixed' | 'flex';\r\n\r\nexport interface TableColumnWidthConfig {\r\n type?: string;\r\n label?: string;\r\n compact?: boolean;\r\n autoWidth?: boolean;\r\n maxWidth?: number;\r\n minWidth?: number;\r\n widthProfile?: ColumnWidthProfile;\r\n /** true explícito, o detectar `\\n` en label */\r\n headerMultiline?: boolean;\r\n}\r\n\r\nexport interface ResolvedTableColumnLayout {\r\n profile: ColumnWidthProfile;\r\n minWidth: number;\r\n maxWidth?: number;\r\n /** Peso en fr para sub-filas (child-grid) */\r\n grow: number;\r\n headerNowrap: boolean;\r\n cellEllipsis: boolean;\r\n cellWrap: boolean;\r\n}\r\n\r\nconst LABEL_CHAR_PX = 9;\r\nconst HEADER_PADDING_PX = 28;\r\n\r\nexport function isMultilineHeaderLabel(\r\n label: string | undefined,\r\n headerMultiline?: boolean,\r\n): boolean {\r\n if (headerMultiline === true) return true;\r\n if (headerMultiline === false) return false;\r\n return !!label?.includes('\\n');\r\n}\r\n\r\nfunction longestLabelLine(label: string): string {\r\n return label.split('\\n').reduce((longest, line) => (line.length > longest.length ? line : longest), '');\r\n}\r\n\r\nfunction minWidthFromLabel(label: string | undefined, floor: number): number {\r\n if (!label?.trim()) return floor;\r\n const line = longestLabelLine(label.trim());\r\n return Math.max(floor, line.length * LABEL_CHAR_PX + HEADER_PADDING_PX);\r\n}\r\n\r\nfunction byType(type: string | undefined): ResolvedTableColumnLayout {\r\n switch (type) {\r\n case 'icon-button':\r\n return { profile: 'compact', minWidth: 52, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false };\r\n case 'grade':\r\n return { profile: 'compact', minWidth: 72, maxWidth: 96, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false };\r\n case 'status':\r\n return { profile: 'fixed', minWidth: 100, maxWidth: 150, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false };\r\n case 'number':\r\n return { profile: 'fixed', minWidth: 88, maxWidth: 120, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'money':\r\n return { profile: 'fixed', minWidth: 110, maxWidth: 140, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'percentage':\r\n return { profile: 'fixed', minWidth: 84, maxWidth: 104, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'date':\r\n return { profile: 'fixed', minWidth: 108, maxWidth: 128, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'datetime':\r\n return { profile: 'fixed', minWidth: 148, maxWidth: 176, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'email':\r\n return { profile: 'flex', minWidth: 160, maxWidth: 240, grow: 2, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'text':\r\n return { profile: 'flex', minWidth: 140, maxWidth: 280, grow: 3, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n default:\r\n return { profile: 'flex', minWidth: 120, maxWidth: 220, grow: 2, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n }\r\n}\r\n\r\nexport function resolveTableColumnLayout(col: TableColumnWidthConfig): ResolvedTableColumnLayout {\r\n const typeDefault = byType(col.type);\r\n\r\n if (col.compact) {\r\n const minWidth = col.minWidth ?? Math.min(typeDefault.minWidth, 56);\r\n return {\r\n profile: 'compact',\r\n minWidth,\r\n maxWidth: col.maxWidth ?? minWidth,\r\n grow: 0,\r\n headerNowrap: true,\r\n cellEllipsis: false,\r\n cellWrap: false,\r\n };\r\n }\r\n\r\n if (col.widthProfile) {\r\n const base = col.widthProfile === 'compact'\r\n ? { profile: 'compact' as const, minWidth: col.minWidth ?? 56, maxWidth: col.maxWidth ?? col.minWidth ?? 56, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false }\r\n : col.widthProfile === 'fixed'\r\n ? { ...typeDefault, profile: 'fixed' as const, grow: 0 }\r\n : { ...typeDefault, profile: 'flex' as const, maxWidth: col.maxWidth ?? typeDefault.maxWidth, grow: Math.max(typeDefault.grow, 2), cellWrap: true, cellEllipsis: false };\r\n\r\n return {\r\n ...base,\r\n minWidth: col.minWidth ?? minWidthFromLabel(col.label, base.minWidth),\r\n maxWidth: col.maxWidth ?? base.maxWidth,\r\n };\r\n }\r\n\r\n if (col.autoWidth === false) {\r\n const minWidth = col.minWidth ?? minWidthFromLabel(col.label, 160);\r\n return {\r\n profile: 'flex',\r\n minWidth,\r\n maxWidth: col.maxWidth,\r\n grow: 4,\r\n headerNowrap: true,\r\n cellEllipsis: false,\r\n cellWrap: true,\r\n };\r\n }\r\n\r\n const layout: ResolvedTableColumnLayout = {\r\n ...typeDefault,\r\n minWidth: minWidthFromLabel(col.label, typeDefault.minWidth),\r\n };\r\n\r\n if (col.minWidth != null) {\r\n layout.minWidth = col.minWidth;\r\n }\r\n\r\n if (isMultilineHeaderLabel(col.label, col.headerMultiline)) {\r\n layout.headerNowrap = false;\r\n }\r\n\r\n if (col.maxWidth != null) {\r\n layout.maxWidth = col.maxWidth;\r\n layout.cellEllipsis = true;\r\n layout.cellWrap = false;\r\n }\r\n\r\n if (col.autoWidth === true && (col.type === 'text' || col.type === 'email' || !col.type)) {\r\n layout.profile = 'flex';\r\n layout.grow = Math.max(layout.grow, 2);\r\n }\r\n\r\n return layout;\r\n}\r\n\r\nexport function getTableMinWidth(\r\n columns: TableColumnWidthConfig[],\r\n options: {\r\n hasSelection?: boolean;\r\n hasActions?: boolean;\r\n columnGroupCount?: number;\r\n columnGroupCellWidth?: number;\r\n } = {},\r\n): number {\r\n const columnGroupCellWidth = options.columnGroupCellWidth ?? 56;\r\n let total = columns.reduce((sum, col) => sum + resolveTableColumnLayout(col).minWidth, 0);\r\n\r\n if (options.columnGroupCount) {\r\n total += options.columnGroupCount * columnGroupCellWidth;\r\n }\r\n if (options.hasSelection) {\r\n total += 52;\r\n }\r\n if (options.hasActions) {\r\n total += 96;\r\n }\r\n\r\n return total;\r\n}\r\n\r\nexport function buildChildGridTemplateColumns(\r\n subColumns: TableColumnWidthConfig[],\r\n options: { includeActions?: boolean; actionsMinWidth?: number } = {},\r\n): string {\r\n const tracks = subColumns.map((col) => {\r\n const layout = resolveTableColumnLayout(col);\r\n if (layout.profile === 'flex') {\r\n return `minmax(${layout.minWidth}px, ${layout.grow}fr)`;\r\n }\r\n const max = layout.maxWidth ?? layout.minWidth;\r\n return `minmax(${layout.minWidth}px, ${max}px)`;\r\n });\r\n\r\n if (options.includeActions) {\r\n tracks.push(`minmax(${options.actionsMinWidth ?? 96}px, auto)`);\r\n }\r\n\r\n return tracks.join(' ');\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 { LucideAngularModule, LucideIconData, icons } from 'lucide-angular';\r\nimport {\r\n getCssIconClass,\r\n getLucideIconName,\r\n resolveIconKind,\r\n toLucidePascalCase,\r\n} from '../icon-picker/icon-picker.utils';\r\nimport { PdfViewerService } from '../../services/pdf-viewer/pdf-viewer.service';\r\nimport {\r\n buildChildGridTemplateColumns,\r\n ColumnWidthProfile,\r\n getTableMinWidth,\r\n isMultilineHeaderLabel,\r\n resolveTableColumnLayout,\r\n ResolvedTableColumnLayout,\r\n} from './table-column-layout';\r\n\r\nexport type { ColumnWidthProfile, ResolvedTableColumnLayout } from './table-column-layout';\r\nexport {\r\n buildChildGridTemplateColumns,\r\n getTableMinWidth,\r\n isMultilineHeaderLabel,\r\n resolveTableColumnLayout,\r\n} from './table-column-layout';\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 /** CSS (`icon-*`) o Lucide (`lucide:nombre`) para columnas icon-button */\r\n icon?: string;\r\n iconKey?: string;\r\n /** Icono alternativo (CSS `icon-*` o Lucide `lucide:nombre`) */\r\n iconAlternate?: string;\r\n /** Key del row: si es truthy, muestra iconAlternate en lugar de icon */\r\n iconActiveKey?: string;\r\n /** Función para determinar si mostrar iconAlternate (solo icon-button) */\r\n isIconActive?: (row: TableRow) => boolean;\r\n /** Key del row: si es truthy, deshabilita el botón de icono */\r\n disabledKey?: string;\r\n /** Función para determinar si el botón de icono está deshabilitado */\r\n isIconDisabled?: (row: TableRow) => boolean;\r\n /** Color del icono por defecto (solo icon-button) */\r\n iconColor?: string;\r\n /** Color del icono alternativo (solo icon-button) */\r\n iconAlternateColor?: string;\r\n /**\r\n * @deprecated Usar prefijo `lucide:` en `icon` / `iconAlternate` (ej. `lucide:share-2`)\r\n */\r\n iconType?: 'css' | 'lucide';\r\n /**\r\n * @deprecated Usar prefijo `lucide:` en `iconAlternate`\r\n */\r\n iconAlternateType?: 'css' | 'lucide';\r\n\r\n totalizable?: boolean;\r\n\r\n headerClass?: string;\r\n cellClass?: (row: TableRow) => string;\r\n /**\r\n * Header con salto de línea (`white-space: pre-line`).\r\n * Si no se define, se activa automáticamente cuando `label` contiene `\\n`.\r\n */\r\n headerMultiline?: boolean;\r\n\r\n /**\r\n * Ajusta el ancho de la columna a su contenido hasta un máximo.\r\n * Por defecto se infiere del tipo de columna; usar `false` para columna flexible principal.\r\n */\r\n autoWidth?: boolean;\r\n /** Ancho mínimo en px. Por defecto según tipo y longitud del label */\r\n minWidth?: number;\r\n /** Ancho máximo en px cuando aplica perfil fixed/flex */\r\n maxWidth?: number;\r\n /** Comprime la columna al mínimo posible */\r\n compact?: boolean;\r\n /** Override del perfil automático: compact | fixed | flex */\r\n widthProfile?: ColumnWidthProfile;\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 autoWidth?: boolean;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n compact?: boolean;\r\n widthProfile?: ColumnWidthProfile;\r\n headerMultiline?: boolean;\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 iconAlternate?: string;\r\n iconActiveKey?: string;\r\n isIconActive?: (row: TableRow) => boolean;\r\n disabledKey?: string;\r\n isIconDisabled?: (row: TableRow) => boolean;\r\n iconColor?: string;\r\n iconAlternateColor?: string;\r\n /** @deprecated Usar prefijo `lucide:` en `icon` / `iconAlternate` */\r\n iconType?: 'css' | 'lucide';\r\n /** @deprecated Usar prefijo `lucide:` en `iconAlternate` */\r\n iconAlternateType?: 'css' | 'lucide';\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\n/** Configuración compartida para columnas de tipo icon-button */\r\nexport type TableIconButtonConfig = Pick<\r\n TableColumn,\r\n | 'icon'\r\n | 'iconAlternate'\r\n | 'iconActiveKey'\r\n | 'isIconActive'\r\n | 'disabledKey'\r\n | 'isIconDisabled'\r\n | 'iconColor'\r\n | 'iconAlternateColor'\r\n | 'iconType'\r\n | 'iconAlternateType'\r\n>;\r\n\r\nexport interface TableAction {\r\n key: string;\r\n /** CSS (`icon-*`) o Lucide (`lucide:nombre`) */\r\n icon: string;\r\n label: string;\r\n /** Color explícito del icono. Si no se define, usa ICON_COLOR_MAP para clases icon-* */\r\n color?: string;\r\n /**\r\n * @deprecated Usar prefijo `lucide:` en `icon` (ej. `lucide:share-2`)\r\n */\r\n iconType?: 'css' | 'lucide';\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 | 'purple'\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 purple: { bg: '#C7B0D8', color: '#6A1B9A' },\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 'icon-logout': '#CF0707',\r\n 'icon-sanction': '#CF6507',\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\r\n 'icon-file': '#40484C',\r\n 'icon-export': '#40484C',\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, LucideAngularModule],\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 subOptionSelected = 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 subActions = input<TableAction[] | ((row: TableRow) => TableAction[])>([] as TableAction[]);\r\n showSubActions = input<boolean>(false);\r\n expandedRowId = signal<number | string | null>(null);\r\n selectedChildRow = signal<TableRow | 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 this.selectedChildRow.set(null);\r\n }\r\n }\r\n\r\n getColumnLayout(col: TableColumn | SubColumn): ResolvedTableColumnLayout {\r\n return resolveTableColumnLayout(col);\r\n }\r\n\r\n isHeaderMultiline(col: { label?: string; headerMultiline?: boolean }): boolean {\r\n return isMultilineHeaderLabel(col.label, col.headerMultiline);\r\n }\r\n\r\n isGroupLabelMultiline(groupLabel: string): boolean {\r\n return isMultilineHeaderLabel(groupLabel);\r\n }\r\n\r\n getTableMinWidthPx(): number {\r\n const groupCount = this.columnGroups().reduce((n, g) => n + g.columns.length, 0);\r\n return getTableMinWidth(this.columns(), {\r\n hasSelection: this.showSelection(),\r\n hasActions: this.showActions(),\r\n columnGroupCount: groupCount,\r\n });\r\n }\r\n\r\n getChildGridColumns(): string {\r\n return buildChildGridTemplateColumns(this.subColumns(), {\r\n includeActions: this.showSubActions(),\r\n });\r\n }\r\n\r\n getColMaxWidth(col: TableColumn | SubColumn): string | undefined {\r\n const layout = this.getColumnLayout(col);\r\n return layout.maxWidth != null ? `${layout.maxWidth}px` : undefined;\r\n }\r\n\r\n getColMinWidth(col: TableColumn | SubColumn): string {\r\n return `${this.getColumnLayout(col).minWidth}px`;\r\n }\r\n\r\n getColWidth(col: TableColumn | SubColumn): string | undefined {\r\n const layout = this.getColumnLayout(col);\r\n if (layout.profile === 'compact') {\r\n return `${layout.minWidth}px`;\r\n }\r\n if (layout.profile === 'flex' && col.autoWidth === false) {\r\n return undefined;\r\n }\r\n if (layout.profile === 'fixed' && layout.maxWidth != null) {\r\n return `${layout.maxWidth}px`;\r\n }\r\n return undefined;\r\n }\r\n\r\n isColumnCellEllipsis(col: TableColumn | SubColumn): boolean {\r\n return this.getColumnLayout(col).cellEllipsis;\r\n }\r\n\r\n isColumnCellWrap(col: TableColumn | SubColumn): boolean {\r\n return this.getColumnLayout(col).cellWrap;\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 action.color ?? ICON_COLOR_MAP[action.icon] ?? '#40484C';\r\n }\r\n\r\n isIconButtonActive(config: TableIconButtonConfig, row: TableRow): boolean {\r\n if (config.isIconActive) return config.isIconActive(row);\r\n if (config.iconActiveKey) return !!row[config.iconActiveKey];\r\n return false;\r\n }\r\n\r\n isIconButtonDisabled(config: TableIconButtonConfig, row: TableRow): boolean {\r\n if (config.isIconDisabled) return config.isIconDisabled(row);\r\n if (config.disabledKey) return !!row[config.disabledKey];\r\n return false;\r\n }\r\n\r\n getIconButtonIcon(config: TableIconButtonConfig, row: TableRow): string {\r\n if (this.isIconButtonActive(config, row) && config.iconAlternate) {\r\n return config.iconAlternate;\r\n }\r\n return config.icon ?? '';\r\n }\r\n\r\n getIconButtonLegacyType(config: TableIconButtonConfig, row: TableRow): 'css' | 'lucide' | undefined {\r\n if (this.isIconButtonActive(config, row) && config.iconAlternate) {\r\n return config.iconAlternateType ?? config.iconType;\r\n }\r\n return config.iconType;\r\n }\r\n\r\n isLucideIconButton(config: TableIconButtonConfig, row: TableRow): boolean {\r\n const icon = this.getIconButtonIcon(config, row);\r\n return resolveIconKind(icon, this.getIconButtonLegacyType(config, row)) === 'lucide';\r\n }\r\n\r\n getIconButtonCssClass(config: TableIconButtonConfig, row: TableRow): string {\r\n const icon = this.getIconButtonIcon(config, row);\r\n return getCssIconClass(icon);\r\n }\r\n\r\n getIconButtonColor(config: TableIconButtonConfig, row: TableRow): string {\r\n const icon = this.getIconButtonIcon(config, row);\r\n const cssIcon = getCssIconClass(icon) || icon;\r\n if (this.isIconButtonActive(config, row) && config.iconAlternate) {\r\n return config.iconAlternateColor ?? config.iconColor ?? ICON_COLOR_MAP[cssIcon] ?? '#40484C';\r\n }\r\n return config.iconColor ?? ICON_COLOR_MAP[cssIcon] ?? '#40484C';\r\n }\r\n\r\n getIconButtonLucideIcon(config: TableIconButtonConfig, row: TableRow): LucideIconData | null {\r\n return this.getLucideIcon(this.getIconButtonIcon(config, row));\r\n }\r\n\r\n isLucideAction(action: TableAction): boolean {\r\n return resolveIconKind(action.icon, action.iconType) === 'lucide';\r\n }\r\n\r\n getActionCssClass(action: TableAction): string {\r\n return getCssIconClass(action.icon);\r\n }\r\n\r\n getLucideIcon(value: string): LucideIconData | null {\r\n const iconName = toLucidePascalCase(getLucideIconName(value));\r\n return (icons as Record<string, LucideIconData | undefined>)[iconName] ?? null;\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 getActionsForChildRow(row: TableRow): TableAction[] {\r\n const acts = this.subActions();\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 openSubModal(row: TableRow, event?: MouseEvent) {\r\n event?.stopPropagation();\r\n if (this.selectedChildRow()?.['id'] === row['id']) {\r\n this.selectedChildRow.set(null);\r\n } else {\r\n this.selectedChildRow.set(row);\r\n }\r\n }\r\n\r\n onSubOptionClick(option: TableAction, row: TableRow) {\r\n this.subOptionSelected.emit({ action: option.label, row });\r\n this.selectedChildRow.set(null);\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 if (this.isIconButtonDisabled(col, row)) return;\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 if (this.isIconButtonDisabled(col, row)) return;\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 <div class=\"table-scroll\">\n <table class=\"inner-table\" [style.minWidth.px]=\"getTableMinWidthPx()\">\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) + ' ' + (col.headerClass || '')\"\n [class.th--multiline]=\"isHeaderMultiline(col)\"\n [attr.rowspan]=\"hasColumnGroups() ? 2 : null\"\n [style.minWidth]=\"getColMinWidth(col)\" [style.maxWidth]=\"getColMaxWidth(col)\" [style.width]=\"getColWidth(col)\">\n <span class=\"th__label\">{{ col.label }}</span>\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\" [class.th--multiline]=\"isGroupLabelMultiline(group.groupLabel)\"\n [attr.colspan]=\"group.columns.length\">\n <span class=\"th__label\">{{ group.groupLabel }}</span>\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\" [class.th--multiline]=\"isHeaderMultiline(subCol)\">\n <span class=\"th__label\">{{ subCol.label }}</span>\n </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) + ' ' + (col.cellClass ? col.cellClass(row) : '')\"\n [class.table-cell--ellipsis]=\"isColumnCellEllipsis(col)\"\n [class.table-cell--wrap]=\"isColumnCellWrap(col)\"\n [style.minWidth]=\"getColMinWidth(col)\" [style.maxWidth]=\"getColMaxWidth(col)\" [style.width]=\"getColWidth(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 type=\"button\" class=\"cell-icon-button\"\n [class.cell-icon-button--disabled]=\"isIconButtonDisabled(col, row)\"\n [disabled]=\"isIconButtonDisabled(col, row)\"\n [style.color]=\"getIconButtonColor(col, row)\"\n (click)=\"onIconColumnClick(col, row, $event)\">\n @if (isLucideIconButton(col, row)) {\n @if (getIconButtonLucideIcon(col, row); as lucideIcon) {\n <lucide-icon class=\"cell-icon-button__icon\" [img]=\"lucideIcon\" [size]=\"24\"\n [color]=\"getIconButtonColor(col, row)\" aria-hidden=\"true\"></lucide-icon>\n }\n } @else {\n <span class=\"icon cell-icon-button__icon\" [class]=\"getIconButtonCssClass(col, row)\"></span>\n }\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 type=\"button\" class=\"cell-icon-button\"\n [class.cell-icon-button--disabled]=\"isIconButtonDisabled(subCol, row)\"\n [disabled]=\"isIconButtonDisabled(subCol, row)\"\n [style.color]=\"getIconButtonColor(subCol, row)\"\n (click)=\"onGroupIconClick(subCol, row, $event)\">\n @if (isLucideIconButton(subCol, row)) {\n @if (getIconButtonLucideIcon(subCol, row); as lucideIcon) {\n <lucide-icon class=\"cell-icon-button__icon\" [img]=\"lucideIcon\" [size]=\"24\"\n [color]=\"getIconButtonColor(subCol, row)\" aria-hidden=\"true\"></lucide-icon>\n }\n } @else {\n <span class=\"icon cell-icon-button__icon\" [class]=\"getIconButtonCssClass(subCol, row)\"></span>\n }\n </button>\n }\n </td>\n }\n }\n\n <!-- Celda de acciones -->\n @if (showActions()) {\n <td class=\"acciones-cell\" [style.whiteSpace]=\"'nowrap'\">\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 @if (isLucideAction(option)) {\n @if (getLucideIcon(option.icon); as lucideIcon) {\n <lucide-icon class=\"action-lucide-icon\" [img]=\"lucideIcon\" [size]=\"24\"\n [color]=\"getActionColor(option)\" aria-hidden=\"true\"></lucide-icon>\n }\n } @else {\n <span class=\"icon\" [class]=\"getActionCssClass(option)\"></span>\n }\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-scroll\">\n <div class=\"child-grid\" [style.gridTemplateColumns]=\"getChildGridColumns()\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\"\n [style.minWidth]=\"getColMinWidth(subCol)\"\n [class.child-item--wrap]=\"isColumnCellWrap(subCol)\">\n <span class=\"child-label\" [class.child-label--multiline]=\"isHeaderMultiline(subCol)\">{{ subCol.label }}</span>\n </div>\n }\n @if (showSubActions()) {\n <div class=\"child-item child-actions-header\">\n <span class=\"child-label\">Acciones</span>\n </div>\n }\n </div>\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-scroll\">\n <div class=\"child-grid\" [style.gridTemplateColumns]=\"getChildGridColumns()\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\"\n [style.minWidth]=\"getColMinWidth(subCol)\"\n [class.child-item--wrap]=\"isColumnCellWrap(subCol)\">\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\" [class.child-value--wrap]=\"isColumnCellWrap(subCol)\">\n {{ formatValue(subCol, child[subCol.key]) }}\n </span>\n }\n\n </div>\n }\n @if (showSubActions()) {\n <div class=\"child-item child-actions-cell\">\n <div class=\"menu-acciones\">\n <button class=\"icon-button\" (click)=\"openSubModal(child, $event)\">\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(selectedChildRow()?.['id'] === child['id']){\n <div class=\"modal-options-table\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content-table\">\n <ul>\n @for (option of getActionsForChildRow(child); track $index) {\n <li class=\"option-item-table\" [style.color]=\"getActionColor(option)\"\n (click)=\"onSubOptionClick(option, child)\">\n @if (isLucideAction(option)) {\n @if (getLucideIcon(option.icon); as lucideIcon) {\n <lucide-icon class=\"action-lucide-icon\" [img]=\"lucideIcon\" [size]=\"24\"\n [color]=\"getActionColor(option)\" aria-hidden=\"true\"></lucide-icon>\n }\n } @else {\n <span class=\"icon\" [class]=\"getActionCssClass(option)\"></span>\n }\n <span class=\"label\">{{ option.label }}</span>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\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>\n</div>","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n ViewChild,\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 host: {\r\n class: 'lib-date-time-picker-host',\r\n },\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 private static readonly DROPDOWN_MIN_WIDTH = 400;\r\n private static readonly VIEWPORT_MARGIN = 8;\r\n private static readonly DROPDOWN_GAP = 4;\r\n\r\n @ViewChild('dropdownPanel') dropdownRef?: ElementRef<HTMLElement>;\r\n\r\n private readonly document = inject(DOCUMENT);\r\n\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 dropdownStyles = signal<Record<string, string>>({});\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 private resizeListener?: () => void;\r\n private scrollListener?: () => void;\r\n private dropdownParent: HTMLElement | null = null;\r\n\r\n /**\r\n * Valor que se muestra en el campo de texto.\r\n * Modo 'date': DD/MM/YYYY. Modo 'datetime': DD/MM/YYYY HH:MM (24h).\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 return this.formatDateForInput(date);\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.detachDropdownOverlay();\r\n this.removeDocumentListener();\r\n this.removePositioningListeners();\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 this.isOpen.set(true);\r\n this.addDocumentListener();\r\n this.addPositioningListeners();\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 queueMicrotask(() => {\r\n if (!this.isOpen()) return;\r\n this.attachDropdownOverlay();\r\n this.updatePosition();\r\n requestAnimationFrame(() => {\r\n if (this.isOpen()) {\r\n this.updatePosition();\r\n }\r\n });\r\n });\r\n }\r\n\r\n close() {\r\n this.detachDropdownOverlay();\r\n this.isOpen.set(false);\r\n this.openUpward.set(false);\r\n this.dropdownStyles.set({});\r\n this.removeDocumentListener();\r\n this.removePositioningListeners();\r\n this.markAsTouched();\r\n }\r\n\r\n private getTriggerElement(): HTMLElement | null {\r\n return this.elementRef.nativeElement.querySelector('.datetime-header');\r\n }\r\n\r\n private getEstimatedDropdownHeight(): number {\r\n return this.mode() === 'datetime' ? 400 : 360;\r\n }\r\n\r\n private updatePosition(): void {\r\n const trigger = this.getTriggerElement();\r\n if (!trigger) return;\r\n\r\n const triggerRect = trigger.getBoundingClientRect();\r\n const dropdown = this.dropdownRef?.nativeElement;\r\n const dropdownHeight = dropdown?.offsetHeight || this.getEstimatedDropdownHeight();\r\n const dropdownWidth = Math.max(\r\n triggerRect.width,\r\n DateTimePicker.DROPDOWN_MIN_WIDTH\r\n );\r\n const margin = DateTimePicker.VIEWPORT_MARGIN;\r\n const gap = DateTimePicker.DROPDOWN_GAP;\r\n\r\n const spaceBelow = window.innerHeight - triggerRect.bottom - margin;\r\n const spaceAbove = triggerRect.top - margin;\r\n const fitsBelow = spaceBelow >= dropdownHeight + gap;\r\n const fitsAbove = spaceAbove >= dropdownHeight + gap;\r\n\r\n let openUp = false;\r\n if (fitsBelow) {\r\n openUp = false;\r\n } else if (fitsAbove) {\r\n openUp = true;\r\n } else {\r\n openUp = spaceAbove > spaceBelow;\r\n }\r\n\r\n this.openUpward.set(openUp);\r\n\r\n let top = openUp\r\n ? triggerRect.top - dropdownHeight - gap\r\n : triggerRect.bottom + gap;\r\n\r\n const maxTop = window.innerHeight - margin - dropdownHeight;\r\n top = Math.min(Math.max(margin, top), Math.max(margin, maxTop));\r\n\r\n let left = triggerRect.left;\r\n if (left + dropdownWidth > window.innerWidth - margin) {\r\n left = window.innerWidth - margin - dropdownWidth;\r\n }\r\n left = Math.max(margin, left);\r\n\r\n this.dropdownStyles.set({\r\n position: 'fixed',\r\n top: `${Math.round(top)}px`,\r\n left: `${Math.round(left)}px`,\r\n width: `${Math.round(dropdownWidth)}px`,\r\n zIndex: '10050',\r\n });\r\n }\r\n\r\n private attachDropdownOverlay(): void {\r\n const dropdown = this.dropdownRef?.nativeElement;\r\n if (!dropdown || dropdown.parentElement === this.document.body) {\r\n return;\r\n }\r\n\r\n this.dropdownParent = dropdown.parentElement;\r\n this.document.body.appendChild(dropdown);\r\n }\r\n\r\n private detachDropdownOverlay(): void {\r\n const dropdown = this.dropdownRef?.nativeElement;\r\n if (!dropdown || dropdown.parentElement !== this.document.body) {\r\n return;\r\n }\r\n\r\n const parent =\r\n this.dropdownParent ??\r\n this.elementRef.nativeElement.querySelector('.datetime-container');\r\n\r\n parent?.appendChild(dropdown);\r\n this.dropdownParent = null;\r\n }\r\n\r\n private addPositioningListeners(): void {\r\n this.removePositioningListeners();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const reposition = () => {\r\n if (this.isOpen()) {\r\n this.ngZone.run(() => this.updatePosition());\r\n }\r\n };\r\n\r\n this.resizeListener = reposition;\r\n this.scrollListener = reposition;\r\n\r\n window.addEventListener('resize', this.resizeListener);\r\n window.addEventListener('scroll', this.scrollListener, true);\r\n });\r\n }\r\n\r\n private removePositioningListeners(): void {\r\n if (this.resizeListener) {\r\n window.removeEventListener('resize', this.resizeListener);\r\n this.resizeListener = undefined;\r\n }\r\n\r\n if (this.scrollListener) {\r\n window.removeEventListener('scroll', this.scrollListener, true);\r\n this.scrollListener = undefined;\r\n }\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 o DD/MM/YYYY HH:MM)\r\n onInputChange(event: Event) {\r\n if (this.isBlocked()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const value = input.value;\r\n const isDateTime = this.mode() === 'datetime';\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 para fecha o 12 para datetime\r\n const maxDigits = isDateTime ? 12 : 8;\r\n const limitedNumbers = numbersOnly.slice(0, maxDigits);\r\n\r\n // Formatear con separadores: DD/MM/YYYY [ HH:MM]\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 if (isDateTime && limitedNumbers.length > 8) {\r\n formatted += ' ' + limitedNumbers.slice(8, 10);\r\n }\r\n if (isDateTime && limitedNumbers.length > 10) {\r\n formatted += ':' + limitedNumbers.slice(10, 12);\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 const completeLength = isDateTime ? 16 : 10;\r\n\r\n if (formatted.length === completeLength) {\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/time segment under the cursor on click.\r\n * Format: DD/MM/YYYY [HH:MM] → DD=0-1, MM=3-4, YYYY=6-9, HH=11-12, MM=14-15\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 if (!value || !value.includes('/')) return;\r\n\r\n const hasTime = this.mode() === 'datetime' && value.includes(':');\r\n\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 if (pos <= 10 || !hasTime) {\r\n start = 6;\r\n end = 10;\r\n } else if (pos <= 13) {\r\n start = 11;\r\n end = 13;\r\n } else {\r\n start = 14;\r\n end = 16;\r\n }\r\n\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 trimmed = input.trim();\r\n const dateTimeMatch = trimmed.match(\r\n /^(\\d{2})\\/(\\d{2})\\/(\\d{4})\\s(\\d{2}):(\\d{2})$/\r\n );\r\n const dateMatch = trimmed.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n const match = dateTimeMatch || dateMatch;\r\n\r\n if (!match) return null;\r\n\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 const hour = match[4] ? parseInt(match[4], 10) : 0;\r\n const minute = match[5] ? parseInt(match[5], 10) : 0;\r\n\r\n if (\r\n day >= 1 && day <= 31 &&\r\n month >= 0 && month <= 11 &&\r\n year >= 1900 && year <= 2100 &&\r\n hour >= 0 && hour <= 23 &&\r\n minute >= 0 && minute <= 59\r\n ) {\r\n const date = new Date(year, month, day, hour, minute);\r\n if (\r\n date.getDate() === day &&\r\n date.getMonth() === month &&\r\n date.getFullYear() === year\r\n ) {\r\n return date;\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 const dateStr = `${day}/${month}/${year}`;\r\n\r\n if (this.mode() === 'datetime') {\r\n const hour = date.getHours().toString().padStart(2, '0');\r\n const minute = date.getMinutes().toString().padStart(2, '0');\r\n return `${dateStr} ${hour}:${minute}`;\r\n }\r\n\r\n return dateStr;\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 const clickedInsideTrigger = this.elementRef.nativeElement.contains(target);\r\n const clickedInsideDropdown =\r\n this.dropdownRef?.nativeElement.contains(target) ?? false;\r\n\r\n if (!clickedInsideTrigger && !clickedInsideDropdown) {\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\r\n @if (isOpen()) {\r\n <div\r\n #dropdownPanel\r\n class=\"dropdown\"\r\n [class.dropdown--upward]=\"openUpward()\"\r\n [style.position]=\"dropdownStyles()['position']\"\r\n [style.top]=\"dropdownStyles()['top']\"\r\n [style.left]=\"dropdownStyles()['left']\"\r\n [style.width]=\"dropdownStyles()['width']\"\r\n [style.z-index]=\"dropdownStyles()['zIndex']\"\r\n >\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</div>\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 __/__/____ o __/__/____, __:__ __\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n const ampmMatch = raw.toUpperCase().match(/[AP]M?/);\r\n const ampmStr = ampmMatch ? (ampmMatch[0].startsWith('P') ? 'PM' : 'AM') : 'AM';\r\n\r\n const template: { char: string; filled: boolean }[] = [\r\n { char: 'd', filled: false }, // 0\r\n { char: 'd', filled: false }, // 1\r\n { char: '/', filled: false }, // 2\r\n { char: 'm', filled: false }, // 3\r\n { char: 'm', filled: false }, // 4\r\n { char: '/', filled: false }, // 5\r\n { char: 'y', filled: false }, // 6\r\n { char: 'y', filled: false }, // 7\r\n { char: 'y', filled: false }, // 8\r\n { char: 'y', filled: false }, // 9\r\n ];\r\n\r\n if (isDateTime) {\r\n template.push(\r\n { char: ',', filled: false }, // 10\r\n { char: ' ', filled: false }, // 11\r\n { char: 'h', filled: false }, // 12\r\n { char: 'h', filled: false }, // 13\r\n { char: ':', filled: false }, // 14\r\n { char: 'm', filled: false }, // 15\r\n { char: 'm', filled: false }, // 16\r\n { char: ' ', filled: false }, // 17\r\n { char: ampmStr[0], filled: false }, // 18\r\n { char: ampmStr[1], filled: false } // 19\r\n );\r\n }\r\n\r\n let index = 0;\r\n\r\n for (let i = 0; i < template.length; i++) {\r\n if (template[i].char === '/' || template[i].char === ',' || template[i].char === ' ' || template[i].char === ':') continue;\r\n\r\n if (isDateTime && (i === 18 || i === 19)) {\r\n if (numbersOnly.length >= 12) {\r\n template[i].filled = true;\r\n }\r\n continue;\r\n }\r\n\r\n if (index < numbersOnly.length) {\r\n template[i] = { char: numbersOnly[index++], filled: true };\r\n }\r\n }\r\n\r\n // Cuando se completa el segmento, el slash/separador correspondiente pasa a \"filled\"\r\n if (numbersOnly.length >= 2) template[2].filled = true;\r\n if (numbersOnly.length >= 4) template[5].filled = true;\r\n \r\n if (isDateTime) {\r\n if (numbersOnly.length >= 8) {\r\n template[10].filled = true;\r\n template[11].filled = true;\r\n }\r\n if (numbersOnly.length >= 10) template[14].filled = true;\r\n if (numbersOnly.length >= 12) template[17].filled = true;\r\n }\r\n\r\n return template;\r\n });\r\n\r\n clearTrigger = input<number>(0);\r\n /** Fecha previa a restaurar */\r\n initialValue = input<Date | string | null>(null);\r\n /** Clave del filtro activo a restaurar (FilterItem.value) */\r\n initialFilterType = input<string | null>(null);\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 wasManuallyCleared = false;\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.wasManuallyCleared = false;\r\n this.clear();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const filterType = this.initialFilterType();\r\n const value = this.initialValue();\r\n if (!filterType && !value) return;\r\n if (this.wasManuallyCleared) return;\r\n if (filterType) this.activeFilterType.set(filterType);\r\n if (value) this.writeValue(value);\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n // Remove all non-numeric characters for digits processing\r\n const numbersOnly = value.replace(/\\D/g, '');\r\n\r\n // Limit to 8 digits (DD/MM/YYYY) or 12 for datetime\r\n const maxDigits = isDateTime ? 12 : 8;\r\n const limitedNumbers = numbersOnly.slice(0, maxDigits);\r\n\r\n // Format string\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 if (isDateTime && limitedNumbers.length > 8) {\r\n formatted += ', ' + limitedNumbers.slice(8, 10);\r\n }\r\n if (isDateTime && limitedNumbers.length > 10) {\r\n formatted += ':' + limitedNumbers.slice(10, 12);\r\n }\r\n \r\n if (isDateTime && limitedNumbers.length === 12) {\r\n const lastChars = value.slice(-3).toUpperCase();\r\n let ampm = this.selectedAmPm();\r\n if (lastChars.includes('P')) ampm = 'PM';\r\n else if (lastChars.includes('A')) ampm = 'AM';\r\n \r\n this.selectedAmPm.set(ampm);\r\n formatted += ' ' + ampm;\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 const completeLength = isDateTime ? (formatted.length >= 20 ? 12 : -1) : 10;\r\n const isComplete = isDateTime ? limitedNumbers.length === 12 : formatted.length === 10;\r\n\r\n if (isComplete) {\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n let start: number;\r\n let end: number;\r\n\r\n if (pos <= 2) {\r\n start = 0; end = 2;\r\n } else if (pos <= 5) {\r\n start = 3; end = 5;\r\n } else if (pos <= 10 || !isDateTime) {\r\n start = 6; end = 10;\r\n } else if (pos <= 14) {\r\n start = 12; end = 14;\r\n } else if (pos <= 17) {\r\n start = 15; end = 17;\r\n } else {\r\n start = 18; end = 20;\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 const isDateTime = this.mode() === 'datetime';\r\n \r\n // Determine current segment\r\n let currentSegment: number;\r\n if (pos <= 2) currentSegment = 0;\r\n else if (pos <= 5) currentSegment = 1;\r\n else if (pos <= 10 || !isDateTime) currentSegment = 2;\r\n else if (pos <= 14) currentSegment = 3;\r\n else if (pos <= 17) currentSegment = 4;\r\n else currentSegment = 5;\r\n\r\n // Segment ranges\r\n const segments = isDateTime \r\n ? [\r\n { start: 0, end: 2 }, // DD\r\n { start: 3, end: 5 }, // MM\r\n { start: 6, end: 10 }, // YYYY\r\n { start: 12, end: 14 }, // HH\r\n { start: 15, end: 17 }, // MIN\r\n { start: 18, end: 20 }, // AMPM\r\n ]\r\n : [\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 const numSegments = isDateTime ? 6 : 3;\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 } else {\r\n // Move to next segment\r\n if (currentSegment < numSegments - 1) {\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 }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n if (currentSegment < numSegments - 1) {\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 let day = 1, month = 1, year = 2024, hour = 12, min = 0, ampm = 'AM';\r\n \r\n if (isDateTime) {\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4}),\\s(\\d{2}):(\\d{2})\\s(AM|PM)$/i);\r\n if (!match) return;\r\n day = parseInt(match[1], 10);\r\n month = parseInt(match[2], 10);\r\n year = parseInt(match[3], 10);\r\n hour = parseInt(match[4], 10);\r\n min = parseInt(match[5], 10);\r\n ampm = match[6].toUpperCase();\r\n } else {\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (!match) return;\r\n day = parseInt(match[1], 10);\r\n month = parseInt(match[2], 10);\r\n year = parseInt(match[3], 10);\r\n }\r\n\r\n const delta = event.key === 'ArrowUp' ? 1 : -1;\r\n\r\n if (currentSegment === 0) {\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 month += delta;\r\n if (month < 1) month = 12;\r\n if (month > 12) month = 1;\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n } else if (currentSegment === 2) {\r\n year += delta;\r\n if (year < 1900) year = 1900;\r\n if (year > 2100) year = 2100;\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n } else if (currentSegment === 3) {\r\n hour += delta;\r\n if (hour < 1) hour = 12;\r\n if (hour > 12) hour = 1;\r\n } else if (currentSegment === 4) {\r\n min += delta;\r\n if (min < 0) min = 59;\r\n if (min > 59) min = 0;\r\n } else if (currentSegment === 5) {\r\n ampm = ampm === 'AM' ? 'PM' : 'AM';\r\n }\r\n\r\n let newFormatted = '';\r\n if (isDateTime) {\r\n newFormatted = `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}, ${hour.toString().padStart(2, '0')}:${min.toString().padStart(2, '0')} ${ampm}`;\r\n } else {\r\n newFormatted = `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}`;\r\n }\r\n\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n if (isDateTime) {\r\n const match = input.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4}),\\s(\\d{2}):(\\d{2})\\s(AM|PM)$/i);\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 const hour12 = parseInt(match[4], 10);\r\n const minute = parseInt(match[5], 10);\r\n const ampm = match[6].toUpperCase();\r\n\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100 &&\r\n hour12 >= 1 && hour12 <= 12 && minute >= 0 && minute <= 59) {\r\n const hour24 = ampm === 'PM' ? (hour12 === 12 ? 12 : hour12 + 12) : (hour12 === 12 ? 0 : hour12);\r\n const date = new Date(year, month, day, hour24, minute);\r\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\r\n return date;\r\n }\r\n }\r\n }\r\n } else {\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\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\r\n if (this.mode() === 'datetime') {\r\n let h = date.getHours();\r\n const m = date.getMinutes().toString().padStart(2, '0');\r\n const ampm = h >= 12 ? 'PM' : 'AM';\r\n h = h % 12;\r\n h = h ? h : 12;\r\n const hStr = h.toString().padStart(2, '0');\r\n return `${day}/${month}/${year}, ${hStr}:${m} ${ampm}`;\r\n }\r\n\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.wasManuallyCleared = true;\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\">\n @for (item of filters(); track item.value) {\n <div class=\"chip-input-wrapper\" #chip [class.has-value]=\"selectedDate() || inputTextValue()\"\n [class.active]=\"activeFilterType() === item.value\">\n <!-- Etiqueta flotante -->\n <label class=\"floating-label\">{{ item.placeholder || item.label || (item.type === 'datetime' ? 'dd/mm/aaaa, hh:mm AM/PM' : 'dd/mm/aaaa') }}</label>\n\n <!-- Máscara de guía de fecha dinámica (__/__/____) -->\n <div class=\"chip-input-mask\">\n @for (part of inputMask(); track $index) {\n <span class=\"mask-char\" [class.mask-char-filled]=\"part.filled\" [class.mask-char-placeholder]=\"!part.filled\">\n {{ part.char }}\n </span>\n }\n </div>\n\n <input type=\"text\" [value]=\"inputTextValue()\" (input)=\"onInputChange($event, item.value)\"\n (click)=\"onInputClick($event, item.value)\"\n (focus)=\"onInputFocus(item.value)\" [placeholder]=\"item.placeholder || 'Seleccionar Fecha'\"\n [attr.title]=\"item.placeholder || item.label || 'Seleccionar Fecha'\" class=\"chip-input\"\n [disabled]=\"isDisabled()\" (keydown)=\"onInputKeyDown($event, item.value)\" />\n\n <button type=\"button\" class=\"calendar-icon-button\" (click)=\"toggle(item.value)\" title=\"Abrir calendario\">\n <span class=\"calendar-icon icon icon-calendar\" aria-hidden=\"true\"></span>\n </button>\n\n @if (isOpen() && activeFilterType() === item.value) {\n <div class=\"dropdown\" [class.open-left]=\"dropdownDirection() === 'left'\">\n <div class=\"datetime-content\">\n <!-- Sección del calendario -->\n <div class=\"calendar-section\">\n <!-- Navegación -->\n <div class=\"calendar-nav\">\n <div class=\"nav-section\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousYear()\" title=\"Año anterior\">\n ‹‹\n </button>\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousMonth()\" title=\"Mes anterior\">\n ‹\n </button>\n </div>\n\n <div class=\"current-date\">\n {{ monthName() }} {{ currentYear() }}\n </div>\n\n <div class=\"nav-section\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextMonth()\" title=\"Siguiente mes\">\n ›\n </button>\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextYear()\" title=\"Siguiente año\">\n ››\n </button>\n </div>\n </div>\n\n <!-- Días de la semana -->\n <div class=\"weekdays\">\n <div class=\"weekday\">Dom</div>\n <div class=\"weekday\">Lun</div>\n <div class=\"weekday\">Mar</div>\n <div class=\"weekday\">Mié</div>\n <div class=\"weekday\">Jue</div>\n <div class=\"weekday\">Vie</div>\n <div class=\"weekday\">Sáb</div>\n </div>\n\n <!-- Días -->\n <div class=\"calendar-grid\">\n @for (day of calendarDays(); track $index) {\n <div class=\"calendar-day\" [class.selected]=\"isDaySelected(day)\" [class.today]=\"isToday(day)\"\n [class.disabled]=\"isDayDisabled(day)\" [class.empty]=\"!day\" (click)=\"selectDay(day)\">\n {{ day || \"\" }}\n </div>\n }\n </div>\n\n <!-- TIME PICKER -->\n @if (mode() === 'datetime') {\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 class=\"time-option\" [class.selected]=\"hour.value === selectedHour12()\"\n (click)=\"setHour12(hour.value)\">\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 class=\"time-option\" [class.selected]=\"minute === selectedMinute()\" (click)=\"setMinute(minute)\">\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 class=\"time-option\" [class.selected]=\"selectedAmPm() === 'AM'\" (click)=\"setAmPm('AM')\">\n AM\n </div>\n <div class=\"time-option\" [class.selected]=\"selectedAmPm() === 'PM'\" (click)=\"setAmPm('PM')\">\n PM\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- botones -->\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"action-btn secondary\" (click)=\"today()\">\n Hoy\n </button>\n\n @if (mode() === 'datetime') {\n <button type=\"button\" class=\"action-btn primary\" (click)=\"close()\">\n Aceptar\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\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);\r\n initialValues = input<Record<string, string>>({});\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 effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) this.resetAllFilters();\r\n });\r\n\r\n effect(() => {\r\n const init = this.initialValues();\r\n if (Object.keys(init).length === 0) return;\r\n this.filterValues.update(current => {\r\n const toApply: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(init)) {\r\n if (!(key in current)) toApply[key] = value;\r\n }\r\n return { ...current, ...toApply };\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 this.filterValues.update(current => ({ ...current, [filterValue]: '' }));\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 [attr.title]=\"!filterValues()[item.value] ? (item.placeholder || item.label || 'Escribir Número') : null\"\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);\r\n initialValues = input<Record<string, string>>({});\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 effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) this.resetAllFilters();\r\n });\r\n\r\n effect(() => {\r\n const init = this.initialValues();\r\n if (Object.keys(init).length === 0) return;\r\n const allFilters = this.filters();\r\n this.filterValues.update(current => {\r\n const toApply: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(init)) {\r\n if (key in current) continue;\r\n const filter = allFilters.find(f => f.value === key);\r\n const option = filter?.options?.find(opt => String(opt.value) === String(value));\r\n if (option) toApply[key] = option.label;\r\n }\r\n return { ...current, ...toApply };\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\">\n @for (item of filters(); track item.value) {\n <div class=\"chip\" [class.active]=\"activeFilterType() === item.value\" [class.has-value]=\"filterValues()[item.value]\">\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Seleccionar' }}</label>\n <div class=\"content-chip\">\n <input type=\"text\" class=\"chip-input\" [value]=\"filterValues()[item.value] || ''\"\n (input)=\"onInputChange($event, item.value)\" (focus)=\"onFocusFilter(item.value)\"\n (click)=\"$event.stopPropagation()\" (keydown)=\"onKeyDown($event)\" (keydown)=\"onEnter($event)\"\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Seleccionar')\"\n [attr.title]=\"!filterValues()[item.value] ? (item.placeholder || item.label || 'Seleccionar') : null\"\n [disabled]=\"isDisabled()\" />\n\n <span class=\"chip-list-icon icon icon-list\" (click)=\"onFocusFilter(item.value)\" aria-hidden=\"true\"></span>\n </div>\n\n @if (isOpen() && activeFilterType() === item.value) {\n <div class=\"dropdown\">\n <div class=\"options-list\">\n <!-- Opción por defecto sin valor -->\n <div class=\"option-item option-default\" (click)=\"clear()\">\n {{ 'Seleccionar' }}\n </div>\n @for (option of filteredOptions(); track option.value) {\n <div class=\"option-item\" (click)=\"selectOption(option)\">\n {{ option.label }}\n </div>\n }\n @if (filteredOptions().length === 0) {\n <div class=\"no-options\">No hay opciones</div>\n }\n </div>\n </div>\n }\n </div>\n }\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);\r\n /** Valores previos a restaurar (clave = FilterItem.value, valor = texto) */\r\n initialValues = input<Record<string, string>>({});\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 effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const init = this.initialValues();\r\n if (Object.keys(init).length === 0) return;\r\n this.filterValues.update(current => {\r\n const toApply: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(init)) {\r\n if (!(key in current)) toApply[key] = value;\r\n }\r\n return { ...current, ...toApply };\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 ('' mantiene la key para que el effect no restaure el initialValue)\r\n this.filterValues.update(current => ({ ...current, [filterValue]: '' }));\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 [attr.title]=\"!filterValues()[item.value] ? (item.placeholder || item.label || 'Escribir') : null\"\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 disabled = input<boolean>(false);\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\">\n <input\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n class=\"custom-input\"\n [attr.maxlength]=\"maxLength()\"\n [style.text-transform]=\"uppercase() ? 'uppercase' : null\"\n (input)=\"handleInput($event)\"\n (keyup.enter)=\"search()\"\n [disabled]=\"disabled()\"\n />\n\n @if (value() && mode() === 'search') {\n <button class=\"clear-btn\" (click)=\"clear()\" type=\"button\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\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 <path d=\"M18 6l-12 12\" />\n <path d=\"M6 6l12 12\" />\n </svg>\n </button>\n } @if (mode() === 'search') {\n <button class=\"search-btn\" (click)=\"search()\" type=\"button\" [disabled]=\"disabled()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"56\"\n height=\"56\"\n fill=\"none\"\n viewBox=\"0 0 56 56\"\n >\n <g clip-path=\"url(#clip0_190_2403)\">\n <path\n fill=\"#454733\"\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\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_190_2403\">\n <rect width=\"56\" height=\"56\" fill=\"#fff\" rx=\"28\" />\n </clipPath>\n </defs>\n </svg>\n </button>\n } @else {\n <button class=\"select-btn\" (click)=\"openSelect()\" type=\"button\" [disabled]=\"disabled()\">\n <span class=\"select-chevron icon icon-chevron-down\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n@if (showDropdown()) {\n <div class=\"dropdown-menu\">\n @for (option of options(); track option.code) {\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"selectOption(option)\"\n >\n <span class=\"code\">{{ option.code }}</span>\n <span class=\"dash\">-</span>\n <span class=\"name\">{{ option.name }}</span>\n </button>\n }\n </div>\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 OnDestroy,\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, OnDestroy {\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 private resizeListener?: () => void;\r\n\r\n constructor(private elementRef: ElementRef) {}\r\n\r\n ngOnDestroy(): void {\r\n this.removePositioningListeners();\r\n }\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 this.updatePosition();\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n\r\n requestAnimationFrame(() => {\r\n const input =\r\n this.elementRef.nativeElement.querySelector('.search-input');\r\n if (input) input.focus({ preventScroll: true });\r\n });\r\n\r\n this.addPositioningListeners();\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.openUpward.set(false);\r\n this.removePositioningListeners();\r\n }\r\n\r\n private updatePosition(): void {\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const DROPDOWN_HEIGHT = 260;\r\n\r\n this.openUpward.set(spaceBelow < DROPDOWN_HEIGHT && spaceAbove > spaceBelow);\r\n }\r\n\r\n private addPositioningListeners(): void {\r\n this.removePositioningListeners();\r\n\r\n this.resizeListener = () => {\r\n if (this.isOpen()) this.updatePosition();\r\n };\r\n\r\n window.addEventListener('resize', this.resizeListener);\r\n }\r\n\r\n private removePositioningListeners(): void {\r\n if (this.resizeListener) {\r\n window.removeEventListener('resize', this.resizeListener);\r\n this.resizeListener = undefined;\r\n }\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, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport {\n AbstractControl,\n FormArray,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n} from '@angular/forms';\n\nimport { Subscription } from 'rxjs';\nimport { SelectCustomSearch } from '../select-custom-search/select-custom-search';\nimport { DateTimePicker } from '../date-time-picker/date-time-picker';\nimport { ToggleCustom } from '../toggle-custom/toggle-custom';\n\ntype FieldType =\n | 'text'\n | 'email'\n | 'number'\n | 'date'\n | 'datetime-local'\n | 'select'\n | 'radio'\n | 'checkbox'\n | 'textarea'\n | 'disabled'\n | 'password'\n | 'time'\n | 'file'\n | 'toggle'\n // experimental: formato pesos colombianos ($2.000,74)\n | 'currency-cop';\n\nexport interface Option {\n value: string | number | boolean;\n label: string;\n subtitle?: string;\n}\n\nexport interface FieldConfig {\n key: string;\n label?: string;\n type: FieldType;\n placeholder?: string;\n required?: boolean;\n options?: Option[];\n col?: number;\n disabled?: boolean;\n readonly?: boolean;\n matchWith?: string;\n copyFrom?: string;\n pattern?: string;\n patternType?:\n | 'numbers'\n | 'phone'\n | 'custom'\n | 'text'\n | 'username'\n | 'alphanumeric';\n\n minDate?: Date;\n maxDate?: Date;\n variant?: 'cards';\n /**\n * Solo para checkbox.\n * Fields con el mismo nombre se comportan como radio: al marcar uno se desmarcan los demás.\n */\n radioGroup?: string;\n /**\n * Solo para checkbox.\n * Fields con el mismo nombre permiten selección múltiple pero impiden quedar todos desmarcados.\n */\n atLeastOneGroup?: string;\n /** Controla mayúsculas. Default: true. En checkbox desactiva el estilo visual; en text/number/time desactiva la conversión automática */\n uppercase?: boolean;\n /** Solo para textarea. Número de filas visibles. Default: 6 */\n rows?: number;\n /** Solo para textarea. Permite al usuario redimensionar. Default: true */\n resizable?: boolean;\n}\n\nexport interface SectionConfig {\n title?: string;\n description?: string;\n fields: FieldConfig[];\n}\n\ninterface RealTimeCopyItem {\n fieldKey: string;\n subscription: Subscription;\n}\n\n@Component({\n selector: 'lib-dynamic-form-fields',\n standalone: true,\n imports: [ReactiveFormsModule, SelectCustomSearch, DateTimePicker, ToggleCustom],\n templateUrl: './dynamic-form-fields.html',\n styleUrl: './dynamic-form-fields.css',\n})\nexport class DynamicFormFields implements OnInit, OnDestroy {\n form = input.required<FormGroup>();\n sections = input<SectionConfig[]>([]);\n compact = input<boolean>(false);\n\n private el = inject(ElementRef);\n private copyFromSubscriptions: Subscription[] = [];\n private realTimeCopySubscriptions: RealTimeCopyItem[] = [];\n\n ngOnInit(): void {\n setTimeout(() => {\n this.setupCopyFromLogic();\n this.initCurrencyDisplay();\n }, 100);\n }\n\n getDatePickerMode(fieldType: FieldType): 'date' | 'datetime' {\n return fieldType === 'datetime-local' ? 'datetime' : 'date';\n }\n\n private setupCopyFromLogic(): void {\n this.sections().forEach((section) => {\n section.fields.forEach((field) => {\n if (field.copyFrom) {\n this.setupFieldCopy(field);\n }\n });\n });\n }\n\n private setupFieldCopy(field: FieldConfig): void {\n const targetControl = this.form().get(field.key);\n if (!targetControl) return;\n\n const sourceControl = this.form().get(field.copyFrom!);\n if (!sourceControl) return;\n\n const triggerFieldKey = this.findTriggerField();\n\n if (!triggerFieldKey) {\n this.setupSimpleCopy(sourceControl, targetControl);\n return;\n }\n\n const triggerControl = this.form().get(triggerFieldKey);\n if (!triggerControl) {\n this.setupSimpleCopy(sourceControl, targetControl);\n return;\n }\n\n const subscription = triggerControl.valueChanges.subscribe(\n (shouldCopy: boolean) => {\n if (shouldCopy) {\n targetControl.setValue(sourceControl.value);\n targetControl.disable();\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\n } else {\n targetControl.enable();\n\n targetControl.setValue('');\n this.removeRealTimeCopy(field.key);\n }\n }\n );\n\n this.copyFromSubscriptions.push(subscription);\n\n if (triggerControl.value === true) {\n targetControl.setValue(sourceControl.value);\n targetControl.disable();\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\n }\n }\n\n private findTriggerField(): string {\n for (const section of this.sections()) {\n const triggerField = section.fields.find(\n (f) =>\n f.type === 'radio' &&\n (f.key.includes('is_owner') || f.key.includes('infractor-owner'))\n );\n if (triggerField) return triggerField.key;\n }\n return '';\n }\n\n private setupSimpleCopy(\n sourceControl: AbstractControl,\n targetControl: AbstractControl\n ): void {\n const subscription = sourceControl.valueChanges.subscribe((value) => {\n targetControl.setValue(value);\n });\n this.copyFromSubscriptions.push(subscription);\n }\n\n private setupRealTimeCopy(\n sourceControl: AbstractControl,\n targetControl: AbstractControl,\n fieldKey: string\n ): void {\n this.removeRealTimeCopy(fieldKey);\n\n const subscription = sourceControl.valueChanges.subscribe((value) => {\n targetControl.setValue(value);\n });\n\n this.realTimeCopySubscriptions.push({\n fieldKey,\n subscription,\n });\n }\n\n private removeRealTimeCopy(fieldKey: string): void {\n const index = this.realTimeCopySubscriptions.findIndex(\n (item) => item.fieldKey === fieldKey\n );\n if (index >= 0) {\n this.realTimeCopySubscriptions[index].subscription.unsubscribe();\n this.realTimeCopySubscriptions.splice(index, 1);\n }\n }\n\n /** toggle, checkbox y radio siempre ocupan la fila completa (12 cols) */\n isGroupType(type: FieldType): boolean {\n return type === 'toggle';\n }\n\n getFieldRuns(fields: FieldConfig[]): { isGroup: boolean; fields: FieldConfig[] }[] {\n const runs: { isGroup: boolean; fields: FieldConfig[] }[] = [];\n for (const f of fields) {\n const isGroup = this.isGroupType(f.type);\n const last = runs[runs.length - 1];\n if (last && last.isGroup === isGroup) {\n last.fields.push(f);\n } else {\n runs.push({ isGroup, fields: [f] });\n }\n }\n return runs;\n }\n\n ctrl = (key: string): AbstractControl | null => this.form().get(key);\n\n getCheckboxArray(key: string): FormControl[] | undefined {\n return (this.form().get(key) as FormArray)?.controls as FormControl[];\n }\n\n onCheckboxChange(event: Event, fieldKey: string, optionIndex: number) {\n const checkbox = event.target as HTMLInputElement;\n const checkboxArray = this.getCheckboxArray(fieldKey);\n checkboxArray?.[optionIndex]?.setValue(checkbox.checked);\n }\n\n onCheckboxInteract(event: Event, field: FieldConfig, optionIndex: number) {\n if (field.disabled || field.readonly) {\n (event.target as HTMLInputElement).checked = !!this.getCheckboxArray(field.key)?.[optionIndex]?.value;\n return;\n }\n const { key, radioGroup, atLeastOneGroup } = field;\n\n if (radioGroup) {\n this.getCheckboxArray(key)?.forEach((ctrl, i) => ctrl.setValue(i === optionIndex));\n this.sections().forEach(sec =>\n sec.fields\n .filter(f => f.radioGroup === radioGroup && f.key !== key)\n .forEach(f => this.getCheckboxArray(f.key)?.forEach(ctrl => ctrl.setValue(false)))\n );\n return;\n }\n\n if (atLeastOneGroup) {\n const checkbox = event.target as HTMLInputElement;\n if (!checkbox.checked) {\n const anyOtherInSameField = this.getCheckboxArray(key)?.some((ctrl, i) => i !== optionIndex && ctrl.value);\n const anyOtherInOtherFields = this.sections().some(sec =>\n sec.fields\n .filter(f => f.atLeastOneGroup === atLeastOneGroup && f.key !== key)\n .some(f => this.getCheckboxArray(f.key)?.some(ctrl => ctrl.value))\n );\n if (!anyOtherInSameField && !anyOtherInOtherFields) { checkbox.checked = true; return; }\n }\n this.onCheckboxChange(event, key, optionIndex);\n return;\n }\n\n this.onCheckboxChange(event, key, optionIndex);\n }\n\n // ── currency-cop ─────────────────────────────────────────────────────────\n onCurrencyInput(event: Event, key: string): void {\n const input = event.target as HTMLInputElement;\n const raw = input.value;\n\n // Quitar $ y puntos de miles; conservar dígitos y una coma decimal\n const stripped = raw.replace(/\\$/g, '').replace(/\\./g, '');\n const sanitized = stripped.replace(/[^\\d,]/g, '');\n\n const commaIdx = sanitized.indexOf(',');\n let intStr: string;\n let decStr: string | null = null;\n\n if (commaIdx >= 0) {\n intStr = sanitized.slice(0, commaIdx);\n decStr = sanitized.slice(commaIdx + 1).replace(/,/g, '');\n } else {\n intStr = sanitized;\n }\n\n // Eliminar ceros a la izquierda (\"020\" → \"20\"), preservar \"0\" solo\n intStr = intStr.replace(/^0+(?=\\d)/, '');\n\n const formattedInt = intStr ? intStr.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.') : '';\n\n let displayValue = '';\n if (formattedInt) {\n displayValue = `$${formattedInt}`;\n if (decStr !== null) displayValue += `,${decStr}`;\n } else if (decStr !== null) {\n displayValue = `$0,${decStr}`;\n }\n\n // Actualizar el DOM directamente para preservar el formato\n input.value = displayValue;\n\n const ctrl = this.form().get(key);\n if (!ctrl) return;\n\n const numStr = decStr !== null ? `${intStr || '0'}.${decStr}` : intStr;\n const numericValue = numStr ? parseFloat(numStr) : null;\n // emitModelToViewChange: false evita que Angular sobreescriba el valor formateado\n ctrl.setValue(numericValue, { emitModelToViewChange: false });\n }\n\n private formatCurrencyCOP(value: unknown): string {\n if (value === null || value === undefined || value === '') return '';\n const num = Number(value);\n if (isNaN(num)) return '';\n const parts = num.toString().split('.');\n const intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return parts[1] && Number(parts[1]) > 0 ? `$${intPart},${parts[1]}` : `$${intPart}`;\n }\n\n private initCurrencyDisplay(): void {\n const inputs = this.el.nativeElement.querySelectorAll('[data-currency-key]') as NodeListOf<HTMLInputElement>;\n inputs.forEach((inputEl: HTMLInputElement) => {\n const key = inputEl.getAttribute('data-currency-key');\n if (!key) return;\n const ctrl = this.form().get(key);\n if (ctrl?.value != null && ctrl.value !== '') {\n inputEl.value = this.formatCurrencyCOP(ctrl.value);\n }\n });\n }\n // ─────────────────────────────────────────────────────────────────────────\n\n ngOnDestroy(): void {\n this.copyFromSubscriptions.forEach((sub) => sub.unsubscribe());\n this.realTimeCopySubscriptions.forEach((item) =>\n item.subscription.unsubscribe()\n );\n }\n\n onCancel(): void {\n }\n\n onEnter(event: KeyboardEvent): void {\n if (event.key !== 'Enter') return;\n \n const target = event.target as HTMLElement;\n \n // Permitir salto de línea en textarea con Shift+Enter\n if (target.tagName === 'TEXTAREA' && event.shiftKey) return;\n \n event.preventDefault();\n this.focusNextElement(target);\n }\n\n onUppercaseInput(event: Event, field: FieldConfig) {\n if (field.uppercase === false) return;\n if (['email', 'password'].includes(field.type)) return;\n\n const control = this.form().get(field.key);\n if (!control) return;\n\n const value = control.value;\n if (typeof value !== 'string') return;\n\n const upperValue = value.toUpperCase();\n\n if (value !== upperValue) {\n control.setValue(upperValue);\n }\n }\n \n private focusNextElement(current: HTMLElement): void {\n const form = current.closest('form');\n if (!form) return;\n \n const focusable = Array.from(\n form.querySelectorAll<HTMLElement>(\n 'input:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly]), select:not([disabled]), button:not([disabled])'\n )\n );\n \n const index = focusable.indexOf(current);\n \n // Si hay siguiente input → foco\n if (index >= 0 && index < focusable.length - 1) {\n focusable[index + 1].focus();\n return;\n }\n \n // Si es el último → submit\n const submitBtn = form.querySelector<HTMLButtonElement>(\n 'button[type=\"submit\"]'\n );\n \n submitBtn?.click();\n }\n \n}\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)\"\n />\n } @if (f.type === 'currency-cop') {\n <input\n type=\"text\"\n class=\"input\"\n inputmode=\"decimal\"\n [placeholder]=\"f.placeholder || '$0'\"\n [formControlName]=\"f.key\"\n [attr.data-currency-key]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n (input)=\"onCurrencyInput($event, 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]=\"f.rows ?? 6\"\n [style.resize]=\"(f.resizable ?? true) ? 'vertical' : 'none'\"\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()\">\n <div class=\"header-content\">\n <div class=\"header-top\">\n <div class=\"header-text\">\n <h1>{{ title() }}</h1>\n @if(subtitle()){\n <p>{{ subtitle() }}</p>\n }\n </div>\n \n <button class=\"close-btn\" type=\"button\" (click)=\"onCancel.emit()\">\n ✕\n </button>\n </div>\n </div>\n\n @if (steps() && steps().length > 1) {\n <div class=\"steps\">\n @for (step of steps(); track $index) {\n <div class=\"step\" [class.step-active]=\"currentStep() === $index + 1\"\n [class.step-completed]=\"currentStep() > $index + 1\">\n @if (currentStep() > $index + 1) {\n <span class=\"check-icon\">✔</span>\n }\n <span>Paso {{ $index + 1 }}: {{ step.label }}</span>\n </div>\n\n @if ($index < steps().length - 1) { <span class=\"separator\">›</span>\n } }\n </div>\n }\n\n <div class=\"divider\"></div>\n\n <div class=\"body-content\" [class.scrollable]=\"scrollBody()\" [class.no-scroll]=\"!scrollBody()\">\n @if (!steps() || !steps().length) {\n <ng-content></ng-content>\n } @else {\n <!-- Render dinámico del paso actual -->\n <lib-wizard-form [form]=\"form()\" [currentStep]=\"currentStep()\" [steps]=\"steps()\"\n (canContinue)=\"canContinue.set($event)\"></lib-wizard-form>\n }\n </div>\n\n @if (!hiddenFooterActions()) {\n <div class=\"actions\">\n @if (showActionsLeft()){\n <div class=\"actions-left\">\n <p class=\"file-type\">{{ evidenceHelperText() }}</p>\n <lib-button variant=\"outline\" type=\"button\" (clicked)=\"fileInput.click()\">\n <span class=\"upload-icon icon icon-upload\" aria-hidden=\"true\"></span>\n <span class=\"label-button\">\n {{ evidenceFileName() || evidenceLabel() }}\n </span>\n </lib-button>\n <input #fileInput type=\"file\" hidden [accept]=\"evidenceAccept()\" (change)=\"onFileSelected($event)\" />\n </div>\n }\n\n <div class=\"actions-right\">\n @if (!steps() || steps().length <= 1) { \n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\n Cancelar\n </lib-button>\n } @else if (currentStep() === 1) {\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\n Cancelar\n </lib-button>\n } @else {\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"prevStep()\">\n Volver\n </lib-button>\n }\n\n <lib-button\n variant=\"primary\"\n type=\"button\"\n [disabled]=\"!canContinue()\"\n (clicked)=\"!steps() || !steps().length ? submitForm() : (currentStep() === steps().length ? submitForm() : nextStep())\"\n >\n {{ !steps() || !steps().length ? submitLabel() : currentStep() ===\n steps().length ? submitLabel() : 'Continuar' }}\n </lib-button>\n </div>\n </div>\n }\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 rows: 3,\r\n resizable: false,\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()\">\n <div class=\"modal-card\" [class.modal-card-compact]=\"!isReasonNeeded\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n @if(type != 'info') {\n <div class=\"icono-container\" [ngClass]=\"type\">\n @if (type === 'success') {\n <span class=\"icon icon-check-circle\" aria-hidden=\"true\"></span>\n } @else if(type === 'error') {\n <span class=\"icon icon-x-circle\" aria-hidden=\"true\"></span>\n } @else if (type === 'warning') {\n <span class=\"icon icon-warning\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n <h2>{{ title }}</h2>\n </div>\n\n <div class=\"modal-body\">\n <p>{{ message }}</p>\n <lib-dynamic-form-fields [form]=\"form\" [sections]=\"sections\"></lib-dynamic-form-fields>\n </div>\n <div class=\"modal-footer\">\n @if (confirm) {\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\n } @else {\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\n }\n </div>\n </div>\n</div>\n","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()\">\n <div class=\"modal-card\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <div class=\"modal-header-title\">\n <div class=\"icon-container\" class=\"icono-container\" [ngClass]=\"type\">\n @if(type === 'info') {\n <span class=\"icon icon-check-circle\" aria-hidden=\"true\"></span>\n }\n </div>\n <h2>{{ title }}</h2>\n <p class=\"modal-header-message\">{{ message }}</p>\n </div>\n <button class=\"close-btn\" (click)=\"onCancel()\" aria-label=\"Cerrar\">\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 <path d=\"M18 6l-12 12\" />\n <path d=\"M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"info-container\" [class.expanded]=\"expandedIndex !== null\">\n @for (item of items; track item.key; let i = $index) {\n\n <div class=\"info-item\">\n <div class=\"info-main\" [class.info-main-expanded]=\"item.expandible\" (click)=\"item.expandible && toggle(i)\">\n <span class=\"label\">{{ item.label }} @if (item.expandible) {\n <span class=\"arrow\"> {{ expandedIndex === i ? '▲' : '▼' }} </span>\n }\n </span>\n <span class=\"value\"> {{ item.value }} </span>\n </div>\n\n @if (expandedIndex === i && item.children?.length) {\n <div class=\"info-children\">\n @for (child of item.children; track child.key) {\n <div class=\"info-item child-item\">\n <div class=\"info-main\">\n <span class=\"label\">{{ child.label }}</span>\n <span class=\"value\">{{ child.value }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n }\n </div>\n </div>\n <div class=\"modal-footer\">\n @if (confirm) {\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\n @if(btnMap) {\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 }\n {{ confirmLabel }}\n </button>\n } @else {\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\n @if(btnMap) {\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 }\n {{ confirmLabel }}\n </button>\n }\n </div>\n </div>\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' | 'number';\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 case 'number':\n return isNaN(numValue) ? raw : `${Math.trunc(numValue)}`;\n default:\n return raw;\n }\n });\n\n constructor() {\n // Sincroniza description solo cuando el feature cambia desde el padre,\n // pero nunca pisa un valor que el formulario (writeValue) ya haya establecido.\n effect(() => {\n const feat = this.feature();\n const incoming = feat?.description ?? '';\n if (incoming !== this.descriptionValue()) {\n this.descriptionValue.set(incoming);\n }\n });\n }\n\n // --- ControlValueAccessor Implementation ---\n\n writeValue(value: string | number | undefined | null): void {\n const nextDescription = value == null ? '' : String(value);\n this.descriptionValue.set(nextDescription);\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 === 'number') {\n // Solo dígitos enteros\n nextDescription = nextDescription.replace(/[^0-9]/g, '');\n\n // Aplicar límite máximo en tiempo real\n if (currentFeature.max !== undefined && nextDescription !== '') {\n const numericValue = parseInt(nextDescription, 10);\n if (!isNaN(numericValue) && numericValue > currentFeature.max) {\n nextDescription = currentFeature.max.toString();\n }\n }\n\n if (target.value !== nextDescription) {\n target.value = nextDescription;\n }\n } else 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 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', 'number'].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 icon-edit\" 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\">\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\n <div class=\"element-header\">\n @if (modeSideCard === 'create' && showTypeSelector) {\n <div class=\"button-group\">\n <button class=\"btn-type\" [class.active]=\"selectedType === 'radial'\" (click)=\"selectType('radial')\">\n Radial\n </button>\n <button class=\"btn-type\" [class.active]=\"selectedType === 'poligonal'\" (click)=\"selectType('poligonal')\">\n Poligonal\n </button>\n </div>\n }\n <div class=\"text-container\">\n <input #inputRef type=\"text\" class=\"input-field\" [placeholder]=\"placeholder\" [value]=\"value\"\n (input)=\"onInput($event)\" [disabled]=\"modeSideCard === 'info'\" />\n @if(modeSideCard === 'create' || modeSideCard === 'edit'){\n <span class=\"icon icon-edit\" (click)=\"focusInput(inputRef)\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"icon icon-settings\" (click)=\"buttonClickIcon()\" aria-hidden=\"true\"></span>\n }\n </div>\n\n @if(modeSideCard === 'edit' || modeSideCard === 'info'){\n <span #statusChip class=\"status-chip\" [class.status-chip--disabled]=\"modeSideCard === 'info'\" [ngClass]=\"statusClass\" (click)=\"changeStatusLabel()\">\n {{ statusLabel }}\n </span>\n }\n </div>\n @for (section of sections; track section.title) {\n <div class=\"element-section\">\n <h3>{{ section.title }}</h3>\n\n <div class=\"element-content\">\n @if (section.items?.length) { @for (item of section.items; track\n item.label) {\n <div class=\"element-item\">\n <span class=\"label\">{{ item.label }}</span>\n <span class=\"value\">{{ item.value }}</span>\n </div>\n } } @if (section.showSlider) {\n <div class=\"element-item\">\n <span class=\"label\">{{ sliderLabel }}</span>\n <span class=\"value\">{{ sliderValue }} {{ sliderUnit }}</span>\n </div>\n @if (modeSideCard !== 'info') {\n <input type=\"range\" class=\"slider\" [min]=\"min\" [max]=\"max\" [value]=\"sliderValue\"\n [style.--slider-value]=\"sliderPercentage\" step=\"0.01\" (input)=\"onSliderChange($event)\" />\n }} @if (section.buttonSectionLabel && modeSideCard !== 'info') {\n <button class=\"btn-assign\" (click)=\"onButtonSectionClick(section)\">{{ section.buttonSectionLabel }}</button>\n }\n </div>\n </div>\n }\n\n <div class=\"side-card-actions\">\n @if (showBtnPrimary) {\n <button class=\"btn-primary\" (click)=\"onButtonClick('primary')\">{{ primaryButtonLabel }}</button>\n }\n @if (showBtnSecondary) {\n <button class=\"btn-secondary\" (click)=\"onButtonClick('secondary')\">{{ secondaryButtonLabel }}</button>\n }\n </div>\n </div>\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\">\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\n <div class=\"element-header\">\n <span class=\"back-icon icon icon-arrow-left\" (click)=\"buttonClickIcon('back')\" aria-hidden=\"true\"></span>\n\n <div class=\"text-container\">\n <span class=\"title\"> {{ title }} </span>\n <span class=\"subtitle\"> {{ subtitle }} </span>\n <div class=\"container-chip\">\n <span #statusChip class=\"status-chip\" [ngClass]=\"statusClass\">\n {{ statusLabel }}\n </span>\n </div>\n </div>\n\n <div class=\"right-icons\">\n <span class=\"icon icon-location\"\n (click)=\"buttonClickIcon('location')\" aria-hidden=\"true\"></span>\n\n <!-- message + modal -->\n <div class=\"message-icon-wrapper\">\n <span class=\"icon icon-message\"\n (click)=\"buttonClickIcon('message')\" aria-hidden=\"true\"></span>\n\n <!-- @if (showMessageModal) {\n <div class=\"message-modal-anchor\">\n <lib-notification-modal (buttonClick)=\"onNotify($event)\" />\n </div>\n } -->\n </div>\n </div>\n </div>\n <div class=\"side-tabs\">\n <div class=\"tab\" [class.active]=\"activeTab === 'principal'\" (click)=\"setTab('principal')\">\n Principal\n </div>\n\n <div class=\"tab\" [class.active]=\"activeTab === 'historial'\" (click)=\"setTab('historial')\">\n Historial\n </div>\n\n <div class=\"tab-indicator\" [style.left]=\"getIndicatorLeft()\"></div>\n </div>\n <div class=\"body-content\">\n @for (section of sections; track section.title) {\n <div class=\"element-section\">\n <h3>{{ section.title }}</h3>\n\n <div class=\"element-content\">\n @if (section.items?.length) { @for (item of section.items; track\n item.key) {\n <div class=\"element-item\">\n <span class=\"label\">{{ item.label }}</span>\n <span class=\"value\">{{ isDateValue(item.value) ? getRelativeTime(item.value) : item.value }}</span>\n </div>\n } }\n </div>\n </div>\n }\n </div>\n </div>\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\">\n <div class=\"carousel-wrapper\">\n\n @if (canScrollLeft) {\n <button class=\"nav left\" (click)=\"scroll(list,'left')\">\n <span class=\"nav-icon icon icon-chevron-left\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <div class=\"carousel-mask\">\n <div class=\"carousel-list\" #list (scroll)=\"onScroll(list)\">\n @for (d of devices; track d.androidId) {\n <div class=\"device-card\">\n <div class=\"card-header\">\n <div class=\"header-title-wrapper\">\n <span class=\"code\">{{ d.code }} - {{ d.name }}</span>\n <span class=\"geofence\">{{ d.geofenceName }}</span>\n </div>\n <span class=\"target icon icon-location\"\n (click)=\"buttonClickIcon(d)\" aria-hidden=\"true\"></span>\n </div>\n\n <div class=\"device-info\">\n <span>{{ d.deviceInfo }}</span>\n <div class=\"icons\">\n @if (d.status.wifi) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\">\n <title>En Línea</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Fuera de Línea</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n } @if (getBatteryLevel(d.status.batteryPercentage) >= 4) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>76-100%</title>\n <path\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\" />\n </g>\n </svg>\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 3) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>51-75%</title>\n <path\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\" />\n </g>\n </svg>\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 2) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>21-50%</title>\n <path\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\" />\n </g>\n </svg>\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 1) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>1-20%</title>\n <path\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\" />\n </g>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>0%</title>\n <path\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\" />\n </g>\n </svg>\n }\n @if (d.status.signalStatus! >= 4) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Excelente</title>\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667z\" />\n </svg>\n } @else if (d.status.signalStatus! == 3) { <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>Buena</title>\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\n <path id=\"Combined-Shape\"\n d=\"M426.667 0v341.333H0zM384 88.747l-85.334 68.266v141.653H384z\" />\n </g>\n </g>\n </g>\n </svg>\n } @else if (d.status.signalStatus! == 2) { <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>Regular</title>\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\n <path id=\"Combined-Shape\"\n d=\"M426.667 0v341.333H0zM384 88.747 213.333 225.28v73.386H384z\" />\n </g>\n </g>\n </g>\n </svg>\n } @else if (d.status.signalStatus! == 1) { <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>Mala</title>\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\n <path id=\"Combined-Shape\"\n d=\"M426.667 0v341.333H0zM384 88.747 170.666 259.413v39.253H384z\" />\n </g>\n </g>\n </g>\n </svg>\n } @else { <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Sin Señal</title>\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667zm15-1.666H5.692L16.667 5.692z\" />\n </svg>\n }\n @if (d.status.bluetooth) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Conectado</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Desconectado</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n }\n @if (d.status.gps) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <g clip-path=\"url(#clip0_3_9268)\">\n <title>Localizado</title>\n <path fill=\"#454733\"\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\" />\n </g>\n <defs>\n <clipPath id=\"clip0_3_9268\">\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n </clipPath>\n </defs>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <g clip-path=\"url(#clip0_3_9268)\">\n <title>No Localizado</title>\n <path fill=\"#454733\"\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\" />\n </g>\n <defs>\n <clipPath id=\"clip0_3_9268\">\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n </clipPath>\n </defs>\n </svg>\n }\n </div>\n </div>\n <div class=\"card-footer\">\n <span class=\"badge\" [ngClass]=\"getGeofenceClass(d.status.geofence)\">\n {{ d.status.geofence === 'inside' ? 'DENTRO DE GEOCERCA' : 'FUERA DE GEOCERCA' }}\n </span>\n\n <span class=\"badge update\">{{ getRelativeTime(d.lastUpdate) }}</span>\n </div>\n\n </div>\n }\n </div>\n </div>\n\n @if (canScrollRight) {\n <button class=\"nav right\" (click)=\"scroll(list,'right')\">\n <span class=\"nav-icon icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n }\n </div>\n\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 initialValues = input<Record<string, string>>({});\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 effect(() => {\n const trigger = this.clearTrigger();\n if (trigger > 0) this.resetAllFilters();\n });\n\n effect(() => {\n const init = this.initialValues();\n if (Object.keys(init).length === 0) return;\n this.filterValues.update(current => {\n const toApply: Record<string, string> = {};\n for (const [key, value] of Object.entries(init)) {\n if (!(key in current)) toApply[key] = value;\n }\n return { ...current, ...toApply };\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) => ({ ...current, [filterValue]: '' }));\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 [attr.title]=\"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, effect, ElementRef, input, output, signal, untracked, 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\ninterface PerConfigInitial {\n textValues: Record<string, string>;\n dateValue: Date | string | null;\n dateFilterType: string | null;\n}\n\ntype FilterButtonMode = 'toggle' | 'action' | 'click' | 'clickRight' | 'none';\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 /**\n * Estado previo de filtros para restaurar al volver a la pantalla.\n * Misma estructura que emite filtersChange.\n */\n initialFilters = input<Record<string, string | number | Date | null>>({});\n\n /** Slice de initialFilters mapeado por posición de cada grupo en filtersConfig */\n readonly initialFiltersPerConfig = computed((): PerConfigInitial[] => {\n const init = this.initialFilters();\n return this.normalizedFiltersConfig().map(config => {\n if (config.type === 'date' || config.type === 'datetime') {\n for (const f of config.filters) {\n const v = init[f.value];\n if (v instanceof Date || (typeof v === 'string' && v)) {\n return { textValues: {}, dateValue: v as Date | string, dateFilterType: f.value };\n }\n }\n return { textValues: {}, dateValue: null, dateFilterType: null };\n }\n const textValues: Record<string, string> = {};\n for (const f of config.filters) {\n const v = init[f.value];\n if (v !== null && v !== undefined) textValues[f.value] = String(v);\n }\n return { textValues, dateValue: null, dateFilterType: null };\n });\n });\n\n constructor() {\n // Restaura selectedTextFilters y selectedDates para que \"Aplicar Filtros\"\n // emita los valores correctos al volver a la pantalla.\n effect(() => {\n const init = this.initialFilters();\n if (Object.keys(init).length === 0) return;\n\n const configs = untracked(() => this.normalizedFiltersConfig());\n const dateKeys = new Set<string>(\n configs\n .filter(c => c.type === 'date' || c.type === 'datetime')\n .flatMap(c => c.filters.map(f => f.value))\n );\n\n const textVals: Record<string, string> = {};\n const dateVals: SelectedDatesMap = {};\n\n for (const [key, value] of Object.entries(init)) {\n if (value === null || value === undefined) continue;\n if (dateKeys.has(key)) {\n if (value instanceof Date) {\n dateVals[key] = value;\n } else if (typeof value === 'string' && value) {\n const parsed = new Date(value);\n dateVals[key] = isNaN(parsed.getTime()) ? null : parsed;\n }\n } else {\n textVals[key] = String(value);\n }\n }\n\n this.selectedTextFilters.set(textVals);\n this.selectedDates.set(dateVals);\n });\n }\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 <span class=\"button-back-icon icon-arrow-left\" aria-hidden=\"true\"></span>\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 <span class=\"filter-toggle-icon icon-filter\" aria-hidden=\"true\"></span>\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; let i = $index) {\n @switch (config.type) {\n @case ('text') {\n <lib-input-text-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('number') {\n <lib-input-number-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('select') {\n <lib-input-select-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('date') {\n <lib-date-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValue]=\"initialFiltersPerConfig()[i].dateValue\"\n [initialFilterType]=\"initialFiltersPerConfig()[i].dateFilterType\"\n (dateSelected)=\"onDateSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('time') {\n <lib-input-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\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\">\n <div class=\"notification-modal-header\">\n <h3>{{ titulo }}</h3>\n </div>\n <div class=\"notification-modal-body\">\n <!-- LISTA DE MENSAJES -->\n @if (mode === 'list') {\n <div class=\"default-message-list\">\n @for (msg of defaultMessages; track msg) {\n <div class=\"default-message-item\" (click)=\"selectDefaultMessage(msg)\">\n <span>{{ msg }}</span>\n <span class=\"send-icon icon icon-send\" aria-hidden=\"true\"></span>\n </div>\n }\n </div>\n }\n\n <!-- EDICIÓN -->\n @if (mode === 'edit') {\n <div class=\"text-area-wrapper\">\n <textarea #messageInput class=\"message-textarea\" rows=\"5\" placeholder=\"Mensaje...\" [formControl]=\"messageControl\"></textarea>\n </div>\n }\n\n </div>\n\n <div class=\"notification-modal-actions\">\n @if (mode === 'edit') {\n <button class=\"btn-back\" (click)=\"backToList()\">\n Volver\n </button>\n <button class=\"btn-custom\" [disabled]=\"!messageControl.value.trim()\" (click)=\"btnClick()\">\n Notificar\n </button>\n } @else {\n <button class=\"btn-custom\" (click)=\"customMessage()\">\n Personalizado\n </button>\n }\n </div>\n</div>","import { Component, input } from '@angular/core';\n\n/**\n * Footer compacto anclado al borde inferior del viewport.\n *\n * Colócalo como hermano del área con scroll (no dentro de ella):\n * ```\n * <div class=\"footer-layout\"> <!-- importar footer-layout.css -->\n * <main class=\"footer-layout__content\">...</main>\n * <lib-footer />\n * </div>\n * ```\n */\n@Component({\n selector: 'lib-footer',\n standalone: true,\n imports: [],\n templateUrl: './footer.html',\n styleUrl: './footer.css',\n})\nexport class Footer {\n backgroundColor = input<string>('#F0F0DB');\n textColor = input<string>('#787861');\n /** Color del texto destacado (marca). Si no se define, hereda textColor */\n highlightColor = input<string | undefined>(undefined);\n year = input<number>(new Date().getFullYear());\n}\n","<footer\n class=\"footer\"\n [style.background-color]=\"backgroundColor()\"\n [style.color]=\"textColor()\"\n>\n <ng-content>\n © {{ year() }}\n <span [style.color]=\"highlightColor() ?? textColor()\">PAICO · Sistemas y Aplicaciones en Línea.</span>\n Todos los derechos reservados.\n </ng-content>\n</footer>\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()) {\n\n<!-- MODO SINGLE -->\n<button class=\"opcion-boton\" [class.opcion-activa]=\"selectedSingle()\"\n [class.opcion-success]=\"selectedSingle() && isSuccess()\" [class.opcion-danger]=\"selectedSingle() && isDanger()\"\n (click)=\"toggleSingle()\">\n\n <div class=\"opcion-contenido\">\n <div class=\"opcion-icono-container\" [class.icono-activo]=\"selectedSingle()\">\n\n @if (isSuccess()) {\n <span class=\"icon icon-check-circle\" [class.icon-success]=\"selectedSingle() && isSuccess()\" aria-hidden=\"true\"></span>\n } @else if(isDanger()) {\n <span class=\"icon icon-x-circle\" [class.icon-danger]=\"selectedSingle() && isDanger()\" aria-hidden=\"true\"></span>\n }\n </div>\n\n <div class=\"opcion-textos\">\n <div class=\"opcion-titulo\" [class.titulo-success]=\"selectedSingle() && isSuccess()\"\n [class.titulo-danger]=\"selectedSingle() && isDanger()\">\n {{ label() }}\n </div>\n\n <div class=\"opcion-subtitulo\" [class.subtitulo-success]=\"selectedSingle() && isSuccess()\"\n [class.subtitulo-danger]=\"selectedSingle() && isDanger()\">\n {{ subtitle() }}\n </div>\n </div>\n </div>\n\n @if (selectedSingle()) {\n <div class=\"indicador-seleccion\">\n <div class=\"indicador-punto\" [class.punto-success]=\"isSuccess()\" [class.punto-danger]=\"isDanger()\">\n </div>\n </div>\n }\n</button>\n\n} @else {\n<!-- MODO GROUP -->\n<div class=\"columnCards\">\n @for (option of options(); track option.variant) {\n <button class=\"opcion-boton\" [class.opcion-activa]=\"isSelected(option.variant)\"\n [class.opcion-success]=\"isSelected(option.variant) && option.variant === 'success'\"\n [class.opcion-danger]=\"isSelected(option.variant) && option.variant === 'danger'\"\n (click)=\"selectGroup(option.variant)\">\n <div class=\"opcion-contenido\">\n <div class=\"opcion-icono-container\">\n @if (option.variant === 'success') {\n <span class=\"icon icon-check-circle\" aria-hidden=\"true\"></span>\n } @else if(option.variant === 'danger') {\n <span class=\"icon icon-x-circle\" [class.icon-danger]=\"isSelected(option.variant) && option.variant === 'danger'\" aria-hidden=\"true\"></span>\n }\n </div>\n\n <div class=\"opcion-textos\">\n <div class=\"opcion-titulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\n {{ option.label }}\n </div>\n\n <div class=\"opcion-subtitulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\n {{ option.subtitle }}\n </div>\n </div>\n </div>\n\n @if (isSelected(option.variant)) {\n <div class=\"indicador-seleccion\">\n <div class=\"indicador-punto\" [class.punto-success]=\"option.variant === 'success'\"\n [class.punto-danger]=\"option.variant === 'danger'\">\n </div>\n </div>\n }\n </button>\n }\n</div>\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, input, model, output, OnChanges, SimpleChanges } 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 implements OnChanges {\r\n /** Clave externa que cambia cuando el contexto del tab cambia. Al detectar el cambio se limpia searchValue. */\r\n tabKey = input<string | null>(null);\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['tabKey'] && !changes['tabKey'].firstChange) {\r\n this.searchValue.set('');\r\n }\r\n }\r\n\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 con clave estable por tab+índice (no usa signal en el track) */\r\n readonly activeCards = computed<(TabCardConfig & { _tabKey: string })[] | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n if (!tab?.cards) return null;\r\n return tab.cards.map((card, i) => ({ ...card, _tabKey: `${String(a)}-${i}` }));\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 card._tabKey) {\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 [tabKey]=\"card._tabKey\"\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\">\n <div class=\"no-data-container\">\n <span class=\"inbox-icon icon icon-inbox\" aria-hidden=\"true\"></span>\n <div class=\"title2\">{{ title() }}</div>\n @if(showButton()){\n <button class=\"button-medium-primary\" (click)=\"openModal.emit()\">\n <span class=\"icon icon-add\" aria-hidden=\"true\"></span>\n <div class=\"label\">{{ buttonLabel() }}</div>\n </button>\n }\n </div>\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 ×\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, TitleComponent } 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 TitleComponent\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 chartInit = output<any>();\r\n\r\n onChartClick(event: any) {\r\n this.chartClick.emit(event);\r\n }\r\n\r\n onChartInit(chart: any) {\r\n this.chartInit.emit(chart);\r\n }\r\n}\r\n","<div echarts class=\"ui-base-chart\" [options]=\"options()\" [autoResize]=\"true\" (chartClick)=\"onChartClick($event)\" (chartInit)=\"onChartInit($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 threshold = horizontal ? 6 : 12;\r\n const showScroll = data.length > threshold;\r\n const zoomEnd = showScroll ? Math.floor((threshold / 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 // Legend tooltip: shows name + value on hover\r\n const dataMap = new Map(data.map(d => [d.label, d.value]));\r\n const legendTooltip = {\r\n show: true,\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: 'border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,0.10);padding:8px 10px;',\r\n formatter: (params: any) => {\r\n const name = typeof params === 'string' ? params : params?.name;\r\n const val = dataMap.get(name);\r\n return val !== undefined ? `${name}: <b>${val}</b>` : name;\r\n },\r\n };\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 tooltip: legendTooltip,\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 tooltip: legendTooltip,\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 tooltip: legendTooltip,\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 host: { '[attr.title]': 'null' },\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 private chartInstance: any = null;\r\n\r\n onChartInit(chart: any) {\r\n this.chartInstance = chart;\r\n\r\n chart.on('legendselectchanged', (event: any) => {\r\n const selected: Record<string, boolean> = event.selected;\r\n const currentData = this.displayData();\r\n\r\n const visibleTotal = currentData\r\n .filter(item => selected[item.label] !== false)\r\n .reduce((sum, item) => sum + item.value, 0);\r\n\r\n chart.setOption({\r\n title: { text: `${visibleTotal}` }\r\n });\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)\" (chartInit)=\"onChartInit($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 type: 'piecewise',\n min: minVal,\n max: maxVal,\n splitNumber: 5,\n orient: 'horizontal',\n left: 'center',\n bottom: '0',\n itemWidth: 14,\n itemHeight: 14,\n itemGap: 8,\n itemSymbol: 'rect',\n showLabel: false, // Hide the \"10-20\" piece labels\n text: ['Más', 'Menos'], // Labels at the max and min ends\n textStyle: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n fontWeight: 500\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, ElementRef, input, ViewChild } 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 GeoPointCameras {\r\n id: number;\r\n name: string;\r\n latitude: number;\r\n longitude: number;\r\n locationLabel: string;\r\n total: number;\r\n by_code: Record<string, number>;\r\n}\r\n\r\nexport interface GeoMapResponse {\r\n points?: GeoPoint[];\r\n cameras?: GeoPointCameras[];\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 cameras = input<GeoPointCameras[]>([]);\r\n\r\n @ViewChild('mapContainer', { static: true }) mapContainer!: ElementRef<HTMLDivElement>;\r\n\r\n public map!: google.maps.Map;\r\n private markers: google.maps.marker.AdvancedMarkerElement[] = [];\r\n private cameraMarkers: google.maps.marker.AdvancedMarkerElement[] = [];\r\n\r\n constructor() {\r\n // Reactivo a cambios de puntos\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 // Reactivo a cambios de cámaras\r\n effect(() => {\r\n const cams = this.cameras();\r\n if (this.map && cams.length > 0) {\r\n this.renderCameras(cams);\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 = this.mapContainer?.nativeElement;\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 // Render cameras if they already exist when map is ready\r\n if (this.cameras().length > 0) {\r\n this.renderCameras(this.cameras());\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 statusColor = point.immobilized ? '#ef4444' : '#3b82f6';\r\n\r\n const content = `\r\n <div style=\"padding:0 12px 12px 12px;font-family:'Inter',-apple-system,sans-serif;\r\n min-width:200px;color:#374151;\">\r\n <div style=\"font-weight:700;font-size:15px;color:#111827;\">\r\n ${point.subpoenaNumber}\r\n ${point.immobilized ? '<span style=\"font-size:11px;background:#ef4444;color:white;border-radius:4px;padding:1px 6px;margin-bottom:8px;vertical-align:middle;\">Inmovilizado</span>' : ''}\r\n </div>\r\n\r\n <div style=\"font-size:12px;color:#9ca3af;margin-bottom:10px;display:flex;gap:8px;\">\r\n <span>📍 ${point.locationLabel}</span>\r\n </div>\r\n\r\n <div style=\"display:flex;flex-direction:column;gap:4px;\">\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">Fecha</span>\r\n <span style=\"font-weight:600;color:#374151;\">${new Date(point.dateTime).toLocaleString('es-CO', { day:'2-digit', month:'2-digit', year:'numeric', hour:'2-digit', minute:'2-digit', hour12:false })}</span>\r\n </div>\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">Infracción</span>\r\n <span style=\"font-weight:600;color:#374151;\">${point.infractionCode}</span>\r\n </div>\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">Placa</span>\r\n <span style=\"font-weight:600;color:#374151;\">${point.plate}</span>\r\n </div>\r\n <div style=\"border-top:1px solid #e5e7eb;margin-top:6px;padding-top:6px;\r\n display:flex;justify-content:space-between;font-size:13px;font-weight:700;\">\r\n <span style=\"color:${statusColor};\">Estado</span>\r\n <span style=\"display:flex;align-items:center;gap:6px;color:${statusColor};\">\r\n <span style=\"width:8px;height:8px;border-radius:50%;background-color:${statusColor};\"></span>\r\n ${point.immobilized ? 'Inmovilizado' : 'Normal'}\r\n </span>\r\n </div>\r\n </div>\r\n </div>`;\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 // ─── GeoPointCameras markers ─────────────────────────────────────────────────\r\n\r\n private clearCameraMarkers() {\r\n this.cameraMarkers.forEach(m => (m.map = null));\r\n this.cameraMarkers = [];\r\n }\r\n\r\n private renderCameras(cameras: GeoPointCameras[]) {\r\n this.clearCameraMarkers();\r\n const infoWindow = new google.maps.InfoWindow();\r\n let lockedMarker: google.maps.marker.AdvancedMarkerElement | null = null;\r\n\r\n // 1. Encontrar el total mayor para destacarlo\r\n const maxTotal = Math.max(...cameras.map(c => c.total));\r\n\r\n // 2. Centrar el mapa para que se vean todas las cámaras al inicio\r\n if (cameras.length > 0) {\r\n const bounds = new google.maps.LatLngBounds();\r\n cameras.forEach(c => bounds.extend({ lat: c.latitude, lng: c.longitude }));\r\n this.map.fitBounds(bounds);\r\n }\r\n\r\n cameras.forEach(cam => {\r\n // 3. Color diferente si es el de mayor total\r\n const isTop = cam.total === maxTotal;\r\n const bgColor = isTop ? '#dc2626' : '#7c3aed'; // rojo para el top, morado para el resto\r\n\r\n const pin = document.createElement('div');\r\n pin.innerHTML = `\r\n <div style=\"\r\n background:${bgColor}; color:white; border-radius:8px;\r\n padding:4px 8px; font-size:12px; font-weight:700;\r\n border:2px solid white; box-shadow:0 2px 6px rgba(0,0,0,.3);\r\n display:flex; align-items:center; gap:4px; cursor:pointer; white-space:nowrap;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\r\n fill=\"white\">\r\n <path d=\"M15 8v8H5V8h10m1-2H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0\r\n 1-1v-3.5l4 4v-11l-4 4V7a1 1 0 0 0-1-1z\"/>\r\n </svg>\r\n ${cam.total}\r\n </div>`;\r\n\r\n const marker = new google.maps.marker.AdvancedMarkerElement({\r\n position: { lat: cam.latitude, lng: cam.longitude },\r\n map: this.map,\r\n content: pin,\r\n title: cam.name,\r\n });\r\n\r\n const codesHtml = Object.entries(cam.by_code)\r\n .map(([code, count]) => `\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">${code}</span>\r\n <span style=\"font-weight:600;color:#374151;\">${count}</span>\r\n </div>`)\r\n .join('');\r\n\r\n const content = `\r\n <div style=\"padding:0 12px 12px 12px;font-family:'Inter',-apple-system,sans-serif;\r\n min-width:200px;color:#374151;\">\r\n <div style=\"font-weight:700;font-size:15px;color:#111827;\">\r\n ${cam.name}\r\n ${isTop ? '<span style=\"font-size:11px;background:#dc2626;color:white;border-radius:4px;padding:1px 6px;margin-bottom:8px;vertical-align:middle;\">Más Infracciones</span>' : ''}\r\n </div>\r\n <!-- <div style=\"font-size:12px;color:#9ca3af;margin-bottom:4px;\">ID: ${cam.id}</div> -->\r\n\r\n <!-- 4. Coordenadas en el tooltip -->\r\n <div style=\"font-size:12px;color:#9ca3af;margin-bottom:10px;display:flex;gap:8px;\">\r\n <span>📍 ${cam.locationLabel}</span>\r\n </div>\r\n\r\n <div style=\"display:flex;flex-direction:column;gap:4px;\">\r\n <div style=\"margin-top:8px;font-size:14px;color:#6b7280;\">Código(s) de Infracciones</div>\r\n ${codesHtml}\r\n <div style=\"border-top:1px solid #e5e7eb;margin-top:6px;padding-top:6px;\r\n display:flex;justify-content:space-between;font-size:13px;font-weight:700;\">\r\n <span style=\"color:${bgColor};\">Total</span>\r\n <span style=\"color:${bgColor};\">${cam.total}</span>\r\n </div>\r\n </div>\r\n </div>`;\r\n\r\n marker.addListener('mouseover', () => {\r\n if (!lockedMarker) { infoWindow.setContent(content); infoWindow.open(this.map, marker); }\r\n });\r\n marker.addListener('mouseout', () => { if (!lockedMarker) infoWindow.close(); });\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 infoWindow.addListener('closeclick', () => { lockedMarker = null; });\r\n\r\n this.cameraMarkers.push(marker);\r\n });\r\n }\r\n}\r\n","<div #mapContainer class=\"map\"></div>\r\n","import { Component, computed, input, signal } from '@angular/core';\r\nimport { GeoAPIMaps, GeoPoint, GeoPointCameras } 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 cameras = input<GeoPointCameras[]>([]);\r\n\r\n immobilizedCount = computed(() => this.points().filter(p => p.immobilized).length);\r\n normalCount = computed(() => this.points().filter(p => !p.immobilized).length);\r\n totalCameras = computed(() => this.cameras().length);\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()\" [cameras]=\"cameras()\" />\r\n </div>\r\n @if (points().length > 0) {\r\n <div class=\"map-summary\">\r\n <span class=\"map-badge blue\">\r\n <span class=\"map-dot blue\"></span>\r\n Normal: {{ normalCount() }}\r\n </span>\r\n <span class=\"map-badge red\">\r\n <span class=\"map-dot red\"></span>\r\n Inmovilizado: {{ immobilizedCount() }}\r\n </span>\r\n <span class=\"map-badge total\">Total: {{ points().length }}</span>\r\n </div>\r\n }\r\n @if (cameras().length > 0) {\r\n <div class=\"map-summary\">\r\n <span class=\"map-badge purple\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M15 8v8H5V8h10m1-2H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-3.5l4 4v-11l-4 4V7a1 1 0 0 0-1-1z\"/>\r\n </svg>\r\n Cámaras: {{ totalCameras() }}\r\n </span>\r\n </div>\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 { 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()\">✕</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()\">×</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 ‹\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 ›\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>","import { DatePipe, NgClass } from '@angular/common';\r\nimport { Component, input, signal } from '@angular/core';\r\n\r\nexport interface DataCard {\r\n title: string;\r\n time: string;\r\n date: string;\r\n previousStatus?: any;\r\n currentStatus?: any;\r\n type: string;\r\n responsible?: string;\r\n description?: string;\r\n actionType?: 'create' | 'update' | 'delete';\r\n}\r\n\r\nexport interface HistorialEntry {\r\n tipo: 'estado' | 'documento' | string;\r\n titulo: string;\r\n id?: string | number;\r\n detalle?: string;\r\n previousState?: string;\r\n currentState?: string;\r\n createdBy?: string;\r\n creationDate?: string | Date;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-card-history',\r\n imports: [NgClass, DatePipe],\r\n templateUrl: './card-history.html',\r\n styleUrl: './card-history.css',\r\n})\r\nexport class CardHistory {\r\n DataCard = input<DataCard>();\r\n historialEntry = input<HistorialEntry>();\r\n isExpanded = signal(false);\r\n withResponsible = input<boolean>(true);\r\n variant = input<'history' | 'default'>('default');\r\n\r\n private months = [\r\n 'enero',\r\n 'febrero',\r\n 'marzo',\r\n 'abril',\r\n 'mayo',\r\n 'junio',\r\n 'julio',\r\n 'agosto',\r\n 'septiembre',\r\n 'octubre',\r\n 'noviembre',\r\n 'diciembre',\r\n ];\r\n\r\n toggleExpanded() {\r\n this.isExpanded.set(!this.isExpanded());\r\n }\r\n\r\n formatDate(isoDate: string): string {\r\n\r\n const date = new Date(isoDate);\r\n const day = date.getDate();\r\n const month = this.months[date.getMonth()];\r\n const year = date.getFullYear();\r\n\r\n return `${day} ${month} ${year}`;\r\n }\r\n\r\n // getBadgeClass(status: string): string {\r\n // const statusLower = status.toLowerCase();\r\n \r\n // if (statusLower.includes('operativo') || statusLower.includes('operacional')) {\r\n // return 'badge-operational';\r\n // } else if (statusLower.includes('mantenimiento')) {\r\n // return 'badge-maintenance';\r\n // } else if (statusLower.includes('sin ficha') || statusLower.includes('sin fecha')) {\r\n // return 'badge-no-date';\r\n // }\r\n \r\n // return 'badge-operational'; \r\n // }\r\n\r\n private readonly statusData: {\r\n [key: string]: { label: string; class: string };\r\n } = {\r\n activo: { label: 'Activo', class: 'badge-active' },\r\n inactivo: { label: 'Inactivo', class: 'badge-inactive' },\r\n eliminado: { label: 'Eliminado', class: 'badge-retired' },\r\n obsoleto: { label: 'Obsoleto', class: 'badge-obsolete' },\r\n operativo: { label: 'Operativo', class: 'badge-operativo' },\r\n mantenimiento: { label: 'En mantenimiento', class: 'badge-maintenance' },\r\n fallas: { label: 'Con fallas', class: 'badge-failures' },\r\n baja: { label: 'Dado de baja', class: 'badge-deactivated' },\r\n default: { label: 'Desconocido', class: 'badge-default' },\r\n };\r\n\r\n \r\n private readonly statusLabels: Record<string, string> = {\r\n pending: 'Pendiente',\r\n active: 'Activo',\r\n defaulted: 'En mora',\r\n completed: 'Completado',\r\n cancelled: 'Cancelado',\r\n restructured: 'Reestructurado',\r\n in_process: 'En proceso',\r\n paid: 'Pagado',\r\n delinquent_30: 'Vencido 30 días',\r\n delinquent_60: 'Vencido 60 días',\r\n delinquent_90: 'Vencido 90 días'\r\n };\r\n \r\n getBadgeClass(status: string): string {\r\n const normalizedStatus = status?.toLowerCase().trim();\r\n return this.statusData[normalizedStatus]?.class ?? this.statusData['default'].class;\r\n }\r\n\r\n statusLabel(status: string): string {\r\n const normalized = (status ?? '').toString().trim();\r\n const normalizedKey = normalized.toLowerCase();\r\n return this.statusLabels[normalizedKey] ?? normalized;\r\n }\r\n\r\n historialItemTitle(entry: { reason?: string; previousState?: string; currentState?: string }): string {\r\n const reason = (entry.reason ?? '').trim();\r\n if (reason) {\r\n return this.toTitleCase(reason);\r\n }\r\n\r\n const current = entry.currentState ? this.statusLabel(entry.currentState) : '';\r\n if (current) {\r\n return `Cambió estado a ${current}`;\r\n }\r\n\r\n return 'Movimiento registrado';\r\n }\r\n\r\n private toTitleCase(value: string): string {\r\n return value\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\r\n }\r\n\r\n statusToneClass(status: string): string {\r\n switch (status) {\r\n case 'Active': return 'agreement-hero__status--active';\r\n case 'Pending': return 'agreement-hero__status--pending';\r\n case 'in_process': return 'agreement-hero__status--process'\r\n case 'Defaulted': return 'agreement-hero__status--defaulted';\r\n case 'Completed': return 'agreement-hero__status--completed';\r\n case 'Cancelled': return 'agreement-hero__status--cancelled';\r\n case 'Restructured': return 'agreement-hero__status--restructured';\r\n default: return 'agreement-hero__status--neutral';\r\n }\r\n }\r\n\r\n getStatusChipClass(status: string): string {\r\n if (!status) return 'status-chip--neutral';\r\n const normalized = status.toLowerCase().trim();\r\n switch (normalized) {\r\n case 'active':\r\n case 'activo':\r\n return 'status-chip--active';\r\n case 'pending':\r\n case 'pendiente':\r\n return 'status-chip--pending';\r\n case 'defaulted':\r\n case 'en_mora':\r\n case 'en mora':\r\n return 'status-chip--defaulted';\r\n case 'completed':\r\n case 'completado':\r\n return 'status-chip--completed';\r\n case 'cancelled':\r\n case 'cancelado':\r\n return 'status-chip--cancelled';\r\n case 'restructured':\r\n case 'reestructurado':\r\n return 'status-chip--restructured';\r\n case 'paid':\r\n case 'pagado':\r\n return 'status-chip--paid';\r\n case 'in_process':\r\n case 'en_proceso':\r\n case 'en proceso':\r\n return 'status-chip--in-process';\r\n default:\r\n return 'status-chip--neutral';\r\n }\r\n }\r\n \r\n}\r\n","@if(variant() == 'default' && withResponsible()) {\n<div class=\"card-history\">\n <span class=\"card-date\">{{ formatDate(DataCard()?.date || \"\") }}</span>\n <div class=\"event-card\" [class.expanded]=\"isExpanded()\">\n <div class=\"event-header\" (click)=\"toggleExpanded()\">\n <div class=\"event-info\">\n <span class=\"expand-icon icon icon-chevron-up\" aria-hidden=\"true\"></span>\n <span class=\"event-type\">{{ DataCard()?.title }}</span>\n <span class=\"event-time\">{{ DataCard()?.time }}</span>\n </div>\n <div class=\"status-badges\">\n <span class=\"badge\" [ngClass]=\"getBadgeClass(DataCard()?.previousStatus || '')\">\n {{ DataCard()?.previousStatus }}\n </span>\n\n <span class=\"status-arrow icon icon-chevrons-right\" aria-hidden=\"true\"></span>\n\n <span class=\"badge\" [ngClass]=\"getBadgeClass(DataCard()?.currentStatus || '')\">\n {{ DataCard()?.currentStatus }}\n </span>\n </div>\n </div>\n\n <div class=\"event-details\">\n <div class=\"responsible-info\">\n <div class=\"avatar\">\n <span class=\"avatar-icon icon icon-user\" aria-hidden=\"true\"></span>\n </div>\n <div class=\"responsible-details\">\n <h4>Responsable</h4>\n <div class=\"responsible-name\">{{ DataCard()?.responsible }}</div>\n </div>\n </div>\n\n <div class=\"technical-description\">\n <div class=\"tech-label\">Descripción técnica</div>\n <div class=\"tech-content\">\n {{ DataCard()?.description }}\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n\n@if(variant() == 'default' && !withResponsible()) {\n<div class=\"card-history\">\n <div class=\"event-card no-responsible\">\n <div class=\"nr-header\">\n <span class=\"nr-title\">{{ DataCard()?.title }}</span>\n <span class=\"nr-type\">({{ DataCard()?.type || 'estado' }})</span>\n </div>\n <div class=\"nr-body\">\n @if (DataCard()?.actionType === 'create') {\n <p class=\"nr-description\">\n El registro fue creado con los siguientes datos.\n </p>\n <div class=\"nr-comparison single\">\n <div class=\"nr-col\">\n <span class=\"nr-label curr\">VALOR INICIAL</span>\n <div class=\"nr-value curr-val\">{{ DataCard()?.currentStatus }}</div>\n </div>\n </div>\n } @else if (DataCard()?.actionType === 'delete') {\n <p class=\"nr-description\">\n El registro fue eliminado permanentemente.\n </p>\n <div class=\"nr-comparison single\">\n <div class=\"nr-col\">\n <span class=\"nr-label prev\">VALOR ELIMINADO</span>\n <div class=\"nr-value prev-val\">{{ DataCard()?.previousStatus }}</div>\n </div>\n </div>\n } @else {\n <p class=\"nr-description\">\n <span style=\"text-transform: capitalize;\">{{ DataCard()?.type || 'El registro' }}</span> cambió de \"{{\n DataCard()?.previousStatus }}\" a \"{{ DataCard()?.currentStatus }}\".\n </p>\n\n <div class=\"nr-comparison\">\n <div class=\"nr-col\">\n <span class=\"nr-label prev\">VALOR ANTERIOR</span>\n <div class=\"nr-value prev-val\">{{ DataCard()?.previousStatus }}</div>\n </div>\n\n <div class=\"nr-arrow\">\n <span class=\"nr-arrow-icon icon icon-arrow-right\" aria-hidden=\"true\"></span>\n </div>\n\n <div class=\"nr-col\">\n <span class=\"nr-label curr\">VALOR NUEVO</span>\n <div class=\"nr-value curr-val\">{{ DataCard()?.currentStatus }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (variant() == 'history') {\n@let entry = historialEntry();\n<!-- Historial y movimientos -->\n<article class=\"historial-card\">\n <!-- Card Header -->\n <div class=\"historial-card__header\">\n <div class=\"historial-card__title-area\">\n <span class=\"historial-card__icon-wrapper\"\n [ngClass]=\"{'state-change': entry?.tipo === 'estado', 'doc-change': entry?.tipo === 'documento'}\">\n @if (entry?.tipo === 'documento') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\" />\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\" />\n <path d=\"M9 9l1 0\" />\n <path d=\"M9 13l6 0\" />\n <path d=\"M9 17l6 0\" />\n </svg>\n } @else if (entry?.previousState || entry?.currentState) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M3 9l4 -4l4 4m-4 -4v14\" />\n <path d=\"M21 15l-4 4l-4 -4m4 4v-14\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 8l.01 0\" />\n <path d=\"M12 12l0 9\" />\n <path d=\"M12 3a9 9 0 1 0 9 9\" />\n </svg>\n }\n </span>\n <h3 class=\"historial-card__title\">{{ entry?.titulo }}</h3>\n </div>\n @if (entry?.tipo === 'estado') {\n <div class=\"historial-card__id\">ID #{{ entry?.id }}</div>\n } @else {\n <div class=\"historial-card__id historial-card__id--local\">{{ entry?.tipo === 'documento' ? 'Documento' : 'Movimiento' }}\n </div>\n }\n </div>\n\n <!-- Card Body -->\n <div class=\"historial-card__body\">\n @if (entry?.detalle) {\n <div class=\"historial-card__reason-box\">\n <span class=\"reason-label\">Detalles</span>\n <p class=\"reason-text\">{{ entry?.detalle }}</p>\n </div>\n }\n\n @if (entry?.previousState || entry?.currentState) {\n <div class=\"historial-card__states-container\">\n <span class=\"states-label\">Transición:</span>\n <div class=\"historial-item__status-row\">\n @if (entry?.previousState) {\n <span class=\"status-chip\" [ngClass]=\"getStatusChipClass(entry!.previousState!)\">\n {{ statusLabel(entry!.previousState!) }}\n </span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"history-arrow\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M7 7l5 5l-5 5\" />\n <path d=\"M13 7l5 5l-5 5\" />\n </svg>\n }\n @if (entry?.currentState) {\n <span class=\"status-chip\" [ngClass]=\"getStatusChipClass(entry!.currentState!)\">\n {{ statusLabel(entry!.currentState!) }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Footer -->\n <div class=\"historial-card__footer\">\n <div class=\"historial-card__meta-item\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0\" />\n <path d=\"M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2\" />\n </svg>\n <span>Usuario: <strong>{{ entry?.createdBy || 'SISTEMA' }}</strong></span>\n </div>\n <div class=\"historial-card__meta-item\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z\" />\n <path d=\"M16 3v4\" />\n <path d=\"M8 3v4\" />\n <path d=\"M4 11h16\" />\n <path d=\"M11 15h1\" />\n <path d=\"M12 15v3\" />\n </svg>\n <span>{{ entry?.creationDate | date:'dd/MM/yyyy h:mm a' }}</span>\n </div>\n </div>\n</article>\n}","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n output\r\n} from '@angular/core';\r\n\r\nimport SignaturePad from 'signature_pad';\r\nimport { Button } from '../button/button';\r\n\r\n@Component({\r\n selector: 'lib-signature',\r\n standalone: true,\r\n imports: [Button],\r\n templateUrl: './signature.html',\r\n styleUrl: './signature.css',\r\n})\r\nexport class Signature implements AfterViewInit {\r\n\r\n @ViewChild('canvas')\r\n canvasRef!: ElementRef<HTMLCanvasElement>;\r\n\r\n signaturePad!: SignaturePad;\r\n\r\n firmaSaved = output<string>();\r\n\r\n ngAfterViewInit(): void {\r\n this.signaturePad = new SignaturePad(\r\n this.canvasRef.nativeElement,\r\n {\r\n minWidth: 1,\r\n maxWidth: 2\r\n }\r\n );\r\n }\r\n\r\n limpiarFirma() {\r\n this.signaturePad.clear();\r\n }\r\n\r\n guardarFirma() {\r\n if (this.signaturePad.isEmpty()) return;\r\n this.firmaSaved.emit(this.signaturePad.toDataURL('image/png'));\r\n }\r\n\r\n obtenerFirmaBase64(): string {\r\n return this.signaturePad.toDataURL('image/png');\r\n }\r\n\r\n firmaVacia(): boolean {\r\n return this.signaturePad.isEmpty();\r\n }\r\n\r\n}\r\n","<div class=\"signature-container\">\r\n\r\n <canvas #canvas width=\"600\" height=\"200\" class=\"canvas-signature\"></canvas>\r\n\r\n <div class=\"signature-actions\">\r\n <lib-button [variant]=\"'outline'\" [size]=\"'compact'\" (clicked)=\"limpiarFirma()\">\r\n Limpiar\r\n </lib-button>\r\n <lib-button [variant]=\"'primary'\" [size]=\"'compact'\" (clicked)=\"guardarFirma()\">\r\n Guardar firma\r\n </lib-button>\r\n </div>\r\n\r\n</div>","import { Component, input, output } from '@angular/core';\n\nexport interface DocumentInfo {\n folio?: string;\n name: string;\n creation_date: string;\n type: 'document' | 'image' | 'video';\n actionKey: string;\n /** URL del archivo para previsualización o descarga desde el padre */\n url?: string;\n}\n\n@Component({\n selector: 'lib-document-item',\n imports: [],\n templateUrl: './document-item.html',\n styleUrl: './document-item.css',\n})\nexport class DocumentItem {\n data = input<DocumentInfo>();\n view = output<DocumentInfo>();\n\n get iconClass(): string {\n const typeIcons: Record<string, string> = {\n document: 'icon-file-3',\n image: 'icon-image',\n video: 'icon-video',\n };\n const type = this.data()?.type ?? 'document';\n return `document-icon ${typeIcons[type] ?? 'icon-file-3'}`;\n }\n\n viewDocument() {\n const doc = this.data();\n if (doc) this.view.emit(doc);\n }\n}\n","<div class=\"document-item\">\n <div class=\"document-info\">\n <div class=\"document-header\">\n <span [class]=\"iconClass\"></span>\n </div>\n\n <div class=\"document-details\">\n <span class=\"folio\">{{ data()?.folio }}</span>\n <h3 class=\"title\">{{ data()?.name }}</h3>\n <p class=\"date\">Fecha de creación: {{ data()?.creation_date }}</p>\n </div>\n </div>\n <a (click)=\"viewDocument()\" class=\"document-action\">Ver documento</a>\n</div>\n","import { booleanAttribute, Component, input, output } from '@angular/core';\nimport { Button } from '../button/button';\n\n@Component({\n selector: 'lib-rol-card',\n imports: [Button],\n templateUrl: './rol-card.html',\n styleUrl: './rol-card.css',\n})\nexport class RolCard {\n roleName = input.required<string>();\n description = input<string>('');\n color = input<string>('#596300');\n userCount = input<number>(0);\n /** Muestra el botón eliminar en la esquina superior derecha. Default: true */\n showDelete = input(true, { transform: booleanAttribute });\n\n edit = output<void>();\n permissions = output<void>();\n delete = output<void>();\n}\n","<div class=\"rol-card\">\n @if (showDelete()) {\n <button\n type=\"button\"\n class=\"delete-btn\"\n aria-label=\"Eliminar rol\"\n (click)=\"delete.emit()\"\n >\n <span class=\"delete-icon icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <div class=\"card-header\">\n <div class=\"icon-container\" [style.backgroundColor]=\"color()\">\n <span class=\"shield-icon icon icon-shield\" aria-hidden=\"true\"></span>\n </div>\n <div class=\"header-text\">\n <h3 class=\"role-name\">{{ roleName() }}</h3>\n <p class=\"role-description\">{{ description() }}</p>\n </div>\n </div>\n\n <hr class=\"divider\" />\n\n <div class=\"card-footer\">\n <span class=\"user-count\">{{ userCount() }} usuarios</span>\n <div class=\"actions\">\n <lib-button variant=\"outline\" size=\"compact\" (clicked)=\"edit.emit()\">\n <div class=\"button-content\">\n <span class=\"action-icon icon icon-edit\" aria-hidden=\"true\"></span>\n Editar\n </div>\n </lib-button>\n <lib-button variant=\"primary\" size=\"compact\" (clicked)=\"permissions.emit()\">\n <div class=\"button-content\">\n <span class=\"action-icon icon icon-settings\" aria-hidden=\"true\"></span>\n Permisos\n </div>\n </lib-button>\n </div>\n </div>\n</div>","import { IconPickerOption } from './icon-picker-options.types';\r\n\r\nexport type { IconPickerOption } from './icon-picker-options.types';\r\n\r\n/** Todas las clases icon-* definidas en icons.css */\r\nexport const CSS_ICON_CATALOG: IconPickerOption[] = [\r\n 'icon-arrow-up', 'icon-arrow-down', 'icon-arrow-left', 'icon-arrow-right',\r\n 'icon-chevron-up', 'icon-chevron-down', 'icon-chevron-left', 'icon-chevron-right',\r\n 'icon-edit', 'icon-delete', 'icon-add', 'icon-view', 'icon-view-off',\r\n 'icon-save', 'icon-copy', 'icon-duplicate',\r\n 'icon-file', 'icon-folder', 'icon-folder-open', 'icon-upload', 'icon-download',\r\n 'icon-export', 'icon-import', 'icon-attach',\r\n 'icon-user', 'icon-users', 'icon-user-plus',\r\n 'icon-lock', 'icon-unlock', 'icon-key', 'icon-shield', 'icon-fingerprint',\r\n 'icon-settings', 'icon-refresh', 'icon-close', 'icon-check',\r\n 'icon-info', 'icon-warning', 'icon-bell', 'icon-bell-off',\r\n 'icon-search', 'icon-filter', 'icon-sort', 'icon-menu',\r\n 'icon-grid', 'icon-list',\r\n 'icon-check-circle', 'icon-x-circle', 'icon-alert-circle',\r\n 'icon-chart-bar', 'icon-chart-line', 'icon-database', 'icon-table',\r\n 'icon-layout', 'icon-layers', 'icon-box', 'icon-globe', 'icon-link',\r\n 'icon-star', 'icon-bookmark', 'icon-tag', 'icon-home',\r\n 'icon-send', 'icon-share', 'icon-print', 'icon-clipboard', 'icon-zap', 'icon-tool',\r\n 'icon-logout', 'icon-calendar', 'icon-clock', 'icon-mail', 'icon-phone',\r\n 'icon-map-pin', 'icon-image', 'icon-code', 'icon-help',\r\n 'icon-eye', 'icon-eye-off', 'icon-activate', 'icon-deactivate',\r\n 'icon-module', 'icon-submodule', 'icon-applicativo', 'icon-role', 'icon-permission',\r\n 'icon-more-vert', 'icon-more-horiz', 'icon-external-link', 'icon-move',\r\n 'icon-expand', 'icon-collapse', 'icon-drag',\r\n 'icon-sanction', 'icon-plus', 'icon-minus', 'icon-change',\r\n 'icon-inbox', 'icon-message', 'icon-building', 'icon-camera', 'icon-car',\r\n 'icon-chevrons-right', 'icon-location', 'icon-video',\r\n 'icon-chart', 'icon-alert',\r\n 'icon-edit-2', 'icon-delete-2', 'icon-view-2', 'icon-eye-2',\r\n 'icon-file-2', 'icon-file-3',\r\n 'icon-upload-2', 'icon-download-2', 'icon-export-2', 'icon-filter-2',\r\n].map((value) => ({ value }));\r\n\r\n/** Iconos Lucide sugeridos para módulos */\r\nexport const LUCIDE_ICON_CATALOG: IconPickerOption[] = [\r\n { value: 'lucide:layers', label: 'Capas' },\r\n { value: 'lucide:file-text', label: 'Documento' },\r\n { value: 'lucide:book-open', label: 'Libro' },\r\n { value: 'lucide:truck', label: 'Transporte' },\r\n { value: 'lucide:package', label: 'Paquete' },\r\n { value: 'lucide:puzzle', label: 'Puzzle' },\r\n { value: 'lucide:layout-grid', label: 'Cuadrícula' },\r\n { value: 'lucide:workflow', label: 'Flujo' },\r\n { value: 'lucide:shield-check', label: 'Seguridad' },\r\n { value: 'lucide:users', label: 'Usuarios' },\r\n { value: 'lucide:settings', label: 'Configuración' },\r\n { value: 'lucide:folder-tree', label: 'Árbol de carpetas' },\r\n];\r\n\r\n/** Catálogo completo: icons.css + Lucide */\r\nexport const DEFAULT_ICON_PICKER_ICONS: IconPickerOption[] = [\r\n ...CSS_ICON_CATALOG,\r\n ...LUCIDE_ICON_CATALOG,\r\n];\r\n\r\n/**\r\n * Subconjunto curado para formularios de módulo.\r\n * Sin alias CSS duplicados (p. ej. icon-activate = icon-check-circle) ni Lucide\r\n * que repita la misma silueta que un icon-* ya listado.\r\n */\r\nexport const DEFAULT_MODULE_ICONS: IconPickerOption[] = [\r\n { value: 'icon-check-circle', label: 'Documento aprobado' },\r\n { value: 'icon-check', label: 'Verificación' },\r\n { value: 'icon-search', label: 'Búsqueda' },\r\n { value: 'icon-calendar', label: 'Calendario' },\r\n { value: 'icon-clipboard', label: 'Portapapeles' },\r\n { value: 'icon-clock', label: 'Historial' },\r\n { value: 'icon-file-3', label: 'Documento' },\r\n { value: 'icon-chart-bar', label: 'Estadísticas' },\r\n { value: 'icon-chart-line', label: 'Tendencia' },\r\n { value: 'icon-bookmark', label: 'Marcador' },\r\n { value: 'icon-car', label: 'Vehículo' },\r\n { value: 'icon-folder', label: 'Carpeta' },\r\n { value: 'icon-settings', label: 'Configuración' },\r\n { value: 'icon-shield', label: 'Seguridad' },\r\n { value: 'icon-module', label: 'Módulo' },\r\n { value: 'icon-layers', label: 'Capas' },\r\n { value: 'icon-box', label: 'Aplicativo' },\r\n { value: 'icon-database', label: 'Base de datos' },\r\n { value: 'icon-table', label: 'Tabla' },\r\n { value: 'icon-globe', label: 'Global' },\r\n { value: 'icon-users', label: 'Usuarios' },\r\n { value: 'icon-building', label: 'Edificio' },\r\n { value: 'icon-map-pin', label: 'Ubicación' },\r\n { value: 'icon-bell', label: 'Notificaciones' },\r\n { value: 'lucide:book-open', label: 'Libro abierto' },\r\n { value: 'lucide:truck', label: 'Transporte pesado' },\r\n { value: 'lucide:puzzle', label: 'Puzzle' },\r\n { value: 'lucide:workflow', label: 'Flujo de trabajo' },\r\n { value: 'lucide:folder-tree', label: 'Árbol de carpetas' },\r\n { value: 'lucide:layout-grid', label: 'Cuadrícula' },\r\n];\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideAngularModule, LucideIconData, icons } from 'lucide-angular';\r\nimport {\r\n DEFAULT_MODULE_ICONS,\r\n IconPickerOption,\r\n} from './icon-picker-options';\r\nimport {\r\n getIconPickerOptionKey,\r\n getIconPickerOptionLabel,\r\n getIconPickerOptionType,\r\n parseIconPickerValue,\r\n toIconPickerStoredValue,\r\n toLucidePascalCase,\r\n} from './icon-picker.utils';\r\n\r\nexport {\r\n CSS_ICON_CATALOG,\r\n DEFAULT_ICON_PICKER_ICONS,\r\n DEFAULT_MODULE_ICONS,\r\n LUCIDE_ICON_CATALOG,\r\n} from './icon-picker-options';\r\nexport type { IconPickerOption } from './icon-picker-options.types';\r\nexport {\r\n getIconPickerOptionLabel,\r\n getCssIconClass,\r\n getLucideIconName,\r\n isLucideIconValue,\r\n parseIconPickerValue,\r\n resolveIconKind,\r\n toIconPickerStoredValue,\r\n toLucidePascalCase,\r\n} from './icon-picker.utils';\r\n\r\n@Component({\r\n selector: 'lib-icon-picker',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n templateUrl: './icon-picker.html',\r\n styleUrl: './icon-picker.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => IconPicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class IconPicker implements ControlValueAccessor {\r\n label = input<string>('Icono');\r\n icons = input<IconPickerOption[]>(DEFAULT_MODULE_ICONS);\r\n columns = input<number>(8);\r\n disabled = input(false, { transform: booleanAttribute });\r\n readonly = input(false, { transform: booleanAttribute });\r\n\r\n selectionChange = output<string>();\r\n\r\n selectedValue = signal<string | null>(null);\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n isDisabledByControl = false;\r\n\r\n get isBlocked(): boolean {\r\n return this.isDisabledByControl || this.disabled() || this.readonly();\r\n }\r\n\r\n isSelected(option: IconPickerOption): boolean {\r\n return this.selectedValue() === toIconPickerStoredValue(option);\r\n }\r\n\r\n isLucideOption(option: IconPickerOption): boolean {\r\n return getIconPickerOptionType(option) === 'lucide';\r\n }\r\n\r\n getOptionLabel(option: IconPickerOption): string {\r\n return getIconPickerOptionLabel(option);\r\n }\r\n\r\n getOptionKey(option: IconPickerOption): string {\r\n return getIconPickerOptionKey(option);\r\n }\r\n\r\n getLucideIcon(option: IconPickerOption): LucideIconData | null {\r\n const { name } = parseIconPickerValue(toIconPickerStoredValue(option));\r\n const iconName = toLucidePascalCase(name);\r\n return (icons as Record<string, LucideIconData | undefined>)[iconName] ?? null;\r\n }\r\n\r\n select(option: IconPickerOption): void {\r\n if (this.isBlocked) return;\r\n const stored = toIconPickerStoredValue(option);\r\n this.selectedValue.set(stored);\r\n this.selectionChange.emit(stored);\r\n this.onChange(stored);\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n this.selectedValue.set(value ?? null);\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.isDisabledByControl = isDisabled;\r\n }\r\n}\r\n","<div class=\"icon-picker\" [class.icon-picker--disabled]=\"isBlocked\">\r\n @if (label()) {\r\n <span class=\"icon-picker__label\">{{ label() }}</span>\r\n }\r\n\r\n <div\r\n class=\"icon-picker__grid\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"label()\"\r\n [style.--icon-picker-columns]=\"columns()\"\r\n >\r\n @for (option of icons(); track getOptionKey(option)) {\r\n <button\r\n type=\"button\"\r\n class=\"icon-picker__item\"\r\n role=\"option\"\r\n [attr.aria-label]=\"getOptionLabel(option)\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.icon-picker__item--selected]=\"isSelected(option)\"\r\n [disabled]=\"isBlocked\"\r\n (click)=\"select(option)\"\r\n >\r\n @if (isLucideOption(option)) {\r\n @if (getLucideIcon(option); as lucideIcon) {\r\n <lucide-icon class=\"icon-picker__lucide\" [img]=\"lucideIcon\" [size]=\"22\" aria-hidden=\"true\"></lucide-icon>\r\n }\r\n } @else {\r\n <span class=\"icon-picker__icon icon {{ option.value }}\" aria-hidden=\"true\"></span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","/** Paleta viva por defecto para colores de roles (25 tonos) */\r\nexport const DEFAULT_ROLE_COLORS: string[] = [\r\n '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107',\r\n '#FF9800', '#FF5722', '#F44336', '#E91E63', '#9C27B0',\r\n '#673AB7', '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4',\r\n '#009688', '#26A69A', '#66BB6A', '#AED581', '#DCE775',\r\n '#596300', '#827717', '#33691E', '#37474F', '#000000',\r\n];\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DEFAULT_ROLE_COLORS } from './color-picker-options';\r\n\r\nexport { DEFAULT_ROLE_COLORS } from './color-picker-options';\r\n\r\n@Component({\r\n selector: 'lib-color-picker',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './color-picker.html',\r\n styleUrl: './color-picker.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ColorPicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class ColorPicker implements ControlValueAccessor {\r\n label = input<string>('Color del rol');\r\n colors = input<string[]>(DEFAULT_ROLE_COLORS);\r\n columns = input<number>(10);\r\n disabled = input(false, { transform: booleanAttribute });\r\n readonly = input(false, { transform: booleanAttribute });\r\n\r\n selectionChange = output<string>();\r\n\r\n selectedValue = signal<string | null>(null);\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n isDisabledByControl = false;\r\n\r\n get isBlocked(): boolean {\r\n return this.isDisabledByControl || this.disabled() || this.readonly();\r\n }\r\n\r\n isSelected(color: string): boolean {\r\n return this.selectedValue()?.toLowerCase() === color.toLowerCase();\r\n }\r\n\r\n select(color: string): void {\r\n if (this.isBlocked) return;\r\n this.selectedValue.set(color);\r\n this.selectionChange.emit(color);\r\n this.onChange(color);\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n this.selectedValue.set(value ?? null);\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.isDisabledByControl = isDisabled;\r\n }\r\n}\r\n","<div class=\"color-picker\" [class.color-picker--disabled]=\"isBlocked\">\r\n @if (label()) {\r\n <span class=\"color-picker__label\">{{ label() }}</span>\r\n }\r\n\r\n <div\r\n class=\"color-picker__grid\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"label()\"\r\n [style.--color-picker-columns]=\"columns()\"\r\n >\r\n @for (color of colors(); track color) {\r\n <button\r\n type=\"button\"\r\n class=\"color-picker__swatch\"\r\n role=\"option\"\r\n [attr.aria-label]=\"color\"\r\n [attr.aria-selected]=\"isSelected(color)\"\r\n [class.color-picker__swatch--selected]=\"isSelected(color)\"\r\n [style.background-color]=\"color\"\r\n [disabled]=\"isBlocked\"\r\n (click)=\"select(color)\"\r\n >\r\n @if (isSelected(color)) {\r\n <span class=\"color-picker__check icon icon-check\" aria-hidden=\"true\"></span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { LucideAngularModule, LucideIconData, icons } from 'lucide-angular';\r\nimport {\r\n isLucideIconValue,\r\n parseIconPickerValue,\r\n toLucidePascalCase,\r\n} from '../../icon-picker/icon-picker.utils';\r\n\r\n@Component({\r\n selector: 'lib-module-card-icon',\r\n imports: [LucideAngularModule],\r\n templateUrl: './module-card-icon.html',\r\n styleUrl: './module-card-icon.css',\r\n})\r\nexport class ModuleCardIcon {\r\n value = input<string>('');\r\n size = input<'md' | 'sm'>('md');\r\n color = input<string>('#596300');\r\n\r\n pixelSize = computed(() => (this.size() === 'sm' ? 18 : 20));\r\n\r\n isLucide = computed(() => isLucideIconValue(this.value()));\r\n\r\n cssClass = computed(() => parseIconPickerValue(this.value()).name);\r\n\r\n lucideData = computed((): LucideIconData | null => {\r\n if (!this.isLucide()) return null;\r\n const { name } = parseIconPickerValue(this.value());\r\n const iconName = toLucidePascalCase(name);\r\n return (icons as Record<string, LucideIconData | undefined>)[iconName] ?? null;\r\n });\r\n}\r\n","@if (value()) {\r\n @if (isLucide()) {\r\n @if (lucideData(); as lucideIcon) {\r\n <lucide-icon\r\n class=\"mc-icon mc-icon--lucide\"\r\n [class.mc-icon--sm]=\"size() === 'sm'\"\r\n [img]=\"lucideIcon\"\r\n [size]=\"pixelSize()\"\r\n [color]=\"color()\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n } @else {\r\n <span\r\n class=\"mc-icon icon {{ cssClass() }}\"\r\n [class.mc-icon--sm]=\"size() === 'sm'\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n }\r\n}\r\n","import { Component, input, output } from '@angular/core';\nimport { ToggleCustom } from '../../toggle-custom/toggle-custom';\nimport { ModuleApplicativo, ApplicativoEvent } from '../module-card';\nimport { ModuleCardIcon } from '../module-card-icon/module-card-icon';\n\n@Component({\n selector: 'lib-module-card-applicativo',\n imports: [ToggleCustom, ModuleCardIcon],\n templateUrl: './module-card-applicativo.html',\n styleUrl: './module-card-applicativo.css',\n})\nexport class ModuleCardApplicativo {\n /** Datos del aplicativo */\n app = input.required<ModuleApplicativo>();\n\n /** Id del módulo contenedor */\n moduleId = input.required<string | number>();\n\n /** Id del submódulo padre; null si es directo del módulo */\n subId = input<string | number | null>(null);\n\n /** true cuando es el primer aplicativo de su lista (deshabilita mover arriba) */\n isFirst = input<boolean>(false);\n\n /** true cuando es el último aplicativo de su lista (deshabilita mover abajo) */\n isLast = input<boolean>(false);\n\n /** Controla si la fila está expandida (chips visibles) */\n expanded = input<boolean>(false);\n\n /** Solicita cambiar el estado de expansión */\n expandToggle = output<void>();\n\n /** Todos los eventos del aplicativo */\n event = output<ApplicativoEvent>();\n\n emitEvent(type: ApplicativoEvent['type'], data?: ApplicativoEvent['data']): void {\n this.event.emit({\n type,\n moduleId: this.moduleId(),\n applicativoId: this.app().id,\n submoduleId: this.subId(),\n data,\n });\n }\n}\n","<div class=\"mc-aplicativo\" [class.mc-aplicativo--expanded]=\"expanded()\">\n\n <!-- ── Encabezado del aplicativo ────────────────────────────────────── -->\n <div class=\"mc-row mc-row--app\" (click)=\"expandToggle.emit()\">\n <div class=\"mc-header-left\">\n <button class=\"mc-expand-btn\" [class.mc-expand-btn--open]=\"expanded()\"\n title=\"Expandir / Colapsar\">\n <span class=\"mc-action-icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n @if (app().icon) {\n <lib-module-card-icon [value]=\"app().icon!\" size=\"sm\" color=\"#454733\" />\n }\n <span class=\"mc-name mc-name--app\">{{ app().name }}</span>\n </div>\n\n <div class=\"mc-header-right\" (click)=\"$event.stopPropagation()\">\n <button class=\"mc-icon-btn\" title=\"Mover arriba\"\n [disabled]=\"isFirst()\"\n (click)=\"emitEvent('moveUp')\">\n <span class=\"mc-action-icon icon-arrow-up\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn\" title=\"Mover abajo\"\n [disabled]=\"isLast()\"\n (click)=\"emitEvent('moveDown')\">\n <span class=\"mc-action-icon icon-arrow-down\" aria-hidden=\"true\"></span>\n </button>\n <span class=\"mc-btn-sep\" aria-hidden=\"true\"></span>\n <button class=\"mc-icon-btn mc-icon-btn--edit\" title=\"Editar\"\n (click)=\"emitEvent('edit')\">\n <span class=\"mc-action-icon icon-edit\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn mc-icon-btn--delete\" title=\"Eliminar\"\n (click)=\"emitEvent('delete')\">\n <span class=\"mc-action-icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n <lib-toggle-custom\n [checked]=\"app().visible\"\n (toggleChange)=\"emitEvent('visibleChange', $event.checked)\"/>\n </div>\n </div>\n\n <!-- ── Chips de acciones (expandido) ────────────────────────────────── -->\n @if (expanded()) {\n <div class=\"mc-actions-row\">\n @for (action of app().actions; track action.key) {\n <div class=\"mc-chip mc-chip--active\">\n <span class=\"mc-action-icon icon-check\" aria-hidden=\"true\"></span>\n {{ action.label }}\n <button class=\"mc-chip-remove\" title=\"Quitar acción\"\n (click)=\"emitEvent('removeAction', action.key)\">\n ×\n </button>\n </div>\n }\n <button class=\"mc-chip mc-chip--add\"\n (click)=\"emitEvent('addAction')\">\n + Acción\n </button>\n </div>\n }\n\n</div>\n","import { ModuleApplicativo, ModuleChildRef, ModuleData, ModuleSubmodule } from './module-card';\r\n\r\nexport function getModuleChildOrder(\r\n module: Pick<ModuleData, 'submodules' | 'aplicativos' | 'childOrder'>,\r\n): ModuleChildRef[] {\r\n const defaultOrder: ModuleChildRef[] = [\r\n ...module.submodules.map(s => ({ type: 'submodule' as const, id: s.id })),\r\n ...module.aplicativos.map(a => ({ type: 'aplicativo' as const, id: a.id })),\r\n ];\r\n\r\n if (!module.childOrder?.length) {\r\n return defaultOrder;\r\n }\r\n\r\n const validRefs = module.childOrder.filter(ref => {\r\n if (ref.type === 'submodule') {\r\n return module.submodules.some(s => s.id === ref.id);\r\n }\r\n return module.aplicativos.some(a => a.id === ref.id);\r\n });\r\n\r\n const seen = new Set(validRefs.map(r => `${r.type}:${r.id}`));\r\n for (const ref of defaultOrder) {\r\n const key = `${ref.type}:${ref.id}`;\r\n if (!seen.has(key)) {\r\n validRefs.push(ref);\r\n seen.add(key);\r\n }\r\n }\r\n\r\n return validRefs;\r\n}\r\n\r\nexport interface ResolvedModuleChild {\r\n type: 'submodule' | 'aplicativo';\r\n id: string | number;\r\n trackKey: string;\r\n submodule?: ModuleSubmodule;\r\n applicativo?: ModuleApplicativo;\r\n}\r\n\r\nexport function resolveModuleChildren(\r\n order: ModuleChildRef[],\r\n submodules: ModuleSubmodule[],\r\n aplicativos: ModuleApplicativo[],\r\n): ResolvedModuleChild[] {\r\n const children: ResolvedModuleChild[] = [];\r\n\r\n for (const ref of order) {\r\n if (ref.type === 'submodule') {\r\n const submodule = submodules.find(s => s.id === ref.id);\r\n if (submodule) {\r\n children.push({ type: 'submodule', id: ref.id, trackKey: `sub:${ref.id}`, submodule });\r\n }\r\n continue;\r\n }\r\n\r\n const applicativo = aplicativos.find(a => a.id === ref.id);\r\n if (applicativo) {\r\n children.push({ type: 'aplicativo', id: ref.id, trackKey: `app:${ref.id}`, applicativo });\r\n }\r\n }\r\n\r\n return children;\r\n}\r\n\r\nexport function childOrdersEqual(a: ModuleChildRef[], b: ModuleChildRef[]): boolean {\r\n if (a.length !== b.length) return false;\r\n return a.every((ref, i) => ref.type === b[i].type && ref.id === b[i].id);\r\n}\r\n","import { ChangeDetectorRef, Component, ElementRef, QueryList, ViewChildren, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { ToggleCustom } from '../toggle-custom/toggle-custom';\nimport { ModuleCardApplicativo } from './module-card-applicativo/module-card-applicativo';\nimport { ModuleCardIcon } from './module-card-icon/module-card-icon';\nimport { childOrdersEqual, getModuleChildOrder, resolveModuleChildren } from './module-card-order';\n\nexport { getModuleChildOrder, resolveModuleChildren } from './module-card-order';\nexport type { ResolvedModuleChild } from './module-card-order';\n\nexport interface ModuleCardAction {\n key: string;\n label: string;\n}\n\nexport interface ModuleApplicativo {\n id: string | number;\n name: string;\n /** Clase CSS (`icon-*`) o valor Lucide (`lucide:nombre`) */\n icon?: string;\n visible: boolean;\n actions: ModuleCardAction[];\n}\n\nexport interface ModuleSubmodule {\n id: string | number;\n name: string;\n /** Clase CSS (`icon-*`) o valor Lucide (`lucide:nombre`) */\n icon?: string;\n visible: boolean;\n aplicativos: ModuleApplicativo[];\n}\n\nexport type ModuleChildType = 'submodule' | 'aplicativo';\n\nexport interface ModuleChildRef {\n type: ModuleChildType;\n id: string | number;\n}\n\nexport interface ModuleData {\n id: string | number;\n name: string;\n /** Clase CSS (`icon-*`) o valor Lucide (`lucide:nombre`) */\n icon?: string;\n visible: boolean;\n submodules: ModuleSubmodule[];\n aplicativos: ModuleApplicativo[];\n /** Orden mixto de submódulos y aplicativos directos dentro del módulo */\n childOrder?: ModuleChildRef[];\n}\n\nexport interface ModuleEvent {\n type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange' | 'addApplicativo' | 'addSubmodule';\n moduleId: string | number;\n data?: any;\n}\n\nexport interface SubmoduleEvent {\n type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange';\n submoduleId: string | number;\n moduleId: string | number;\n data?: any;\n}\n\nexport interface ApplicativoEvent {\n type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange' | 'addAction' | 'removeAction';\n moduleId: string | number;\n applicativoId: string | number;\n submoduleId?: string | number | null;\n data?: any;\n}\n\n@Component({\n selector: 'lib-module-card',\n imports: [ToggleCustom, ModuleCardApplicativo, ModuleCardIcon],\n templateUrl: './module-card.html',\n styleUrl: './module-card.css',\n})\nexport class ModuleCard {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChildren('childEl') childEls!: QueryList<ElementRef<HTMLElement>>;\n\n moduleId = input.required<string | number>();\n moduleName = input.required<string>();\n moduleIcon = input<string>('');\n visible = input<boolean>(true);\n submodules = input<ModuleSubmodule[]>([]);\n aplicativos = input<ModuleApplicativo[]>([]);\n childOrder = input<ModuleChildRef[] | undefined>(undefined);\n /** true cuando este módulo es el primero de la lista (deshabilita mover arriba) */\n isFirst = input<boolean>(false);\n /** true cuando este módulo es el último de la lista (deshabilita mover abajo) */\n isLast = input<boolean>(false);\n\n moduleEvent = output<ModuleEvent>();\n submoduleEvent = output<SubmoduleEvent>();\n applicativoEvent = output<ApplicativoEvent>();\n childOrderChange = output<ModuleChildRef[]>();\n\n expanded = signal<boolean>(false);\n expandedSubmodules = signal<Set<string | number>>(new Set());\n expandedApplicativos = signal<Set<string | number>>(new Set());\n private optimisticChildOrder = signal<ModuleChildRef[] | null>(null);\n\n moduleChildren = computed(() => {\n const order =\n this.optimisticChildOrder() ??\n getModuleChildOrder({\n submodules: this.submodules(),\n aplicativos: this.aplicativos(),\n childOrder: this.childOrder(),\n });\n return resolveModuleChildren(order, this.submodules(), this.aplicativos());\n });\n\n constructor() {\n effect(() => {\n const optimistic = this.optimisticChildOrder();\n const inputOrder = this.childOrder();\n if (optimistic && inputOrder && childOrdersEqual(optimistic, inputOrder)) {\n this.optimisticChildOrder.set(null);\n }\n });\n }\n\n toggleExpand() {\n this.expanded.set(!this.expanded());\n }\n\n toggleSubmodule(id: string | number) {\n const next = new Set(this.expandedSubmodules());\n next.has(id) ? next.delete(id) : next.add(id);\n this.expandedSubmodules.set(next);\n }\n\n isSubmoduleExpanded(id: string | number): boolean {\n return this.expandedSubmodules().has(id);\n }\n\n toggleApplicativo(id: string | number) {\n const next = new Set(this.expandedApplicativos());\n next.has(id) ? next.delete(id) : next.add(id);\n this.expandedApplicativos.set(next);\n }\n\n isApplicativoExpanded(id: string | number): boolean {\n return this.expandedApplicativos().has(id);\n }\n\n moveChild(index: number, direction: 'up' | 'down') {\n const order = [\n ...(this.optimisticChildOrder() ??\n getModuleChildOrder({\n submodules: this.submodules(),\n aplicativos: this.aplicativos(),\n childOrder: this.childOrder(),\n })),\n ];\n const target = direction === 'up' ? index - 1 : index + 1;\n if (target < 0 || target >= order.length) return;\n this.animateChildSwap(index, target, order);\n }\n\n onDirectApplicativoEvent(event: ApplicativoEvent, index: number) {\n if (event.type === 'moveUp') {\n this.moveChild(index, 'up');\n return;\n }\n if (event.type === 'moveDown') {\n this.moveChild(index, 'down');\n return;\n }\n this.applicativoEvent.emit(event);\n }\n\n private animateChildSwap(from: number, to: number, currentOrder: ModuleChildRef[]) {\n const positionMap = new Map<HTMLElement, number>();\n this.childEls.forEach(el =>\n positionMap.set(el.nativeElement, el.nativeElement.getBoundingClientRect().top),\n );\n\n const newOrder = [...currentOrder];\n [newOrder[from], newOrder[to]] = [newOrder[to], newOrder[from]];\n const moved = currentOrder[from];\n const direction = to < from ? 'moveUp' : 'moveDown';\n\n if (moved.type === 'submodule') {\n this.submoduleEvent.emit({\n type: direction,\n submoduleId: moved.id,\n moduleId: this.moduleId(),\n data: to,\n });\n } else {\n this.applicativoEvent.emit({\n type: direction,\n moduleId: this.moduleId(),\n applicativoId: moved.id,\n submoduleId: null,\n data: to,\n });\n }\n\n this.optimisticChildOrder.set(newOrder);\n this.childOrderChange.emit(newOrder);\n this.cdr.detectChanges();\n\n this.childEls.forEach(el => {\n const node = el.nativeElement;\n const beforeTop = positionMap.get(node);\n if (beforeTop === undefined) return;\n\n const delta = beforeTop - node.getBoundingClientRect().top;\n if (delta === 0) return;\n\n node.style.transition = 'none';\n node.style.transform = `translateY(${delta}px)`;\n node.classList.add('mc-child-item--moving');\n\n void node.offsetHeight;\n\n node.style.transition = 'transform 280ms cubic-bezier(0.25, 0.8, 0.25, 1)';\n node.style.transform = '';\n\n node.addEventListener(\n 'transitionend',\n () => {\n node.style.transition = '';\n node.classList.remove('mc-child-item--moving');\n },\n { once: true },\n );\n });\n }\n}\n","<!-- ══════════════════════════════════════════════════════════════════════ -->\n<!-- MODULE CARD — Angular 20 · solo @if / @for, sin ng-template -->\n<!-- ══════════════════════════════════════════════════════════════════════ -->\n<div class=\"mc-card\">\n\n <!-- ── ENCABEZADO DEL MÓDULO ──────────────────────────────────────────── -->\n <div class=\"mc-header\" (click)=\"toggleExpand()\">\n <div class=\"mc-header-left\">\n <button class=\"mc-expand-btn\" [class.mc-expand-btn--open]=\"expanded()\"\n title=\"Expandir / Colapsar\">\n <span class=\"mc-action-icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n @if (moduleIcon()) {\n <lib-module-card-icon [value]=\"moduleIcon()\" />\n }\n <span class=\"mc-name\">{{ moduleName() }}</span>\n </div>\n\n <div class=\"mc-header-right\" (click)=\"$event.stopPropagation()\">\n <button class=\"mc-icon-btn\" title=\"Mover arriba\"\n [disabled]=\"isFirst()\"\n (click)=\"moduleEvent.emit({ type: 'moveUp', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-arrow-up\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn\" title=\"Mover abajo\"\n [disabled]=\"isLast()\"\n (click)=\"moduleEvent.emit({ type: 'moveDown', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-arrow-down\" aria-hidden=\"true\"></span>\n </button>\n <span class=\"mc-btn-sep\" aria-hidden=\"true\"></span>\n <button class=\"mc-icon-btn mc-icon-btn--edit\" title=\"Editar\"\n (click)=\"moduleEvent.emit({ type: 'edit', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-edit\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn mc-icon-btn--delete\" title=\"Eliminar\"\n (click)=\"moduleEvent.emit({ type: 'delete', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n <lib-toggle-custom\n [checked]=\"visible()\"\n (toggleChange)=\"moduleEvent.emit({ type: 'visibleChange', moduleId: moduleId(), data: $event.checked })\" />\n </div>\n </div>\n\n <!-- ── CUERPO (expandido) ──────────────────────────────────────────────── -->\n @if (expanded()) {\n <div class=\"mc-body\">\n\n <!-- ── HIJOS DEL MÓDULO (submódulos + aplicativos en orden unificado) ── -->\n @for (child of moduleChildren(); track child.trackKey; let childIndex = $index) {\n <div class=\"mc-child-item\" #childEl>\n\n @if (child.type === 'submodule' && child.submodule; as sub) {\n <div class=\"mc-submodule\" [class.mc-submodule--expanded]=\"isSubmoduleExpanded(sub.id)\">\n\n <!-- Encabezado del submódulo -->\n <div class=\"mc-row mc-row--submodule\" (click)=\"toggleSubmodule(sub.id)\">\n <div class=\"mc-header-left\">\n <button class=\"mc-expand-btn\" [class.mc-expand-btn--open]=\"isSubmoduleExpanded(sub.id)\"\n title=\"Expandir / Colapsar\">\n <span class=\"mc-action-icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n @if (sub.icon) {\n <lib-module-card-icon [value]=\"sub.icon\" size=\"sm\" color=\"#454733\" />\n }\n <span class=\"mc-name mc-name--sub\">{{ sub.name }}</span>\n </div>\n\n <div class=\"mc-header-right\" (click)=\"$event.stopPropagation()\">\n <button class=\"mc-icon-btn\" title=\"Mover arriba\"\n [disabled]=\"childIndex === 0\"\n (click)=\"moveChild(childIndex, 'up')\">\n <span class=\"mc-action-icon icon-arrow-up\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn\" title=\"Mover abajo\"\n [disabled]=\"childIndex === moduleChildren().length - 1\"\n (click)=\"moveChild(childIndex, 'down')\">\n <span class=\"mc-action-icon icon-arrow-down\" aria-hidden=\"true\"></span>\n </button>\n <span class=\"mc-btn-sep\" aria-hidden=\"true\"></span>\n <button class=\"mc-icon-btn mc-icon-btn--edit\" title=\"Editar\"\n (click)=\"submoduleEvent.emit({ type: 'edit', submoduleId: sub.id, moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-edit\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn mc-icon-btn--delete\" title=\"Eliminar\"\n (click)=\"submoduleEvent.emit({ type: 'delete', submoduleId: sub.id, moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n <lib-toggle-custom\n [checked]=\"sub.visible\"\n (toggleChange)=\"submoduleEvent.emit({ type: 'visibleChange', submoduleId: sub.id, moduleId: moduleId(), data: $event.checked })\" />\n </div>\n </div>\n\n <!-- Aplicativos del submódulo -->\n @if (isSubmoduleExpanded(sub.id)) {\n <div class=\"mc-sub-body\">\n @for (app of sub.aplicativos; track app.id; let appIndex = $index) {\n <lib-module-card-applicativo\n [app]=\"app\"\n [moduleId]=\"moduleId()\"\n [subId]=\"sub.id\"\n [isFirst]=\"appIndex === 0\"\n [isLast]=\"appIndex === sub.aplicativos.length - 1\"\n [expanded]=\"isApplicativoExpanded(app.id)\"\n (expandToggle)=\"toggleApplicativo(app.id)\"\n (event)=\"applicativoEvent.emit($event)\" />\n }\n </div>\n }\n </div>\n }\n\n @if (child.type === 'aplicativo' && child.applicativo; as app) {\n <lib-module-card-applicativo\n [app]=\"app\"\n [moduleId]=\"moduleId()\"\n [subId]=\"null\"\n [isFirst]=\"childIndex === 0\"\n [isLast]=\"childIndex === moduleChildren().length - 1\"\n [expanded]=\"isApplicativoExpanded(app.id)\"\n (expandToggle)=\"toggleApplicativo(app.id)\"\n (event)=\"onDirectApplicativoEvent($event, childIndex)\" />\n }\n\n </div>\n }\n\n <!-- ── PIE DE MÓDULO ─────────────────────────────────────────────── -->\n <div class=\"mc-footer\">\n <button class=\"mc-add-btn\"\n (click)=\"moduleEvent.emit({ type: 'addApplicativo', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-add\" aria-hidden=\"true\"></span>\n Agregar Aplicativo\n </button>\n <button class=\"mc-add-btn\"\n (click)=\"moduleEvent.emit({ type: 'addSubmodule', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-folder-open\" aria-hidden=\"true\"></span>\n Agregar Submódulo\n </button>\n </div>\n\n </div>\n }\n\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n ElementRef,\n QueryList,\n ViewChildren,\n inject,\n model,\n output,\n} from '@angular/core';\nimport { ModuleCard } from '../module-card';\nimport { ApplicativoEvent, ModuleChildRef, ModuleData, ModuleEvent, SubmoduleEvent } from '../module-card';\n\n@Component({\n selector: 'lib-module-card-list',\n imports: [ModuleCard],\n templateUrl: './module-card-list.html',\n styleUrl: './module-card-list.css',\n})\nexport class ModuleCardList {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChildren('cardEl') cardEls!: QueryList<ElementRef<HTMLElement>>;\n\n modules = model<ModuleData[]>([]);\n\n moduleEvent = output<ModuleEvent>();\n submoduleEvent = output<SubmoduleEvent>();\n applicativoEvent = output<ApplicativoEvent>();\n\n onModuleEvent(event: ModuleEvent, index: number) {\n if (event.type === 'moveUp' && index > 0) {\n this.animateSwap(index, index - 1);\n this.moduleEvent.emit({ ...event, data: index - 1 });\n return;\n }\n\n if (event.type === 'moveDown' && index < this.modules().length - 1) {\n this.animateSwap(index, index + 1);\n this.moduleEvent.emit({ ...event, data: index + 1 });\n return;\n }\n\n if (event.type === 'visibleChange') {\n const list = [...this.modules()];\n list[index] = { ...list[index], visible: event.data as boolean };\n this.modules.set(list);\n }\n\n this.moduleEvent.emit(event);\n }\n\n onChildOrderChange(moduleId: string | number, order: ModuleChildRef[]) {\n const list = [...this.modules()];\n const moduleIndex = list.findIndex(m => m.id === moduleId);\n if (moduleIndex === -1) return;\n\n list[moduleIndex] = { ...list[moduleIndex], childOrder: order };\n this.modules.set(list);\n }\n\n onSubmoduleEvent(event: SubmoduleEvent) {\n const list = [...this.modules()];\n const moduleIndex = list.findIndex(m => m.id === event.moduleId);\n if (moduleIndex === -1) {\n this.submoduleEvent.emit(event);\n return;\n }\n\n const submodules = [...list[moduleIndex].submodules];\n const subIndex = submodules.findIndex(s => s.id === event.submoduleId);\n if (subIndex === -1) {\n this.submoduleEvent.emit(event);\n return;\n }\n\n if (event.type === 'visibleChange') {\n submodules[subIndex] = { ...submodules[subIndex], visible: event.data as boolean };\n list[moduleIndex] = { ...list[moduleIndex], submodules };\n this.modules.set(list);\n }\n\n this.submoduleEvent.emit(event);\n }\n\n onApplicativoEvent(event: ApplicativoEvent) {\n const list = [...this.modules()];\n const moduleIndex = list.findIndex(m => m.id === event.moduleId);\n if (moduleIndex === -1) {\n this.applicativoEvent.emit(event);\n return;\n }\n\n const module = list[moduleIndex];\n\n if (event.submoduleId != null) {\n const submodules = [...module.submodules];\n const subIndex = submodules.findIndex(s => s.id === event.submoduleId);\n if (subIndex === -1) {\n this.applicativoEvent.emit(event);\n return;\n }\n\n const aplicativos = [...submodules[subIndex].aplicativos];\n const appIndex = aplicativos.findIndex(a => a.id === event.applicativoId);\n if (appIndex === -1) {\n this.applicativoEvent.emit(event);\n return;\n }\n\n if (event.type === 'moveUp' && appIndex > 0) {\n [aplicativos[appIndex], aplicativos[appIndex - 1]] = [aplicativos[appIndex - 1], aplicativos[appIndex]];\n submodules[subIndex] = { ...submodules[subIndex], aplicativos };\n list[moduleIndex] = { ...module, submodules };\n this.modules.set(list);\n this.applicativoEvent.emit({ ...event, data: appIndex - 1 });\n return;\n }\n\n if (event.type === 'moveDown' && appIndex < aplicativos.length - 1) {\n [aplicativos[appIndex], aplicativos[appIndex + 1]] = [aplicativos[appIndex + 1], aplicativos[appIndex]];\n submodules[subIndex] = { ...submodules[subIndex], aplicativos };\n list[moduleIndex] = { ...module, submodules };\n this.modules.set(list);\n this.applicativoEvent.emit({ ...event, data: appIndex + 1 });\n return;\n }\n\n if (event.type === 'visibleChange') {\n aplicativos[appIndex] = { ...aplicativos[appIndex], visible: event.data as boolean };\n submodules[subIndex] = { ...submodules[subIndex], aplicativos };\n list[moduleIndex] = { ...module, submodules };\n this.modules.set(list);\n }\n\n this.applicativoEvent.emit(event);\n return;\n }\n\n if (event.type === 'visibleChange') {\n const aplicativos = [...module.aplicativos];\n const appIndex = aplicativos.findIndex(a => a.id === event.applicativoId);\n if (appIndex !== -1) {\n aplicativos[appIndex] = { ...aplicativos[appIndex], visible: event.data as boolean };\n list[moduleIndex] = { ...module, aplicativos };\n this.modules.set(list);\n }\n }\n\n this.applicativoEvent.emit(event);\n }\n\n private animateSwap(from: number, to: number) {\n // FLIP – First: captura posición actual de cada nodo por identidad\n const positionMap = new Map<HTMLElement, number>();\n this.cardEls.forEach(el =>\n positionMap.set(el.nativeElement, el.nativeElement.getBoundingClientRect().top)\n );\n\n // Swap en el modelo y renderizado sincrónico\n const list = [...this.modules()];\n [list[from], list[to]] = [list[to], list[from]];\n this.modules.set(list);\n this.cdr.detectChanges();\n\n // FLIP – Last / Invert / Play\n this.cardEls.forEach(el => {\n const node = el.nativeElement;\n const beforeTop = positionMap.get(node);\n if (beforeTop === undefined) return;\n\n const delta = beforeTop - node.getBoundingClientRect().top;\n if (delta === 0) return;\n\n // Teleporta al origen (sin transición)\n node.style.transition = 'none';\n node.style.transform = `translateY(${delta}px)`;\n node.classList.add('mcl-item--moving');\n\n // Fuerza reflow para que el browser pinte el estado inicial\n void node.offsetHeight;\n\n // Anima al destino final\n node.style.transition = 'transform 280ms cubic-bezier(0.25, 0.8, 0.25, 1)';\n node.style.transform = '';\n\n node.addEventListener(\n 'transitionend',\n () => {\n node.style.transition = '';\n node.classList.remove('mcl-item--moving');\n },\n { once: true }\n );\n });\n }\n}\n","<div class=\"mcl-list\">\n @for (module of modules(); track module.id; let i = $index) {\n <div class=\"mcl-item\" #cardEl>\n <lib-module-card\n [moduleId]=\"module.id\"\n [moduleName]=\"module.name\"\n [moduleIcon]=\"module.icon ?? ''\"\n [visible]=\"module.visible\"\n [submodules]=\"module.submodules\"\n [aplicativos]=\"module.aplicativos\"\n [childOrder]=\"module.childOrder\"\n [isFirst]=\"i === 0\"\n [isLast]=\"i === modules().length - 1\"\n (moduleEvent)=\"onModuleEvent($event, i)\"\n (submoduleEvent)=\"onSubmoduleEvent($event)\"\n (applicativoEvent)=\"onApplicativoEvent($event)\"\n (childOrderChange)=\"onChildOrderChange(module.id, $event)\" />\n </div>\n }\n</div>\n","// 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\nexport * from './lib/components/card-history/card-history'\n\nexport * from './lib/components/signature/signature'\n\nexport * from './lib/components/document-item/document-item'\n\nexport * from './lib/components/rol-card/rol-card'\n\nexport * from './lib/components/icon-picker/icon-picker'\nexport * from './lib/components/color-picker/color-picker'\n\nexport * from './lib/components/module-card/module-card'\nexport * from './lib/components/module-card/module-card-list/module-card-list'","/**\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/components/icon-picker/icon-picker.utils.ts","../../../projects/sapenlinea-components/src/lib/services/pdf-viewer/pdf-viewer.service.ts","../../../projects/sapenlinea-components/src/lib/components/table/table-column-layout.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/lib/components/card-history/card-history.ts","../../../projects/sapenlinea-components/src/lib/components/card-history/card-history.html","../../../projects/sapenlinea-components/src/lib/components/signature/signature.ts","../../../projects/sapenlinea-components/src/lib/components/signature/signature.html","../../../projects/sapenlinea-components/src/lib/components/document-item/document-item.ts","../../../projects/sapenlinea-components/src/lib/components/document-item/document-item.html","../../../projects/sapenlinea-components/src/lib/components/rol-card/rol-card.ts","../../../projects/sapenlinea-components/src/lib/components/rol-card/rol-card.html","../../../projects/sapenlinea-components/src/lib/components/icon-picker/icon-picker-options.ts","../../../projects/sapenlinea-components/src/lib/components/icon-picker/icon-picker.ts","../../../projects/sapenlinea-components/src/lib/components/icon-picker/icon-picker.html","../../../projects/sapenlinea-components/src/lib/components/color-picker/color-picker-options.ts","../../../projects/sapenlinea-components/src/lib/components/color-picker/color-picker.ts","../../../projects/sapenlinea-components/src/lib/components/color-picker/color-picker.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-icon/module-card-icon.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-icon/module-card-icon.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-applicativo/module-card-applicativo.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-applicativo/module-card-applicativo.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-order.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card.html","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-list/module-card-list.ts","../../../projects/sapenlinea-components/src/lib/components/module-card/module-card-list/module-card-list.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 { IconPickerOption } from './icon-picker-options';\r\n\r\nexport type IconPickerValueType = 'css' | 'lucide';\r\n\r\nconst LUCIDE_PREFIX = 'lucide:';\r\n\r\nexport function isLucideIconValue(value: string | null | undefined): boolean {\r\n return !!value?.startsWith(LUCIDE_PREFIX);\r\n}\r\n\r\nexport function parseIconPickerValue(value: string): { type: IconPickerValueType; name: string } {\r\n if (value.startsWith(LUCIDE_PREFIX)) {\r\n return { type: 'lucide', name: value.slice(LUCIDE_PREFIX.length) };\r\n }\r\n return { type: 'css', name: value };\r\n}\r\n\r\nexport function getIconPickerOptionType(option: IconPickerOption): IconPickerValueType {\r\n if (option.type) return option.type;\r\n if (option.value.startsWith(LUCIDE_PREFIX)) return 'lucide';\r\n return 'css';\r\n}\r\n\r\nexport function toIconPickerStoredValue(option: IconPickerOption): string {\r\n const type = getIconPickerOptionType(option);\r\n if (type === 'lucide') {\r\n const name = option.value.startsWith(LUCIDE_PREFIX)\r\n ? option.value.slice(LUCIDE_PREFIX.length)\r\n : option.value;\r\n return `${LUCIDE_PREFIX}${name}`;\r\n }\r\n return option.value;\r\n}\r\n\r\nexport function getIconPickerOptionKey(option: IconPickerOption): string {\r\n return toIconPickerStoredValue(option);\r\n}\r\n\r\nexport function toLucidePascalCase(value: string): string {\r\n return value.replace(/(\\w)([a-z0-9]*)(_|-|\\s*)/g, (_match, first: string, rest: string) =>\r\n first.toUpperCase() + rest.toLowerCase());\r\n}\r\n\r\nexport function getIconPickerOptionLabel(option: IconPickerOption): string {\r\n if (option.label) return option.label;\r\n const { type, name } = parseIconPickerValue(toIconPickerStoredValue(option));\r\n if (type === 'lucide') return name.replace(/-/g, ' ');\r\n return name.replace(/^icon-/, '').replace(/-/g, ' ');\r\n}\r\n\r\n/** Resuelve si un valor de icono es CSS o Lucide (prefijo `lucide:` o legacy `iconType`) */\r\nexport function resolveIconKind(\r\n value: string | null | undefined,\r\n legacyType?: 'css' | 'lucide',\r\n): IconPickerValueType {\r\n if (isLucideIconValue(value)) return 'lucide';\r\n if (legacyType === 'lucide') return 'lucide';\r\n return 'css';\r\n}\r\n\r\n/** Nombre kebab-case del icono Lucide sin el prefijo */\r\nexport function getLucideIconName(value: string): string {\r\n if (isLucideIconValue(value)) {\r\n return parseIconPickerValue(value).name;\r\n }\r\n return value;\r\n}\r\n\r\n/** Clase CSS para iconos de icons.css; vacío si el valor es Lucide */\r\nexport function getCssIconClass(value: string): string {\r\n return resolveIconKind(value) === 'css' ? value : '';\r\n}\r\n","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}","/**\r\n * Matriz de decisión de anchos para columnas de lib-table.\r\n * Prioridad: overrides manuales → widthProfile → tipo de columna.\r\n */\r\n\r\nexport type ColumnWidthProfile = 'compact' | 'fixed' | 'flex';\r\n\r\nexport interface TableColumnWidthConfig {\r\n type?: string;\r\n label?: string;\r\n compact?: boolean;\r\n autoWidth?: boolean;\r\n maxWidth?: number;\r\n minWidth?: number;\r\n widthProfile?: ColumnWidthProfile;\r\n /** true explícito, o detectar `\\n` en label */\r\n headerMultiline?: boolean;\r\n}\r\n\r\nexport interface ResolvedTableColumnLayout {\r\n profile: ColumnWidthProfile;\r\n minWidth: number;\r\n maxWidth?: number;\r\n /** Peso en fr para sub-filas (child-grid) */\r\n grow: number;\r\n headerNowrap: boolean;\r\n cellEllipsis: boolean;\r\n cellWrap: boolean;\r\n}\r\n\r\nconst LABEL_CHAR_PX = 9;\r\nconst HEADER_PADDING_PX = 28;\r\n\r\nexport function isMultilineHeaderLabel(\r\n label: string | undefined,\r\n headerMultiline?: boolean,\r\n): boolean {\r\n if (headerMultiline === true) return true;\r\n if (headerMultiline === false) return false;\r\n return !!label?.includes('\\n');\r\n}\r\n\r\nfunction longestLabelLine(label: string): string {\r\n return label.split('\\n').reduce((longest, line) => (line.length > longest.length ? line : longest), '');\r\n}\r\n\r\nfunction minWidthFromLabel(label: string | undefined, floor: number): number {\r\n if (!label?.trim()) return floor;\r\n const line = longestLabelLine(label.trim());\r\n return Math.max(floor, line.length * LABEL_CHAR_PX + HEADER_PADDING_PX);\r\n}\r\n\r\nfunction byType(type: string | undefined): ResolvedTableColumnLayout {\r\n switch (type) {\r\n case 'icon-button':\r\n return { profile: 'compact', minWidth: 52, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false };\r\n case 'grade':\r\n return { profile: 'compact', minWidth: 72, maxWidth: 96, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false };\r\n case 'status':\r\n return { profile: 'fixed', minWidth: 100, maxWidth: 150, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false };\r\n case 'number':\r\n return { profile: 'fixed', minWidth: 88, maxWidth: 120, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'money':\r\n return { profile: 'fixed', minWidth: 110, maxWidth: 140, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'percentage':\r\n return { profile: 'fixed', minWidth: 84, maxWidth: 104, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'date':\r\n return { profile: 'fixed', minWidth: 108, maxWidth: 128, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'datetime':\r\n return { profile: 'fixed', minWidth: 148, maxWidth: 176, grow: 0, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'email':\r\n return { profile: 'flex', minWidth: 160, maxWidth: 240, grow: 2, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n case 'text':\r\n return { profile: 'flex', minWidth: 140, maxWidth: 280, grow: 3, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n default:\r\n return { profile: 'flex', minWidth: 120, maxWidth: 220, grow: 2, headerNowrap: true, cellEllipsis: true, cellWrap: false };\r\n }\r\n}\r\n\r\nexport function resolveTableColumnLayout(col: TableColumnWidthConfig): ResolvedTableColumnLayout {\r\n const typeDefault = byType(col.type);\r\n\r\n if (col.compact) {\r\n const minWidth = col.minWidth ?? Math.min(typeDefault.minWidth, 56);\r\n return {\r\n profile: 'compact',\r\n minWidth,\r\n maxWidth: col.maxWidth ?? minWidth,\r\n grow: 0,\r\n headerNowrap: true,\r\n cellEllipsis: false,\r\n cellWrap: false,\r\n };\r\n }\r\n\r\n if (col.widthProfile) {\r\n const base = col.widthProfile === 'compact'\r\n ? { profile: 'compact' as const, minWidth: col.minWidth ?? 56, maxWidth: col.maxWidth ?? col.minWidth ?? 56, grow: 0, headerNowrap: true, cellEllipsis: false, cellWrap: false }\r\n : col.widthProfile === 'fixed'\r\n ? { ...typeDefault, profile: 'fixed' as const, grow: 0 }\r\n : { ...typeDefault, profile: 'flex' as const, maxWidth: col.maxWidth ?? typeDefault.maxWidth, grow: Math.max(typeDefault.grow, 2), cellWrap: true, cellEllipsis: false };\r\n\r\n return {\r\n ...base,\r\n minWidth: col.minWidth ?? minWidthFromLabel(col.label, base.minWidth),\r\n maxWidth: col.maxWidth ?? base.maxWidth,\r\n };\r\n }\r\n\r\n if (col.autoWidth === false) {\r\n const minWidth = col.minWidth ?? minWidthFromLabel(col.label, 160);\r\n return {\r\n profile: 'flex',\r\n minWidth,\r\n maxWidth: col.maxWidth,\r\n grow: 4,\r\n headerNowrap: true,\r\n cellEllipsis: false,\r\n cellWrap: true,\r\n };\r\n }\r\n\r\n const layout: ResolvedTableColumnLayout = {\r\n ...typeDefault,\r\n minWidth: minWidthFromLabel(col.label, typeDefault.minWidth),\r\n };\r\n\r\n if (col.minWidth != null) {\r\n layout.minWidth = col.minWidth;\r\n }\r\n\r\n if (isMultilineHeaderLabel(col.label, col.headerMultiline)) {\r\n layout.headerNowrap = false;\r\n }\r\n\r\n if (col.maxWidth != null) {\r\n layout.maxWidth = col.maxWidth;\r\n layout.cellEllipsis = true;\r\n layout.cellWrap = false;\r\n }\r\n\r\n if (col.autoWidth === true && (col.type === 'text' || col.type === 'email' || !col.type)) {\r\n layout.profile = 'flex';\r\n layout.grow = Math.max(layout.grow, 2);\r\n }\r\n\r\n return layout;\r\n}\r\n\r\nexport function getTableMinWidth(\r\n columns: TableColumnWidthConfig[],\r\n options: {\r\n hasSelection?: boolean;\r\n hasActions?: boolean;\r\n columnGroupCount?: number;\r\n columnGroupCellWidth?: number;\r\n } = {},\r\n): number {\r\n const columnGroupCellWidth = options.columnGroupCellWidth ?? 56;\r\n let total = columns.reduce((sum, col) => sum + resolveTableColumnLayout(col).minWidth, 0);\r\n\r\n if (options.columnGroupCount) {\r\n total += options.columnGroupCount * columnGroupCellWidth;\r\n }\r\n if (options.hasSelection) {\r\n total += 52;\r\n }\r\n if (options.hasActions) {\r\n total += 96;\r\n }\r\n\r\n return total;\r\n}\r\n\r\nexport function buildChildGridTemplateColumns(\r\n subColumns: TableColumnWidthConfig[],\r\n options: { includeActions?: boolean; actionsMinWidth?: number } = {},\r\n): string {\r\n const tracks = subColumns.map((col) => {\r\n const layout = resolveTableColumnLayout(col);\r\n if (layout.profile === 'flex') {\r\n return `minmax(${layout.minWidth}px, ${layout.grow}fr)`;\r\n }\r\n const max = layout.maxWidth ?? layout.minWidth;\r\n return `minmax(${layout.minWidth}px, ${max}px)`;\r\n });\r\n\r\n if (options.includeActions) {\r\n tracks.push(`minmax(${options.actionsMinWidth ?? 96}px, auto)`);\r\n }\r\n\r\n return tracks.join(' ');\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n computed,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n QueryList,\r\n signal,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { DOCUMENT, NgStyle, UpperCasePipe } from '@angular/common';\r\nimport { LucideAngularModule, LucideIconData, icons } from 'lucide-angular';\r\nimport {\r\n getCssIconClass,\r\n getLucideIconName,\r\n resolveIconKind,\r\n toLucidePascalCase,\r\n} from '../icon-picker/icon-picker.utils';\r\nimport { PdfViewerService } from '../../services/pdf-viewer/pdf-viewer.service';\r\nimport {\r\n buildChildGridTemplateColumns,\r\n ColumnWidthProfile,\r\n getTableMinWidth,\r\n isMultilineHeaderLabel,\r\n resolveTableColumnLayout,\r\n ResolvedTableColumnLayout,\r\n} from './table-column-layout';\r\n\r\nexport type { ColumnWidthProfile, ResolvedTableColumnLayout } from './table-column-layout';\r\nexport {\r\n buildChildGridTemplateColumns,\r\n getTableMinWidth,\r\n isMultilineHeaderLabel,\r\n resolveTableColumnLayout,\r\n} from './table-column-layout';\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 /** CSS (`icon-*`) o Lucide (`lucide:nombre`) para columnas icon-button */\r\n icon?: string;\r\n iconKey?: string;\r\n /** Icono alternativo (CSS `icon-*` o Lucide `lucide:nombre`) */\r\n iconAlternate?: string;\r\n /** Key del row: si es truthy, muestra iconAlternate en lugar de icon */\r\n iconActiveKey?: string;\r\n /** Función para determinar si mostrar iconAlternate (solo icon-button) */\r\n isIconActive?: (row: TableRow) => boolean;\r\n /** Key del row: si es truthy, deshabilita el botón de icono */\r\n disabledKey?: string;\r\n /** Función para determinar si el botón de icono está deshabilitado */\r\n isIconDisabled?: (row: TableRow) => boolean;\r\n /** Color del icono por defecto (solo icon-button) */\r\n iconColor?: string;\r\n /** Color del icono alternativo (solo icon-button) */\r\n iconAlternateColor?: string;\r\n /**\r\n * @deprecated Usar prefijo `lucide:` en `icon` / `iconAlternate` (ej. `lucide:share-2`)\r\n */\r\n iconType?: 'css' | 'lucide';\r\n /**\r\n * @deprecated Usar prefijo `lucide:` en `iconAlternate`\r\n */\r\n iconAlternateType?: 'css' | 'lucide';\r\n\r\n totalizable?: boolean;\r\n\r\n headerClass?: string;\r\n cellClass?: (row: TableRow) => string;\r\n /**\r\n * Header con salto de línea (`white-space: pre-line`).\r\n * Si no se define, se activa automáticamente cuando `label` contiene `\\n`.\r\n */\r\n headerMultiline?: boolean;\r\n\r\n /**\r\n * Ajusta el ancho de la columna a su contenido hasta un máximo.\r\n * Por defecto se infiere del tipo de columna; usar `false` para columna flexible principal.\r\n */\r\n autoWidth?: boolean;\r\n /** Ancho mínimo en px. Por defecto según tipo y longitud del label */\r\n minWidth?: number;\r\n /** Ancho máximo en px cuando aplica perfil fixed/flex */\r\n maxWidth?: number;\r\n /** Comprime la columna al mínimo posible */\r\n compact?: boolean;\r\n /** Override del perfil automático: compact | fixed | flex */\r\n widthProfile?: ColumnWidthProfile;\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 autoWidth?: boolean;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n compact?: boolean;\r\n widthProfile?: ColumnWidthProfile;\r\n headerMultiline?: boolean;\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 iconAlternate?: string;\r\n iconActiveKey?: string;\r\n isIconActive?: (row: TableRow) => boolean;\r\n disabledKey?: string;\r\n isIconDisabled?: (row: TableRow) => boolean;\r\n iconColor?: string;\r\n iconAlternateColor?: string;\r\n /** @deprecated Usar prefijo `lucide:` en `icon` / `iconAlternate` */\r\n iconType?: 'css' | 'lucide';\r\n /** @deprecated Usar prefijo `lucide:` en `iconAlternate` */\r\n iconAlternateType?: 'css' | 'lucide';\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\n/** Configuración compartida para columnas de tipo icon-button */\r\nexport type TableIconButtonConfig = Pick<\r\n TableColumn,\r\n | 'icon'\r\n | 'iconAlternate'\r\n | 'iconActiveKey'\r\n | 'isIconActive'\r\n | 'disabledKey'\r\n | 'isIconDisabled'\r\n | 'iconColor'\r\n | 'iconAlternateColor'\r\n | 'iconType'\r\n | 'iconAlternateType'\r\n>;\r\n\r\nexport interface TableAction {\r\n key: string;\r\n /** CSS (`icon-*`) o Lucide (`lucide:nombre`) */\r\n icon: string;\r\n label: string;\r\n /** Color explícito del icono. Si no se define, usa ICON_COLOR_MAP para clases icon-* */\r\n color?: string;\r\n /**\r\n * @deprecated Usar prefijo `lucide:` en `icon` (ej. `lucide:share-2`)\r\n */\r\n iconType?: 'css' | 'lucide';\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 | 'purple'\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 purple: { bg: '#C7B0D8', color: '#6A1B9A' },\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 'icon-logout': '#CF0707',\r\n 'icon-sanction': '#CF6507',\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\r\n 'icon-file': '#40484C',\r\n 'icon-export': '#40484C',\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, NgStyle, LucideAngularModule],\r\n standalone: true,\r\n templateUrl: './table.html',\r\n styleUrl: './table.css',\r\n})\r\nexport class Table implements AfterViewInit, OnDestroy {\r\n private static readonly ACTION_MENU_WIDTH = 200;\r\n private static readonly ACTION_MENU_ITEM_HEIGHT = 56;\r\n private static readonly VIEWPORT_MARGIN = 8;\r\n private static readonly ACTION_MENU_GAP = 4;\r\n\r\n private readonly pdfViewerService = inject(PdfViewerService);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly ngZone = inject(NgZone);\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 subOptionSelected = 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 subActions = input<TableAction[] | ((row: TableRow) => TableAction[])>([] as TableAction[]);\r\n showSubActions = input<boolean>(false);\r\n expandedRowId = signal<number | string | null>(null);\r\n selectedChildRow = signal<TableRow | null>(null);\r\n actionMenuStyles = signal<Record<string, string>>({});\r\n\r\n readonly isActionMenuOpen = computed(\r\n () => this.selectedRow() !== null || this.selectedChildRow() !== null\r\n );\r\n\r\n readonly activeMenuActions = computed(() => {\r\n const child = this.selectedChildRow();\r\n if (child) return this.getActionsForChildRow(child);\r\n const row = this.selectedRow();\r\n if (row) return this.getActionsForRow(row);\r\n return [];\r\n });\r\n\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 @ViewChild('actionMenuPanel') actionMenuRef?: ElementRef<HTMLElement>;\r\n\r\n private actionMenuTrigger: HTMLElement | null = null;\r\n private actionMenuParent: HTMLElement | null = null;\r\n private resizeListener?: () => void;\r\n private scrollListener?: () => void;\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 this.closeActionMenu();\r\n }\r\n\r\n onActiveMenuOptionClick(option: TableAction) {\r\n const child = this.selectedChildRow();\r\n if (child) {\r\n this.onSubOptionClick(option, child);\r\n return;\r\n }\r\n\r\n const row = this.selectedRow();\r\n if (row) {\r\n this.onOptionClick(option, row);\r\n }\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.closeActionMenu();\r\n return;\r\n }\r\n\r\n this.selectedChildRow.set(null);\r\n this.selectedRow.set(row);\r\n this.actionMenuTrigger = (event?.currentTarget as HTMLElement) ?? null;\r\n this.scheduleActionMenuPositioning();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.closeActionMenu();\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 (\r\n !target.closest('.menu-acciones') &&\r\n !target.closest('.modal-options-table')\r\n ) {\r\n this.closeActionMenu();\r\n }\r\n }\r\n\r\n getColumnLayout(col: TableColumn | SubColumn): ResolvedTableColumnLayout {\r\n return resolveTableColumnLayout(col);\r\n }\r\n\r\n isHeaderMultiline(col: { label?: string; headerMultiline?: boolean }): boolean {\r\n return isMultilineHeaderLabel(col.label, col.headerMultiline);\r\n }\r\n\r\n isGroupLabelMultiline(groupLabel: string): boolean {\r\n return isMultilineHeaderLabel(groupLabel);\r\n }\r\n\r\n getTableMinWidthPx(): number {\r\n const groupCount = this.columnGroups().reduce((n, g) => n + g.columns.length, 0);\r\n return getTableMinWidth(this.columns(), {\r\n hasSelection: this.showSelection(),\r\n hasActions: this.showActions(),\r\n columnGroupCount: groupCount,\r\n });\r\n }\r\n\r\n getChildGridColumns(): string {\r\n return buildChildGridTemplateColumns(this.subColumns(), {\r\n includeActions: this.showSubActions(),\r\n });\r\n }\r\n\r\n getColMaxWidth(col: TableColumn | SubColumn): string | undefined {\r\n const layout = this.getColumnLayout(col);\r\n return layout.maxWidth != null ? `${layout.maxWidth}px` : undefined;\r\n }\r\n\r\n getColMinWidth(col: TableColumn | SubColumn): string {\r\n return `${this.getColumnLayout(col).minWidth}px`;\r\n }\r\n\r\n getColWidth(col: TableColumn | SubColumn): string | undefined {\r\n const layout = this.getColumnLayout(col);\r\n if (layout.profile === 'compact') {\r\n return `${layout.minWidth}px`;\r\n }\r\n if (layout.profile === 'flex' && col.autoWidth === false) {\r\n return undefined;\r\n }\r\n if (layout.profile === 'fixed' && layout.maxWidth != null) {\r\n return `${layout.maxWidth}px`;\r\n }\r\n return undefined;\r\n }\r\n\r\n isColumnCellEllipsis(col: TableColumn | SubColumn): boolean {\r\n return this.getColumnLayout(col).cellEllipsis;\r\n }\r\n\r\n isColumnCellWrap(col: TableColumn | SubColumn): boolean {\r\n return this.getColumnLayout(col).cellWrap;\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 action.color ?? ICON_COLOR_MAP[action.icon] ?? '#40484C';\r\n }\r\n\r\n isIconButtonActive(config: TableIconButtonConfig, row: TableRow): boolean {\r\n if (config.isIconActive) return config.isIconActive(row);\r\n if (config.iconActiveKey) return !!row[config.iconActiveKey];\r\n return false;\r\n }\r\n\r\n isIconButtonDisabled(config: TableIconButtonConfig, row: TableRow): boolean {\r\n if (config.isIconDisabled) return config.isIconDisabled(row);\r\n if (config.disabledKey) return !!row[config.disabledKey];\r\n return false;\r\n }\r\n\r\n getIconButtonIcon(config: TableIconButtonConfig, row: TableRow): string {\r\n if (this.isIconButtonActive(config, row) && config.iconAlternate) {\r\n return config.iconAlternate;\r\n }\r\n return config.icon ?? '';\r\n }\r\n\r\n getIconButtonLegacyType(config: TableIconButtonConfig, row: TableRow): 'css' | 'lucide' | undefined {\r\n if (this.isIconButtonActive(config, row) && config.iconAlternate) {\r\n return config.iconAlternateType ?? config.iconType;\r\n }\r\n return config.iconType;\r\n }\r\n\r\n isLucideIconButton(config: TableIconButtonConfig, row: TableRow): boolean {\r\n const icon = this.getIconButtonIcon(config, row);\r\n return resolveIconKind(icon, this.getIconButtonLegacyType(config, row)) === 'lucide';\r\n }\r\n\r\n getIconButtonCssClass(config: TableIconButtonConfig, row: TableRow): string {\r\n const icon = this.getIconButtonIcon(config, row);\r\n return getCssIconClass(icon);\r\n }\r\n\r\n getIconButtonColor(config: TableIconButtonConfig, row: TableRow): string {\r\n const icon = this.getIconButtonIcon(config, row);\r\n const cssIcon = getCssIconClass(icon) || icon;\r\n if (this.isIconButtonActive(config, row) && config.iconAlternate) {\r\n return config.iconAlternateColor ?? config.iconColor ?? ICON_COLOR_MAP[cssIcon] ?? '#40484C';\r\n }\r\n return config.iconColor ?? ICON_COLOR_MAP[cssIcon] ?? '#40484C';\r\n }\r\n\r\n getIconButtonLucideIcon(config: TableIconButtonConfig, row: TableRow): LucideIconData | null {\r\n return this.getLucideIcon(this.getIconButtonIcon(config, row));\r\n }\r\n\r\n isLucideAction(action: TableAction): boolean {\r\n return resolveIconKind(action.icon, action.iconType) === 'lucide';\r\n }\r\n\r\n getActionCssClass(action: TableAction): string {\r\n return getCssIconClass(action.icon);\r\n }\r\n\r\n getLucideIcon(value: string): LucideIconData | null {\r\n const iconName = toLucidePascalCase(getLucideIconName(value));\r\n return (icons as Record<string, LucideIconData | undefined>)[iconName] ?? null;\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 getActionsForChildRow(row: TableRow): TableAction[] {\r\n const acts = this.subActions();\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 openSubModal(row: TableRow, event?: MouseEvent) {\r\n event?.stopPropagation();\r\n\r\n if (this.selectedChildRow()?.['id'] === row['id']) {\r\n this.closeActionMenu();\r\n return;\r\n }\r\n\r\n this.selectedRow.set(null);\r\n this.selectedChildRow.set(row);\r\n this.actionMenuTrigger = (event?.currentTarget as HTMLElement) ?? null;\r\n this.scheduleActionMenuPositioning();\r\n }\r\n\r\n onSubOptionClick(option: TableAction, row: TableRow) {\r\n this.subOptionSelected.emit({ action: option.label, row });\r\n this.closeActionMenu();\r\n }\r\n\r\n private scheduleActionMenuPositioning(): void {\r\n this.addActionMenuPositioningListeners();\r\n\r\n queueMicrotask(() => {\r\n if (!this.isActionMenuOpen()) return;\r\n this.attachActionMenuOverlay();\r\n this.updateActionMenuPosition();\r\n requestAnimationFrame(() => {\r\n if (this.isActionMenuOpen()) {\r\n this.updateActionMenuPosition();\r\n }\r\n });\r\n });\r\n }\r\n\r\n private closeActionMenu(): void {\r\n this.detachActionMenuOverlay();\r\n this.removeActionMenuPositioningListeners();\r\n this.selectedRow.set(null);\r\n this.selectedChildRow.set(null);\r\n this.actionMenuTrigger = null;\r\n this.actionMenuStyles.set({});\r\n }\r\n\r\n private getEstimatedActionMenuHeight(): number {\r\n const count = Math.max(this.activeMenuActions().length, 1);\r\n return count * Table.ACTION_MENU_ITEM_HEIGHT + 2;\r\n }\r\n\r\n private updateActionMenuPosition(): void {\r\n const trigger = this.actionMenuTrigger;\r\n if (!trigger) return;\r\n\r\n const triggerRect = trigger.getBoundingClientRect();\r\n const dropdown = this.actionMenuRef?.nativeElement;\r\n const dropdownHeight = dropdown?.offsetHeight || this.getEstimatedActionMenuHeight();\r\n const dropdownWidth = Table.ACTION_MENU_WIDTH;\r\n const margin = Table.VIEWPORT_MARGIN;\r\n const gap = Table.ACTION_MENU_GAP;\r\n\r\n const spaceBelow = window.innerHeight - triggerRect.bottom - margin;\r\n const spaceAbove = triggerRect.top - margin;\r\n const fitsBelow = spaceBelow >= dropdownHeight + gap;\r\n const fitsAbove = spaceAbove >= dropdownHeight + gap;\r\n\r\n let openUp = false;\r\n if (fitsBelow) {\r\n openUp = false;\r\n } else if (fitsAbove) {\r\n openUp = true;\r\n } else {\r\n openUp = spaceAbove > spaceBelow;\r\n }\r\n\r\n let top = openUp\r\n ? triggerRect.top - dropdownHeight - gap\r\n : triggerRect.bottom + gap;\r\n\r\n const maxTop = window.innerHeight - margin - dropdownHeight;\r\n top = Math.min(Math.max(margin, top), Math.max(margin, maxTop));\r\n\r\n let left = triggerRect.right - dropdownWidth;\r\n if (left + dropdownWidth > window.innerWidth - margin) {\r\n left = window.innerWidth - margin - dropdownWidth;\r\n }\r\n left = Math.max(margin, left);\r\n\r\n this.actionMenuStyles.set({\r\n position: 'fixed',\r\n top: `${Math.round(top)}px`,\r\n left: `${Math.round(left)}px`,\r\n width: `${dropdownWidth}px`,\r\n zIndex: '10050',\r\n });\r\n }\r\n\r\n private attachActionMenuOverlay(): void {\r\n const dropdown = this.actionMenuRef?.nativeElement;\r\n if (!dropdown || dropdown.parentElement === this.document.body) {\r\n return;\r\n }\r\n\r\n this.actionMenuParent = dropdown.parentElement;\r\n this.document.body.appendChild(dropdown);\r\n }\r\n\r\n private detachActionMenuOverlay(): void {\r\n const dropdown = this.actionMenuRef?.nativeElement;\r\n if (!dropdown || dropdown.parentElement !== this.document.body) {\r\n return;\r\n }\r\n\r\n const parent =\r\n this.actionMenuParent ??\r\n this.elementRef.nativeElement.querySelector('.table-host');\r\n\r\n parent?.appendChild(dropdown);\r\n this.actionMenuParent = null;\r\n }\r\n\r\n private addActionMenuPositioningListeners(): void {\r\n this.removeActionMenuPositioningListeners();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const reposition = () => {\r\n if (this.isActionMenuOpen()) {\r\n this.ngZone.run(() => this.updateActionMenuPosition());\r\n }\r\n };\r\n\r\n this.resizeListener = reposition;\r\n this.scrollListener = reposition;\r\n\r\n window.addEventListener('resize', this.resizeListener);\r\n window.addEventListener('scroll', this.scrollListener, true);\r\n });\r\n }\r\n\r\n private removeActionMenuPositioningListeners(): void {\r\n if (this.resizeListener) {\r\n window.removeEventListener('resize', this.resizeListener);\r\n this.resizeListener = undefined;\r\n }\r\n\r\n if (this.scrollListener) {\r\n window.removeEventListener('scroll', this.scrollListener, true);\r\n this.scrollListener = undefined;\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 if (this.isIconButtonDisabled(col, row)) return;\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 if (this.isIconButtonDisabled(col, row)) return;\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-host\">\n<div class=\"table-wrapper\">\n <div class=\"table-scroll\">\n <table class=\"inner-table\" [style.minWidth.px]=\"getTableMinWidthPx()\">\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) + ' ' + (col.headerClass || '')\"\n [class.th--multiline]=\"isHeaderMultiline(col)\"\n [attr.rowspan]=\"hasColumnGroups() ? 2 : null\"\n [style.minWidth]=\"getColMinWidth(col)\" [style.maxWidth]=\"getColMaxWidth(col)\" [style.width]=\"getColWidth(col)\">\n <span class=\"th__label\">{{ col.label }}</span>\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\" [class.th--multiline]=\"isGroupLabelMultiline(group.groupLabel)\"\n [attr.colspan]=\"group.columns.length\">\n <span class=\"th__label\">{{ group.groupLabel }}</span>\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\" [class.th--multiline]=\"isHeaderMultiline(subCol)\">\n <span class=\"th__label\">{{ subCol.label }}</span>\n </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) + ' ' + (col.cellClass ? col.cellClass(row) : '')\"\n [class.table-cell--ellipsis]=\"isColumnCellEllipsis(col)\"\n [class.table-cell--wrap]=\"isColumnCellWrap(col)\"\n [style.minWidth]=\"getColMinWidth(col)\" [style.maxWidth]=\"getColMaxWidth(col)\" [style.width]=\"getColWidth(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 type=\"button\" class=\"cell-icon-button\"\n [class.cell-icon-button--disabled]=\"isIconButtonDisabled(col, row)\"\n [disabled]=\"isIconButtonDisabled(col, row)\"\n [style.color]=\"getIconButtonColor(col, row)\"\n (click)=\"onIconColumnClick(col, row, $event)\">\n @if (isLucideIconButton(col, row)) {\n @if (getIconButtonLucideIcon(col, row); as lucideIcon) {\n <lucide-icon class=\"cell-icon-button__icon\" [img]=\"lucideIcon\" [size]=\"24\"\n [color]=\"getIconButtonColor(col, row)\" aria-hidden=\"true\"></lucide-icon>\n }\n } @else {\n <span class=\"icon cell-icon-button__icon\" [class]=\"getIconButtonCssClass(col, row)\"></span>\n }\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 type=\"button\" class=\"cell-icon-button\"\n [class.cell-icon-button--disabled]=\"isIconButtonDisabled(subCol, row)\"\n [disabled]=\"isIconButtonDisabled(subCol, row)\"\n [style.color]=\"getIconButtonColor(subCol, row)\"\n (click)=\"onGroupIconClick(subCol, row, $event)\">\n @if (isLucideIconButton(subCol, row)) {\n @if (getIconButtonLucideIcon(subCol, row); as lucideIcon) {\n <lucide-icon class=\"cell-icon-button__icon\" [img]=\"lucideIcon\" [size]=\"24\"\n [color]=\"getIconButtonColor(subCol, row)\" aria-hidden=\"true\"></lucide-icon>\n }\n } @else {\n <span class=\"icon cell-icon-button__icon\" [class]=\"getIconButtonCssClass(subCol, row)\"></span>\n }\n </button>\n }\n </td>\n }\n }\n\n <!-- Celda de acciones -->\n @if (showActions()) {\n <td class=\"acciones-cell\" [style.whiteSpace]=\"'nowrap'\">\n <div class=\"menu-acciones\">\n <button class=\"icon-button\" (click)=\"openModal(row, $event)\">\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 </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-scroll\">\n <div class=\"child-grid\" [style.gridTemplateColumns]=\"getChildGridColumns()\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\"\n [style.minWidth]=\"getColMinWidth(subCol)\"\n [class.child-item--wrap]=\"isColumnCellWrap(subCol)\">\n <span class=\"child-label\" [class.child-label--multiline]=\"isHeaderMultiline(subCol)\">{{ subCol.label }}</span>\n </div>\n }\n @if (showSubActions()) {\n <div class=\"child-item child-actions-header\">\n <span class=\"child-label\">Acciones</span>\n </div>\n }\n </div>\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-scroll\">\n <div class=\"child-grid\" [style.gridTemplateColumns]=\"getChildGridColumns()\">\n @for (subCol of subColumns(); track subCol.key) {\n <div class=\"child-item\"\n [style.minWidth]=\"getColMinWidth(subCol)\"\n [class.child-item--wrap]=\"isColumnCellWrap(subCol)\">\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\" [class.child-value--wrap]=\"isColumnCellWrap(subCol)\">\n {{ formatValue(subCol, child[subCol.key]) }}\n </span>\n }\n\n </div>\n }\n @if (showSubActions()) {\n <div class=\"child-item child-actions-cell\">\n <div class=\"menu-acciones\">\n <button class=\"icon-button\" (click)=\"openSubModal(child, $event)\">\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 </div>\n </div>\n }\n </div>\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>\n</div>\n\n@if (isActionMenuOpen()) {\n<div\n #actionMenuPanel\n class=\"modal-options-table modal-options-table--overlay\"\n [ngStyle]=\"actionMenuStyles()\"\n (click)=\"$event.stopPropagation()\"\n>\n <div class=\"modal-content-table\">\n <ul>\n @for (option of activeMenuActions(); track option.key) {\n <li\n class=\"option-item-table\"\n [style.color]=\"getActionColor(option)\"\n (click)=\"onActiveMenuOptionClick(option)\"\n >\n @if (isLucideAction(option)) {\n @if (getLucideIcon(option.icon); as lucideIcon) {\n <lucide-icon\n class=\"action-lucide-icon\"\n [img]=\"lucideIcon\"\n [size]=\"24\"\n [color]=\"getActionColor(option)\"\n aria-hidden=\"true\"\n ></lucide-icon>\n }\n } @else {\n <span class=\"icon\" [class]=\"getActionCssClass(option)\"></span>\n }\n <span class=\"label\">{{ option.label }}</span>\n </li>\n }\n </ul>\n </div>\n</div>\n}\n</div>","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n forwardRef,\r\n OnDestroy,\r\n NgZone,\r\n ViewChild,\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 host: {\r\n class: 'lib-date-time-picker-host',\r\n },\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 private static readonly DROPDOWN_MIN_WIDTH = 400;\r\n private static readonly VIEWPORT_MARGIN = 8;\r\n private static readonly DROPDOWN_GAP = 4;\r\n\r\n @ViewChild('dropdownPanel') dropdownRef?: ElementRef<HTMLElement>;\r\n\r\n private readonly document = inject(DOCUMENT);\r\n\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 dropdownStyles = signal<Record<string, string>>({});\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 private resizeListener?: () => void;\r\n private scrollListener?: () => void;\r\n private dropdownParent: HTMLElement | null = null;\r\n\r\n /**\r\n * Valor que se muestra en el campo de texto.\r\n * Modo 'date': DD/MM/YYYY. Modo 'datetime': DD/MM/YYYY HH:MM (24h).\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 return this.formatDateForInput(date);\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.detachDropdownOverlay();\r\n this.removeDocumentListener();\r\n this.removePositioningListeners();\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 this.isOpen.set(true);\r\n this.addDocumentListener();\r\n this.addPositioningListeners();\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 queueMicrotask(() => {\r\n if (!this.isOpen()) return;\r\n this.attachDropdownOverlay();\r\n this.updatePosition();\r\n requestAnimationFrame(() => {\r\n if (this.isOpen()) {\r\n this.updatePosition();\r\n }\r\n });\r\n });\r\n }\r\n\r\n close() {\r\n this.detachDropdownOverlay();\r\n this.isOpen.set(false);\r\n this.openUpward.set(false);\r\n this.dropdownStyles.set({});\r\n this.removeDocumentListener();\r\n this.removePositioningListeners();\r\n this.markAsTouched();\r\n }\r\n\r\n private getTriggerElement(): HTMLElement | null {\r\n return this.elementRef.nativeElement.querySelector('.datetime-header');\r\n }\r\n\r\n private getEstimatedDropdownHeight(): number {\r\n return this.mode() === 'datetime' ? 400 : 360;\r\n }\r\n\r\n private updatePosition(): void {\r\n const trigger = this.getTriggerElement();\r\n if (!trigger) return;\r\n\r\n const triggerRect = trigger.getBoundingClientRect();\r\n const dropdown = this.dropdownRef?.nativeElement;\r\n const dropdownHeight = dropdown?.offsetHeight || this.getEstimatedDropdownHeight();\r\n const dropdownWidth = Math.max(\r\n triggerRect.width,\r\n DateTimePicker.DROPDOWN_MIN_WIDTH\r\n );\r\n const margin = DateTimePicker.VIEWPORT_MARGIN;\r\n const gap = DateTimePicker.DROPDOWN_GAP;\r\n\r\n const spaceBelow = window.innerHeight - triggerRect.bottom - margin;\r\n const spaceAbove = triggerRect.top - margin;\r\n const fitsBelow = spaceBelow >= dropdownHeight + gap;\r\n const fitsAbove = spaceAbove >= dropdownHeight + gap;\r\n\r\n let openUp = false;\r\n if (fitsBelow) {\r\n openUp = false;\r\n } else if (fitsAbove) {\r\n openUp = true;\r\n } else {\r\n openUp = spaceAbove > spaceBelow;\r\n }\r\n\r\n this.openUpward.set(openUp);\r\n\r\n let top = openUp\r\n ? triggerRect.top - dropdownHeight - gap\r\n : triggerRect.bottom + gap;\r\n\r\n const maxTop = window.innerHeight - margin - dropdownHeight;\r\n top = Math.min(Math.max(margin, top), Math.max(margin, maxTop));\r\n\r\n let left = triggerRect.left;\r\n if (left + dropdownWidth > window.innerWidth - margin) {\r\n left = window.innerWidth - margin - dropdownWidth;\r\n }\r\n left = Math.max(margin, left);\r\n\r\n this.dropdownStyles.set({\r\n position: 'fixed',\r\n top: `${Math.round(top)}px`,\r\n left: `${Math.round(left)}px`,\r\n width: `${Math.round(dropdownWidth)}px`,\r\n zIndex: '10050',\r\n });\r\n }\r\n\r\n private attachDropdownOverlay(): void {\r\n const dropdown = this.dropdownRef?.nativeElement;\r\n if (!dropdown || dropdown.parentElement === this.document.body) {\r\n return;\r\n }\r\n\r\n this.dropdownParent = dropdown.parentElement;\r\n this.document.body.appendChild(dropdown);\r\n }\r\n\r\n private detachDropdownOverlay(): void {\r\n const dropdown = this.dropdownRef?.nativeElement;\r\n if (!dropdown || dropdown.parentElement !== this.document.body) {\r\n return;\r\n }\r\n\r\n const parent =\r\n this.dropdownParent ??\r\n this.elementRef.nativeElement.querySelector('.datetime-container');\r\n\r\n parent?.appendChild(dropdown);\r\n this.dropdownParent = null;\r\n }\r\n\r\n private addPositioningListeners(): void {\r\n this.removePositioningListeners();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const reposition = () => {\r\n if (this.isOpen()) {\r\n this.ngZone.run(() => this.updatePosition());\r\n }\r\n };\r\n\r\n this.resizeListener = reposition;\r\n this.scrollListener = reposition;\r\n\r\n window.addEventListener('resize', this.resizeListener);\r\n window.addEventListener('scroll', this.scrollListener, true);\r\n });\r\n }\r\n\r\n private removePositioningListeners(): void {\r\n if (this.resizeListener) {\r\n window.removeEventListener('resize', this.resizeListener);\r\n this.resizeListener = undefined;\r\n }\r\n\r\n if (this.scrollListener) {\r\n window.removeEventListener('scroll', this.scrollListener, true);\r\n this.scrollListener = undefined;\r\n }\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 o DD/MM/YYYY HH:MM)\r\n onInputChange(event: Event) {\r\n if (this.isBlocked()) return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const value = input.value;\r\n const isDateTime = this.mode() === 'datetime';\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 para fecha o 12 para datetime\r\n const maxDigits = isDateTime ? 12 : 8;\r\n const limitedNumbers = numbersOnly.slice(0, maxDigits);\r\n\r\n // Formatear con separadores: DD/MM/YYYY [ HH:MM]\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 if (isDateTime && limitedNumbers.length > 8) {\r\n formatted += ' ' + limitedNumbers.slice(8, 10);\r\n }\r\n if (isDateTime && limitedNumbers.length > 10) {\r\n formatted += ':' + limitedNumbers.slice(10, 12);\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 const completeLength = isDateTime ? 16 : 10;\r\n\r\n if (formatted.length === completeLength) {\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/time segment under the cursor on click.\r\n * Format: DD/MM/YYYY [HH:MM] → DD=0-1, MM=3-4, YYYY=6-9, HH=11-12, MM=14-15\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 if (!value || !value.includes('/')) return;\r\n\r\n const hasTime = this.mode() === 'datetime' && value.includes(':');\r\n\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 if (pos <= 10 || !hasTime) {\r\n start = 6;\r\n end = 10;\r\n } else if (pos <= 13) {\r\n start = 11;\r\n end = 13;\r\n } else {\r\n start = 14;\r\n end = 16;\r\n }\r\n\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 trimmed = input.trim();\r\n const dateTimeMatch = trimmed.match(\r\n /^(\\d{2})\\/(\\d{2})\\/(\\d{4})\\s(\\d{2}):(\\d{2})$/\r\n );\r\n const dateMatch = trimmed.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n const match = dateTimeMatch || dateMatch;\r\n\r\n if (!match) return null;\r\n\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 const hour = match[4] ? parseInt(match[4], 10) : 0;\r\n const minute = match[5] ? parseInt(match[5], 10) : 0;\r\n\r\n if (\r\n day >= 1 && day <= 31 &&\r\n month >= 0 && month <= 11 &&\r\n year >= 1900 && year <= 2100 &&\r\n hour >= 0 && hour <= 23 &&\r\n minute >= 0 && minute <= 59\r\n ) {\r\n const date = new Date(year, month, day, hour, minute);\r\n if (\r\n date.getDate() === day &&\r\n date.getMonth() === month &&\r\n date.getFullYear() === year\r\n ) {\r\n return date;\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 const dateStr = `${day}/${month}/${year}`;\r\n\r\n if (this.mode() === 'datetime') {\r\n const hour = date.getHours().toString().padStart(2, '0');\r\n const minute = date.getMinutes().toString().padStart(2, '0');\r\n return `${dateStr} ${hour}:${minute}`;\r\n }\r\n\r\n return dateStr;\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 const clickedInsideTrigger = this.elementRef.nativeElement.contains(target);\r\n const clickedInsideDropdown =\r\n this.dropdownRef?.nativeElement.contains(target) ?? false;\r\n\r\n if (!clickedInsideTrigger && !clickedInsideDropdown) {\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\r\n @if (isOpen()) {\r\n <div\r\n #dropdownPanel\r\n class=\"dropdown\"\r\n [class.dropdown--upward]=\"openUpward()\"\r\n [style.position]=\"dropdownStyles()['position']\"\r\n [style.top]=\"dropdownStyles()['top']\"\r\n [style.left]=\"dropdownStyles()['left']\"\r\n [style.width]=\"dropdownStyles()['width']\"\r\n [style.z-index]=\"dropdownStyles()['zIndex']\"\r\n >\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</div>\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 __/__/____ o __/__/____, __:__ __\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n const ampmMatch = raw.toUpperCase().match(/[AP]M?/);\r\n const ampmStr = ampmMatch ? (ampmMatch[0].startsWith('P') ? 'PM' : 'AM') : 'AM';\r\n\r\n const template: { char: string; filled: boolean }[] = [\r\n { char: 'd', filled: false }, // 0\r\n { char: 'd', filled: false }, // 1\r\n { char: '/', filled: false }, // 2\r\n { char: 'm', filled: false }, // 3\r\n { char: 'm', filled: false }, // 4\r\n { char: '/', filled: false }, // 5\r\n { char: 'y', filled: false }, // 6\r\n { char: 'y', filled: false }, // 7\r\n { char: 'y', filled: false }, // 8\r\n { char: 'y', filled: false }, // 9\r\n ];\r\n\r\n if (isDateTime) {\r\n template.push(\r\n { char: ',', filled: false }, // 10\r\n { char: ' ', filled: false }, // 11\r\n { char: 'h', filled: false }, // 12\r\n { char: 'h', filled: false }, // 13\r\n { char: ':', filled: false }, // 14\r\n { char: 'm', filled: false }, // 15\r\n { char: 'm', filled: false }, // 16\r\n { char: ' ', filled: false }, // 17\r\n { char: ampmStr[0], filled: false }, // 18\r\n { char: ampmStr[1], filled: false } // 19\r\n );\r\n }\r\n\r\n let index = 0;\r\n\r\n for (let i = 0; i < template.length; i++) {\r\n if (template[i].char === '/' || template[i].char === ',' || template[i].char === ' ' || template[i].char === ':') continue;\r\n\r\n if (isDateTime && (i === 18 || i === 19)) {\r\n if (numbersOnly.length >= 12) {\r\n template[i].filled = true;\r\n }\r\n continue;\r\n }\r\n\r\n if (index < numbersOnly.length) {\r\n template[i] = { char: numbersOnly[index++], filled: true };\r\n }\r\n }\r\n\r\n // Cuando se completa el segmento, el slash/separador correspondiente pasa a \"filled\"\r\n if (numbersOnly.length >= 2) template[2].filled = true;\r\n if (numbersOnly.length >= 4) template[5].filled = true;\r\n \r\n if (isDateTime) {\r\n if (numbersOnly.length >= 8) {\r\n template[10].filled = true;\r\n template[11].filled = true;\r\n }\r\n if (numbersOnly.length >= 10) template[14].filled = true;\r\n if (numbersOnly.length >= 12) template[17].filled = true;\r\n }\r\n\r\n return template;\r\n });\r\n\r\n clearTrigger = input<number>(0);\r\n /** Fecha previa a restaurar */\r\n initialValue = input<Date | string | null>(null);\r\n /** Clave del filtro activo a restaurar (FilterItem.value) */\r\n initialFilterType = input<string | null>(null);\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 wasManuallyCleared = false;\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.wasManuallyCleared = false;\r\n this.clear();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const filterType = this.initialFilterType();\r\n const value = this.initialValue();\r\n if (!filterType && !value) return;\r\n if (this.wasManuallyCleared) return;\r\n if (filterType) this.activeFilterType.set(filterType);\r\n if (value) this.writeValue(value);\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n // Remove all non-numeric characters for digits processing\r\n const numbersOnly = value.replace(/\\D/g, '');\r\n\r\n // Limit to 8 digits (DD/MM/YYYY) or 12 for datetime\r\n const maxDigits = isDateTime ? 12 : 8;\r\n const limitedNumbers = numbersOnly.slice(0, maxDigits);\r\n\r\n // Format string\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 if (isDateTime && limitedNumbers.length > 8) {\r\n formatted += ', ' + limitedNumbers.slice(8, 10);\r\n }\r\n if (isDateTime && limitedNumbers.length > 10) {\r\n formatted += ':' + limitedNumbers.slice(10, 12);\r\n }\r\n \r\n if (isDateTime && limitedNumbers.length === 12) {\r\n const lastChars = value.slice(-3).toUpperCase();\r\n let ampm = this.selectedAmPm();\r\n if (lastChars.includes('P')) ampm = 'PM';\r\n else if (lastChars.includes('A')) ampm = 'AM';\r\n \r\n this.selectedAmPm.set(ampm);\r\n formatted += ' ' + ampm;\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 const completeLength = isDateTime ? (formatted.length >= 20 ? 12 : -1) : 10;\r\n const isComplete = isDateTime ? limitedNumbers.length === 12 : formatted.length === 10;\r\n\r\n if (isComplete) {\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n let start: number;\r\n let end: number;\r\n\r\n if (pos <= 2) {\r\n start = 0; end = 2;\r\n } else if (pos <= 5) {\r\n start = 3; end = 5;\r\n } else if (pos <= 10 || !isDateTime) {\r\n start = 6; end = 10;\r\n } else if (pos <= 14) {\r\n start = 12; end = 14;\r\n } else if (pos <= 17) {\r\n start = 15; end = 17;\r\n } else {\r\n start = 18; end = 20;\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 const isDateTime = this.mode() === 'datetime';\r\n \r\n // Determine current segment\r\n let currentSegment: number;\r\n if (pos <= 2) currentSegment = 0;\r\n else if (pos <= 5) currentSegment = 1;\r\n else if (pos <= 10 || !isDateTime) currentSegment = 2;\r\n else if (pos <= 14) currentSegment = 3;\r\n else if (pos <= 17) currentSegment = 4;\r\n else currentSegment = 5;\r\n\r\n // Segment ranges\r\n const segments = isDateTime \r\n ? [\r\n { start: 0, end: 2 }, // DD\r\n { start: 3, end: 5 }, // MM\r\n { start: 6, end: 10 }, // YYYY\r\n { start: 12, end: 14 }, // HH\r\n { start: 15, end: 17 }, // MIN\r\n { start: 18, end: 20 }, // AMPM\r\n ]\r\n : [\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 const numSegments = isDateTime ? 6 : 3;\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 } else {\r\n // Move to next segment\r\n if (currentSegment < numSegments - 1) {\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 }\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n if (currentSegment < numSegments - 1) {\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 let day = 1, month = 1, year = 2024, hour = 12, min = 0, ampm = 'AM';\r\n \r\n if (isDateTime) {\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4}),\\s(\\d{2}):(\\d{2})\\s(AM|PM)$/i);\r\n if (!match) return;\r\n day = parseInt(match[1], 10);\r\n month = parseInt(match[2], 10);\r\n year = parseInt(match[3], 10);\r\n hour = parseInt(match[4], 10);\r\n min = parseInt(match[5], 10);\r\n ampm = match[6].toUpperCase();\r\n } else {\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (!match) return;\r\n day = parseInt(match[1], 10);\r\n month = parseInt(match[2], 10);\r\n year = parseInt(match[3], 10);\r\n }\r\n\r\n const delta = event.key === 'ArrowUp' ? 1 : -1;\r\n\r\n if (currentSegment === 0) {\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 month += delta;\r\n if (month < 1) month = 12;\r\n if (month > 12) month = 1;\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n } else if (currentSegment === 2) {\r\n year += delta;\r\n if (year < 1900) year = 1900;\r\n if (year > 2100) year = 2100;\r\n const maxDay = new Date(year, month, 0).getDate();\r\n if (day > maxDay) day = maxDay;\r\n } else if (currentSegment === 3) {\r\n hour += delta;\r\n if (hour < 1) hour = 12;\r\n if (hour > 12) hour = 1;\r\n } else if (currentSegment === 4) {\r\n min += delta;\r\n if (min < 0) min = 59;\r\n if (min > 59) min = 0;\r\n } else if (currentSegment === 5) {\r\n ampm = ampm === 'AM' ? 'PM' : 'AM';\r\n }\r\n\r\n let newFormatted = '';\r\n if (isDateTime) {\r\n newFormatted = `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}, ${hour.toString().padStart(2, '0')}:${min.toString().padStart(2, '0')} ${ampm}`;\r\n } else {\r\n newFormatted = `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}`;\r\n }\r\n\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 const isDateTime = this.mode() === 'datetime';\r\n\r\n if (isDateTime) {\r\n const match = input.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4}),\\s(\\d{2}):(\\d{2})\\s(AM|PM)$/i);\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 const hour12 = parseInt(match[4], 10);\r\n const minute = parseInt(match[5], 10);\r\n const ampm = match[6].toUpperCase();\r\n\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100 &&\r\n hour12 >= 1 && hour12 <= 12 && minute >= 0 && minute <= 59) {\r\n const hour24 = ampm === 'PM' ? (hour12 === 12 ? 12 : hour12 + 12) : (hour12 === 12 ? 0 : hour12);\r\n const date = new Date(year, month, day, hour24, minute);\r\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\r\n return date;\r\n }\r\n }\r\n }\r\n } else {\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\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\r\n if (this.mode() === 'datetime') {\r\n let h = date.getHours();\r\n const m = date.getMinutes().toString().padStart(2, '0');\r\n const ampm = h >= 12 ? 'PM' : 'AM';\r\n h = h % 12;\r\n h = h ? h : 12;\r\n const hStr = h.toString().padStart(2, '0');\r\n return `${day}/${month}/${year}, ${hStr}:${m} ${ampm}`;\r\n }\r\n\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.wasManuallyCleared = true;\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\">\n @for (item of filters(); track item.value) {\n <div class=\"chip-input-wrapper\" #chip [class.has-value]=\"selectedDate() || inputTextValue()\"\n [class.active]=\"activeFilterType() === item.value\">\n <!-- Etiqueta flotante -->\n <label class=\"floating-label\">{{ item.placeholder || item.label || (item.type === 'datetime' ? 'dd/mm/aaaa, hh:mm AM/PM' : 'dd/mm/aaaa') }}</label>\n\n <!-- Máscara de guía de fecha dinámica (__/__/____) -->\n <div class=\"chip-input-mask\">\n @for (part of inputMask(); track $index) {\n <span class=\"mask-char\" [class.mask-char-filled]=\"part.filled\" [class.mask-char-placeholder]=\"!part.filled\">\n {{ part.char }}\n </span>\n }\n </div>\n\n <input type=\"text\" [value]=\"inputTextValue()\" (input)=\"onInputChange($event, item.value)\"\n (click)=\"onInputClick($event, item.value)\"\n (focus)=\"onInputFocus(item.value)\" [placeholder]=\"item.placeholder || 'Seleccionar Fecha'\"\n [attr.title]=\"item.placeholder || item.label || 'Seleccionar Fecha'\" class=\"chip-input\"\n [disabled]=\"isDisabled()\" (keydown)=\"onInputKeyDown($event, item.value)\" />\n\n <button type=\"button\" class=\"calendar-icon-button\" (click)=\"toggle(item.value)\" title=\"Abrir calendario\">\n <span class=\"calendar-icon icon icon-calendar\" aria-hidden=\"true\"></span>\n </button>\n\n @if (isOpen() && activeFilterType() === item.value) {\n <div class=\"dropdown\" [class.open-left]=\"dropdownDirection() === 'left'\">\n <div class=\"datetime-content\">\n <!-- Sección del calendario -->\n <div class=\"calendar-section\">\n <!-- Navegación -->\n <div class=\"calendar-nav\">\n <div class=\"nav-section\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousYear()\" title=\"Año anterior\">\n ‹‹\n </button>\n <button type=\"button\" class=\"nav-btn\" (click)=\"previousMonth()\" title=\"Mes anterior\">\n ‹\n </button>\n </div>\n\n <div class=\"current-date\">\n {{ monthName() }} {{ currentYear() }}\n </div>\n\n <div class=\"nav-section\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextMonth()\" title=\"Siguiente mes\">\n ›\n </button>\n <button type=\"button\" class=\"nav-btn\" (click)=\"nextYear()\" title=\"Siguiente año\">\n ››\n </button>\n </div>\n </div>\n\n <!-- Días de la semana -->\n <div class=\"weekdays\">\n <div class=\"weekday\">Dom</div>\n <div class=\"weekday\">Lun</div>\n <div class=\"weekday\">Mar</div>\n <div class=\"weekday\">Mié</div>\n <div class=\"weekday\">Jue</div>\n <div class=\"weekday\">Vie</div>\n <div class=\"weekday\">Sáb</div>\n </div>\n\n <!-- Días -->\n <div class=\"calendar-grid\">\n @for (day of calendarDays(); track $index) {\n <div class=\"calendar-day\" [class.selected]=\"isDaySelected(day)\" [class.today]=\"isToday(day)\"\n [class.disabled]=\"isDayDisabled(day)\" [class.empty]=\"!day\" (click)=\"selectDay(day)\">\n {{ day || \"\" }}\n </div>\n }\n </div>\n\n <!-- TIME PICKER -->\n @if (mode() === 'datetime') {\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 class=\"time-option\" [class.selected]=\"hour.value === selectedHour12()\"\n (click)=\"setHour12(hour.value)\">\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 class=\"time-option\" [class.selected]=\"minute === selectedMinute()\" (click)=\"setMinute(minute)\">\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 class=\"time-option\" [class.selected]=\"selectedAmPm() === 'AM'\" (click)=\"setAmPm('AM')\">\n AM\n </div>\n <div class=\"time-option\" [class.selected]=\"selectedAmPm() === 'PM'\" (click)=\"setAmPm('PM')\">\n PM\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- botones -->\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"action-btn secondary\" (click)=\"today()\">\n Hoy\n </button>\n\n @if (mode() === 'datetime') {\n <button type=\"button\" class=\"action-btn primary\" (click)=\"close()\">\n Aceptar\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\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);\r\n initialValues = input<Record<string, string>>({});\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 effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) this.resetAllFilters();\r\n });\r\n\r\n effect(() => {\r\n const init = this.initialValues();\r\n if (Object.keys(init).length === 0) return;\r\n this.filterValues.update(current => {\r\n const toApply: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(init)) {\r\n if (!(key in current)) toApply[key] = value;\r\n }\r\n return { ...current, ...toApply };\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 this.filterValues.update(current => ({ ...current, [filterValue]: '' }));\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 [attr.title]=\"!filterValues()[item.value] ? (item.placeholder || item.label || 'Escribir Número') : null\"\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);\r\n initialValues = input<Record<string, string>>({});\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 effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) this.resetAllFilters();\r\n });\r\n\r\n effect(() => {\r\n const init = this.initialValues();\r\n if (Object.keys(init).length === 0) return;\r\n const allFilters = this.filters();\r\n this.filterValues.update(current => {\r\n const toApply: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(init)) {\r\n if (key in current) continue;\r\n const filter = allFilters.find(f => f.value === key);\r\n const option = filter?.options?.find(opt => String(opt.value) === String(value));\r\n if (option) toApply[key] = option.label;\r\n }\r\n return { ...current, ...toApply };\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\">\n @for (item of filters(); track item.value) {\n <div class=\"chip\" [class.active]=\"activeFilterType() === item.value\" [class.has-value]=\"filterValues()[item.value]\">\n <label class=\"floating-label\">{{ item.placeholder || item.label || 'Seleccionar' }}</label>\n <div class=\"content-chip\">\n <input type=\"text\" class=\"chip-input\" [value]=\"filterValues()[item.value] || ''\"\n (input)=\"onInputChange($event, item.value)\" (focus)=\"onFocusFilter(item.value)\"\n (click)=\"$event.stopPropagation()\" (keydown)=\"onKeyDown($event)\" (keydown)=\"onEnter($event)\"\n [placeholder]=\"filterValues()[item.value] ? '' : (item.placeholder || item.label || 'Seleccionar')\"\n [attr.title]=\"!filterValues()[item.value] ? (item.placeholder || item.label || 'Seleccionar') : null\"\n [disabled]=\"isDisabled()\" />\n\n <span class=\"chip-list-icon icon icon-list\" (click)=\"onFocusFilter(item.value)\" aria-hidden=\"true\"></span>\n </div>\n\n @if (isOpen() && activeFilterType() === item.value) {\n <div class=\"dropdown\">\n <div class=\"options-list\">\n <!-- Opción por defecto sin valor -->\n <div class=\"option-item option-default\" (click)=\"clear()\">\n {{ 'Seleccionar' }}\n </div>\n @for (option of filteredOptions(); track option.value) {\n <div class=\"option-item\" (click)=\"selectOption(option)\">\n {{ option.label }}\n </div>\n }\n @if (filteredOptions().length === 0) {\n <div class=\"no-options\">No hay opciones</div>\n }\n </div>\n </div>\n }\n </div>\n }\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);\r\n /** Valores previos a restaurar (clave = FilterItem.value, valor = texto) */\r\n initialValues = input<Record<string, string>>({});\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 effect(() => {\r\n const trigger = this.clearTrigger();\r\n if (trigger > 0) {\r\n this.resetAllFilters();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const init = this.initialValues();\r\n if (Object.keys(init).length === 0) return;\r\n this.filterValues.update(current => {\r\n const toApply: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(init)) {\r\n if (!(key in current)) toApply[key] = value;\r\n }\r\n return { ...current, ...toApply };\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 ('' mantiene la key para que el effect no restaure el initialValue)\r\n this.filterValues.update(current => ({ ...current, [filterValue]: '' }));\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 [attr.title]=\"!filterValues()[item.value] ? (item.placeholder || item.label || 'Escribir') : null\"\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 disabled = input<boolean>(false);\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\">\n <input\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n class=\"custom-input\"\n [attr.maxlength]=\"maxLength()\"\n [style.text-transform]=\"uppercase() ? 'uppercase' : null\"\n (input)=\"handleInput($event)\"\n (keyup.enter)=\"search()\"\n [disabled]=\"disabled()\"\n />\n\n @if (value() && mode() === 'search') {\n <button class=\"clear-btn\" (click)=\"clear()\" type=\"button\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\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 <path d=\"M18 6l-12 12\" />\n <path d=\"M6 6l12 12\" />\n </svg>\n </button>\n } @if (mode() === 'search') {\n <button class=\"search-btn\" (click)=\"search()\" type=\"button\" [disabled]=\"disabled()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"56\"\n height=\"56\"\n fill=\"none\"\n viewBox=\"0 0 56 56\"\n >\n <g clip-path=\"url(#clip0_190_2403)\">\n <path\n fill=\"#454733\"\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\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_190_2403\">\n <rect width=\"56\" height=\"56\" fill=\"#fff\" rx=\"28\" />\n </clipPath>\n </defs>\n </svg>\n </button>\n } @else {\n <button class=\"select-btn\" (click)=\"openSelect()\" type=\"button\" [disabled]=\"disabled()\">\n <span class=\"select-chevron icon icon-chevron-down\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n@if (showDropdown()) {\n <div class=\"dropdown-menu\">\n @for (option of options(); track option.code) {\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"selectOption(option)\"\n >\n <span class=\"code\">{{ option.code }}</span>\n <span class=\"dash\">-</span>\n <span class=\"name\">{{ option.name }}</span>\n </button>\n }\n </div>\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 OnDestroy,\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, OnDestroy {\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 private resizeListener?: () => void;\r\n\r\n constructor(private elementRef: ElementRef) {}\r\n\r\n ngOnDestroy(): void {\r\n this.removePositioningListeners();\r\n }\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 this.updatePosition();\r\n this.isOpen.set(true);\r\n this.searchTerm.set('');\r\n\r\n requestAnimationFrame(() => {\r\n const input =\r\n this.elementRef.nativeElement.querySelector('.search-input');\r\n if (input) input.focus({ preventScroll: true });\r\n });\r\n\r\n this.addPositioningListeners();\r\n }\r\n\r\n close() {\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.openUpward.set(false);\r\n this.removePositioningListeners();\r\n }\r\n\r\n private updatePosition(): void {\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const DROPDOWN_HEIGHT = 260;\r\n\r\n this.openUpward.set(spaceBelow < DROPDOWN_HEIGHT && spaceAbove > spaceBelow);\r\n }\r\n\r\n private addPositioningListeners(): void {\r\n this.removePositioningListeners();\r\n\r\n this.resizeListener = () => {\r\n if (this.isOpen()) this.updatePosition();\r\n };\r\n\r\n window.addEventListener('resize', this.resizeListener);\r\n }\r\n\r\n private removePositioningListeners(): void {\r\n if (this.resizeListener) {\r\n window.removeEventListener('resize', this.resizeListener);\r\n this.resizeListener = undefined;\r\n }\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, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport {\n AbstractControl,\n FormArray,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n} from '@angular/forms';\n\nimport { Subscription } from 'rxjs';\nimport { SelectCustomSearch } from '../select-custom-search/select-custom-search';\nimport { DateTimePicker } from '../date-time-picker/date-time-picker';\nimport { ToggleCustom } from '../toggle-custom/toggle-custom';\n\ntype FieldType =\n | 'text'\n | 'email'\n | 'number'\n | 'date'\n | 'datetime-local'\n | 'select'\n | 'radio'\n | 'checkbox'\n | 'textarea'\n | 'disabled'\n | 'password'\n | 'time'\n | 'file'\n | 'toggle'\n // experimental: formato pesos colombianos ($2.000,74)\n | 'currency-cop';\n\nexport interface Option {\n value: string | number | boolean;\n label: string;\n subtitle?: string;\n}\n\nexport interface FieldConfig {\n key: string;\n label?: string;\n type: FieldType;\n placeholder?: string;\n required?: boolean;\n options?: Option[];\n col?: number;\n disabled?: boolean;\n readonly?: boolean;\n matchWith?: string;\n copyFrom?: string;\n pattern?: string;\n patternType?:\n | 'numbers'\n | 'phone'\n | 'custom'\n | 'text'\n | 'username'\n | 'alphanumeric';\n\n minDate?: Date;\n maxDate?: Date;\n variant?: 'cards';\n /**\n * Solo para checkbox.\n * Fields con el mismo nombre se comportan como radio: al marcar uno se desmarcan los demás.\n */\n radioGroup?: string;\n /**\n * Solo para checkbox.\n * Fields con el mismo nombre permiten selección múltiple pero impiden quedar todos desmarcados.\n */\n atLeastOneGroup?: string;\n /** Controla mayúsculas. Default: true. En checkbox desactiva el estilo visual; en text/number/time desactiva la conversión automática */\n uppercase?: boolean;\n /** Solo para textarea. Número de filas visibles. Default: 6 */\n rows?: number;\n /** Solo para textarea. Permite al usuario redimensionar. Default: true */\n resizable?: boolean;\n}\n\nexport interface SectionConfig {\n title?: string;\n description?: string;\n fields: FieldConfig[];\n}\n\ninterface RealTimeCopyItem {\n fieldKey: string;\n subscription: Subscription;\n}\n\n@Component({\n selector: 'lib-dynamic-form-fields',\n standalone: true,\n imports: [ReactiveFormsModule, SelectCustomSearch, DateTimePicker, ToggleCustom],\n templateUrl: './dynamic-form-fields.html',\n styleUrl: './dynamic-form-fields.css',\n})\nexport class DynamicFormFields implements OnInit, OnDestroy {\n form = input.required<FormGroup>();\n sections = input<SectionConfig[]>([]);\n compact = input<boolean>(false);\n\n private el = inject(ElementRef);\n private copyFromSubscriptions: Subscription[] = [];\n private realTimeCopySubscriptions: RealTimeCopyItem[] = [];\n\n ngOnInit(): void {\n setTimeout(() => {\n this.setupCopyFromLogic();\n this.initCurrencyDisplay();\n }, 100);\n }\n\n getDatePickerMode(fieldType: FieldType): 'date' | 'datetime' {\n return fieldType === 'datetime-local' ? 'datetime' : 'date';\n }\n\n private setupCopyFromLogic(): void {\n this.sections().forEach((section) => {\n section.fields.forEach((field) => {\n if (field.copyFrom) {\n this.setupFieldCopy(field);\n }\n });\n });\n }\n\n private setupFieldCopy(field: FieldConfig): void {\n const targetControl = this.form().get(field.key);\n if (!targetControl) return;\n\n const sourceControl = this.form().get(field.copyFrom!);\n if (!sourceControl) return;\n\n const triggerFieldKey = this.findTriggerField();\n\n if (!triggerFieldKey) {\n this.setupSimpleCopy(sourceControl, targetControl);\n return;\n }\n\n const triggerControl = this.form().get(triggerFieldKey);\n if (!triggerControl) {\n this.setupSimpleCopy(sourceControl, targetControl);\n return;\n }\n\n const subscription = triggerControl.valueChanges.subscribe(\n (shouldCopy: boolean) => {\n if (shouldCopy) {\n targetControl.setValue(sourceControl.value);\n targetControl.disable();\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\n } else {\n targetControl.enable();\n\n targetControl.setValue('');\n this.removeRealTimeCopy(field.key);\n }\n }\n );\n\n this.copyFromSubscriptions.push(subscription);\n\n if (triggerControl.value === true) {\n targetControl.setValue(sourceControl.value);\n targetControl.disable();\n this.setupRealTimeCopy(sourceControl, targetControl, field.key);\n }\n }\n\n private findTriggerField(): string {\n for (const section of this.sections()) {\n const triggerField = section.fields.find(\n (f) =>\n f.type === 'radio' &&\n (f.key.includes('is_owner') || f.key.includes('infractor-owner'))\n );\n if (triggerField) return triggerField.key;\n }\n return '';\n }\n\n private setupSimpleCopy(\n sourceControl: AbstractControl,\n targetControl: AbstractControl\n ): void {\n const subscription = sourceControl.valueChanges.subscribe((value) => {\n targetControl.setValue(value);\n });\n this.copyFromSubscriptions.push(subscription);\n }\n\n private setupRealTimeCopy(\n sourceControl: AbstractControl,\n targetControl: AbstractControl,\n fieldKey: string\n ): void {\n this.removeRealTimeCopy(fieldKey);\n\n const subscription = sourceControl.valueChanges.subscribe((value) => {\n targetControl.setValue(value);\n });\n\n this.realTimeCopySubscriptions.push({\n fieldKey,\n subscription,\n });\n }\n\n private removeRealTimeCopy(fieldKey: string): void {\n const index = this.realTimeCopySubscriptions.findIndex(\n (item) => item.fieldKey === fieldKey\n );\n if (index >= 0) {\n this.realTimeCopySubscriptions[index].subscription.unsubscribe();\n this.realTimeCopySubscriptions.splice(index, 1);\n }\n }\n\n /** toggle, checkbox y radio siempre ocupan la fila completa (12 cols) */\n isGroupType(type: FieldType): boolean {\n return type === 'toggle';\n }\n\n getFieldRuns(fields: FieldConfig[]): { isGroup: boolean; fields: FieldConfig[] }[] {\n const runs: { isGroup: boolean; fields: FieldConfig[] }[] = [];\n for (const f of fields) {\n const isGroup = this.isGroupType(f.type);\n const last = runs[runs.length - 1];\n if (last && last.isGroup === isGroup) {\n last.fields.push(f);\n } else {\n runs.push({ isGroup, fields: [f] });\n }\n }\n return runs;\n }\n\n ctrl = (key: string): AbstractControl | null => this.form().get(key);\n\n getCheckboxArray(key: string): FormControl[] | undefined {\n return (this.form().get(key) as FormArray)?.controls as FormControl[];\n }\n\n onCheckboxChange(event: Event, fieldKey: string, optionIndex: number) {\n const checkbox = event.target as HTMLInputElement;\n const checkboxArray = this.getCheckboxArray(fieldKey);\n checkboxArray?.[optionIndex]?.setValue(checkbox.checked);\n }\n\n onCheckboxInteract(event: Event, field: FieldConfig, optionIndex: number) {\n if (field.disabled || field.readonly) {\n (event.target as HTMLInputElement).checked = !!this.getCheckboxArray(field.key)?.[optionIndex]?.value;\n return;\n }\n const { key, radioGroup, atLeastOneGroup } = field;\n\n if (radioGroup) {\n this.getCheckboxArray(key)?.forEach((ctrl, i) => ctrl.setValue(i === optionIndex));\n this.sections().forEach(sec =>\n sec.fields\n .filter(f => f.radioGroup === radioGroup && f.key !== key)\n .forEach(f => this.getCheckboxArray(f.key)?.forEach(ctrl => ctrl.setValue(false)))\n );\n return;\n }\n\n if (atLeastOneGroup) {\n const checkbox = event.target as HTMLInputElement;\n if (!checkbox.checked) {\n const anyOtherInSameField = this.getCheckboxArray(key)?.some((ctrl, i) => i !== optionIndex && ctrl.value);\n const anyOtherInOtherFields = this.sections().some(sec =>\n sec.fields\n .filter(f => f.atLeastOneGroup === atLeastOneGroup && f.key !== key)\n .some(f => this.getCheckboxArray(f.key)?.some(ctrl => ctrl.value))\n );\n if (!anyOtherInSameField && !anyOtherInOtherFields) { checkbox.checked = true; return; }\n }\n this.onCheckboxChange(event, key, optionIndex);\n return;\n }\n\n this.onCheckboxChange(event, key, optionIndex);\n }\n\n // ── currency-cop ─────────────────────────────────────────────────────────\n onCurrencyInput(event: Event, key: string): void {\n const input = event.target as HTMLInputElement;\n const raw = input.value;\n\n // Quitar $ y puntos de miles; conservar dígitos y una coma decimal\n const stripped = raw.replace(/\\$/g, '').replace(/\\./g, '');\n const sanitized = stripped.replace(/[^\\d,]/g, '');\n\n const commaIdx = sanitized.indexOf(',');\n let intStr: string;\n let decStr: string | null = null;\n\n if (commaIdx >= 0) {\n intStr = sanitized.slice(0, commaIdx);\n decStr = sanitized.slice(commaIdx + 1).replace(/,/g, '');\n } else {\n intStr = sanitized;\n }\n\n // Eliminar ceros a la izquierda (\"020\" → \"20\"), preservar \"0\" solo\n intStr = intStr.replace(/^0+(?=\\d)/, '');\n\n const formattedInt = intStr ? intStr.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.') : '';\n\n let displayValue = '';\n if (formattedInt) {\n displayValue = `$${formattedInt}`;\n if (decStr !== null) displayValue += `,${decStr}`;\n } else if (decStr !== null) {\n displayValue = `$0,${decStr}`;\n }\n\n // Actualizar el DOM directamente para preservar el formato\n input.value = displayValue;\n\n const ctrl = this.form().get(key);\n if (!ctrl) return;\n\n const numStr = decStr !== null ? `${intStr || '0'}.${decStr}` : intStr;\n const numericValue = numStr ? parseFloat(numStr) : null;\n // emitModelToViewChange: false evita que Angular sobreescriba el valor formateado\n ctrl.setValue(numericValue, { emitModelToViewChange: false });\n }\n\n private formatCurrencyCOP(value: unknown): string {\n if (value === null || value === undefined || value === '') return '';\n const num = Number(value);\n if (isNaN(num)) return '';\n const parts = num.toString().split('.');\n const intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return parts[1] && Number(parts[1]) > 0 ? `$${intPart},${parts[1]}` : `$${intPart}`;\n }\n\n private initCurrencyDisplay(): void {\n const inputs = this.el.nativeElement.querySelectorAll('[data-currency-key]') as NodeListOf<HTMLInputElement>;\n inputs.forEach((inputEl: HTMLInputElement) => {\n const key = inputEl.getAttribute('data-currency-key');\n if (!key) return;\n const ctrl = this.form().get(key);\n if (ctrl?.value != null && ctrl.value !== '') {\n inputEl.value = this.formatCurrencyCOP(ctrl.value);\n }\n });\n }\n // ─────────────────────────────────────────────────────────────────────────\n\n ngOnDestroy(): void {\n this.copyFromSubscriptions.forEach((sub) => sub.unsubscribe());\n this.realTimeCopySubscriptions.forEach((item) =>\n item.subscription.unsubscribe()\n );\n }\n\n onCancel(): void {\n }\n\n onEnter(event: KeyboardEvent): void {\n if (event.key !== 'Enter') return;\n \n const target = event.target as HTMLElement;\n \n // Permitir salto de línea en textarea con Shift+Enter\n if (target.tagName === 'TEXTAREA' && event.shiftKey) return;\n \n event.preventDefault();\n this.focusNextElement(target);\n }\n\n onUppercaseInput(event: Event, field: FieldConfig) {\n if (field.uppercase === false) return;\n if (['email', 'password'].includes(field.type)) return;\n\n const control = this.form().get(field.key);\n if (!control) return;\n\n const value = control.value;\n if (typeof value !== 'string') return;\n\n const upperValue = value.toUpperCase();\n\n if (value !== upperValue) {\n control.setValue(upperValue);\n }\n }\n \n private focusNextElement(current: HTMLElement): void {\n const form = current.closest('form');\n if (!form) return;\n \n const focusable = Array.from(\n form.querySelectorAll<HTMLElement>(\n 'input:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly]), select:not([disabled]), button:not([disabled])'\n )\n );\n \n const index = focusable.indexOf(current);\n \n // Si hay siguiente input → foco\n if (index >= 0 && index < focusable.length - 1) {\n focusable[index + 1].focus();\n return;\n }\n \n // Si es el último → submit\n const submitBtn = form.querySelector<HTMLButtonElement>(\n 'button[type=\"submit\"]'\n );\n \n submitBtn?.click();\n }\n \n}\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)\"\n />\n } @if (f.type === 'currency-cop') {\n <input\n type=\"text\"\n class=\"input\"\n inputmode=\"decimal\"\n [placeholder]=\"f.placeholder || '$0'\"\n [formControlName]=\"f.key\"\n [attr.data-currency-key]=\"f.key\"\n [readonly]=\"f.readonly || false\"\n (input)=\"onCurrencyInput($event, 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]=\"f.rows ?? 6\"\n [style.resize]=\"(f.resizable ?? true) ? 'vertical' : 'none'\"\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()\">\n <div class=\"header-content\">\n <div class=\"header-top\">\n <div class=\"header-text\">\n <h1>{{ title() }}</h1>\n @if(subtitle()){\n <p>{{ subtitle() }}</p>\n }\n </div>\n \n <button class=\"close-btn\" type=\"button\" (click)=\"onCancel.emit()\">\n ✕\n </button>\n </div>\n </div>\n\n @if (steps() && steps().length > 1) {\n <div class=\"steps\">\n @for (step of steps(); track $index) {\n <div class=\"step\" [class.step-active]=\"currentStep() === $index + 1\"\n [class.step-completed]=\"currentStep() > $index + 1\">\n @if (currentStep() > $index + 1) {\n <span class=\"check-icon\">✔</span>\n }\n <span>Paso {{ $index + 1 }}: {{ step.label }}</span>\n </div>\n\n @if ($index < steps().length - 1) { <span class=\"separator\">›</span>\n } }\n </div>\n }\n\n <div class=\"divider\"></div>\n\n <div class=\"body-content\" [class.scrollable]=\"scrollBody()\" [class.no-scroll]=\"!scrollBody()\">\n @if (!steps() || !steps().length) {\n <ng-content></ng-content>\n } @else {\n <!-- Render dinámico del paso actual -->\n <lib-wizard-form [form]=\"form()\" [currentStep]=\"currentStep()\" [steps]=\"steps()\"\n (canContinue)=\"canContinue.set($event)\"></lib-wizard-form>\n }\n </div>\n\n @if (!hiddenFooterActions()) {\n <div class=\"actions\">\n @if (showActionsLeft()){\n <div class=\"actions-left\">\n <p class=\"file-type\">{{ evidenceHelperText() }}</p>\n <lib-button variant=\"outline\" type=\"button\" (clicked)=\"fileInput.click()\">\n <span class=\"upload-icon icon icon-upload\" aria-hidden=\"true\"></span>\n <span class=\"label-button\">\n {{ evidenceFileName() || evidenceLabel() }}\n </span>\n </lib-button>\n <input #fileInput type=\"file\" hidden [accept]=\"evidenceAccept()\" (change)=\"onFileSelected($event)\" />\n </div>\n }\n\n <div class=\"actions-right\">\n @if (!steps() || steps().length <= 1) { \n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\n Cancelar\n </lib-button>\n } @else if (currentStep() === 1) {\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"onCancel.emit()\">\n Cancelar\n </lib-button>\n } @else {\n <lib-button variant=\"secondary\" type=\"button\" (clicked)=\"prevStep()\">\n Volver\n </lib-button>\n }\n\n <lib-button\n variant=\"primary\"\n type=\"button\"\n [disabled]=\"!canContinue()\"\n (clicked)=\"!steps() || !steps().length ? submitForm() : (currentStep() === steps().length ? submitForm() : nextStep())\"\n >\n {{ !steps() || !steps().length ? submitLabel() : currentStep() ===\n steps().length ? submitLabel() : 'Continuar' }}\n </lib-button>\n </div>\n </div>\n }\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 rows: 3,\r\n resizable: false,\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()\">\n <div class=\"modal-card\" [class.modal-card-compact]=\"!isReasonNeeded\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n @if(type != 'info') {\n <div class=\"icono-container\" [ngClass]=\"type\">\n @if (type === 'success') {\n <span class=\"icon icon-check-circle\" aria-hidden=\"true\"></span>\n } @else if(type === 'error') {\n <span class=\"icon icon-x-circle\" aria-hidden=\"true\"></span>\n } @else if (type === 'warning') {\n <span class=\"icon icon-warning\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n <h2>{{ title }}</h2>\n </div>\n\n <div class=\"modal-body\">\n <p>{{ message }}</p>\n <lib-dynamic-form-fields [form]=\"form\" [sections]=\"sections\"></lib-dynamic-form-fields>\n </div>\n <div class=\"modal-footer\">\n @if (confirm) {\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\n } @else {\n <button class=\"btn confirm\" [ngClass]=\"type\" (click)=\"onConfirm()\">{{ confirmLabel }}</button>\n }\n </div>\n </div>\n</div>\n","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()\">\n <div class=\"modal-card\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <div class=\"modal-header-title\">\n <div class=\"icon-container\" class=\"icono-container\" [ngClass]=\"type\">\n @if(type === 'info') {\n <span class=\"icon icon-check-circle\" aria-hidden=\"true\"></span>\n }\n </div>\n <h2>{{ title }}</h2>\n <p class=\"modal-header-message\">{{ message }}</p>\n </div>\n <button class=\"close-btn\" (click)=\"onCancel()\" aria-label=\"Cerrar\">\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 <path d=\"M18 6l-12 12\" />\n <path d=\"M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"info-container\" [class.expanded]=\"expandedIndex !== null\">\n @for (item of items; track item.key; let i = $index) {\n\n <div class=\"info-item\">\n <div class=\"info-main\" [class.info-main-expanded]=\"item.expandible\" (click)=\"item.expandible && toggle(i)\">\n <span class=\"label\">{{ item.label }} @if (item.expandible) {\n <span class=\"arrow\"> {{ expandedIndex === i ? '▲' : '▼' }} </span>\n }\n </span>\n <span class=\"value\"> {{ item.value }} </span>\n </div>\n\n @if (expandedIndex === i && item.children?.length) {\n <div class=\"info-children\">\n @for (child of item.children; track child.key) {\n <div class=\"info-item child-item\">\n <div class=\"info-main\">\n <span class=\"label\">{{ child.label }}</span>\n <span class=\"value\">{{ child.value }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n }\n </div>\n </div>\n <div class=\"modal-footer\">\n @if (confirm) {\n <button class=\"btn cancel\" (click)=\"onCancel()\">Cancelar</button>\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\n @if(btnMap) {\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 }\n {{ confirmLabel }}\n </button>\n } @else {\n <button class=\"btn confirm\" (click)=\"onConfirm()\">\n @if(btnMap) {\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 }\n {{ confirmLabel }}\n </button>\n }\n </div>\n </div>\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' | 'number';\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 case 'number':\n return isNaN(numValue) ? raw : `${Math.trunc(numValue)}`;\n default:\n return raw;\n }\n });\n\n constructor() {\n // Sincroniza description solo cuando el feature cambia desde el padre,\n // pero nunca pisa un valor que el formulario (writeValue) ya haya establecido.\n effect(() => {\n const feat = this.feature();\n const incoming = feat?.description ?? '';\n if (incoming !== this.descriptionValue()) {\n this.descriptionValue.set(incoming);\n }\n });\n }\n\n // --- ControlValueAccessor Implementation ---\n\n writeValue(value: string | number | undefined | null): void {\n const nextDescription = value == null ? '' : String(value);\n this.descriptionValue.set(nextDescription);\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 === 'number') {\n // Solo dígitos enteros\n nextDescription = nextDescription.replace(/[^0-9]/g, '');\n\n // Aplicar límite máximo en tiempo real\n if (currentFeature.max !== undefined && nextDescription !== '') {\n const numericValue = parseInt(nextDescription, 10);\n if (!isNaN(numericValue) && numericValue > currentFeature.max) {\n nextDescription = currentFeature.max.toString();\n }\n }\n\n if (target.value !== nextDescription) {\n target.value = nextDescription;\n }\n } else 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 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', 'number'].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 icon-edit\" 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\">\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\n <div class=\"element-header\">\n @if (modeSideCard === 'create' && showTypeSelector) {\n <div class=\"button-group\">\n <button class=\"btn-type\" [class.active]=\"selectedType === 'radial'\" (click)=\"selectType('radial')\">\n Radial\n </button>\n <button class=\"btn-type\" [class.active]=\"selectedType === 'poligonal'\" (click)=\"selectType('poligonal')\">\n Poligonal\n </button>\n </div>\n }\n <div class=\"text-container\">\n <input #inputRef type=\"text\" class=\"input-field\" [placeholder]=\"placeholder\" [value]=\"value\"\n (input)=\"onInput($event)\" [disabled]=\"modeSideCard === 'info'\" />\n @if(modeSideCard === 'create' || modeSideCard === 'edit'){\n <span class=\"icon icon-edit\" (click)=\"focusInput(inputRef)\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"icon icon-settings\" (click)=\"buttonClickIcon()\" aria-hidden=\"true\"></span>\n }\n </div>\n\n @if(modeSideCard === 'edit' || modeSideCard === 'info'){\n <span #statusChip class=\"status-chip\" [class.status-chip--disabled]=\"modeSideCard === 'info'\" [ngClass]=\"statusClass\" (click)=\"changeStatusLabel()\">\n {{ statusLabel }}\n </span>\n }\n </div>\n @for (section of sections; track section.title) {\n <div class=\"element-section\">\n <h3>{{ section.title }}</h3>\n\n <div class=\"element-content\">\n @if (section.items?.length) { @for (item of section.items; track\n item.label) {\n <div class=\"element-item\">\n <span class=\"label\">{{ item.label }}</span>\n <span class=\"value\">{{ item.value }}</span>\n </div>\n } } @if (section.showSlider) {\n <div class=\"element-item\">\n <span class=\"label\">{{ sliderLabel }}</span>\n <span class=\"value\">{{ sliderValue }} {{ sliderUnit }}</span>\n </div>\n @if (modeSideCard !== 'info') {\n <input type=\"range\" class=\"slider\" [min]=\"min\" [max]=\"max\" [value]=\"sliderValue\"\n [style.--slider-value]=\"sliderPercentage\" step=\"0.01\" (input)=\"onSliderChange($event)\" />\n }} @if (section.buttonSectionLabel && modeSideCard !== 'info') {\n <button class=\"btn-assign\" (click)=\"onButtonSectionClick(section)\">{{ section.buttonSectionLabel }}</button>\n }\n </div>\n </div>\n }\n\n <div class=\"side-card-actions\">\n @if (showBtnPrimary) {\n <button class=\"btn-primary\" (click)=\"onButtonClick('primary')\">{{ primaryButtonLabel }}</button>\n }\n @if (showBtnSecondary) {\n <button class=\"btn-secondary\" (click)=\"onButtonClick('secondary')\">{{ secondaryButtonLabel }}</button>\n }\n </div>\n </div>\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\">\n <div class=\"side-card\" [class.floating]=\"isFloating\" [class.compact]=\"isCompact\">\n <div class=\"element-header\">\n <span class=\"back-icon icon icon-arrow-left\" (click)=\"buttonClickIcon('back')\" aria-hidden=\"true\"></span>\n\n <div class=\"text-container\">\n <span class=\"title\"> {{ title }} </span>\n <span class=\"subtitle\"> {{ subtitle }} </span>\n <div class=\"container-chip\">\n <span #statusChip class=\"status-chip\" [ngClass]=\"statusClass\">\n {{ statusLabel }}\n </span>\n </div>\n </div>\n\n <div class=\"right-icons\">\n <span class=\"icon icon-location\"\n (click)=\"buttonClickIcon('location')\" aria-hidden=\"true\"></span>\n\n <!-- message + modal -->\n <div class=\"message-icon-wrapper\">\n <span class=\"icon icon-message\"\n (click)=\"buttonClickIcon('message')\" aria-hidden=\"true\"></span>\n\n <!-- @if (showMessageModal) {\n <div class=\"message-modal-anchor\">\n <lib-notification-modal (buttonClick)=\"onNotify($event)\" />\n </div>\n } -->\n </div>\n </div>\n </div>\n <div class=\"side-tabs\">\n <div class=\"tab\" [class.active]=\"activeTab === 'principal'\" (click)=\"setTab('principal')\">\n Principal\n </div>\n\n <div class=\"tab\" [class.active]=\"activeTab === 'historial'\" (click)=\"setTab('historial')\">\n Historial\n </div>\n\n <div class=\"tab-indicator\" [style.left]=\"getIndicatorLeft()\"></div>\n </div>\n <div class=\"body-content\">\n @for (section of sections; track section.title) {\n <div class=\"element-section\">\n <h3>{{ section.title }}</h3>\n\n <div class=\"element-content\">\n @if (section.items?.length) { @for (item of section.items; track\n item.key) {\n <div class=\"element-item\">\n <span class=\"label\">{{ item.label }}</span>\n <span class=\"value\">{{ isDateValue(item.value) ? getRelativeTime(item.value) : item.value }}</span>\n </div>\n } }\n </div>\n </div>\n }\n </div>\n </div>\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\">\n <div class=\"carousel-wrapper\">\n\n @if (canScrollLeft) {\n <button class=\"nav left\" (click)=\"scroll(list,'left')\">\n <span class=\"nav-icon icon icon-chevron-left\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <div class=\"carousel-mask\">\n <div class=\"carousel-list\" #list (scroll)=\"onScroll(list)\">\n @for (d of devices; track d.androidId) {\n <div class=\"device-card\">\n <div class=\"card-header\">\n <div class=\"header-title-wrapper\">\n <span class=\"code\">{{ d.code }} - {{ d.name }}</span>\n <span class=\"geofence\">{{ d.geofenceName }}</span>\n </div>\n <span class=\"target icon icon-location\"\n (click)=\"buttonClickIcon(d)\" aria-hidden=\"true\"></span>\n </div>\n\n <div class=\"device-info\">\n <span>{{ d.deviceInfo }}</span>\n <div class=\"icons\">\n @if (d.status.wifi) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\">\n <title>En Línea</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Fuera de Línea</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n } @if (getBatteryLevel(d.status.batteryPercentage) >= 4) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>76-100%</title>\n <path\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\" />\n </g>\n </svg>\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 3) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>51-75%</title>\n <path\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\" />\n </g>\n </svg>\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 2) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>21-50%</title>\n <path\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\" />\n </g>\n </svg>\n } @else if (getBatteryLevel(d.status.batteryPercentage) == 1) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>1-20%</title>\n <path\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\" />\n </g>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" fill=\"#454733\"\n viewBox=\"0 0 32 32\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>0%</title>\n <path\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\" />\n </g>\n </svg>\n }\n @if (d.status.signalStatus! >= 4) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Excelente</title>\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667z\" />\n </svg>\n } @else if (d.status.signalStatus! == 3) { <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>Buena</title>\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\n <path id=\"Combined-Shape\"\n d=\"M426.667 0v341.333H0zM384 88.747l-85.334 68.266v141.653H384z\" />\n </g>\n </g>\n </g>\n </svg>\n } @else if (d.status.signalStatus! == 2) { <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>Regular</title>\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\n <path id=\"Combined-Shape\"\n d=\"M426.667 0v341.333H0zM384 88.747 213.333 225.28v73.386H384z\" />\n </g>\n </g>\n </g>\n </svg>\n } @else if (d.status.signalStatus! == 1) { <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" fill=\"#000\" viewBox=\"0 0 512 512\">\n <g id=\"SVGRepo_iconCarrier\">\n <title>Mala</title>\n <g id=\"Page-1\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <g id=\"drop\" fill=\"#454733\" transform=\"translate(42.667 85.333)\">\n <path id=\"Combined-Shape\"\n d=\"M426.667 0v341.333H0zM384 88.747 170.666 259.413v39.253H384z\" />\n </g>\n </g>\n </g>\n </svg>\n } @else { <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Sin Señal</title>\n <path fill=\"#454733\" d=\"M1.667 18.333h16.666V1.667zm15-1.666H5.692L16.667 5.692z\" />\n </svg>\n }\n @if (d.status.bluetooth) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Conectado</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <title>Desconectado</title>\n <path fill=\"#454733\"\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\" />\n </svg>\n }\n @if (d.status.gps) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <g clip-path=\"url(#clip0_3_9268)\">\n <title>Localizado</title>\n <path fill=\"#454733\"\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\" />\n </g>\n <defs>\n <clipPath id=\"clip0_3_9268\">\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n </clipPath>\n </defs>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\"\n viewBox=\"0 0 20 20\">\n <g clip-path=\"url(#clip0_3_9268)\">\n <title>No Localizado</title>\n <path fill=\"#454733\"\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\" />\n </g>\n <defs>\n <clipPath id=\"clip0_3_9268\">\n <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n </clipPath>\n </defs>\n </svg>\n }\n </div>\n </div>\n <div class=\"card-footer\">\n <span class=\"badge\" [ngClass]=\"getGeofenceClass(d.status.geofence)\">\n {{ d.status.geofence === 'inside' ? 'DENTRO DE GEOCERCA' : 'FUERA DE GEOCERCA' }}\n </span>\n\n <span class=\"badge update\">{{ getRelativeTime(d.lastUpdate) }}</span>\n </div>\n\n </div>\n }\n </div>\n </div>\n\n @if (canScrollRight) {\n <button class=\"nav right\" (click)=\"scroll(list,'right')\">\n <span class=\"nav-icon icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n }\n </div>\n\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 initialValues = input<Record<string, string>>({});\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 effect(() => {\n const trigger = this.clearTrigger();\n if (trigger > 0) this.resetAllFilters();\n });\n\n effect(() => {\n const init = this.initialValues();\n if (Object.keys(init).length === 0) return;\n this.filterValues.update(current => {\n const toApply: Record<string, string> = {};\n for (const [key, value] of Object.entries(init)) {\n if (!(key in current)) toApply[key] = value;\n }\n return { ...current, ...toApply };\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) => ({ ...current, [filterValue]: '' }));\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 [attr.title]=\"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, effect, ElementRef, input, output, signal, untracked, 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\ninterface PerConfigInitial {\n textValues: Record<string, string>;\n dateValue: Date | string | null;\n dateFilterType: string | null;\n}\n\ntype FilterButtonMode = 'toggle' | 'action' | 'click' | 'clickRight' | 'none';\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 /**\n * Estado previo de filtros para restaurar al volver a la pantalla.\n * Misma estructura que emite filtersChange.\n */\n initialFilters = input<Record<string, string | number | Date | null>>({});\n\n /** Slice de initialFilters mapeado por posición de cada grupo en filtersConfig */\n readonly initialFiltersPerConfig = computed((): PerConfigInitial[] => {\n const init = this.initialFilters();\n return this.normalizedFiltersConfig().map(config => {\n if (config.type === 'date' || config.type === 'datetime') {\n for (const f of config.filters) {\n const v = init[f.value];\n if (v instanceof Date || (typeof v === 'string' && v)) {\n return { textValues: {}, dateValue: v as Date | string, dateFilterType: f.value };\n }\n }\n return { textValues: {}, dateValue: null, dateFilterType: null };\n }\n const textValues: Record<string, string> = {};\n for (const f of config.filters) {\n const v = init[f.value];\n if (v !== null && v !== undefined) textValues[f.value] = String(v);\n }\n return { textValues, dateValue: null, dateFilterType: null };\n });\n });\n\n constructor() {\n // Restaura selectedTextFilters y selectedDates para que \"Aplicar Filtros\"\n // emita los valores correctos al volver a la pantalla.\n effect(() => {\n const init = this.initialFilters();\n if (Object.keys(init).length === 0) return;\n\n const configs = untracked(() => this.normalizedFiltersConfig());\n const dateKeys = new Set<string>(\n configs\n .filter(c => c.type === 'date' || c.type === 'datetime')\n .flatMap(c => c.filters.map(f => f.value))\n );\n\n const textVals: Record<string, string> = {};\n const dateVals: SelectedDatesMap = {};\n\n for (const [key, value] of Object.entries(init)) {\n if (value === null || value === undefined) continue;\n if (dateKeys.has(key)) {\n if (value instanceof Date) {\n dateVals[key] = value;\n } else if (typeof value === 'string' && value) {\n const parsed = new Date(value);\n dateVals[key] = isNaN(parsed.getTime()) ? null : parsed;\n }\n } else {\n textVals[key] = String(value);\n }\n }\n\n this.selectedTextFilters.set(textVals);\n this.selectedDates.set(dateVals);\n });\n }\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 <span class=\"button-back-icon icon-arrow-left\" aria-hidden=\"true\"></span>\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 <span class=\"filter-toggle-icon icon-filter\" aria-hidden=\"true\"></span>\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; let i = $index) {\n @switch (config.type) {\n @case ('text') {\n <lib-input-text-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('number') {\n <lib-input-number-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('select') {\n <lib-input-select-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\n (filterSelected)=\"onFilterSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('date') {\n <lib-date-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValue]=\"initialFiltersPerConfig()[i].dateValue\"\n [initialFilterType]=\"initialFiltersPerConfig()[i].dateFilterType\"\n (dateSelected)=\"onDateSelected($event)\" (enterPressed)=\"focusNextFilter()\" />\n }\n @case ('time') {\n <lib-input-time-filter [filters]=\"config.filters\" [clearTrigger]=\"clearFilterTrigger()\"\n [initialValues]=\"initialFiltersPerConfig()[i].textValues\"\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\">\n <div class=\"notification-modal-header\">\n <h3>{{ titulo }}</h3>\n </div>\n <div class=\"notification-modal-body\">\n <!-- LISTA DE MENSAJES -->\n @if (mode === 'list') {\n <div class=\"default-message-list\">\n @for (msg of defaultMessages; track msg) {\n <div class=\"default-message-item\" (click)=\"selectDefaultMessage(msg)\">\n <span>{{ msg }}</span>\n <span class=\"send-icon icon icon-send\" aria-hidden=\"true\"></span>\n </div>\n }\n </div>\n }\n\n <!-- EDICIÓN -->\n @if (mode === 'edit') {\n <div class=\"text-area-wrapper\">\n <textarea #messageInput class=\"message-textarea\" rows=\"5\" placeholder=\"Mensaje...\" [formControl]=\"messageControl\"></textarea>\n </div>\n }\n\n </div>\n\n <div class=\"notification-modal-actions\">\n @if (mode === 'edit') {\n <button class=\"btn-back\" (click)=\"backToList()\">\n Volver\n </button>\n <button class=\"btn-custom\" [disabled]=\"!messageControl.value.trim()\" (click)=\"btnClick()\">\n Notificar\n </button>\n } @else {\n <button class=\"btn-custom\" (click)=\"customMessage()\">\n Personalizado\n </button>\n }\n </div>\n</div>","import { Component, input } from '@angular/core';\n\n/**\n * Footer compacto anclado al borde inferior del viewport.\n *\n * Colócalo como hermano del área con scroll (no dentro de ella):\n * ```\n * <div class=\"footer-layout\"> <!-- importar footer-layout.css -->\n * <main class=\"footer-layout__content\">...</main>\n * <lib-footer />\n * </div>\n * ```\n */\n@Component({\n selector: 'lib-footer',\n standalone: true,\n imports: [],\n templateUrl: './footer.html',\n styleUrl: './footer.css',\n})\nexport class Footer {\n backgroundColor = input<string>('#F0F0DB');\n textColor = input<string>('#787861');\n /** Color del texto destacado (marca). Si no se define, hereda textColor */\n highlightColor = input<string | undefined>(undefined);\n year = input<number>(new Date().getFullYear());\n}\n","<footer\n class=\"footer\"\n [style.background-color]=\"backgroundColor()\"\n [style.color]=\"textColor()\"\n>\n <ng-content>\n © {{ year() }}\n <span [style.color]=\"highlightColor() ?? textColor()\">PAICO · Sistemas y Aplicaciones en Línea.</span>\n Todos los derechos reservados.\n </ng-content>\n</footer>\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()) {\n\n<!-- MODO SINGLE -->\n<button class=\"opcion-boton\" [class.opcion-activa]=\"selectedSingle()\"\n [class.opcion-success]=\"selectedSingle() && isSuccess()\" [class.opcion-danger]=\"selectedSingle() && isDanger()\"\n (click)=\"toggleSingle()\">\n\n <div class=\"opcion-contenido\">\n <div class=\"opcion-icono-container\" [class.icono-activo]=\"selectedSingle()\">\n\n @if (isSuccess()) {\n <span class=\"icon icon-check-circle\" [class.icon-success]=\"selectedSingle() && isSuccess()\" aria-hidden=\"true\"></span>\n } @else if(isDanger()) {\n <span class=\"icon icon-x-circle\" [class.icon-danger]=\"selectedSingle() && isDanger()\" aria-hidden=\"true\"></span>\n }\n </div>\n\n <div class=\"opcion-textos\">\n <div class=\"opcion-titulo\" [class.titulo-success]=\"selectedSingle() && isSuccess()\"\n [class.titulo-danger]=\"selectedSingle() && isDanger()\">\n {{ label() }}\n </div>\n\n <div class=\"opcion-subtitulo\" [class.subtitulo-success]=\"selectedSingle() && isSuccess()\"\n [class.subtitulo-danger]=\"selectedSingle() && isDanger()\">\n {{ subtitle() }}\n </div>\n </div>\n </div>\n\n @if (selectedSingle()) {\n <div class=\"indicador-seleccion\">\n <div class=\"indicador-punto\" [class.punto-success]=\"isSuccess()\" [class.punto-danger]=\"isDanger()\">\n </div>\n </div>\n }\n</button>\n\n} @else {\n<!-- MODO GROUP -->\n<div class=\"columnCards\">\n @for (option of options(); track option.variant) {\n <button class=\"opcion-boton\" [class.opcion-activa]=\"isSelected(option.variant)\"\n [class.opcion-success]=\"isSelected(option.variant) && option.variant === 'success'\"\n [class.opcion-danger]=\"isSelected(option.variant) && option.variant === 'danger'\"\n (click)=\"selectGroup(option.variant)\">\n <div class=\"opcion-contenido\">\n <div class=\"opcion-icono-container\">\n @if (option.variant === 'success') {\n <span class=\"icon icon-check-circle\" aria-hidden=\"true\"></span>\n } @else if(option.variant === 'danger') {\n <span class=\"icon icon-x-circle\" [class.icon-danger]=\"isSelected(option.variant) && option.variant === 'danger'\" aria-hidden=\"true\"></span>\n }\n </div>\n\n <div class=\"opcion-textos\">\n <div class=\"opcion-titulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\n {{ option.label }}\n </div>\n\n <div class=\"opcion-subtitulo\" [class.titulo-success]=\"isSelected(option.variant) && option.variant === 'success'\"\n [class.titulo-danger]=\"isSelected(option.variant) && option.variant === 'danger'\">\n {{ option.subtitle }}\n </div>\n </div>\n </div>\n\n @if (isSelected(option.variant)) {\n <div class=\"indicador-seleccion\">\n <div class=\"indicador-punto\" [class.punto-success]=\"option.variant === 'success'\"\n [class.punto-danger]=\"option.variant === 'danger'\">\n </div>\n </div>\n }\n </button>\n }\n</div>\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, input, model, output, OnChanges, SimpleChanges } 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 implements OnChanges {\r\n /** Clave externa que cambia cuando el contexto del tab cambia. Al detectar el cambio se limpia searchValue. */\r\n tabKey = input<string | null>(null);\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['tabKey'] && !changes['tabKey'].firstChange) {\r\n this.searchValue.set('');\r\n }\r\n }\r\n\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 con clave estable por tab+índice (no usa signal en el track) */\r\n readonly activeCards = computed<(TabCardConfig & { _tabKey: string })[] | null>(() => {\r\n const a = this.active();\r\n const tab = this.tabs().find(t => t.id === a);\r\n if (!tab?.cards) return null;\r\n return tab.cards.map((card, i) => ({ ...card, _tabKey: `${String(a)}-${i}` }));\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 card._tabKey) {\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 [tabKey]=\"card._tabKey\"\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\">\n <div class=\"no-data-container\">\n <span class=\"inbox-icon icon icon-inbox\" aria-hidden=\"true\"></span>\n <div class=\"title2\">{{ title() }}</div>\n @if(showButton()){\n <button class=\"button-medium-primary\" (click)=\"openModal.emit()\">\n <span class=\"icon icon-add\" aria-hidden=\"true\"></span>\n <div class=\"label\">{{ buttonLabel() }}</div>\n </button>\n }\n </div>\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 ×\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, TitleComponent } 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 TitleComponent\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 chartInit = output<any>();\r\n\r\n onChartClick(event: any) {\r\n this.chartClick.emit(event);\r\n }\r\n\r\n onChartInit(chart: any) {\r\n this.chartInit.emit(chart);\r\n }\r\n}\r\n","<div echarts class=\"ui-base-chart\" [options]=\"options()\" [autoResize]=\"true\" (chartClick)=\"onChartClick($event)\" (chartInit)=\"onChartInit($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 threshold = horizontal ? 6 : 12;\r\n const showScroll = data.length > threshold;\r\n const zoomEnd = showScroll ? Math.floor((threshold / 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 // Legend tooltip: shows name + value on hover\r\n const dataMap = new Map(data.map(d => [d.label, d.value]));\r\n const legendTooltip = {\r\n show: true,\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: 'border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,0.10);padding:8px 10px;',\r\n formatter: (params: any) => {\r\n const name = typeof params === 'string' ? params : params?.name;\r\n const val = dataMap.get(name);\r\n return val !== undefined ? `${name}: <b>${val}</b>` : name;\r\n },\r\n };\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 tooltip: legendTooltip,\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 tooltip: legendTooltip,\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 tooltip: legendTooltip,\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 host: { '[attr.title]': 'null' },\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 private chartInstance: any = null;\r\n\r\n onChartInit(chart: any) {\r\n this.chartInstance = chart;\r\n\r\n chart.on('legendselectchanged', (event: any) => {\r\n const selected: Record<string, boolean> = event.selected;\r\n const currentData = this.displayData();\r\n\r\n const visibleTotal = currentData\r\n .filter(item => selected[item.label] !== false)\r\n .reduce((sum, item) => sum + item.value, 0);\r\n\r\n chart.setOption({\r\n title: { text: `${visibleTotal}` }\r\n });\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)\" (chartInit)=\"onChartInit($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 type: 'piecewise',\n min: minVal,\n max: maxVal,\n splitNumber: 5,\n orient: 'horizontal',\n left: 'center',\n bottom: '0',\n itemWidth: 14,\n itemHeight: 14,\n itemGap: 8,\n itemSymbol: 'rect',\n showLabel: false, // Hide the \"10-20\" piece labels\n text: ['Más', 'Menos'], // Labels at the max and min ends\n textStyle: {\n color: UI_CHART_TOKENS.muted,\n fontSize: 12,\n fontFamily: UI_CHART_TOKENS.fontFamily,\n fontWeight: 500\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, ElementRef, input, ViewChild } 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 GeoPointCameras {\r\n id: number;\r\n name: string;\r\n latitude: number;\r\n longitude: number;\r\n locationLabel: string;\r\n total: number;\r\n by_code: Record<string, number>;\r\n}\r\n\r\nexport interface GeoMapResponse {\r\n points?: GeoPoint[];\r\n cameras?: GeoPointCameras[];\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 cameras = input<GeoPointCameras[]>([]);\r\n\r\n @ViewChild('mapContainer', { static: true }) mapContainer!: ElementRef<HTMLDivElement>;\r\n\r\n public map!: google.maps.Map;\r\n private markers: google.maps.marker.AdvancedMarkerElement[] = [];\r\n private cameraMarkers: google.maps.marker.AdvancedMarkerElement[] = [];\r\n\r\n constructor() {\r\n // Reactivo a cambios de puntos\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 // Reactivo a cambios de cámaras\r\n effect(() => {\r\n const cams = this.cameras();\r\n if (this.map && cams.length > 0) {\r\n this.renderCameras(cams);\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 = this.mapContainer?.nativeElement;\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 // Render cameras if they already exist when map is ready\r\n if (this.cameras().length > 0) {\r\n this.renderCameras(this.cameras());\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 statusColor = point.immobilized ? '#ef4444' : '#3b82f6';\r\n\r\n const content = `\r\n <div style=\"padding:0 12px 12px 12px;font-family:'Inter',-apple-system,sans-serif;\r\n min-width:200px;color:#374151;\">\r\n <div style=\"font-weight:700;font-size:15px;color:#111827;\">\r\n ${point.subpoenaNumber}\r\n ${point.immobilized ? '<span style=\"font-size:11px;background:#ef4444;color:white;border-radius:4px;padding:1px 6px;margin-bottom:8px;vertical-align:middle;\">Inmovilizado</span>' : ''}\r\n </div>\r\n\r\n <div style=\"font-size:12px;color:#9ca3af;margin-bottom:10px;display:flex;gap:8px;\">\r\n <span>📍 ${point.locationLabel}</span>\r\n </div>\r\n\r\n <div style=\"display:flex;flex-direction:column;gap:4px;\">\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">Fecha</span>\r\n <span style=\"font-weight:600;color:#374151;\">${new Date(point.dateTime).toLocaleString('es-CO', { day:'2-digit', month:'2-digit', year:'numeric', hour:'2-digit', minute:'2-digit', hour12:false })}</span>\r\n </div>\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">Infracción</span>\r\n <span style=\"font-weight:600;color:#374151;\">${point.infractionCode}</span>\r\n </div>\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">Placa</span>\r\n <span style=\"font-weight:600;color:#374151;\">${point.plate}</span>\r\n </div>\r\n <div style=\"border-top:1px solid #e5e7eb;margin-top:6px;padding-top:6px;\r\n display:flex;justify-content:space-between;font-size:13px;font-weight:700;\">\r\n <span style=\"color:${statusColor};\">Estado</span>\r\n <span style=\"display:flex;align-items:center;gap:6px;color:${statusColor};\">\r\n <span style=\"width:8px;height:8px;border-radius:50%;background-color:${statusColor};\"></span>\r\n ${point.immobilized ? 'Inmovilizado' : 'Normal'}\r\n </span>\r\n </div>\r\n </div>\r\n </div>`;\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 // ─── GeoPointCameras markers ─────────────────────────────────────────────────\r\n\r\n private clearCameraMarkers() {\r\n this.cameraMarkers.forEach(m => (m.map = null));\r\n this.cameraMarkers = [];\r\n }\r\n\r\n private renderCameras(cameras: GeoPointCameras[]) {\r\n this.clearCameraMarkers();\r\n const infoWindow = new google.maps.InfoWindow();\r\n let lockedMarker: google.maps.marker.AdvancedMarkerElement | null = null;\r\n\r\n // 1. Encontrar el total mayor para destacarlo\r\n const maxTotal = Math.max(...cameras.map(c => c.total));\r\n\r\n // 2. Centrar el mapa para que se vean todas las cámaras al inicio\r\n if (cameras.length > 0) {\r\n const bounds = new google.maps.LatLngBounds();\r\n cameras.forEach(c => bounds.extend({ lat: c.latitude, lng: c.longitude }));\r\n this.map.fitBounds(bounds);\r\n }\r\n\r\n cameras.forEach(cam => {\r\n // 3. Color diferente si es el de mayor total\r\n const isTop = cam.total === maxTotal;\r\n const bgColor = isTop ? '#dc2626' : '#7c3aed'; // rojo para el top, morado para el resto\r\n\r\n const pin = document.createElement('div');\r\n pin.innerHTML = `\r\n <div style=\"\r\n background:${bgColor}; color:white; border-radius:8px;\r\n padding:4px 8px; font-size:12px; font-weight:700;\r\n border:2px solid white; box-shadow:0 2px 6px rgba(0,0,0,.3);\r\n display:flex; align-items:center; gap:4px; cursor:pointer; white-space:nowrap;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\r\n fill=\"white\">\r\n <path d=\"M15 8v8H5V8h10m1-2H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0\r\n 1-1v-3.5l4 4v-11l-4 4V7a1 1 0 0 0-1-1z\"/>\r\n </svg>\r\n ${cam.total}\r\n </div>`;\r\n\r\n const marker = new google.maps.marker.AdvancedMarkerElement({\r\n position: { lat: cam.latitude, lng: cam.longitude },\r\n map: this.map,\r\n content: pin,\r\n title: cam.name,\r\n });\r\n\r\n const codesHtml = Object.entries(cam.by_code)\r\n .map(([code, count]) => `\r\n <div style=\"display:flex;justify-content:space-between;gap:16px;font-size:13px;\">\r\n <span style=\"color:#9ca3af;\">${code}</span>\r\n <span style=\"font-weight:600;color:#374151;\">${count}</span>\r\n </div>`)\r\n .join('');\r\n\r\n const content = `\r\n <div style=\"padding:0 12px 12px 12px;font-family:'Inter',-apple-system,sans-serif;\r\n min-width:200px;color:#374151;\">\r\n <div style=\"font-weight:700;font-size:15px;color:#111827;\">\r\n ${cam.name}\r\n ${isTop ? '<span style=\"font-size:11px;background:#dc2626;color:white;border-radius:4px;padding:1px 6px;margin-bottom:8px;vertical-align:middle;\">Más Infracciones</span>' : ''}\r\n </div>\r\n <!-- <div style=\"font-size:12px;color:#9ca3af;margin-bottom:4px;\">ID: ${cam.id}</div> -->\r\n\r\n <!-- 4. Coordenadas en el tooltip -->\r\n <div style=\"font-size:12px;color:#9ca3af;margin-bottom:10px;display:flex;gap:8px;\">\r\n <span>📍 ${cam.locationLabel}</span>\r\n </div>\r\n\r\n <div style=\"display:flex;flex-direction:column;gap:4px;\">\r\n <div style=\"margin-top:8px;font-size:14px;color:#6b7280;\">Código(s) de Infracciones</div>\r\n ${codesHtml}\r\n <div style=\"border-top:1px solid #e5e7eb;margin-top:6px;padding-top:6px;\r\n display:flex;justify-content:space-between;font-size:13px;font-weight:700;\">\r\n <span style=\"color:${bgColor};\">Total</span>\r\n <span style=\"color:${bgColor};\">${cam.total}</span>\r\n </div>\r\n </div>\r\n </div>`;\r\n\r\n marker.addListener('mouseover', () => {\r\n if (!lockedMarker) { infoWindow.setContent(content); infoWindow.open(this.map, marker); }\r\n });\r\n marker.addListener('mouseout', () => { if (!lockedMarker) infoWindow.close(); });\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 infoWindow.addListener('closeclick', () => { lockedMarker = null; });\r\n\r\n this.cameraMarkers.push(marker);\r\n });\r\n }\r\n}\r\n","<div #mapContainer class=\"map\"></div>\r\n","import { Component, computed, input, signal } from '@angular/core';\r\nimport { GeoAPIMaps, GeoPoint, GeoPointCameras } 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 cameras = input<GeoPointCameras[]>([]);\r\n\r\n immobilizedCount = computed(() => this.points().filter(p => p.immobilized).length);\r\n normalCount = computed(() => this.points().filter(p => !p.immobilized).length);\r\n totalCameras = computed(() => this.cameras().length);\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()\" [cameras]=\"cameras()\" />\r\n </div>\r\n @if (points().length > 0) {\r\n <div class=\"map-summary\">\r\n <span class=\"map-badge blue\">\r\n <span class=\"map-dot blue\"></span>\r\n Normal: {{ normalCount() }}\r\n </span>\r\n <span class=\"map-badge red\">\r\n <span class=\"map-dot red\"></span>\r\n Inmovilizado: {{ immobilizedCount() }}\r\n </span>\r\n <span class=\"map-badge total\">Total: {{ points().length }}</span>\r\n </div>\r\n }\r\n @if (cameras().length > 0) {\r\n <div class=\"map-summary\">\r\n <span class=\"map-badge purple\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M15 8v8H5V8h10m1-2H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-3.5l4 4v-11l-4 4V7a1 1 0 0 0-1-1z\"/>\r\n </svg>\r\n Cámaras: {{ totalCameras() }}\r\n </span>\r\n </div>\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 { 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()\">✕</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()\">×</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 ‹\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 ›\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>","import { DatePipe, NgClass } from '@angular/common';\r\nimport { Component, input, signal } from '@angular/core';\r\n\r\nexport interface DataCard {\r\n title: string;\r\n time: string;\r\n date: string;\r\n previousStatus?: any;\r\n currentStatus?: any;\r\n type: string;\r\n responsible?: string;\r\n description?: string;\r\n actionType?: 'create' | 'update' | 'delete';\r\n}\r\n\r\nexport interface HistorialEntry {\r\n tipo: 'estado' | 'documento' | string;\r\n titulo: string;\r\n id?: string | number;\r\n detalle?: string;\r\n previousState?: string;\r\n currentState?: string;\r\n createdBy?: string;\r\n creationDate?: string | Date;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-card-history',\r\n imports: [NgClass, DatePipe],\r\n templateUrl: './card-history.html',\r\n styleUrl: './card-history.css',\r\n})\r\nexport class CardHistory {\r\n DataCard = input<DataCard>();\r\n historialEntry = input<HistorialEntry>();\r\n isExpanded = signal(false);\r\n withResponsible = input<boolean>(true);\r\n variant = input<'history' | 'default'>('default');\r\n\r\n private months = [\r\n 'enero',\r\n 'febrero',\r\n 'marzo',\r\n 'abril',\r\n 'mayo',\r\n 'junio',\r\n 'julio',\r\n 'agosto',\r\n 'septiembre',\r\n 'octubre',\r\n 'noviembre',\r\n 'diciembre',\r\n ];\r\n\r\n toggleExpanded() {\r\n this.isExpanded.set(!this.isExpanded());\r\n }\r\n\r\n formatDate(isoDate: string): string {\r\n\r\n const date = new Date(isoDate);\r\n const day = date.getDate();\r\n const month = this.months[date.getMonth()];\r\n const year = date.getFullYear();\r\n\r\n return `${day} ${month} ${year}`;\r\n }\r\n\r\n // getBadgeClass(status: string): string {\r\n // const statusLower = status.toLowerCase();\r\n \r\n // if (statusLower.includes('operativo') || statusLower.includes('operacional')) {\r\n // return 'badge-operational';\r\n // } else if (statusLower.includes('mantenimiento')) {\r\n // return 'badge-maintenance';\r\n // } else if (statusLower.includes('sin ficha') || statusLower.includes('sin fecha')) {\r\n // return 'badge-no-date';\r\n // }\r\n \r\n // return 'badge-operational'; \r\n // }\r\n\r\n private readonly statusData: {\r\n [key: string]: { label: string; class: string };\r\n } = {\r\n activo: { label: 'Activo', class: 'badge-active' },\r\n inactivo: { label: 'Inactivo', class: 'badge-inactive' },\r\n eliminado: { label: 'Eliminado', class: 'badge-retired' },\r\n obsoleto: { label: 'Obsoleto', class: 'badge-obsolete' },\r\n operativo: { label: 'Operativo', class: 'badge-operativo' },\r\n mantenimiento: { label: 'En mantenimiento', class: 'badge-maintenance' },\r\n fallas: { label: 'Con fallas', class: 'badge-failures' },\r\n baja: { label: 'Dado de baja', class: 'badge-deactivated' },\r\n default: { label: 'Desconocido', class: 'badge-default' },\r\n };\r\n\r\n \r\n private readonly statusLabels: Record<string, string> = {\r\n pending: 'Pendiente',\r\n active: 'Activo',\r\n defaulted: 'En mora',\r\n completed: 'Completado',\r\n cancelled: 'Cancelado',\r\n restructured: 'Reestructurado',\r\n in_process: 'En proceso',\r\n paid: 'Pagado',\r\n delinquent_30: 'Vencido 30 días',\r\n delinquent_60: 'Vencido 60 días',\r\n delinquent_90: 'Vencido 90 días'\r\n };\r\n \r\n getBadgeClass(status: string): string {\r\n const normalizedStatus = status?.toLowerCase().trim();\r\n return this.statusData[normalizedStatus]?.class ?? this.statusData['default'].class;\r\n }\r\n\r\n statusLabel(status: string): string {\r\n const normalized = (status ?? '').toString().trim();\r\n const normalizedKey = normalized.toLowerCase();\r\n return this.statusLabels[normalizedKey] ?? normalized;\r\n }\r\n\r\n historialItemTitle(entry: { reason?: string; previousState?: string; currentState?: string }): string {\r\n const reason = (entry.reason ?? '').trim();\r\n if (reason) {\r\n return this.toTitleCase(reason);\r\n }\r\n\r\n const current = entry.currentState ? this.statusLabel(entry.currentState) : '';\r\n if (current) {\r\n return `Cambió estado a ${current}`;\r\n }\r\n\r\n return 'Movimiento registrado';\r\n }\r\n\r\n private toTitleCase(value: string): string {\r\n return value\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\r\n }\r\n\r\n statusToneClass(status: string): string {\r\n switch (status) {\r\n case 'Active': return 'agreement-hero__status--active';\r\n case 'Pending': return 'agreement-hero__status--pending';\r\n case 'in_process': return 'agreement-hero__status--process'\r\n case 'Defaulted': return 'agreement-hero__status--defaulted';\r\n case 'Completed': return 'agreement-hero__status--completed';\r\n case 'Cancelled': return 'agreement-hero__status--cancelled';\r\n case 'Restructured': return 'agreement-hero__status--restructured';\r\n default: return 'agreement-hero__status--neutral';\r\n }\r\n }\r\n\r\n getStatusChipClass(status: string): string {\r\n if (!status) return 'status-chip--neutral';\r\n const normalized = status.toLowerCase().trim();\r\n switch (normalized) {\r\n case 'active':\r\n case 'activo':\r\n return 'status-chip--active';\r\n case 'pending':\r\n case 'pendiente':\r\n return 'status-chip--pending';\r\n case 'defaulted':\r\n case 'en_mora':\r\n case 'en mora':\r\n return 'status-chip--defaulted';\r\n case 'completed':\r\n case 'completado':\r\n return 'status-chip--completed';\r\n case 'cancelled':\r\n case 'cancelado':\r\n return 'status-chip--cancelled';\r\n case 'restructured':\r\n case 'reestructurado':\r\n return 'status-chip--restructured';\r\n case 'paid':\r\n case 'pagado':\r\n return 'status-chip--paid';\r\n case 'in_process':\r\n case 'en_proceso':\r\n case 'en proceso':\r\n case 'generated':\r\n case 'generado':\r\n return 'status-chip--in-process';\r\n default:\r\n return 'status-chip--neutral';\r\n }\r\n }\r\n \r\n}\r\n","@if(variant() == 'default' && withResponsible()) {\n<div class=\"card-history\">\n <span class=\"card-date\">{{ formatDate(DataCard()?.date || \"\") }}</span>\n <div class=\"event-card\" [class.expanded]=\"isExpanded()\">\n <div class=\"event-header\" (click)=\"toggleExpanded()\">\n <div class=\"event-info\">\n <span class=\"expand-icon icon icon-chevron-up\" aria-hidden=\"true\"></span>\n <span class=\"event-type\">{{ DataCard()?.title }}</span>\n <span class=\"event-time\">{{ DataCard()?.time }}</span>\n </div>\n <div class=\"status-badges\">\n <span class=\"badge\" [ngClass]=\"getBadgeClass(DataCard()?.previousStatus || '')\">\n {{ DataCard()?.previousStatus }}\n </span>\n\n <span class=\"status-arrow icon icon-chevrons-right\" aria-hidden=\"true\"></span>\n\n <span class=\"badge\" [ngClass]=\"getBadgeClass(DataCard()?.currentStatus || '')\">\n {{ DataCard()?.currentStatus }}\n </span>\n </div>\n </div>\n\n <div class=\"event-details\">\n <div class=\"responsible-info\">\n <div class=\"avatar\">\n <span class=\"avatar-icon icon icon-user\" aria-hidden=\"true\"></span>\n </div>\n <div class=\"responsible-details\">\n <h4>Responsable</h4>\n <div class=\"responsible-name\">{{ DataCard()?.responsible }}</div>\n </div>\n </div>\n\n <div class=\"technical-description\">\n <div class=\"tech-label\">Descripción técnica</div>\n <div class=\"tech-content\">\n {{ DataCard()?.description }}\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n\n@if(variant() == 'default' && !withResponsible()) {\n<div class=\"card-history\">\n <div class=\"event-card no-responsible\">\n <div class=\"nr-header\">\n <span class=\"nr-title\">{{ DataCard()?.title }}</span>\n <span class=\"nr-type\">({{ DataCard()?.type || 'estado' }})</span>\n </div>\n <div class=\"nr-body\">\n @if (DataCard()?.actionType === 'create') {\n <p class=\"nr-description\">\n El registro fue creado con los siguientes datos.\n </p>\n <div class=\"nr-comparison single\">\n <div class=\"nr-col\">\n <span class=\"nr-label curr\">VALOR INICIAL</span>\n <div class=\"nr-value curr-val\">{{ DataCard()?.currentStatus }}</div>\n </div>\n </div>\n } @else if (DataCard()?.actionType === 'delete') {\n <p class=\"nr-description\">\n El registro fue eliminado permanentemente.\n </p>\n <div class=\"nr-comparison single\">\n <div class=\"nr-col\">\n <span class=\"nr-label prev\">VALOR ELIMINADO</span>\n <div class=\"nr-value prev-val\">{{ DataCard()?.previousStatus }}</div>\n </div>\n </div>\n } @else {\n <p class=\"nr-description\">\n <span style=\"text-transform: capitalize;\">{{ DataCard()?.type || 'El registro' }}</span> cambió de \"{{\n DataCard()?.previousStatus }}\" a \"{{ DataCard()?.currentStatus }}\".\n </p>\n\n <div class=\"nr-comparison\">\n <div class=\"nr-col\">\n <span class=\"nr-label prev\">VALOR ANTERIOR</span>\n <div class=\"nr-value prev-val\">{{ DataCard()?.previousStatus }}</div>\n </div>\n\n <div class=\"nr-arrow\">\n <span class=\"nr-arrow-icon icon icon-arrow-right\" aria-hidden=\"true\"></span>\n </div>\n\n <div class=\"nr-col\">\n <span class=\"nr-label curr\">VALOR NUEVO</span>\n <div class=\"nr-value curr-val\">{{ DataCard()?.currentStatus }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (variant() == 'history') {\n@let entry = historialEntry();\n<!-- Historial y movimientos -->\n<article class=\"historial-card\">\n <!-- Card Header -->\n <div class=\"historial-card__header\">\n <div class=\"historial-card__title-area\">\n <span class=\"historial-card__icon-wrapper\"\n [ngClass]=\"{'state-change': entry?.tipo === 'estado', 'doc-change': entry?.tipo === 'documento'}\">\n @if (entry?.tipo === 'documento') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\" />\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\" />\n <path d=\"M9 9l1 0\" />\n <path d=\"M9 13l6 0\" />\n <path d=\"M9 17l6 0\" />\n </svg>\n } @else if (entry?.previousState || entry?.currentState) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M3 9l4 -4l4 4m-4 -4v14\" />\n <path d=\"M21 15l-4 4l-4 -4m4 4v-14\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 8l.01 0\" />\n <path d=\"M12 12l0 9\" />\n <path d=\"M12 3a9 9 0 1 0 9 9\" />\n </svg>\n }\n </span>\n <h3 class=\"historial-card__title\">{{ entry?.titulo }}</h3>\n </div>\n @if (entry?.tipo === 'estado') {\n <div class=\"historial-card__id\">ID #{{ entry?.id }}</div>\n } @else {\n <div class=\"historial-card__id historial-card__id--local\">{{ entry?.tipo === 'documento' ? 'Documento' : 'Movimiento' }}\n </div>\n }\n </div>\n\n <!-- Card Body -->\n <div class=\"historial-card__body\">\n @if (entry?.detalle) {\n <div class=\"historial-card__reason-box\">\n <span class=\"reason-label\">Detalles</span>\n <p class=\"reason-text\">{{ entry?.detalle }}</p>\n </div>\n }\n\n @if (entry?.previousState || entry?.currentState) {\n <div class=\"historial-card__states-container\">\n <span class=\"states-label\">Transición:</span>\n <div class=\"historial-item__status-row\">\n @if (entry?.previousState) {\n <span class=\"status-chip\" [ngClass]=\"getStatusChipClass(entry!.previousState!)\">\n {{ statusLabel(entry!.previousState!) }}\n </span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"history-arrow\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M7 7l5 5l-5 5\" />\n <path d=\"M13 7l5 5l-5 5\" />\n </svg>\n }\n @if (entry?.currentState) {\n <span class=\"status-chip\" [ngClass]=\"getStatusChipClass(entry!.currentState!)\">\n {{ statusLabel(entry!.currentState!) }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Footer -->\n <div class=\"historial-card__footer\">\n <div class=\"historial-card__meta-item\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0\" />\n <path d=\"M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2\" />\n </svg>\n <span>Usuario: <strong>{{ entry?.createdBy || 'SISTEMA' }}</strong></span>\n </div>\n <div class=\"historial-card__meta-item\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"me-1\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z\" />\n <path d=\"M16 3v4\" />\n <path d=\"M8 3v4\" />\n <path d=\"M4 11h16\" />\n <path d=\"M11 15h1\" />\n <path d=\"M12 15v3\" />\n </svg>\n <span>{{ entry?.creationDate | date:'dd/MM/yyyy h:mm a' }}</span>\n </div>\n </div>\n</article>\n}","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n output\r\n} from '@angular/core';\r\n\r\nimport SignaturePad from 'signature_pad';\r\nimport { Button } from '../button/button';\r\n\r\n@Component({\r\n selector: 'lib-signature',\r\n standalone: true,\r\n imports: [Button],\r\n templateUrl: './signature.html',\r\n styleUrl: './signature.css',\r\n})\r\nexport class Signature implements AfterViewInit {\r\n\r\n @ViewChild('canvas')\r\n canvasRef!: ElementRef<HTMLCanvasElement>;\r\n\r\n signaturePad!: SignaturePad;\r\n\r\n firmaSaved = output<string>();\r\n\r\n ngAfterViewInit(): void {\r\n this.signaturePad = new SignaturePad(\r\n this.canvasRef.nativeElement,\r\n {\r\n minWidth: 1,\r\n maxWidth: 2\r\n }\r\n );\r\n }\r\n\r\n limpiarFirma() {\r\n this.signaturePad.clear();\r\n }\r\n\r\n guardarFirma() {\r\n if (this.signaturePad.isEmpty()) return;\r\n this.firmaSaved.emit(this.signaturePad.toDataURL('image/png'));\r\n }\r\n\r\n obtenerFirmaBase64(): string {\r\n return this.signaturePad.toDataURL('image/png');\r\n }\r\n\r\n firmaVacia(): boolean {\r\n return this.signaturePad.isEmpty();\r\n }\r\n\r\n}\r\n","<div class=\"signature-container\">\r\n\r\n <canvas #canvas width=\"600\" height=\"200\" class=\"canvas-signature\"></canvas>\r\n\r\n <div class=\"signature-actions\">\r\n <lib-button [variant]=\"'outline'\" [size]=\"'compact'\" (clicked)=\"limpiarFirma()\">\r\n Limpiar\r\n </lib-button>\r\n <lib-button [variant]=\"'primary'\" [size]=\"'compact'\" (clicked)=\"guardarFirma()\">\r\n Guardar firma\r\n </lib-button>\r\n </div>\r\n\r\n</div>","import { Component, input, output } from '@angular/core';\n\nexport interface DocumentInfo {\n folio?: string;\n name: string;\n creation_date: string;\n type: 'document' | 'image' | 'video';\n actionKey: string;\n /** URL del archivo para previsualización o descarga desde el padre */\n url?: string;\n}\n\n@Component({\n selector: 'lib-document-item',\n imports: [],\n templateUrl: './document-item.html',\n styleUrl: './document-item.css',\n})\nexport class DocumentItem {\n data = input<DocumentInfo>();\n view = output<DocumentInfo>();\n\n get iconClass(): string {\n const typeIcons: Record<string, string> = {\n document: 'icon-file-3',\n image: 'icon-image',\n video: 'icon-video',\n };\n const type = this.data()?.type ?? 'document';\n return `document-icon ${typeIcons[type] ?? 'icon-file-3'}`;\n }\n\n viewDocument() {\n const doc = this.data();\n if (doc) this.view.emit(doc);\n }\n}\n","<div class=\"document-item\">\n <div class=\"document-info\">\n <div class=\"document-header\">\n <span [class]=\"iconClass\"></span>\n </div>\n\n <div class=\"document-details\">\n <span class=\"folio\">{{ data()?.folio }}</span>\n <h3 class=\"title\">{{ data()?.name }}</h3>\n <p class=\"date\">Fecha de creación: {{ data()?.creation_date }}</p>\n </div>\n </div>\n <a (click)=\"viewDocument()\" class=\"document-action\">Ver documento</a>\n</div>\n","import { booleanAttribute, Component, input, output } from '@angular/core';\nimport { Button } from '../button/button';\n\n@Component({\n selector: 'lib-rol-card',\n imports: [Button],\n templateUrl: './rol-card.html',\n styleUrl: './rol-card.css',\n})\nexport class RolCard {\n roleName = input.required<string>();\n description = input<string>('');\n color = input<string>('#596300');\n userCount = input<number>(0);\n /** Muestra el botón eliminar en la esquina superior derecha. Default: true */\n showDelete = input(true, { transform: booleanAttribute });\n\n edit = output<void>();\n permissions = output<void>();\n delete = output<void>();\n}\n","<div class=\"rol-card\">\n @if (showDelete()) {\n <button\n type=\"button\"\n class=\"delete-btn\"\n aria-label=\"Eliminar rol\"\n (click)=\"delete.emit()\"\n >\n <span class=\"delete-icon icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <div class=\"card-header\">\n <div class=\"icon-container\" [style.backgroundColor]=\"color()\">\n <span class=\"shield-icon icon icon-shield\" aria-hidden=\"true\"></span>\n </div>\n <div class=\"header-text\">\n <h3 class=\"role-name\">{{ roleName() }}</h3>\n <p class=\"role-description\">{{ description() }}</p>\n </div>\n </div>\n\n <hr class=\"divider\" />\n\n <div class=\"card-footer\">\n <span class=\"user-count\">{{ userCount() }} usuarios</span>\n <div class=\"actions\">\n <lib-button variant=\"outline\" size=\"compact\" (clicked)=\"edit.emit()\">\n <div class=\"button-content\">\n <span class=\"action-icon icon icon-edit\" aria-hidden=\"true\"></span>\n Editar\n </div>\n </lib-button>\n <lib-button variant=\"primary\" size=\"compact\" (clicked)=\"permissions.emit()\">\n <div class=\"button-content\">\n <span class=\"action-icon icon icon-settings\" aria-hidden=\"true\"></span>\n Permisos\n </div>\n </lib-button>\n </div>\n </div>\n</div>","import { IconPickerOption } from './icon-picker-options.types';\r\n\r\nexport type { IconPickerOption } from './icon-picker-options.types';\r\n\r\n/** Todas las clases icon-* definidas en icons.css */\r\nexport const CSS_ICON_CATALOG: IconPickerOption[] = [\r\n 'icon-arrow-up', 'icon-arrow-down', 'icon-arrow-left', 'icon-arrow-right',\r\n 'icon-chevron-up', 'icon-chevron-down', 'icon-chevron-left', 'icon-chevron-right',\r\n 'icon-edit', 'icon-delete', 'icon-add', 'icon-view', 'icon-view-off',\r\n 'icon-save', 'icon-copy', 'icon-duplicate',\r\n 'icon-file', 'icon-folder', 'icon-folder-open', 'icon-upload', 'icon-download',\r\n 'icon-export', 'icon-import', 'icon-attach',\r\n 'icon-user', 'icon-users', 'icon-user-plus',\r\n 'icon-lock', 'icon-unlock', 'icon-key', 'icon-shield', 'icon-fingerprint',\r\n 'icon-settings', 'icon-refresh', 'icon-close', 'icon-check',\r\n 'icon-info', 'icon-warning', 'icon-bell', 'icon-bell-off',\r\n 'icon-search', 'icon-filter', 'icon-sort', 'icon-menu',\r\n 'icon-grid', 'icon-list',\r\n 'icon-check-circle', 'icon-x-circle', 'icon-alert-circle',\r\n 'icon-chart-bar', 'icon-chart-line', 'icon-database', 'icon-table',\r\n 'icon-layout', 'icon-layers', 'icon-box', 'icon-globe', 'icon-link',\r\n 'icon-star', 'icon-bookmark', 'icon-tag', 'icon-home',\r\n 'icon-send', 'icon-share', 'icon-print', 'icon-clipboard', 'icon-zap', 'icon-tool',\r\n 'icon-logout', 'icon-calendar', 'icon-clock', 'icon-mail', 'icon-phone',\r\n 'icon-map-pin', 'icon-image', 'icon-code', 'icon-help',\r\n 'icon-eye', 'icon-eye-off', 'icon-activate', 'icon-deactivate',\r\n 'icon-module', 'icon-submodule', 'icon-applicativo', 'icon-role', 'icon-permission',\r\n 'icon-more-vert', 'icon-more-horiz', 'icon-external-link', 'icon-move',\r\n 'icon-expand', 'icon-collapse', 'icon-drag',\r\n 'icon-sanction', 'icon-plus', 'icon-minus', 'icon-change',\r\n 'icon-inbox', 'icon-message', 'icon-building', 'icon-camera', 'icon-car',\r\n 'icon-chevrons-right', 'icon-location', 'icon-video',\r\n 'icon-chart', 'icon-alert',\r\n 'icon-edit-2', 'icon-delete-2', 'icon-view-2', 'icon-eye-2',\r\n 'icon-file-2', 'icon-file-3',\r\n 'icon-upload-2', 'icon-download-2', 'icon-export-2', 'icon-filter-2',\r\n].map((value) => ({ value }));\r\n\r\n/** Iconos Lucide sugeridos para módulos */\r\nexport const LUCIDE_ICON_CATALOG: IconPickerOption[] = [\r\n { value: 'lucide:layers', label: 'Capas' },\r\n { value: 'lucide:file-text', label: 'Documento' },\r\n { value: 'lucide:book-open', label: 'Libro' },\r\n { value: 'lucide:truck', label: 'Transporte' },\r\n { value: 'lucide:package', label: 'Paquete' },\r\n { value: 'lucide:puzzle', label: 'Puzzle' },\r\n { value: 'lucide:layout-grid', label: 'Cuadrícula' },\r\n { value: 'lucide:workflow', label: 'Flujo' },\r\n { value: 'lucide:shield-check', label: 'Seguridad' },\r\n { value: 'lucide:users', label: 'Usuarios' },\r\n { value: 'lucide:settings', label: 'Configuración' },\r\n { value: 'lucide:folder-tree', label: 'Árbol de carpetas' },\r\n];\r\n\r\n/** Catálogo completo: icons.css + Lucide */\r\nexport const DEFAULT_ICON_PICKER_ICONS: IconPickerOption[] = [\r\n ...CSS_ICON_CATALOG,\r\n ...LUCIDE_ICON_CATALOG,\r\n];\r\n\r\n/**\r\n * Subconjunto curado para formularios de módulo.\r\n * Sin alias CSS duplicados (p. ej. icon-activate = icon-check-circle) ni Lucide\r\n * que repita la misma silueta que un icon-* ya listado.\r\n */\r\nexport const DEFAULT_MODULE_ICONS: IconPickerOption[] = [\r\n { value: 'icon-check-circle', label: 'Documento aprobado' },\r\n { value: 'icon-check', label: 'Verificación' },\r\n { value: 'icon-search', label: 'Búsqueda' },\r\n { value: 'icon-calendar', label: 'Calendario' },\r\n { value: 'icon-clipboard', label: 'Portapapeles' },\r\n { value: 'icon-clock', label: 'Historial' },\r\n { value: 'icon-file-3', label: 'Documento' },\r\n { value: 'icon-chart-bar', label: 'Estadísticas' },\r\n { value: 'icon-chart-line', label: 'Tendencia' },\r\n { value: 'icon-bookmark', label: 'Marcador' },\r\n { value: 'icon-car', label: 'Vehículo' },\r\n { value: 'icon-folder', label: 'Carpeta' },\r\n { value: 'icon-settings', label: 'Configuración' },\r\n { value: 'icon-shield', label: 'Seguridad' },\r\n { value: 'icon-module', label: 'Módulo' },\r\n { value: 'icon-layers', label: 'Capas' },\r\n { value: 'icon-box', label: 'Aplicativo' },\r\n { value: 'icon-database', label: 'Base de datos' },\r\n { value: 'icon-table', label: 'Tabla' },\r\n { value: 'icon-globe', label: 'Global' },\r\n { value: 'icon-users', label: 'Usuarios' },\r\n { value: 'icon-building', label: 'Edificio' },\r\n { value: 'icon-map-pin', label: 'Ubicación' },\r\n { value: 'icon-bell', label: 'Notificaciones' },\r\n { value: 'lucide:book-open', label: 'Libro abierto' },\r\n { value: 'lucide:truck', label: 'Transporte pesado' },\r\n { value: 'lucide:puzzle', label: 'Puzzle' },\r\n { value: 'lucide:workflow', label: 'Flujo de trabajo' },\r\n { value: 'lucide:folder-tree', label: 'Árbol de carpetas' },\r\n { value: 'lucide:layout-grid', label: 'Cuadrícula' },\r\n];\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideAngularModule, LucideIconData, icons } from 'lucide-angular';\r\nimport {\r\n DEFAULT_MODULE_ICONS,\r\n IconPickerOption,\r\n} from './icon-picker-options';\r\nimport {\r\n getIconPickerOptionKey,\r\n getIconPickerOptionLabel,\r\n getIconPickerOptionType,\r\n parseIconPickerValue,\r\n toIconPickerStoredValue,\r\n toLucidePascalCase,\r\n} from './icon-picker.utils';\r\n\r\nexport {\r\n CSS_ICON_CATALOG,\r\n DEFAULT_ICON_PICKER_ICONS,\r\n DEFAULT_MODULE_ICONS,\r\n LUCIDE_ICON_CATALOG,\r\n} from './icon-picker-options';\r\nexport type { IconPickerOption } from './icon-picker-options.types';\r\nexport {\r\n getIconPickerOptionLabel,\r\n getCssIconClass,\r\n getLucideIconName,\r\n isLucideIconValue,\r\n parseIconPickerValue,\r\n resolveIconKind,\r\n toIconPickerStoredValue,\r\n toLucidePascalCase,\r\n} from './icon-picker.utils';\r\n\r\n@Component({\r\n selector: 'lib-icon-picker',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n templateUrl: './icon-picker.html',\r\n styleUrl: './icon-picker.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => IconPicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class IconPicker implements ControlValueAccessor {\r\n label = input<string>('Icono');\r\n icons = input<IconPickerOption[]>(DEFAULT_MODULE_ICONS);\r\n columns = input<number>(8);\r\n disabled = input(false, { transform: booleanAttribute });\r\n readonly = input(false, { transform: booleanAttribute });\r\n\r\n selectionChange = output<string>();\r\n\r\n selectedValue = signal<string | null>(null);\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n isDisabledByControl = false;\r\n\r\n get isBlocked(): boolean {\r\n return this.isDisabledByControl || this.disabled() || this.readonly();\r\n }\r\n\r\n isSelected(option: IconPickerOption): boolean {\r\n return this.selectedValue() === toIconPickerStoredValue(option);\r\n }\r\n\r\n isLucideOption(option: IconPickerOption): boolean {\r\n return getIconPickerOptionType(option) === 'lucide';\r\n }\r\n\r\n getOptionLabel(option: IconPickerOption): string {\r\n return getIconPickerOptionLabel(option);\r\n }\r\n\r\n getOptionKey(option: IconPickerOption): string {\r\n return getIconPickerOptionKey(option);\r\n }\r\n\r\n getLucideIcon(option: IconPickerOption): LucideIconData | null {\r\n const { name } = parseIconPickerValue(toIconPickerStoredValue(option));\r\n const iconName = toLucidePascalCase(name);\r\n return (icons as Record<string, LucideIconData | undefined>)[iconName] ?? null;\r\n }\r\n\r\n select(option: IconPickerOption): void {\r\n if (this.isBlocked) return;\r\n const stored = toIconPickerStoredValue(option);\r\n this.selectedValue.set(stored);\r\n this.selectionChange.emit(stored);\r\n this.onChange(stored);\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n this.selectedValue.set(value ?? null);\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.isDisabledByControl = isDisabled;\r\n }\r\n}\r\n","<div class=\"icon-picker\" [class.icon-picker--disabled]=\"isBlocked\">\r\n @if (label()) {\r\n <span class=\"icon-picker__label\">{{ label() }}</span>\r\n }\r\n\r\n <div\r\n class=\"icon-picker__grid\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"label()\"\r\n [style.--icon-picker-columns]=\"columns()\"\r\n >\r\n @for (option of icons(); track getOptionKey(option)) {\r\n <button\r\n type=\"button\"\r\n class=\"icon-picker__item\"\r\n role=\"option\"\r\n [attr.aria-label]=\"getOptionLabel(option)\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.icon-picker__item--selected]=\"isSelected(option)\"\r\n [disabled]=\"isBlocked\"\r\n (click)=\"select(option)\"\r\n >\r\n @if (isLucideOption(option)) {\r\n @if (getLucideIcon(option); as lucideIcon) {\r\n <lucide-icon class=\"icon-picker__lucide\" [img]=\"lucideIcon\" [size]=\"22\" aria-hidden=\"true\"></lucide-icon>\r\n }\r\n } @else {\r\n <span class=\"icon-picker__icon icon {{ option.value }}\" aria-hidden=\"true\"></span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","/** Paleta viva por defecto para colores de roles (25 tonos) */\r\nexport const DEFAULT_ROLE_COLORS: string[] = [\r\n '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107',\r\n '#FF9800', '#FF5722', '#F44336', '#E91E63', '#9C27B0',\r\n '#673AB7', '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4',\r\n '#009688', '#26A69A', '#66BB6A', '#AED581', '#DCE775',\r\n '#596300', '#827717', '#33691E', '#37474F', '#000000',\r\n];\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DEFAULT_ROLE_COLORS } from './color-picker-options';\r\n\r\nexport { DEFAULT_ROLE_COLORS } from './color-picker-options';\r\n\r\n@Component({\r\n selector: 'lib-color-picker',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './color-picker.html',\r\n styleUrl: './color-picker.css',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ColorPicker),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class ColorPicker implements ControlValueAccessor {\r\n label = input<string>('Color del rol');\r\n colors = input<string[]>(DEFAULT_ROLE_COLORS);\r\n columns = input<number>(10);\r\n disabled = input(false, { transform: booleanAttribute });\r\n readonly = input(false, { transform: booleanAttribute });\r\n\r\n selectionChange = output<string>();\r\n\r\n selectedValue = signal<string | null>(null);\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n isDisabledByControl = false;\r\n\r\n get isBlocked(): boolean {\r\n return this.isDisabledByControl || this.disabled() || this.readonly();\r\n }\r\n\r\n isSelected(color: string): boolean {\r\n return this.selectedValue()?.toLowerCase() === color.toLowerCase();\r\n }\r\n\r\n select(color: string): void {\r\n if (this.isBlocked) return;\r\n this.selectedValue.set(color);\r\n this.selectionChange.emit(color);\r\n this.onChange(color);\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n this.selectedValue.set(value ?? null);\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.isDisabledByControl = isDisabled;\r\n }\r\n}\r\n","<div class=\"color-picker\" [class.color-picker--disabled]=\"isBlocked\">\r\n @if (label()) {\r\n <span class=\"color-picker__label\">{{ label() }}</span>\r\n }\r\n\r\n <div\r\n class=\"color-picker__grid\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"label()\"\r\n [style.--color-picker-columns]=\"columns()\"\r\n >\r\n @for (color of colors(); track color) {\r\n <button\r\n type=\"button\"\r\n class=\"color-picker__swatch\"\r\n role=\"option\"\r\n [attr.aria-label]=\"color\"\r\n [attr.aria-selected]=\"isSelected(color)\"\r\n [class.color-picker__swatch--selected]=\"isSelected(color)\"\r\n [style.background-color]=\"color\"\r\n [disabled]=\"isBlocked\"\r\n (click)=\"select(color)\"\r\n >\r\n @if (isSelected(color)) {\r\n <span class=\"color-picker__check icon icon-check\" aria-hidden=\"true\"></span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { LucideAngularModule, LucideIconData, icons } from 'lucide-angular';\r\nimport {\r\n isLucideIconValue,\r\n parseIconPickerValue,\r\n toLucidePascalCase,\r\n} from '../../icon-picker/icon-picker.utils';\r\n\r\n@Component({\r\n selector: 'lib-module-card-icon',\r\n imports: [LucideAngularModule],\r\n templateUrl: './module-card-icon.html',\r\n styleUrl: './module-card-icon.css',\r\n})\r\nexport class ModuleCardIcon {\r\n value = input<string>('');\r\n size = input<'md' | 'sm'>('md');\r\n color = input<string>('#596300');\r\n\r\n pixelSize = computed(() => (this.size() === 'sm' ? 18 : 20));\r\n\r\n isLucide = computed(() => isLucideIconValue(this.value()));\r\n\r\n cssClass = computed(() => parseIconPickerValue(this.value()).name);\r\n\r\n lucideData = computed((): LucideIconData | null => {\r\n if (!this.isLucide()) return null;\r\n const { name } = parseIconPickerValue(this.value());\r\n const iconName = toLucidePascalCase(name);\r\n return (icons as Record<string, LucideIconData | undefined>)[iconName] ?? null;\r\n });\r\n}\r\n","@if (value()) {\r\n @if (isLucide()) {\r\n @if (lucideData(); as lucideIcon) {\r\n <lucide-icon\r\n class=\"mc-icon mc-icon--lucide\"\r\n [class.mc-icon--sm]=\"size() === 'sm'\"\r\n [img]=\"lucideIcon\"\r\n [size]=\"pixelSize()\"\r\n [color]=\"color()\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n } @else {\r\n <span\r\n class=\"mc-icon icon {{ cssClass() }}\"\r\n [class.mc-icon--sm]=\"size() === 'sm'\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n }\r\n}\r\n","import { Component, input, output } from '@angular/core';\nimport { ToggleCustom } from '../../toggle-custom/toggle-custom';\nimport { ModuleApplicativo, ApplicativoEvent } from '../module-card';\nimport { ModuleCardIcon } from '../module-card-icon/module-card-icon';\n\n@Component({\n selector: 'lib-module-card-applicativo',\n imports: [ToggleCustom, ModuleCardIcon],\n templateUrl: './module-card-applicativo.html',\n styleUrl: './module-card-applicativo.css',\n})\nexport class ModuleCardApplicativo {\n /** Datos del aplicativo */\n app = input.required<ModuleApplicativo>();\n\n /** Id del módulo contenedor */\n moduleId = input.required<string | number>();\n\n /** Id del submódulo padre; null si es directo del módulo */\n subId = input<string | number | null>(null);\n\n /** true cuando es el primer aplicativo de su lista (deshabilita mover arriba) */\n isFirst = input<boolean>(false);\n\n /** true cuando es el último aplicativo de su lista (deshabilita mover abajo) */\n isLast = input<boolean>(false);\n\n /** Controla si la fila está expandida (chips visibles) */\n expanded = input<boolean>(false);\n\n /** Solicita cambiar el estado de expansión */\n expandToggle = output<void>();\n\n /** Todos los eventos del aplicativo */\n event = output<ApplicativoEvent>();\n\n emitEvent(type: ApplicativoEvent['type'], data?: ApplicativoEvent['data']): void {\n this.event.emit({\n type,\n moduleId: this.moduleId(),\n applicativoId: this.app().id,\n submoduleId: this.subId(),\n data,\n });\n }\n}\n","<div class=\"mc-aplicativo\" [class.mc-aplicativo--expanded]=\"expanded()\">\n\n <!-- ── Encabezado del aplicativo ────────────────────────────────────── -->\n <div class=\"mc-row mc-row--app\" (click)=\"expandToggle.emit()\">\n <div class=\"mc-header-left\">\n <button class=\"mc-expand-btn\" [class.mc-expand-btn--open]=\"expanded()\"\n title=\"Expandir / Colapsar\">\n <span class=\"mc-action-icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n @if (app().icon) {\n <lib-module-card-icon [value]=\"app().icon!\" size=\"sm\" color=\"#454733\" />\n }\n <span class=\"mc-name mc-name--app\">{{ app().name }}</span>\n </div>\n\n <div class=\"mc-header-right\" (click)=\"$event.stopPropagation()\">\n <button class=\"mc-icon-btn\" title=\"Mover arriba\"\n [disabled]=\"isFirst()\"\n (click)=\"emitEvent('moveUp')\">\n <span class=\"mc-action-icon icon-arrow-up\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn\" title=\"Mover abajo\"\n [disabled]=\"isLast()\"\n (click)=\"emitEvent('moveDown')\">\n <span class=\"mc-action-icon icon-arrow-down\" aria-hidden=\"true\"></span>\n </button>\n <span class=\"mc-btn-sep\" aria-hidden=\"true\"></span>\n <button class=\"mc-icon-btn mc-icon-btn--edit\" title=\"Editar\"\n (click)=\"emitEvent('edit')\">\n <span class=\"mc-action-icon icon-edit\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn mc-icon-btn--delete\" title=\"Eliminar\"\n (click)=\"emitEvent('delete')\">\n <span class=\"mc-action-icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n <lib-toggle-custom\n [checked]=\"app().visible\"\n (toggleChange)=\"emitEvent('visibleChange', $event.checked)\"/>\n </div>\n </div>\n\n <!-- ── Chips de acciones (expandido) ────────────────────────────────── -->\n @if (expanded()) {\n <div class=\"mc-actions-row\">\n @for (action of app().actions; track action.key) {\n <div class=\"mc-chip mc-chip--active\">\n <span class=\"mc-action-icon icon-check\" aria-hidden=\"true\"></span>\n {{ action.label }}\n <button class=\"mc-chip-remove\" title=\"Quitar acción\"\n (click)=\"emitEvent('removeAction', action.key)\">\n ×\n </button>\n </div>\n }\n <button class=\"mc-chip mc-chip--add\"\n (click)=\"emitEvent('addAction')\">\n + Acción\n </button>\n </div>\n }\n\n</div>\n","import { ModuleApplicativo, ModuleChildRef, ModuleData, ModuleSubmodule } from './module-card';\r\n\r\nexport function getModuleChildOrder(\r\n module: Pick<ModuleData, 'submodules' | 'aplicativos' | 'childOrder'>,\r\n): ModuleChildRef[] {\r\n const defaultOrder: ModuleChildRef[] = [\r\n ...module.submodules.map(s => ({ type: 'submodule' as const, id: s.id })),\r\n ...module.aplicativos.map(a => ({ type: 'aplicativo' as const, id: a.id })),\r\n ];\r\n\r\n if (!module.childOrder?.length) {\r\n return defaultOrder;\r\n }\r\n\r\n const validRefs = module.childOrder.filter(ref => {\r\n if (ref.type === 'submodule') {\r\n return module.submodules.some(s => s.id === ref.id);\r\n }\r\n return module.aplicativos.some(a => a.id === ref.id);\r\n });\r\n\r\n const seen = new Set(validRefs.map(r => `${r.type}:${r.id}`));\r\n for (const ref of defaultOrder) {\r\n const key = `${ref.type}:${ref.id}`;\r\n if (!seen.has(key)) {\r\n validRefs.push(ref);\r\n seen.add(key);\r\n }\r\n }\r\n\r\n return validRefs;\r\n}\r\n\r\nexport interface ResolvedModuleChild {\r\n type: 'submodule' | 'aplicativo';\r\n id: string | number;\r\n trackKey: string;\r\n submodule?: ModuleSubmodule;\r\n applicativo?: ModuleApplicativo;\r\n}\r\n\r\nexport function resolveModuleChildren(\r\n order: ModuleChildRef[],\r\n submodules: ModuleSubmodule[],\r\n aplicativos: ModuleApplicativo[],\r\n): ResolvedModuleChild[] {\r\n const children: ResolvedModuleChild[] = [];\r\n\r\n for (const ref of order) {\r\n if (ref.type === 'submodule') {\r\n const submodule = submodules.find(s => s.id === ref.id);\r\n if (submodule) {\r\n children.push({ type: 'submodule', id: ref.id, trackKey: `sub:${ref.id}`, submodule });\r\n }\r\n continue;\r\n }\r\n\r\n const applicativo = aplicativos.find(a => a.id === ref.id);\r\n if (applicativo) {\r\n children.push({ type: 'aplicativo', id: ref.id, trackKey: `app:${ref.id}`, applicativo });\r\n }\r\n }\r\n\r\n return children;\r\n}\r\n\r\nexport function childOrdersEqual(a: ModuleChildRef[], b: ModuleChildRef[]): boolean {\r\n if (a.length !== b.length) return false;\r\n return a.every((ref, i) => ref.type === b[i].type && ref.id === b[i].id);\r\n}\r\n","import { ChangeDetectorRef, Component, ElementRef, QueryList, ViewChildren, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { ToggleCustom } from '../toggle-custom/toggle-custom';\nimport { ModuleCardApplicativo } from './module-card-applicativo/module-card-applicativo';\nimport { ModuleCardIcon } from './module-card-icon/module-card-icon';\nimport { childOrdersEqual, getModuleChildOrder, resolveModuleChildren } from './module-card-order';\n\nexport { getModuleChildOrder, resolveModuleChildren } from './module-card-order';\nexport type { ResolvedModuleChild } from './module-card-order';\n\nexport interface ModuleCardAction {\n key: string;\n label: string;\n}\n\nexport interface ModuleApplicativo {\n id: string | number;\n name: string;\n /** Clase CSS (`icon-*`) o valor Lucide (`lucide:nombre`) */\n icon?: string;\n visible: boolean;\n actions: ModuleCardAction[];\n}\n\nexport interface ModuleSubmodule {\n id: string | number;\n name: string;\n /** Clase CSS (`icon-*`) o valor Lucide (`lucide:nombre`) */\n icon?: string;\n visible: boolean;\n aplicativos: ModuleApplicativo[];\n}\n\nexport type ModuleChildType = 'submodule' | 'aplicativo';\n\nexport interface ModuleChildRef {\n type: ModuleChildType;\n id: string | number;\n}\n\nexport interface ModuleData {\n id: string | number;\n name: string;\n /** Clase CSS (`icon-*`) o valor Lucide (`lucide:nombre`) */\n icon?: string;\n visible: boolean;\n submodules: ModuleSubmodule[];\n aplicativos: ModuleApplicativo[];\n /** Orden mixto de submódulos y aplicativos directos dentro del módulo */\n childOrder?: ModuleChildRef[];\n}\n\nexport interface ModuleEvent {\n type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange' | 'addApplicativo' | 'addSubmodule';\n moduleId: string | number;\n data?: any;\n}\n\nexport interface SubmoduleEvent {\n type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange';\n submoduleId: string | number;\n moduleId: string | number;\n data?: any;\n}\n\nexport interface ApplicativoEvent {\n type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange' | 'addAction' | 'removeAction';\n moduleId: string | number;\n applicativoId: string | number;\n submoduleId?: string | number | null;\n data?: any;\n}\n\n@Component({\n selector: 'lib-module-card',\n imports: [ToggleCustom, ModuleCardApplicativo, ModuleCardIcon],\n templateUrl: './module-card.html',\n styleUrl: './module-card.css',\n})\nexport class ModuleCard {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChildren('childEl') childEls!: QueryList<ElementRef<HTMLElement>>;\n\n moduleId = input.required<string | number>();\n moduleName = input.required<string>();\n moduleIcon = input<string>('');\n visible = input<boolean>(true);\n submodules = input<ModuleSubmodule[]>([]);\n aplicativos = input<ModuleApplicativo[]>([]);\n childOrder = input<ModuleChildRef[] | undefined>(undefined);\n /** true cuando este módulo es el primero de la lista (deshabilita mover arriba) */\n isFirst = input<boolean>(false);\n /** true cuando este módulo es el último de la lista (deshabilita mover abajo) */\n isLast = input<boolean>(false);\n\n moduleEvent = output<ModuleEvent>();\n submoduleEvent = output<SubmoduleEvent>();\n applicativoEvent = output<ApplicativoEvent>();\n childOrderChange = output<ModuleChildRef[]>();\n\n expanded = signal<boolean>(false);\n expandedSubmodules = signal<Set<string | number>>(new Set());\n expandedApplicativos = signal<Set<string | number>>(new Set());\n private optimisticChildOrder = signal<ModuleChildRef[] | null>(null);\n\n moduleChildren = computed(() => {\n const order =\n this.optimisticChildOrder() ??\n getModuleChildOrder({\n submodules: this.submodules(),\n aplicativos: this.aplicativos(),\n childOrder: this.childOrder(),\n });\n return resolveModuleChildren(order, this.submodules(), this.aplicativos());\n });\n\n constructor() {\n effect(() => {\n const optimistic = this.optimisticChildOrder();\n const inputOrder = this.childOrder();\n if (optimistic && inputOrder && childOrdersEqual(optimistic, inputOrder)) {\n this.optimisticChildOrder.set(null);\n }\n });\n }\n\n toggleExpand() {\n this.expanded.set(!this.expanded());\n }\n\n toggleSubmodule(id: string | number) {\n const next = new Set(this.expandedSubmodules());\n next.has(id) ? next.delete(id) : next.add(id);\n this.expandedSubmodules.set(next);\n }\n\n isSubmoduleExpanded(id: string | number): boolean {\n return this.expandedSubmodules().has(id);\n }\n\n toggleApplicativo(id: string | number) {\n const next = new Set(this.expandedApplicativos());\n next.has(id) ? next.delete(id) : next.add(id);\n this.expandedApplicativos.set(next);\n }\n\n isApplicativoExpanded(id: string | number): boolean {\n return this.expandedApplicativos().has(id);\n }\n\n moveChild(index: number, direction: 'up' | 'down') {\n const order = [\n ...(this.optimisticChildOrder() ??\n getModuleChildOrder({\n submodules: this.submodules(),\n aplicativos: this.aplicativos(),\n childOrder: this.childOrder(),\n })),\n ];\n const target = direction === 'up' ? index - 1 : index + 1;\n if (target < 0 || target >= order.length) return;\n this.animateChildSwap(index, target, order);\n }\n\n onDirectApplicativoEvent(event: ApplicativoEvent, index: number) {\n if (event.type === 'moveUp') {\n this.moveChild(index, 'up');\n return;\n }\n if (event.type === 'moveDown') {\n this.moveChild(index, 'down');\n return;\n }\n this.applicativoEvent.emit(event);\n }\n\n private animateChildSwap(from: number, to: number, currentOrder: ModuleChildRef[]) {\n const positionMap = new Map<HTMLElement, number>();\n this.childEls.forEach(el =>\n positionMap.set(el.nativeElement, el.nativeElement.getBoundingClientRect().top),\n );\n\n const newOrder = [...currentOrder];\n [newOrder[from], newOrder[to]] = [newOrder[to], newOrder[from]];\n const moved = currentOrder[from];\n const direction = to < from ? 'moveUp' : 'moveDown';\n\n if (moved.type === 'submodule') {\n this.submoduleEvent.emit({\n type: direction,\n submoduleId: moved.id,\n moduleId: this.moduleId(),\n data: to,\n });\n } else {\n this.applicativoEvent.emit({\n type: direction,\n moduleId: this.moduleId(),\n applicativoId: moved.id,\n submoduleId: null,\n data: to,\n });\n }\n\n this.optimisticChildOrder.set(newOrder);\n this.childOrderChange.emit(newOrder);\n this.cdr.detectChanges();\n\n this.childEls.forEach(el => {\n const node = el.nativeElement;\n const beforeTop = positionMap.get(node);\n if (beforeTop === undefined) return;\n\n const delta = beforeTop - node.getBoundingClientRect().top;\n if (delta === 0) return;\n\n node.style.transition = 'none';\n node.style.transform = `translateY(${delta}px)`;\n node.classList.add('mc-child-item--moving');\n\n void node.offsetHeight;\n\n node.style.transition = 'transform 280ms cubic-bezier(0.25, 0.8, 0.25, 1)';\n node.style.transform = '';\n\n node.addEventListener(\n 'transitionend',\n () => {\n node.style.transition = '';\n node.classList.remove('mc-child-item--moving');\n },\n { once: true },\n );\n });\n }\n}\n","<!-- ══════════════════════════════════════════════════════════════════════ -->\n<!-- MODULE CARD — Angular 20 · solo @if / @for, sin ng-template -->\n<!-- ══════════════════════════════════════════════════════════════════════ -->\n<div class=\"mc-card\">\n\n <!-- ── ENCABEZADO DEL MÓDULO ──────────────────────────────────────────── -->\n <div class=\"mc-header\" (click)=\"toggleExpand()\">\n <div class=\"mc-header-left\">\n <button class=\"mc-expand-btn\" [class.mc-expand-btn--open]=\"expanded()\"\n title=\"Expandir / Colapsar\">\n <span class=\"mc-action-icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n @if (moduleIcon()) {\n <lib-module-card-icon [value]=\"moduleIcon()\" />\n }\n <span class=\"mc-name\">{{ moduleName() }}</span>\n </div>\n\n <div class=\"mc-header-right\" (click)=\"$event.stopPropagation()\">\n <button class=\"mc-icon-btn\" title=\"Mover arriba\"\n [disabled]=\"isFirst()\"\n (click)=\"moduleEvent.emit({ type: 'moveUp', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-arrow-up\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn\" title=\"Mover abajo\"\n [disabled]=\"isLast()\"\n (click)=\"moduleEvent.emit({ type: 'moveDown', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-arrow-down\" aria-hidden=\"true\"></span>\n </button>\n <span class=\"mc-btn-sep\" aria-hidden=\"true\"></span>\n <button class=\"mc-icon-btn mc-icon-btn--edit\" title=\"Editar\"\n (click)=\"moduleEvent.emit({ type: 'edit', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-edit\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn mc-icon-btn--delete\" title=\"Eliminar\"\n (click)=\"moduleEvent.emit({ type: 'delete', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n <lib-toggle-custom\n [checked]=\"visible()\"\n (toggleChange)=\"moduleEvent.emit({ type: 'visibleChange', moduleId: moduleId(), data: $event.checked })\" />\n </div>\n </div>\n\n <!-- ── CUERPO (expandido) ──────────────────────────────────────────────── -->\n @if (expanded()) {\n <div class=\"mc-body\">\n\n <!-- ── HIJOS DEL MÓDULO (submódulos + aplicativos en orden unificado) ── -->\n @for (child of moduleChildren(); track child.trackKey; let childIndex = $index) {\n <div class=\"mc-child-item\" #childEl>\n\n @if (child.type === 'submodule' && child.submodule; as sub) {\n <div class=\"mc-submodule\" [class.mc-submodule--expanded]=\"isSubmoduleExpanded(sub.id)\">\n\n <!-- Encabezado del submódulo -->\n <div class=\"mc-row mc-row--submodule\" (click)=\"toggleSubmodule(sub.id)\">\n <div class=\"mc-header-left\">\n <button class=\"mc-expand-btn\" [class.mc-expand-btn--open]=\"isSubmoduleExpanded(sub.id)\"\n title=\"Expandir / Colapsar\">\n <span class=\"mc-action-icon icon-chevron-right\" aria-hidden=\"true\"></span>\n </button>\n @if (sub.icon) {\n <lib-module-card-icon [value]=\"sub.icon\" size=\"sm\" color=\"#454733\" />\n }\n <span class=\"mc-name mc-name--sub\">{{ sub.name }}</span>\n </div>\n\n <div class=\"mc-header-right\" (click)=\"$event.stopPropagation()\">\n <button class=\"mc-icon-btn\" title=\"Mover arriba\"\n [disabled]=\"childIndex === 0\"\n (click)=\"moveChild(childIndex, 'up')\">\n <span class=\"mc-action-icon icon-arrow-up\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn\" title=\"Mover abajo\"\n [disabled]=\"childIndex === moduleChildren().length - 1\"\n (click)=\"moveChild(childIndex, 'down')\">\n <span class=\"mc-action-icon icon-arrow-down\" aria-hidden=\"true\"></span>\n </button>\n <span class=\"mc-btn-sep\" aria-hidden=\"true\"></span>\n <button class=\"mc-icon-btn mc-icon-btn--edit\" title=\"Editar\"\n (click)=\"submoduleEvent.emit({ type: 'edit', submoduleId: sub.id, moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-edit\" aria-hidden=\"true\"></span>\n </button>\n <button class=\"mc-icon-btn mc-icon-btn--delete\" title=\"Eliminar\"\n (click)=\"submoduleEvent.emit({ type: 'delete', submoduleId: sub.id, moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-delete-2\" aria-hidden=\"true\"></span>\n </button>\n <lib-toggle-custom\n [checked]=\"sub.visible\"\n (toggleChange)=\"submoduleEvent.emit({ type: 'visibleChange', submoduleId: sub.id, moduleId: moduleId(), data: $event.checked })\" />\n </div>\n </div>\n\n <!-- Aplicativos del submódulo -->\n @if (isSubmoduleExpanded(sub.id)) {\n <div class=\"mc-sub-body\">\n @for (app of sub.aplicativos; track app.id; let appIndex = $index) {\n <lib-module-card-applicativo\n [app]=\"app\"\n [moduleId]=\"moduleId()\"\n [subId]=\"sub.id\"\n [isFirst]=\"appIndex === 0\"\n [isLast]=\"appIndex === sub.aplicativos.length - 1\"\n [expanded]=\"isApplicativoExpanded(app.id)\"\n (expandToggle)=\"toggleApplicativo(app.id)\"\n (event)=\"applicativoEvent.emit($event)\" />\n }\n </div>\n }\n </div>\n }\n\n @if (child.type === 'aplicativo' && child.applicativo; as app) {\n <lib-module-card-applicativo\n [app]=\"app\"\n [moduleId]=\"moduleId()\"\n [subId]=\"null\"\n [isFirst]=\"childIndex === 0\"\n [isLast]=\"childIndex === moduleChildren().length - 1\"\n [expanded]=\"isApplicativoExpanded(app.id)\"\n (expandToggle)=\"toggleApplicativo(app.id)\"\n (event)=\"onDirectApplicativoEvent($event, childIndex)\" />\n }\n\n </div>\n }\n\n <!-- ── PIE DE MÓDULO ─────────────────────────────────────────────── -->\n <div class=\"mc-footer\">\n <button class=\"mc-add-btn\"\n (click)=\"moduleEvent.emit({ type: 'addApplicativo', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-add\" aria-hidden=\"true\"></span>\n Agregar Aplicativo\n </button>\n <button class=\"mc-add-btn\"\n (click)=\"moduleEvent.emit({ type: 'addSubmodule', moduleId: moduleId() })\">\n <span class=\"mc-action-icon icon-folder-open\" aria-hidden=\"true\"></span>\n Agregar Submódulo\n </button>\n </div>\n\n </div>\n }\n\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n ElementRef,\n QueryList,\n ViewChildren,\n inject,\n model,\n output,\n} from '@angular/core';\nimport { ModuleCard } from '../module-card';\nimport { ApplicativoEvent, ModuleChildRef, ModuleData, ModuleEvent, SubmoduleEvent } from '../module-card';\n\n@Component({\n selector: 'lib-module-card-list',\n imports: [ModuleCard],\n templateUrl: './module-card-list.html',\n styleUrl: './module-card-list.css',\n})\nexport class ModuleCardList {\n private cdr = inject(ChangeDetectorRef);\n\n @ViewChildren('cardEl') cardEls!: QueryList<ElementRef<HTMLElement>>;\n\n modules = model<ModuleData[]>([]);\n\n moduleEvent = output<ModuleEvent>();\n submoduleEvent = output<SubmoduleEvent>();\n applicativoEvent = output<ApplicativoEvent>();\n\n onModuleEvent(event: ModuleEvent, index: number) {\n if (event.type === 'moveUp' && index > 0) {\n this.animateSwap(index, index - 1);\n this.moduleEvent.emit({ ...event, data: index - 1 });\n return;\n }\n\n if (event.type === 'moveDown' && index < this.modules().length - 1) {\n this.animateSwap(index, index + 1);\n this.moduleEvent.emit({ ...event, data: index + 1 });\n return;\n }\n\n if (event.type === 'visibleChange') {\n const list = [...this.modules()];\n list[index] = { ...list[index], visible: event.data as boolean };\n this.modules.set(list);\n }\n\n this.moduleEvent.emit(event);\n }\n\n onChildOrderChange(moduleId: string | number, order: ModuleChildRef[]) {\n const list = [...this.modules()];\n const moduleIndex = list.findIndex(m => m.id === moduleId);\n if (moduleIndex === -1) return;\n\n list[moduleIndex] = { ...list[moduleIndex], childOrder: order };\n this.modules.set(list);\n }\n\n onSubmoduleEvent(event: SubmoduleEvent) {\n const list = [...this.modules()];\n const moduleIndex = list.findIndex(m => m.id === event.moduleId);\n if (moduleIndex === -1) {\n this.submoduleEvent.emit(event);\n return;\n }\n\n const submodules = [...list[moduleIndex].submodules];\n const subIndex = submodules.findIndex(s => s.id === event.submoduleId);\n if (subIndex === -1) {\n this.submoduleEvent.emit(event);\n return;\n }\n\n if (event.type === 'visibleChange') {\n submodules[subIndex] = { ...submodules[subIndex], visible: event.data as boolean };\n list[moduleIndex] = { ...list[moduleIndex], submodules };\n this.modules.set(list);\n }\n\n this.submoduleEvent.emit(event);\n }\n\n onApplicativoEvent(event: ApplicativoEvent) {\n const list = [...this.modules()];\n const moduleIndex = list.findIndex(m => m.id === event.moduleId);\n if (moduleIndex === -1) {\n this.applicativoEvent.emit(event);\n return;\n }\n\n const module = list[moduleIndex];\n\n if (event.submoduleId != null) {\n const submodules = [...module.submodules];\n const subIndex = submodules.findIndex(s => s.id === event.submoduleId);\n if (subIndex === -1) {\n this.applicativoEvent.emit(event);\n return;\n }\n\n const aplicativos = [...submodules[subIndex].aplicativos];\n const appIndex = aplicativos.findIndex(a => a.id === event.applicativoId);\n if (appIndex === -1) {\n this.applicativoEvent.emit(event);\n return;\n }\n\n if (event.type === 'moveUp' && appIndex > 0) {\n [aplicativos[appIndex], aplicativos[appIndex - 1]] = [aplicativos[appIndex - 1], aplicativos[appIndex]];\n submodules[subIndex] = { ...submodules[subIndex], aplicativos };\n list[moduleIndex] = { ...module, submodules };\n this.modules.set(list);\n this.applicativoEvent.emit({ ...event, data: appIndex - 1 });\n return;\n }\n\n if (event.type === 'moveDown' && appIndex < aplicativos.length - 1) {\n [aplicativos[appIndex], aplicativos[appIndex + 1]] = [aplicativos[appIndex + 1], aplicativos[appIndex]];\n submodules[subIndex] = { ...submodules[subIndex], aplicativos };\n list[moduleIndex] = { ...module, submodules };\n this.modules.set(list);\n this.applicativoEvent.emit({ ...event, data: appIndex + 1 });\n return;\n }\n\n if (event.type === 'visibleChange') {\n aplicativos[appIndex] = { ...aplicativos[appIndex], visible: event.data as boolean };\n submodules[subIndex] = { ...submodules[subIndex], aplicativos };\n list[moduleIndex] = { ...module, submodules };\n this.modules.set(list);\n }\n\n this.applicativoEvent.emit(event);\n return;\n }\n\n if (event.type === 'visibleChange') {\n const aplicativos = [...module.aplicativos];\n const appIndex = aplicativos.findIndex(a => a.id === event.applicativoId);\n if (appIndex !== -1) {\n aplicativos[appIndex] = { ...aplicativos[appIndex], visible: event.data as boolean };\n list[moduleIndex] = { ...module, aplicativos };\n this.modules.set(list);\n }\n }\n\n this.applicativoEvent.emit(event);\n }\n\n private animateSwap(from: number, to: number) {\n // FLIP – First: captura posición actual de cada nodo por identidad\n const positionMap = new Map<HTMLElement, number>();\n this.cardEls.forEach(el =>\n positionMap.set(el.nativeElement, el.nativeElement.getBoundingClientRect().top)\n );\n\n // Swap en el modelo y renderizado sincrónico\n const list = [...this.modules()];\n [list[from], list[to]] = [list[to], list[from]];\n this.modules.set(list);\n this.cdr.detectChanges();\n\n // FLIP – Last / Invert / Play\n this.cardEls.forEach(el => {\n const node = el.nativeElement;\n const beforeTop = positionMap.get(node);\n if (beforeTop === undefined) return;\n\n const delta = beforeTop - node.getBoundingClientRect().top;\n if (delta === 0) return;\n\n // Teleporta al origen (sin transición)\n node.style.transition = 'none';\n node.style.transform = `translateY(${delta}px)`;\n node.classList.add('mcl-item--moving');\n\n // Fuerza reflow para que el browser pinte el estado inicial\n void node.offsetHeight;\n\n // Anima al destino final\n node.style.transition = 'transform 280ms cubic-bezier(0.25, 0.8, 0.25, 1)';\n node.style.transform = '';\n\n node.addEventListener(\n 'transitionend',\n () => {\n node.style.transition = '';\n node.classList.remove('mcl-item--moving');\n },\n { once: true }\n );\n });\n }\n}\n","<div class=\"mcl-list\">\n @for (module of modules(); track module.id; let i = $index) {\n <div class=\"mcl-item\" #cardEl>\n <lib-module-card\n [moduleId]=\"module.id\"\n [moduleName]=\"module.name\"\n [moduleIcon]=\"module.icon ?? ''\"\n [visible]=\"module.visible\"\n [submodules]=\"module.submodules\"\n [aplicativos]=\"module.aplicativos\"\n [childOrder]=\"module.childOrder\"\n [isFirst]=\"i === 0\"\n [isLast]=\"i === modules().length - 1\"\n (moduleEvent)=\"onModuleEvent($event, i)\"\n (submoduleEvent)=\"onSubmoduleEvent($event)\"\n (applicativoEvent)=\"onApplicativoEvent($event)\"\n (childOrderChange)=\"onChildOrderChange(module.id, $event)\" />\n </div>\n }\n</div>\n","// 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\nexport * from './lib/components/card-history/card-history'\n\nexport * from './lib/components/signature/signature'\n\nexport * from './lib/components/document-item/document-item'\n\nexport * from './lib/components/rol-card/rol-card'\n\nexport * from './lib/components/icon-picker/icon-picker'\nexport * from './lib/components/color-picker/color-picker'\n\nexport * from './lib/components/module-card/module-card'\nexport * from './lib/components/module-card/module-card-list/module-card-list'","/**\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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"}
|