ngx-eiffage-material 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-eiffage-material.mjs","sources":["../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-tables.ts","../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-eiffage-texts.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.html","../../../projects/ngx-eiffage-material/src/lib/components/shared/file-utils.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.html","../../../projects/ngx-eiffage-material/src/lib/utils/string-operations.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.html","../../../projects/ngx-eiffage-material/src/lib/models/dialog-config.ts","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-cell-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/pipes/only-upper-first-character.pipe.ts","../../../projects/ngx-eiffage-material/src/lib/models/paginated-table-config.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter-utils.ts","../../../projects/ngx-eiffage-material/src/lib/models/user-id-factory.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter.ts","../../../projects/ngx-eiffage-material/src/lib/services/advanced-filter.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/column-config.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/datos-pantalla.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/ngx-dialog.service.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.html","../../../projects/ngx-eiffage-material/src/ngx-eiffage-material.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * @deprecated Usa `provideNgxEiffageTexts()`: solo hay que indicar los textos que cambian, se agrupan\r\n * por componente y se actualizan solos al cambiar de idioma (signals). Mientras tanto, una subclase de\r\n * NgxTablesIntl provista en la app se sigue respetando. Esta clase no recibirá textos nuevos y se\r\n * eliminará en una versión mayor.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTablesIntl {\r\n /**\r\n * Stream que emite cuando las etiquetas cambian.\r\n * Los componentes deben reaccionar a estos cambios.\r\n */\r\n readonly changes = new Subject<void>();\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-TABLE ===\r\n // ========================================\r\n\r\n // === Botones de acciones ===\r\n /** Etiqueta del botón de crear/nuevo */\r\n createButtonLabel: string = 'Nuevo';\r\n\r\n /** Tooltip del botón de editar */\r\n editTooltip: string = 'Editar';\r\n\r\n /** Tooltip del botón de eliminar */\r\n deleteTooltip: string = 'Eliminar';\r\n\r\n /** Etiqueta del botón de confirmar eliminación */\r\n confirmDeleteLabel: string = 'Eliminar';\r\n\r\n // === Búsqueda y filtros ===\r\n /** Placeholder del campo de búsqueda */\r\n searchPlaceholder: string = 'Buscar...';\r\n\r\n /** Tooltip del botón de limpiar búsqueda */\r\n clearSearchTooltip: string = 'Limpiar búsqueda';\r\n\r\n /** Tooltip del botón de editar columnas */\r\n editColumnsTooltip: string = 'Visualizar y ordenar columnas';\r\n\r\n /** Etiqueta para filtros avanzados */\r\n advancedFiltersLabel: string = 'Filtros avanzados';\r\n\r\n /** Etiqueta para nuevo filtro avanzado */\r\n newAdvancedFilterLabel: string = 'Nuevo filtro';\r\n\r\n /** Tooltip del botón de editar filtro avanzado - usa función getEditAdvancedFilterTooltip() */\r\n editAdvancedFilterTooltip: string = 'Editar filtro';\r\n\r\n /** Tooltip del botón de eliminar filtro avanzado - usa función getDeleteAdvancedFilterTooltip() */\r\n deleteAdvancedFilterTooltip: string = 'Eliminar filtro';\r\n\r\n /** Tooltip del botón de quitar filtro avanzado aplicado */\r\n removeAdvancedFilterTooltip: string = 'Quitar filtros avanzados';\r\n\r\n /** Texto cuando no hay filtros avanzados */\r\n noAdvancedFiltersLabel: string = 'No hay filtros guardados';\r\n\r\n /** Etiqueta para quitar filtro en select */\r\n removeFilterLabel: string = '-- Quitar filtro --';\r\n\r\n // === Selección de filas ===\r\n /** Tooltip del checkbox de seleccionar todas las filas */\r\n selectAllTooltip: string = 'Seleccionar todo';\r\n\r\n /** Tooltip del checkbox de deseleccionar todas las filas */\r\n deselectAllTooltip: string = 'Deseleccionar todo';\r\n\r\n /** Etiqueta del botón de deseleccionar todos */\r\n deselectAllLabel: string = 'Desmarcar todos los registros';\r\n\r\n /** Tooltip del menú de acciones de selección */\r\n selectionActionsTooltip: string = 'Operaciones sobre los registros seleccionados';\r\n\r\n // === Exportación ===\r\n /** Tooltip del botón de exportar */\r\n exportTooltip: string = 'Exportar datos';\r\n\r\n /** Etiqueta para exportar a Excel */\r\n exportToExcelLabel: string = 'Exportar a XLSX la página actual';\r\n\r\n /** Etiqueta para exportar a PDF */\r\n exportToPdfLabel: string = 'Exportar a PDF la página actual';\r\n\r\n // === Pantalla completa ===\r\n /** Tooltip para entrar en pantalla completa */\r\n enterFullscreenTooltip: string = 'Pantalla completa';\r\n\r\n /** Tooltip para salir de pantalla completa */\r\n exitFullscreenTooltip: string = 'Salir del modo de pantalla completa';\r\n\r\n // === Mensajes ===\r\n /** Mensaje cuando no hay datos */\r\n noDataMessage: string = 'No se han encontrado resultados...';\r\n\r\n /** Mensaje mientras se cargan los datos */\r\n loadingMessage: string = 'Cargando...';\r\n\r\n /** Título del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmTitle: string = 'Eliminar';\r\n\r\n /** Cuerpo del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmBody: string = 'Vas a eliminar el registro seleccionado. ¿Estas seguro?';\r\n\r\n /** Título del diálogo de eliminación de filtro avanzado */\r\n deleteAdvancedFilterTitle: string = 'Eliminar plantilla de filtro avanzado';\r\n\r\n // === Columnas ===\r\n /** Etiqueta para la columna de acciones */\r\n actionsLabel: string = 'Acciones';\r\n\r\n // === Filtros de columna ===\r\n /** Placeholder para filtros de fecha */\r\n datePlaceholder: string = 'Fecha';\r\n\r\n /** Placeholder para filtro de rango de fechas - inicio */\r\n dateRangeStartPlaceholder: string = 'Desde';\r\n\r\n /** Placeholder para filtro de rango de fechas - fin */\r\n dateRangeEndPlaceholder: string = 'Hasta';\r\n\r\n // === Filas expandibles ===\r\n /** Tooltip para expandir detalles */\r\n expandDetailsTooltip: string = 'Ver detalles';\r\n\r\n /** Tooltip para contraer detalles */\r\n collapseDetailsTooltip: string = 'Ocultar detalles';\r\n\r\n // === Totales en pie de tabla ===\r\n /** Etiqueta para total por página */\r\n totalPerPageLabel: string = 'Total parcial (por página)';\r\n\r\n /** Etiqueta para total general */\r\n totalGeneralLabel: string = 'Total (todos los registros)';\r\n\r\n // === Diálogos ===\r\n /** Botón de cancelar en diálogos */\r\n cancelButtonLabel: string = 'Cancelar';\r\n\r\n /** Botón de confirmar en diálogos */\r\n confirmButtonLabel: string = 'Confirmar';\r\n\r\n /** Botón de cerrar en diálogos */\r\n closeButtonLabel: string = 'Cerrar';\r\n\r\n /** Botón de guardar en diálogos */\r\n saveButtonLabel: string = 'Guardar';\r\n\r\n /** Botón de guardar y aplicar en diálogos */\r\n saveAndApplyButtonLabel: string = 'Guardar y aplicar';\r\n\r\n // === Diálogo de configurar columnas ===\r\n /** Título del diálogo de configurar columnas */\r\n configureColumnsTitle: string = 'Ordenar y visualizar columnas de la tabla';\r\n\r\n /** Tooltip para anclar columna */\r\n pinColumnTooltip: string = 'Anclar columna';\r\n\r\n /** Tooltip para desanclar columna */\r\n unpinColumnTooltip: string = 'Desanclar';\r\n\r\n /** Tooltip para subir columna */\r\n moveUpTooltip: string = 'Subir';\r\n\r\n /** Tooltip para bajar columna */\r\n moveDownTooltip: string = 'Bajar';\r\n\r\n /** Texto para columnas con filtros aplicados */\r\n hasFiltersAppliedText: string = '(hay filtros aplicados)';\r\n\r\n /** Nota sobre ocultar columnas con filtros */\r\n hideColumnWithFiltersNote: string = 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados';\r\n\r\n /** Etiqueta de nota */\r\n noteLabel: string = 'Nota:';\r\n\r\n /** Botón de restablecer configuración de columnas */\r\n resetColumnsButtonLabel: string = 'Reestablecer orden y visualización';\r\n\r\n // === Diálogo de filtros avanzados ===\r\n /** Título del diálogo de filtros avanzados */\r\n advancedFiltersDialogTitle: string = 'Filtros avanzados para la tabla';\r\n\r\n /** Label del campo de nombre de plantilla */\r\n templateNameLabel: string = 'Nombre de la plantilla';\r\n\r\n /** Error de nombre obligatorio */\r\n templateNameRequiredError: string = 'El nombre es obligatorio';\r\n\r\n /** Título de ayuda de filtros avanzados */\r\n advancedFiltersHelpTitle: string = 'Uso de filtros avanzados';\r\n\r\n /** Texto de ayuda sobre grupos */\r\n advancedFiltersGroupHelp: string = 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos';\r\n\r\n /** Texto de ayuda sobre filtros */\r\n advancedFiltersRuleHelp: string = 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)';\r\n\r\n /** Label de grupo en ayuda */\r\n groupLabel: string = 'Grupo:';\r\n\r\n /** Label de filtro en ayuda */\r\n filterLabel: string = 'Filtro:';\r\n\r\n /** Botón añadir filtro */\r\n addFilterButtonLabel: string = 'Añadir filtro';\r\n\r\n /** Botón añadir grupo */\r\n addGroupButtonLabel: string = 'Añadir grupo';\r\n\r\n /** Tooltip eliminar grupo */\r\n deleteGroupTooltip: string = 'Eliminar grupo';\r\n\r\n /** Tooltip eliminar filtro */\r\n deleteFilterTooltip: string = 'Eliminar filtro';\r\n\r\n // === Reglas de filtros avanzados ===\r\n /** Label de campo */\r\n fieldLabel: string = 'Campo';\r\n\r\n /** Label de condición */\r\n conditionLabel: string = 'Condición';\r\n\r\n /** Label de valor */\r\n valueLabel: string = 'Valor';\r\n\r\n /** Placeholder de seleccionar opción */\r\n selectOptionPlaceholder: string = 'Selecciona una opción';\r\n\r\n /** Opción para quitar campo */\r\n removeFieldOption: string = '-- Quitar campo --';\r\n\r\n /** Opción para quitar condición */\r\n removeConditionOption: string = '-- Quitar condición --';\r\n\r\n /** Opción para quitar valor */\r\n removeValueOption: string = '-- Quitar valor --';\r\n\r\n /** Error de campo obligatorio */\r\n requiredFieldError: string = 'Obligatorio';\r\n\r\n // === Conectores y operadores de filtros ===\r\n /** Conector AND */\r\n connectorAnd: string = 'Y';\r\n\r\n /** Conector OR */\r\n connectorOr: string = 'O';\r\n\r\n /** Operador igual a */\r\n operatorEquals: string = 'Igual a';\r\n\r\n /** Operador distinto de */\r\n operatorNotEquals: string = 'Distinto de';\r\n\r\n /** Operador mayor que */\r\n operatorGreaterThan: string = 'Mayor que';\r\n\r\n /** Operador mayor o igual que */\r\n operatorGreaterOrEquals: string = 'Mayor o igual que';\r\n\r\n /** Operador menor que */\r\n operatorLessThan: string = 'Menor que';\r\n\r\n /** Operador menor o igual que */\r\n operatorLessOrEquals: string = 'Menor o igual que';\r\n\r\n /** Operador contiene */\r\n operatorLike: string = 'Contiene';\r\n\r\n // ========================================\r\n // === NGX-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Mensaje cuando no hay resultados en select */\r\n noResultsMessage: string = 'No se han encontrado resultados...';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Etiqueta del botón de ver más resultados */\r\n showMoreLabel: string = 'Ver más';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SELECT ===\r\n // ========================================\r\n\r\n /** Botón de confirmar selección (modo múltiple) */\r\n paginatedSelectConfirmLabel: string = 'Confirmar';\r\n\r\n /** Botón de limpiar selección (modo múltiple) */\r\n paginatedSelectResetLabel: string = 'Limpiar';\r\n\r\n /** Etiqueta del toggle \"Seleccionar todo\" */\r\n paginatedSelectSelectAllLabel: string = 'Seleccionar todo';\r\n\r\n /** Fila \"cargando más…\" al paginar por scroll */\r\n paginatedSelectLoadingMoreLabel: string = 'Cargando más…';\r\n\r\n /** Fila de fin de lista cuando ya no quedan más resultados */\r\n paginatedSelectEndOfListLabel: string = 'No hay más resultados';\r\n\r\n /** Ayuda bajo el mensaje de \"sin resultados\" cuando hay búsqueda activa */\r\n paginatedSelectNoResultsHint: string = 'Prueba con otro término de búsqueda';\r\n\r\n /** Botón para limpiar la búsqueda desde el estado vacío */\r\n paginatedSelectClearSearchLabel: string = 'Limpiar búsqueda';\r\n\r\n /** Título del estado de error al fallar la carga */\r\n paginatedSelectErrorTitle: string = 'No se pudieron cargar los datos';\r\n\r\n /** Ayuda del estado de error */\r\n paginatedSelectErrorHint: string = 'Revisa tu conexión e inténtalo de nuevo';\r\n\r\n /** Botón de reintentar la carga */\r\n paginatedSelectRetryLabel: string = 'Reintentar';\r\n\r\n // ========================================\r\n // === FUNCIONES AUXILIARES ===\r\n // ========================================\r\n\r\n /**\r\n * Función para obtener el mensaje de confirmación de eliminación\r\n * @param itemName Nombre del elemento a eliminar (opcional)\r\n */\r\n getDeleteConfirmMessage(itemName?: string): string {\r\n if (itemName) {\r\n return `Vas a eliminar '${itemName}'. ¿Estas seguro?`;\r\n }\r\n return this.deleteConfirmBody;\r\n }\r\n\r\n /**\r\n * Función para obtener el mensaje de eliminación de filtro avanzado\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterMessage(filterName: string): string {\r\n return `Vas a eliminar la plantilla de filtro avanzado '${filterName}'. ¿Estas seguro?`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de editar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getEditAdvancedFilterTooltip(filterName: string): string {\r\n return `Editar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de eliminar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterTooltip(filterName: string): string {\r\n return `Eliminar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el label de elementos seleccionados\r\n * @param count Número de elementos seleccionados\r\n */\r\n getSelectedItemsLabel(count: number): string {\r\n return count === 1\r\n ? `${count} elemento seleccionado`\r\n : `${count} elementos seleccionados`;\r\n }\r\n\r\n /**\r\n * Función para obtener el texto de quitar selección en selects\r\n * @param optionName Nombre de la opción (opcional)\r\n */\r\n getRemoveOptionText(optionName: string): string {\r\n return `-- Quitar ${optionName} --`;\r\n }\r\n\r\n /**\r\n * Mensaje anunciado por lectores de pantalla (aria-live) con el número de\r\n * resultados tras filtrar en un select buscable.\r\n * @param count Número de resultados visibles\r\n */\r\n getSearchResultsCountMessage(count: number): string {\r\n return count === 1 ? '1 resultado' : `${count} resultados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo múltiple: elementos seleccionados\r\n * sobre el total disponible.\r\n */\r\n getPaginatedSelectSelectedCountLabel(selected: number, total: number): string {\r\n return `${selected} de ${total} seleccionados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo simple: número total de resultados.\r\n */\r\n getPaginatedSelectResultsCountLabel(total: number): string {\r\n return total === 1 ? '1 resultado' : `${total} resultados`;\r\n }\r\n}\r\n","import {\n computed,\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n isSignal,\n makeEnvironmentProviders,\n Signal,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NgxTablesIntl } from './ngx-tables';\n\n/**\n * Todos los textos de la librería, agrupados por componente.\n * Los que dependen de un dato (nombre, número…) son funciones.\n */\nexport interface NgxEiffageTexts {\n /** Textos compartidos por varios componentes. */\n common: {\n search: string;\n clearSearch: string;\n noData: string;\n loading: string;\n cancel: string;\n confirm: string;\n close: string;\n save: string;\n saveAndApply: string;\n };\n /** ngx-basic-table y ngx-paginated-table. */\n table: {\n create: string;\n edit: string;\n delete: string;\n confirmDelete: string;\n deleteConfirmTitle: string;\n deleteConfirmBody: string;\n editColumns: string;\n deselectAll: string;\n selectionActions: string;\n export: string;\n exportExcel: string;\n exportPdf: string;\n enterFullscreen: string;\n exitFullscreen: string;\n actions: string;\n dateRangeStart: string;\n dateRangeEnd: string;\n totalPerPage: string;\n totalGeneral: string;\n };\n /** Diálogo de ordenar y mostrar columnas de las tablas. */\n columnsDialog: {\n title: string;\n pin: string;\n unpin: string;\n moveUp: string;\n moveDown: string;\n hasFiltersApplied: string;\n hideColumnWithFiltersNote: string;\n note: string;\n reset: string;\n };\n /** Filtros avanzados de ngx-paginated-table. */\n advancedFilters: {\n label: string;\n new: string;\n remove: string;\n editTooltip: (filterName: string) => string;\n deleteTooltip: (filterName: string) => string;\n deleteTitle: string;\n deleteMessage: (filterName: string) => string;\n dialogTitle: string;\n templateName: string;\n templateNameRequired: string;\n helpTitle: string;\n groupHelp: string;\n ruleHelp: string;\n group: string;\n filter: string;\n addFilter: string;\n addGroup: string;\n deleteGroup: string;\n deleteFilter: string;\n field: string;\n condition: string;\n value: string;\n selectOption: string;\n required: string;\n and: string;\n or: string;\n operators: {\n equals: string;\n notEquals: string;\n greaterThan: string;\n greaterOrEquals: string;\n lessThan: string;\n lessOrEquals: string;\n like: string;\n };\n };\n /** ngx-basic-select, ngx-searchable-select y ngx-paginated-searchable-select. */\n select: {\n noResults: string;\n showMore: string;\n removeOption: (optionName: string) => string;\n resultsCount: (count: number) => string;\n };\n /** ngx-paginated-select. */\n paginatedSelect: {\n confirm: string;\n reset: string;\n selectAll: string;\n loadingMore: string;\n endOfList: string;\n noResultsHint: string;\n clearSearch: string;\n errorTitle: string;\n errorHint: string;\n retry: string;\n selectedCount: (selected: number, total: number) => string;\n resultsCount: (total: number) => string;\n };\n /** NgxDialogService y ngx-dialog (botones por defecto). */\n dialog: {\n cancel: string;\n /** Botón de confirmar de NgxDialogService.confirm(). */\n confirm: string;\n /** Botón de aceptar de NgxDialogService.info() y de ngx-dialog. */\n accept: string;\n /** Etiqueta accesible y tooltip del botón X de cerrar. */\n close: string;\n };\n /** ngx-file-input. */\n fileInput: {\n dropLabel: string;\n browse: string;\n remove: (fileName: string) => string;\n removed: (fileName: string) => string;\n added: (count: number) => string;\n maxFiles: (max: number) => string;\n typeNotAllowed: (type: string) => string;\n tooLarge: (maxSize: string) => string;\n };\n /** ngx-input-file. */\n inputFile: {\n label: string;\n /** Texto del campo vacío. */\n placeholder: string;\n /** Pista mientras se arrastran ficheros encima. */\n dropping: string;\n /** Etiqueta accesible y tooltip del botón de examinar. */\n browse: string;\n remove: (fileName: string) => string;\n /** Fichero descartado por no cumplir `accept`. */\n rejectedType: (fileName: string) => string;\n /** Fichero descartado por superar `maxSize` (ya formateado: «2 MB»). */\n rejectedSize: (fileName: string, maxSize: string) => string;\n /** Ficheros descartados por superar `maxFiles`. */\n rejectedCount: (max: number) => string;\n };\n skeleton: {\n loading: string;\n };\n alert: {\n dismiss: string;\n };\n loadingButton: {\n busy: string;\n };\n}\n\n/** Igual que T pero con todo opcional, a cualquier profundidad (las funciones se quedan como están). */\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends (...args: never[]) => unknown ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\n/** Textos que la app quiere cambiar: solo los que difieren de los valores por defecto. */\nexport type NgxEiffageTextsOverrides = DeepPartial<NgxEiffageTexts>;\n\nconst plural = (count: number, one: string, many: string) => (count === 1 ? one : many);\n\n/** Valores por defecto (castellano). */\nexport const NGX_EIFFAGE_DEFAULT_TEXTS: NgxEiffageTexts = {\n common: {\n search: 'Buscar...',\n clearSearch: 'Limpiar búsqueda',\n noData: 'No se han encontrado resultados...',\n loading: 'Cargando...',\n cancel: 'Cancelar',\n confirm: 'Confirmar',\n close: 'Cerrar',\n save: 'Guardar',\n saveAndApply: 'Guardar y aplicar',\n },\n table: {\n create: 'Nuevo',\n edit: 'Editar',\n delete: 'Eliminar',\n confirmDelete: 'Eliminar',\n deleteConfirmTitle: 'Eliminar',\n deleteConfirmBody: 'Vas a eliminar el registro seleccionado. ¿Estas seguro?',\n editColumns: 'Visualizar y ordenar columnas',\n deselectAll: 'Desmarcar todos los registros',\n selectionActions: 'Operaciones sobre los registros seleccionados',\n export: 'Exportar datos',\n exportExcel: 'Exportar a XLSX la página actual',\n exportPdf: 'Exportar a PDF la página actual',\n enterFullscreen: 'Pantalla completa',\n exitFullscreen: 'Salir del modo de pantalla completa',\n actions: 'Acciones',\n dateRangeStart: 'Desde',\n dateRangeEnd: 'Hasta',\n totalPerPage: 'Total parcial (por página)',\n totalGeneral: 'Total (todos los registros)',\n },\n columnsDialog: {\n title: 'Ordenar y visualizar columnas de la tabla',\n pin: 'Anclar columna',\n unpin: 'Desanclar',\n moveUp: 'Subir',\n moveDown: 'Bajar',\n hasFiltersApplied: '(hay filtros aplicados)',\n hideColumnWithFiltersNote: 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados',\n note: 'Nota:',\n reset: 'Reestablecer orden y visualización',\n },\n advancedFilters: {\n label: 'Filtros avanzados',\n new: 'Nuevo filtro',\n remove: 'Quitar filtros avanzados',\n editTooltip: name => `Editar '${name}'`,\n deleteTooltip: name => `Eliminar '${name}'`,\n deleteTitle: 'Eliminar plantilla de filtro avanzado',\n deleteMessage: name => `Vas a eliminar la plantilla de filtro avanzado '${name}'. ¿Estas seguro?`,\n dialogTitle: 'Filtros avanzados para la tabla',\n templateName: 'Nombre de la plantilla',\n templateNameRequired: 'El nombre es obligatorio',\n helpTitle: 'Uso de filtros avanzados',\n groupHelp: 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos',\n ruleHelp: 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)',\n group: 'Grupo:',\n filter: 'Filtro:',\n addFilter: 'Añadir filtro',\n addGroup: 'Añadir grupo',\n deleteGroup: 'Eliminar grupo',\n deleteFilter: 'Eliminar filtro',\n field: 'Campo',\n condition: 'Condición',\n value: 'Valor',\n selectOption: 'Selecciona una opción',\n required: 'Obligatorio',\n and: 'Y',\n or: 'O',\n operators: {\n equals: 'Igual a',\n notEquals: 'Distinto de',\n greaterThan: 'Mayor que',\n greaterOrEquals: 'Mayor o igual que',\n lessThan: 'Menor que',\n lessOrEquals: 'Menor o igual que',\n like: 'Contiene',\n },\n },\n select: {\n noResults: 'No se han encontrado resultados...',\n showMore: 'Ver más',\n removeOption: name => `-- Quitar ${name} --`,\n resultsCount: count => plural(count, '1 resultado', `${count} resultados`),\n },\n paginatedSelect: {\n confirm: 'Confirmar',\n reset: 'Limpiar',\n selectAll: 'Seleccionar todo',\n loadingMore: 'Cargando más…',\n endOfList: 'No hay más resultados',\n noResultsHint: 'Prueba con otro término de búsqueda',\n clearSearch: 'Limpiar búsqueda',\n errorTitle: 'No se pudieron cargar los datos',\n errorHint: 'Revisa tu conexión e inténtalo de nuevo',\n retry: 'Reintentar',\n selectedCount: (selected, total) => `${selected} de ${total} seleccionados`,\n resultsCount: total => plural(total, '1 resultado', `${total} resultados`),\n },\n dialog: {\n cancel: 'Cancelar',\n confirm: 'Confirmar',\n accept: 'Aceptar',\n close: 'Cerrar',\n },\n fileInput: {\n dropLabel: 'Arrastra archivos aquí',\n browse: 'o haz clic para seleccionar',\n remove: name => `Eliminar ${name}`,\n removed: name => `Archivo ${name} eliminado`,\n added: count => plural(count, '1 archivo añadido', `${count} archivos añadidos`),\n maxFiles: max => plural(max, 'Solo se permite 1 archivo', `Máximo ${max} archivos permitidos`),\n typeNotAllowed: type => `Tipo no permitido: ${type}`,\n tooLarge: maxSize => `Excede el tamaño máximo (${maxSize})`,\n },\n inputFile: {\n label: 'Seleccionar archivo',\n placeholder: 'Haz clic o arrastra aquí',\n dropping: 'Suelta los archivos para añadirlos',\n browse: 'Examinar',\n remove: name => `Eliminar ${name}`,\n rejectedType: name => `«${name}»: tipo de archivo no permitido`,\n rejectedSize: (name, maxSize) => `«${name}» supera el tamaño máximo (${maxSize})`,\n rejectedCount: max => plural(max, 'Solo se permite 1 archivo', `Solo se permiten ${max} archivos`),\n },\n skeleton: {\n loading: 'Cargando…',\n },\n alert: {\n dismiss: 'Cerrar aviso',\n },\n loadingButton: {\n busy: 'Cargando…',\n },\n};\n\n/** Lo que acepta provideNgxEiffageTexts: un objeto fijo o un signal (para cambiar de idioma en caliente). */\nexport type NgxEiffageTextsSource = NgxEiffageTextsOverrides | Signal<NgxEiffageTextsOverrides>;\n\n/** Textos que la app consumidora sustituye. Se provee con provideNgxEiffageTexts(). */\nexport const NGX_EIFFAGE_TEXTS = new InjectionToken<Signal<NgxEiffageTextsOverrides>>('NGX_EIFFAGE_TEXTS');\n\n/**\n * Cambia los textos de la librería. Solo hay que indicar los que difieren de los valores por defecto.\n *\n * ```ts\n * // Textos fijos\n * provideNgxEiffageTexts({ alert: { dismiss: 'Dismiss' } })\n *\n * // Según el idioma de la app: una función (se ejecuta en contexto de inyección) que devuelve un signal\n * provideNgxEiffageTexts(() => {\n * const language = inject(LanguageService);\n * return computed(() => language.current() === 'en' ? EN_TEXTS : {});\n * })\n * ```\n */\nexport function provideNgxEiffageTexts(\n texts: NgxEiffageTextsSource | (() => NgxEiffageTextsSource),\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_EIFFAGE_TEXTS,\n useFactory: (): Signal<NgxEiffageTextsOverrides> => {\n const source = typeof texts === 'function' && !isSignal(texts) ? texts() : texts;\n return isSignal(source) ? source : signal(source);\n },\n },\n ]);\n}\n\n/** Textos efectivos de la librería: valores por defecto + NgxTablesIntl (obsoleto) + provideNgxEiffageTexts. */\n@Injectable({ providedIn: 'root' })\nexport class NgxTexts {\n private readonly _overrides = inject(NGX_EIFFAGE_TEXTS, { optional: true });\n private readonly _legacyIntl = inject(NgxTablesIntl);\n private readonly _legacyChanges = toSignal(this._legacyIntl.changes);\n\n /** Todos los textos ya combinados. En plantilla: `texts().alert.dismiss`. */\n readonly texts: Signal<NgxEiffageTexts> = computed(() => {\n this._legacyChanges();\n const legacy = isCustomizedLegacyIntl(this._legacyIntl) ? textsFromLegacyIntl(this._legacyIntl) : {};\n return deepMerge(deepMerge(NGX_EIFFAGE_DEFAULT_TEXTS, legacy), this._overrides?.() ?? {});\n });\n}\n\n// ── Compatibilidad con NgxTablesIntl ────────────────────────────────────────\n\n/** Solo se leen los valores de NgxTablesIntl si el consumidor la ha sustituido (subclase o useValue). */\nfunction isCustomizedLegacyIntl(intl: NgxTablesIntl): boolean {\n return Object.getPrototypeOf(intl) !== NgxTablesIntl.prototype;\n}\n\n/** Traduce una NgxTablesIntl personalizada al formato nuevo. */\nfunction textsFromLegacyIntl(intl: NgxTablesIntl): NgxEiffageTextsOverrides {\n return {\n common: {\n search: intl.searchPlaceholder,\n clearSearch: intl.clearSearchTooltip,\n noData: intl.noDataMessage,\n loading: intl.loadingMessage,\n cancel: intl.cancelButtonLabel,\n confirm: intl.confirmButtonLabel,\n close: intl.closeButtonLabel,\n save: intl.saveButtonLabel,\n saveAndApply: intl.saveAndApplyButtonLabel,\n },\n table: {\n create: intl.createButtonLabel,\n edit: intl.editTooltip,\n delete: intl.deleteTooltip,\n confirmDelete: intl.confirmDeleteLabel,\n deleteConfirmTitle: intl.deleteConfirmTitle,\n deleteConfirmBody: intl.deleteConfirmBody,\n editColumns: intl.editColumnsTooltip,\n deselectAll: intl.deselectAllLabel,\n selectionActions: intl.selectionActionsTooltip,\n export: intl.exportTooltip,\n exportExcel: intl.exportToExcelLabel,\n exportPdf: intl.exportToPdfLabel,\n enterFullscreen: intl.enterFullscreenTooltip,\n exitFullscreen: intl.exitFullscreenTooltip,\n actions: intl.actionsLabel,\n dateRangeStart: intl.dateRangeStartPlaceholder,\n dateRangeEnd: intl.dateRangeEndPlaceholder,\n totalPerPage: intl.totalPerPageLabel,\n totalGeneral: intl.totalGeneralLabel,\n },\n columnsDialog: {\n title: intl.configureColumnsTitle,\n pin: intl.pinColumnTooltip,\n unpin: intl.unpinColumnTooltip,\n moveUp: intl.moveUpTooltip,\n moveDown: intl.moveDownTooltip,\n hasFiltersApplied: intl.hasFiltersAppliedText,\n hideColumnWithFiltersNote: intl.hideColumnWithFiltersNote,\n note: intl.noteLabel,\n reset: intl.resetColumnsButtonLabel,\n },\n advancedFilters: {\n label: intl.advancedFiltersLabel,\n new: intl.newAdvancedFilterLabel,\n remove: intl.removeAdvancedFilterTooltip,\n editTooltip: name => intl.getEditAdvancedFilterTooltip(name),\n deleteTooltip: name => intl.getDeleteAdvancedFilterTooltip(name),\n deleteTitle: intl.deleteAdvancedFilterTitle,\n deleteMessage: name => intl.getDeleteAdvancedFilterMessage(name),\n dialogTitle: intl.advancedFiltersDialogTitle,\n templateName: intl.templateNameLabel,\n templateNameRequired: intl.templateNameRequiredError,\n helpTitle: intl.advancedFiltersHelpTitle,\n groupHelp: intl.advancedFiltersGroupHelp,\n ruleHelp: intl.advancedFiltersRuleHelp,\n group: intl.groupLabel,\n filter: intl.filterLabel,\n addFilter: intl.addFilterButtonLabel,\n addGroup: intl.addGroupButtonLabel,\n deleteGroup: intl.deleteGroupTooltip,\n deleteFilter: intl.deleteFilterTooltip,\n field: intl.fieldLabel,\n condition: intl.conditionLabel,\n value: intl.valueLabel,\n selectOption: intl.selectOptionPlaceholder,\n required: intl.requiredFieldError,\n and: intl.connectorAnd,\n or: intl.connectorOr,\n operators: {\n equals: intl.operatorEquals,\n notEquals: intl.operatorNotEquals,\n greaterThan: intl.operatorGreaterThan,\n greaterOrEquals: intl.operatorGreaterOrEquals,\n lessThan: intl.operatorLessThan,\n lessOrEquals: intl.operatorLessOrEquals,\n like: intl.operatorLike,\n },\n },\n select: {\n noResults: intl.noResultsMessage,\n showMore: intl.showMoreLabel,\n removeOption: name => intl.getRemoveOptionText(name),\n resultsCount: count => intl.getSearchResultsCountMessage(count),\n },\n paginatedSelect: {\n confirm: intl.paginatedSelectConfirmLabel,\n reset: intl.paginatedSelectResetLabel,\n selectAll: intl.paginatedSelectSelectAllLabel,\n loadingMore: intl.paginatedSelectLoadingMoreLabel,\n endOfList: intl.paginatedSelectEndOfListLabel,\n noResultsHint: intl.paginatedSelectNoResultsHint,\n clearSearch: intl.paginatedSelectClearSearchLabel,\n errorTitle: intl.paginatedSelectErrorTitle,\n errorHint: intl.paginatedSelectErrorHint,\n retry: intl.paginatedSelectRetryLabel,\n selectedCount: (selected, total) => intl.getPaginatedSelectSelectedCountLabel(selected, total),\n resultsCount: total => intl.getPaginatedSelectResultsCountLabel(total),\n },\n };\n}\n\n// ── Utilidades ──────────────────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !isSignal(value);\n}\n\n/** Copia profunda de `base` con los valores de `overrides` encima; ignora los undefined. */\nfunction deepMerge<T>(base: T, overrides: DeepPartial<T>): T {\n const result: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [key, value] of Object.entries(overrides as Record<string, unknown>)) {\n if (value === undefined) continue;\n const current = result[key];\n result[key] = isPlainObject(current) && isPlainObject(value)\n ? deepMerge(current, value as DeepPartial<typeof current>)\n : value;\n }\n return result as T;\n}\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { LoadingButtonAppearance, LoadingButtonColor } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Botón de Material que muestra un spinner mientras dura una acción y no deja volver a pulsarlo.\r\n *\r\n * El clic se escucha en el propio selector: `<ngx-loading-button (click)=\"save()\" />`.\r\n * Mientras `isLoading` es true el clic no llega (ni el submit del formulario, ni con Enter).\r\n */\r\n@Component({\r\n selector: 'ngx-loading-button',\r\n imports: [MatButtonModule, MatProgressSpinnerModule],\r\n templateUrl: './ngx-loading-button.component.html',\r\n styleUrl: './ngx-loading-button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.ngx-loading-button--secondary]': 'color() === \"secondary\"',\r\n '[class.ngx-loading-button--tertiary]': 'color() === \"tertiary\"',\r\n '[class.ngx-loading-button--error]': 'color() === \"error\"',\r\n '[class.ngx-loading-button--loading]': 'isLoading() && !disabled()',\r\n },\r\n})\r\nexport class NgxLoadingButton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Muestra el spinner y bloquea el botón. */\r\n readonly isLoading = input(false, { transform: booleanAttribute });\r\n\r\n /** Texto del botón. Para iconos o contenido con formato, proyéctalo en su lugar. */\r\n readonly label = input<string>();\r\n\r\n /**\r\n * Texto que sustituye al contenido mientras carga, con un spinner pequeño delante\r\n * (p. ej. «Guardando…»). Sin él, el spinner se superpone y el botón mantiene su ancho.\r\n */\r\n readonly loadingText = input<string>();\r\n\r\n /** Apariencia de Material: text, filled, elevated, outlined o tonal. */\r\n readonly matButton = input<LoadingButtonAppearance>('filled');\r\n\r\n /** Tipo nativo del botón. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n\r\n /** Deshabilita el botón (independiente de isLoading). */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n /** Color. Sin valor, el primary del tema. */\r\n readonly color = input<LoadingButtonColor>();\r\n\r\n /** Diámetro en px del spinner superpuesto. */\r\n readonly spinnerDiameter = input(24, { transform: numberAttribute });\r\n\r\n /** Grosor en px del trazo del spinner. */\r\n readonly spinnerStrokeWidth = input(3, { transform: numberAttribute });\r\n\r\n /** Lo que anuncia el lector de pantalla mientras carga. Por defecto, el texto `loadingButton.busy` de la librería. */\r\n readonly busyLabel = input<string>();\r\n\r\n /** El spinner va encima del contenido (que se oculta sin cambiar el ancho). */\r\n protected readonly overlaySpinner = computed(() => this.isLoading() && !this.loadingText());\r\n\r\n /** El spinner va en línea, delante de loadingText. */\r\n protected readonly inlineSpinner = computed(() => this.isLoading() && !!this.loadingText());\r\n\r\n protected readonly resolvedBusyLabel = computed(() => {\r\n return this.busyLabel() ?? this._texts().loadingButton.busy;\r\n });\r\n\r\n /**\r\n * Mientras carga, anula el clic en el propio botón: preventDefault evita el submit del formulario\r\n * (también el implícito al pulsar Enter en un campo) y stopImmediatePropagation evita que llegue\r\n * al (click) que el consumidor escucha en <ngx-loading-button>.\r\n */\r\n protected blockWhileLoading(event: Event): void {\r\n if (!this.isLoading()) return;\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n}\r\n","<!--\r\n Mientras carga: disabledInteractive mantiene el foco en el botón (el lector de pantalla sigue en él\r\n y oye aria-busy). Material NO bloquea el clic de un <button> en ese estado: lo hace blockWhileLoading.\r\n Con disabled, el botón se deshabilita del todo y el navegador ya no emite clics.\r\n-->\r\n<button\r\n class=\"loadingButton\"\r\n [matButton]=\"matButton()\"\r\n [type]=\"type()\"\r\n [disabled]=\"disabled() || isLoading()\"\r\n [disabledInteractive]=\"isLoading() && !disabled()\"\r\n [attr.aria-busy]=\"isLoading() || null\"\r\n (click)=\"blockWhileLoading($event)\"\r\n>\r\n <span class=\"loadingButton__content\" [class.loadingButton__content--hidden]=\"overlaySpinner()\" [class.loadingButton__content--gone]=\"inlineSpinner()\">\r\n {{ label() }}\r\n <ng-content />\r\n </span>\r\n\r\n @if (inlineSpinner()) {\r\n <span class=\"loadingButton__content\">\r\n <mat-spinner class=\"loadingButton__inlineSpinner\" diameter=\"18\" strokeWidth=\"2.5\" aria-hidden=\"true\" />\r\n {{ loadingText() }}\r\n </span>\r\n }\r\n\r\n @if (overlaySpinner()) {\r\n <mat-spinner\r\n class=\"loadingButton__overlaySpinner\"\r\n [diameter]=\"spinnerDiameter()\"\r\n [strokeWidth]=\"spinnerStrokeWidth()\"\r\n [attr.aria-label]=\"resolvedBusyLabel()\"\r\n />\r\n }\r\n</button>\r\n","// Utilidades internas de ngx-input-file y ngx-file-input (no se exportan en el barril).\n\n/** Normaliza `accept` (array o cadena separada por comas) a patrones en minúsculas. `*` o vacío = sin filtro. */\nexport function parseAccept(accept: string | readonly string[] | null | undefined): string[] {\n const parts = Array.isArray(accept) ? accept : String(accept ?? '').split(',');\n return parts.map(part => part.trim().toLowerCase()).filter(part => part && part !== '*' && part !== '*/*');\n}\n\n/** ¿Cumple el fichero alguno de los patrones? Admite extensiones (`.pdf`), MIME (`application/pdf`) y comodines (`image/*`). */\nexport function matchesAccept(file: File, patterns: readonly string[]): boolean {\n if (!patterns.length) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n\n return patterns.some(pattern => {\n if (pattern.startsWith('.')) return name.endsWith(pattern);\n if (pattern.endsWith('/*')) return type.startsWith(pattern.slice(0, -1));\n return type === pattern;\n });\n}\n\n/** Mismo fichero = mismo nombre, tamaño y fecha de modificación (el navegador da objetos File distintos en cada selección). */\nexport function isSameFile(a: File, b: File): boolean {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\n}\n\nconst UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/** Tamaño legible con el formato numérico del idioma: 845 B, 12 KB, 1,4 MB. */\nexport function formatFileSize(bytes: number, locale: string): string {\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit++;\n }\n const digits = unit === 0 || value >= 10 ? 0 : 1;\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: digits }).format(value)} ${UNITS[unit]}`;\n}\n\n/** Icono de Material Symbols según el tipo; si el navegador no da MIME (pasa con .docx, .dwg…), según la extensión. */\nexport function fileIcon(file: File): string {\n const type = file.type.toLowerCase();\n const extension = file.name.toLowerCase().split('.').pop() ?? '';\n\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || extension === 'pdf') return 'picture_as_pdf';\n if (type.startsWith('video/')) return 'videocam';\n if (type.startsWith('audio/')) return 'audio_file';\n if (/spreadsheet|excel|csv/.test(type) || ['xls', 'xlsx', 'csv', 'ods'].includes(extension)) return 'table_chart';\n if (/word|document|text\\//.test(type) || ['doc', 'docx', 'odt', 'txt', 'rtf'].includes(extension)) return 'description';\n if (/zip|compressed|tar|rar|7z/.test(type) || ['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) return 'folder_zip';\n return 'draft';\n}\n\n/** Familia del fichero, para el color de su icono en ngx-file-input. */\nexport type FileKind = 'image' | 'pdf' | 'video' | 'audio' | 'generic';\n\nexport function fileKind(file: File): FileKind {\n const type = file.type.toLowerCase();\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || file.name.toLowerCase().endsWith('.pdf')) return 'pdf';\n if (type.startsWith('video/')) return 'video';\n if (type.startsWith('audio/')) return 'audio';\n return 'generic';\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n DoCheck,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipGrid, MatChipsModule } from '@angular/material/chips';\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\nimport { NgxTexts } from '../../i18n';\nimport { NgxFileError, NgxFileErrorCode } from '../../models/file-input-types';\nimport { fileIcon, formatFileSize, isSameFile, matchesAccept, parseAccept } from '../shared/file-utils';\n\n/**\n * Selector de ficheros con forma de campo de formulario: un `mat-form-field` con los ficheros como chips.\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: `File[]`) o con `[(files)]`.\n */\n@Component({\n selector: 'ngx-input-file',\n imports: [MatButtonModule, MatChipsModule, MatFormFieldModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-input-file.component.html',\n styleUrl: './ngx-input-file.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-input-file',\n '[class.ngx-input-file--disabled]': 'isDisabled()',\n '[class.ngx-input-file--dropping]': 'isDropping()',\n '[class.ngx-input-file--has-files]': 'files().length > 0',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class NgxInputFile implements ControlValueAccessor, AfterViewInit, DoCheck {\n // Se registra como value accessor a mano (en vez de con NG_VALUE_ACCESSOR) para poder leer el\n // control del formulario: su estado decide el asterisco de obligatorio y cuándo se ve el error.\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\n private readonly _cdr = inject(ChangeDetectorRef);\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _locale = inject(LOCALE_ID);\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n private readonly _chipGrid = viewChild(MatChipGrid);\n protected readonly texts = inject(NgxTexts).texts;\n\n /** Etiqueta del campo. Por defecto, el texto `inputFile.label` de la librería. */\n readonly label = input<string>();\n /** Texto del campo vacío. Por defecto, el texto `inputFile.placeholder` de la librería. */\n readonly placeholder = input<string>();\n /** Texto de ayuda bajo el campo. */\n readonly hint = input<string>('');\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\n readonly error = input<string>('');\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). Se comprueba también al arrastrar. */\n readonly accept = input<string | string[]>([]);\n /** Permite varios ficheros; cada selección se añade a los que ya hay. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamaño máximo por fichero, en bytes. Los mayores se descartan. */\n readonly maxSize = input<number | null>(null);\n /** Número máximo de ficheros (con `multiple`). Los que no caben se descartan. */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Apariencia del `mat-form-field`. */\n readonly appearance = input<MatFormFieldAppearance>('outline');\n /** Ficheros seleccionados. Admite `[(files)]` para usarlo sin formularios. */\n readonly files = model<File[]>([]);\n /** Fichero descartado al seleccionar o arrastrar (tipo, tamaño o número), con el mismo formato que ngx-file-input. */\n readonly validationError = output<NgxFileError>();\n\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().inputFile.label);\n protected readonly resolvedPlaceholder = computed(() =>\n this.files().length ? '' : (this.placeholder() ?? this.texts().inputFile.placeholder)\n );\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\n protected readonly items = computed(() =>\n this.files().map(file => ({ file, icon: fileIcon(file), size: formatFileSize(file.size, this._locale) }))\n );\n\n private readonly _cvaDisabled = signal(false);\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n protected readonly isDropping = signal(false);\n protected readonly isRequired = signal(false);\n\n /** Ficheros descartados en la última selección; el mensaje se recalcula si cambia el idioma. */\n private readonly _rejected = signal<{ file: File; code: NgxFileErrorCode }[]>([]);\n protected readonly rejectionMessage = computed(() => {\n const messages = this._rejected().map(({ file, code }) => this._message(file, code));\n return [...new Set(messages)].join(' · ');\n });\n\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\n protected readonly errorStateMatcher: ErrorStateMatcher = {\n isErrorState: () => {\n const control = this._control();\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\n },\n };\n protected readonly noSeparators: number[] = [];\n\n private _onChange: (files: File[]) => void = () => {};\n private _onTouched: () => void = () => {};\n private _controlSub?: Subscription;\n\n constructor() {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n inject(DestroyRef).onDestroy(() => this._controlSub?.unsubscribe());\n }\n\n ngAfterViewInit(): void {\n // formControlName asigna su control después de registerOnChange: aquí ya está\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n ngDoCheck(): void {\n // Como hacen los campos de Material: hay cambios sin evento (resetForm quita el «enviado» después del reset)\n this._chipGrid()?.updateErrorState();\n }\n\n /** Abre el selector de ficheros del sistema. */\n openPicker(): void {\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\n }\n\n /** Quita un fichero de la selección. */\n remove(file: File): void {\n this._rejected.set([]);\n this._commit(this.files().filter(item => item !== file));\n }\n\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\n\n protected onFieldClick(event: MouseEvent): void {\n // Pulsar un chip (o su botón de quitar) no abre el selector\n if ((event.target as Element).closest('.mat-mdc-chip, .ngx-input-file__browse')) return;\n this.openPicker();\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected onTriggerBlur(): void {\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._addFiles(input.files);\n input.value = '';\n }\n\n protected onNativeCancel(): void {\n this._markTouched();\n }\n\n protected onDragOver(event: DragEvent): void {\n // Siempre: si no, el navegador abre el fichero al soltarlo\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\n if (!this.isDisabled()) this.isDropping.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDropping.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDropping.set(false);\n if (!this.isDisabled()) this._addFiles(event.dataTransfer?.files);\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────────────\n\n writeValue(files: File[] | null | undefined): void {\n this.files.set(Array.isArray(files) ? files : []);\n this._rejected.set([]);\n }\n\n registerOnChange(fn: (files: File[]) => void): void {\n this._onChange = fn;\n // [formControl] ya tiene aquí su control (también si se cambia por otro); formControlName, en ngAfterViewInit\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n // ── Privado ─────────────────────────────────────────────────────────────────\n\n private _control(): AbstractControl | null {\n return this._ngControl?.control ?? null;\n }\n\n /** Escucha el control (y el envío del formulario) para refrescar el asterisco y el estado de error con OnPush. */\n private _bindControl(control: AbstractControl | null): void {\n this._controlSub?.unsubscribe();\n if (!control) return;\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\n\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState(control));\n this._syncFormState(control);\n }\n\n private _syncFormState(control: AbstractControl): void {\n this.isRequired.set(control.hasValidator(Validators.required));\n // mat-chip-grid solo recalcula su error en ngDoCheck y si tiene NgControl propio, que aquí no tiene\n this._chipGrid()?.updateErrorState();\n this._cdr.markForCheck();\n }\n\n private _addFiles(list: FileList | null | undefined): void {\n const incoming = Array.from(list ?? []);\n if (!incoming.length) return;\n\n const patterns = parseAccept(this.accept());\n const maxSize = this.maxSize();\n const rejected: { file: File; code: NgxFileErrorCode }[] = [];\n const valid: File[] = [];\n\n for (const file of incoming) {\n if (!matchesAccept(file, patterns)) rejected.push({ file, code: 'TYPE_NOT_ALLOWED' });\n else if (maxSize != null && file.size > maxSize) rejected.push({ file, code: 'SIZE_EXCEEDED' });\n else valid.push(file);\n }\n\n let next = this.files();\n if (!this.multiple()) {\n if (valid.length) next = [valid[0]];\n } else {\n // Los repetidos (ya seleccionados o dos veces en la misma tanda) se ignoran sin avisar\n const fresh = valid.filter((file, index) =>\n !next.some(current => isSameFile(current, file)) && valid.findIndex(other => isSameFile(other, file)) === index\n );\n const max = this.maxFiles();\n const room = max == null ? fresh.length : Math.max(max - next.length, 0);\n fresh.slice(room).forEach(file => rejected.push({ file, code: 'MAX_FILES_EXCEEDED' }));\n if (room > 0 && fresh.length) next = [...next, ...fresh.slice(0, room)];\n }\n\n this._rejected.set(rejected);\n for (const { file, code } of rejected) this.validationError.emit({ file, code, message: this._message(file, code) });\n\n if (next !== this.files()) this._commit(next);\n else this._markTouched();\n }\n\n private _commit(files: File[]): void {\n this.files.set(files);\n this._onChange(files);\n this._markTouched();\n }\n\n private _markTouched(): void {\n this._onTouched();\n this._chipGrid()?.updateErrorState();\n this._cdr.markForCheck();\n }\n\n private _message(file: File, code: NgxFileErrorCode): string {\n const texts = this.texts().inputFile;\n switch (code) {\n case 'TYPE_NOT_ALLOWED':\n return texts.rejectedType(file.name);\n case 'SIZE_EXCEEDED':\n return texts.rejectedSize(file.name, formatFileSize(this.maxSize() ?? 0, this._locale));\n case 'MAX_FILES_EXCEEDED':\n return texts.rejectedCount(this.maxFiles() ?? 0);\n }\n }\n}\n","<mat-form-field\r\n class=\"ngx-input-file__field\"\r\n [appearance]=\"appearance()\"\r\n floatLabel=\"always\"\r\n subscriptSizing=\"dynamic\"\r\n (click)=\"onFieldClick($event)\">\r\n <mat-label>{{ resolvedLabel() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ngx-input-file__chips\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"isRequired()\"\r\n [errorStateMatcher]=\"errorStateMatcher\">\r\n @for (item of items(); track item.file) {\r\n <mat-chip-row class=\"ngx-input-file__chip\" [title]=\"item.file.name + ' · ' + item.size\" (removed)=\"remove(item.file)\">\r\n <mat-icon matChipAvatar aria-hidden=\"true\">{{ item.icon }}</mat-icon>\r\n <span class=\"ngx-input-file__chip-name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-input-file__chip-size\">{{ item.size }}</span>\r\n <button matChipRemove type=\"button\" [attr.aria-label]=\"texts().inputFile.remove(item.file.name)\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n\r\n <!-- Entrada de texto de solo lectura: da el foco con Tab, el placeholder y abre el selector con Intro o Espacio -->\r\n <input\r\n class=\"ngx-input-file__trigger\"\r\n readonly\r\n [matChipInputFor]=\"chipGrid\"\r\n [matChipInputSeparatorKeyCodes]=\"noSeparators\"\r\n [placeholder]=\"resolvedPlaceholder()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n (blur)=\"onTriggerBlur()\" />\r\n </mat-chip-grid>\r\n\r\n <button\r\n matIconSuffix\r\n matIconButton\r\n type=\"button\"\r\n class=\"ngx-input-file__browse\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"texts().inputFile.browse\"\r\n [matTooltip]=\"texts().inputFile.browse\"\r\n (click)=\"openPicker()\">\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #nativeInput\r\n type=\"file\"\r\n hidden\r\n tabindex=\"-1\"\r\n [accept]=\"acceptAttr()\"\r\n [multiple]=\"multiple()\"\r\n (change)=\"onNativeChange($event)\"\r\n (cancel)=\"onNativeCancel()\" />\r\n\r\n <mat-hint>\r\n @if (isDropping()) {\r\n {{ texts().inputFile.dropping }}\r\n } @else if (rejectionMessage()) {\r\n <span class=\"ngx-input-file__rejection\">{{ rejectionMessage() }}</span>\r\n } @else {\r\n {{ hint() }}\r\n }\r\n </mat-hint>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n</mat-form-field>\r\n\r\n<!-- Región viva fija: los descartes se anuncian aunque el lector esté en otro sitio -->\r\n<div class=\"ngx-input-file__live\" aria-live=\"polite\">{{ rejectionMessage() }}</div>\r\n","export const includeNoSensible = (cadena: string, query: string): boolean => {\r\n const nomalizadoCadena = cadena\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n const nomalizadoQuery = query\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n return nomalizadoCadena.includes(nomalizadoQuery);\r\n};\r\n\r\nexport const base64ToUtf8 = (str: string): string => {\r\n return decodeURIComponent(\r\n atob(str)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n};\r\n","import {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\r\nimport { BasicSelectConfig } from '../../models';\r\nimport { includeNoSensible } from '../../utils';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */\r\ninterface ResolvedOption<T> {\r\n value: T[keyof T];\r\n label: string;\r\n disabled: boolean;\r\n visible: boolean;\r\n}\r\n\r\n/** Teclas que deben llegar al mat-select para navegar/seleccionar desde el buscador. */\r\nconst NAVIGATION_KEYS = new Set([\r\n 'ArrowDown',\r\n 'ArrowUp',\r\n 'Enter',\r\n 'Escape',\r\n 'Home',\r\n 'End',\r\n 'Tab',\r\n]);\r\n\r\n@Component({\r\n selector: 'ngx-basic-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatInputModule,\r\n MatSelectModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n ReactiveFormsModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-basic-select.component.html',\r\n styleUrl: './ngx-basic-select.component.scss',\r\n})\r\nexport class NgxBasicSelect<T> implements ControlValueAccessor {\r\n\r\n // Servicio de internacionalización (placeholder del buscador, mensajes de estado…)\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n /**\r\n * Se auto-registra como ControlValueAccessor del control del formulario.\r\n * Se usa `self`/`optional` para poder leer el estado de validación (invalid/touched)\r\n * y para no fallar cuando el componente se usa sin formulario.\r\n */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intentó enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // ─── Inputs ──────────────────────────────────────────────────────────────\r\n readonly label = input.required<string>();\r\n readonly options = input.required<T[]>();\r\n readonly basicSelectConfig = input.required<BasicSelectConfig<T>>();\r\n readonly isLoading = input<boolean>(false);\r\n readonly placeholder = input<string>('');\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n readonly appearance = input<'fill' | 'outline'>('fill');\r\n readonly multiple = input<boolean>(false);\r\n readonly disabled = input<boolean>(false);\r\n readonly clearable = input<boolean>(false);\r\n readonly error = input<string>('');\r\n readonly class = input<string>('');\r\n\r\n // ─── Outputs ─────────────────────────────────────────────────────────────\r\n /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */\r\n selectionChange = output<T[keyof T] | T[keyof T][] | null>();\r\n\r\n // ─── ViewChilds ──────────────────────────────────────────────────────────\r\n readonly matSelect = viewChild.required<MatSelect>('matSelect');\r\n readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\r\n\r\n // ─── Estado interno ──────────────────────────────────────────────────────\r\n /** FormControl interno que gobierna el mat-select (independiente del control del form). */\r\n protected readonly innerControl = new FormControl<any>(null);\r\n /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */\r\n protected readonly value = signal<any>(null);\r\n /** Deshabilitado que llega vía setDisabledState (reactive forms). */\r\n private readonly cvaDisabled = signal(false);\r\n /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */\r\n protected readonly searchQuery = signal('');\r\n\r\n private onChange: (value: any) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */\r\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\r\n\r\n /**\r\n * Opciones resueltas y marcadas con `visible` según el buscador. Las no visibles\r\n * NO se quitan del DOM (se ocultan con display:none) para que el mat-select siga\r\n * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.\r\n */\r\n protected readonly resolvedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const query = this.searchQuery();\r\n const options = this.options();\r\n const config = this.basicSelectConfig();\r\n\r\n return options.map(option => {\r\n const label = String(config.displayedLabel(option));\r\n return {\r\n value: option[config.valueKey],\r\n label,\r\n disabled: config.disabled ? config.disabled(option) : false,\r\n visible: includeNoSensible(label, query),\r\n };\r\n });\r\n });\r\n\r\n /** Hay datos de entrada (con independencia del buscador). */\r\n protected readonly hasData = computed(() => this.resolvedOptions().length > 0);\r\n\r\n /**\r\n * Opciones que se renderizan realmente: las que casan con el buscador MÁS las que\r\n * estén seleccionadas (aunque no casen). Se quitan del DOM las que no casan para que\r\n * el ListKeyManager de mat-select no las pueda enfocar con las flechas —marcarlas\r\n * `disabled` no basta: con el panel abierto Material permite enfocar deshabilitadas\r\n * (recomendación WAI-ARIA)—. Las seleccionadas se conservan para que el trigger\r\n * pueda pintar su etiqueta y no se pierda el valor al filtrar.\r\n */\r\n protected readonly displayedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const value = this.value();\r\n const selected = new Set(Array.isArray(value) ? value : (value != null ? [value] : []));\r\n return this.resolvedOptions().filter(o => o.visible || selected.has(o.value));\r\n });\r\n\r\n /** No hay ninguna opción que mostrar (ni coincidencia ni seleccionada). */\r\n protected readonly showNoOptionsMessage = computed(() => this.displayedOptions().length === 0);\r\n\r\n /** Mensaje aria-live con el recuento de resultados al filtrar. */\r\n protected readonly searchAnnouncement = computed(() => {\r\n const query = this.searchQuery();\r\n if (!query)\r\n return '';\r\n\r\n const count = this.resolvedOptions().filter(o => o.visible).length;\r\n return this.texts().select.resultsCount(count);\r\n });\r\n\r\n /**\r\n * ErrorStateMatcher que refleja el estado del control del formulario.\r\n * Replica el criterio por defecto de Material: se muestra el error si el\r\n * control es inválido y además ha sido tocado O ya se ha enviado el\r\n * formulario. Sin la parte de `submitted`, al pulsar \"Guardar\" los campos\r\n * obligatorios que el usuario no llegó a tocar no se marcaban en rojo.\r\n */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`.\r\n * Se propaga al mat-select interno para que el mat-form-field pinte el\r\n * asterisco, igual que hace Material con un `<input matInput>`.\r\n */\r\n protected isRequired(): boolean {\r\n return this._ngControl?.control?.hasValidator(Validators.required) ?? false;\r\n }\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n constructor() {\r\n // Auto-registro como CVA (evita el provider NG_VALUE_ACCESSOR y su DI circular).\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sincroniza el deshabilitado efectivo con el control interno.\r\n afterRenderEffect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n\r\n // Propaga los cambios del control interno al formulario, al output y al signal de valor.\r\n this.innerControl.valueChanges\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(value => {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.selectionChange.emit(value);\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una señal:\r\n * al enviar, nada marca este componente (OnPush) para revisión, así que el\r\n * mat-select no reevaluaba su errorStateMatcher y el campo no se pintaba en\r\n * rojo. Al enviarse el formulario se fuerza la revisión.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // ─── ControlValueAccessor ─────────────────────────────────────────────────\r\n writeValue(value: any): void {\r\n this.innerControl.setValue(value, { emitEvent: false });\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: any) => 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.cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Interacción ──────────────────────────────────────────────────────────\r\n onOpenedChange(opened: boolean): void {\r\n if (opened) {\r\n this.searchQuery.set('');\r\n setTimeout(() => {\r\n this.searchInput()?.nativeElement.focus();\r\n const panel = this.matSelect().panel?.nativeElement;\r\n if (panel)\r\n panel.scrollTop = 0;\r\n });\r\n } else {\r\n // Al cerrar marcamos como tocado para que salte la validación\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n }\r\n\r\n onSearchInput(value: string): void {\r\n this.searchQuery.set(value);\r\n }\r\n\r\n /**\r\n * Deja pasar al mat-select las teclas de navegación (flechas, Enter, Escape…) para\r\n * poder moverse por la lista sin salir del buscador, y detiene las de carácter para\r\n * que no disparen el typeahead nativo del mat-select.\r\n */\r\n onSearchKeydown(event: KeyboardEvent): void {\r\n if (!NAVIGATION_KEYS.has(event.key))\r\n event.stopPropagation();\r\n }\r\n\r\n clearSearch(): void {\r\n this.searchQuery.set('');\r\n this.searchInput()?.nativeElement.focus();\r\n }\r\n\r\n onClearClick(): void {\r\n const newValue = this.multiple() ? [] : null;\r\n this.innerControl.setValue(newValue); // emite → onChange + output + signal\r\n this.innerControl.markAsTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","\r\n<mat-form-field [appearance]=\"appearance()\" [className]=\"class()\" [subscriptSizing]=\"subscriptSizing()\">\r\n <mat-label>{{ label() }}</mat-label>\r\n <mat-select\r\n #matSelect\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n [placeholder]=\"placeholder()\"\r\n (openedChange)=\"onOpenedChange($event)\"\r\n >\r\n @if(isLoading()) {\r\n <!--\r\n Opcion deshabilitada (no un div): mat-select no abre el panel si no\r\n tiene ninguna mat-option (_canOpen exige options.length > 0). Asi el\r\n panel abre tambien durante la carga y se ve el indicador.\r\n -->\r\n <mat-option disabled class=\"stateOption loadingOption\">\r\n <mat-spinner diameter=\"18\" />\r\n <span>{{ texts().common.loading }}</span>\r\n </mat-option>\r\n } @else {\r\n <div class=\"searchFilter\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n <input\r\n matInput\r\n #searchInput\r\n type=\"text\"\r\n [attr.aria-label]=\"texts().common.search\"\r\n [placeholder]=\"texts().common.search\"\r\n [value]=\"searchQuery()\"\r\n (input)=\"onSearchInput($any($event.target).value)\"\r\n (keydown)=\"onSearchKeydown($event)\"\r\n />\r\n <button type=\"button\" matIconButton [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <!--\r\n Solo se renderizan las opciones que casan con el buscador (mas las\r\n seleccionadas). Las que no casan se quitan del DOM para que no se puedan\r\n enfocar con las flechas: con el panel abierto mat-select permite navegar\r\n a opciones deshabilitadas, asi que ocultarlas + disabled no bastaria.\r\n -->\r\n @for(option of displayedOptions(); track option.value) {\r\n <mat-option [value]=\"option.value\" [disabled]=\"option.disabled\">\r\n {{ option.label }}\r\n </mat-option>\r\n }\r\n @if(showNoOptionsMessage()) {\r\n <mat-option disabled class=\"stateOption noResults\">\r\n {{ hasData() ? texts().select.noResults : texts().common.noData }}\r\n </mat-option>\r\n }\r\n }\r\n </mat-select>\r\n @if(isLoading()) {\r\n <mat-icon matSuffix><mat-spinner diameter=\"20\" /></mat-icon>\r\n } @else if(clearable() && (multiple() ? value()?.length : value())) {\r\n <button\r\n matIconButton\r\n matSuffix\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"onClearClick(); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>\r\n\r\n<!-- Anuncio para lectores de pantalla del numero de resultados al filtrar -->\r\n<div class=\"srOnly\" aria-live=\"polite\">{{ searchAnnouncement() }}</div>\r\n","import { TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\n\r\nexport enum DialogBodyType {\r\n TEXT = 'text',\r\n HTML = 'html',\r\n COMPONENT = 'component',\r\n TEMPLATE = 'template'\r\n}\r\n\r\nexport interface DialogBodyConfig<T = any> {\r\n type: DialogBodyType;\r\n content: string | Type<T> | TemplateRef<any>;\r\n data?: T;\r\n}\r\n\r\nexport interface DialogConfig<T = any> {\r\n title: string;\r\n icon?: string;\r\n iconColor?: string;\r\n subtitle?: string;\r\n body: DialogBodyConfig<T>;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n cancelText?: string;\r\n confirmText?: string;\r\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\r\n destructive?: boolean;\r\n /** Muestra la X de cerrar en el encabezado (cierra devolviendo undefined). Por defecto true, salvo con disableClose. */\r\n showClose?: boolean;\r\n}\r\n\r\n/**\r\n * Lo que un componente o plantilla dentro de un diálogo de NgxDialogService puede controlar.\r\n *\r\n * - En un componente: `inject(NgxDialogContext)`.\r\n * - En una plantilla: viene en el contexto como `dialog` (`let-dialog=\"dialog\"`).\r\n */\r\nexport abstract class NgxDialogContext<R = unknown> {\r\n /** Resultado que se devuelve al pulsar confirmar. Si se queda sin valor, se devuelve `true`. */\r\n abstract readonly result: WritableSignal<R | undefined>;\r\n\r\n /** Deshabilita el botón de confirmar (p. ej. mientras un formulario no es válido). */\r\n abstract readonly confirmDisabled: WritableSignal<boolean>;\r\n\r\n /** Cierra el diálogo devolviendo `result` (o `false`/`undefined` para cancelar). */\r\n abstract close(result?: R | boolean): void;\r\n}\r\n\r\n/** Contexto que recibe una plantilla usada como cuerpo de un diálogo. */\r\nexport interface NgxDialogTemplateContext<T = any, R = unknown> {\r\n /** Los datos que se pasaron en `templateData`. */\r\n $implicit: T;\r\n /** Para cerrar el diálogo, fijar el resultado o deshabilitar el botón de confirmar. */\r\n dialog: NgxDialogContext<R>;\r\n}\r\n","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[ngxDynamicHost]'\r\n})\r\nexport class DynamicHostDirective<T> {\r\n private _vcr = inject(ViewContainerRef);\r\n private _currentRef: ComponentRef<any> | null = null;\r\n\r\n component = input<Type<any>>();\r\n data = input<T>();\r\n\r\n constructor() {\r\n effect(() => {\r\n const componentType = this.component();\r\n \r\n // 1. Gestión de la creación/destrucción del componente\r\n if (!componentType) {\r\n this._vcr.clear();\r\n this._currentRef = null;\r\n return;\r\n }\r\n\r\n // Si el componente es diferente al que tenemos, lo recreamos\r\n if (this._currentRef?.componentType !== componentType) {\r\n this._vcr.clear();\r\n this._currentRef = this._vcr.createComponent(componentType);\r\n }\r\n \r\n // 2. Actualización de datos (siempre, tanto si es nuevo como si ya existía)\r\n const data = this.data();\r\n if (this._currentRef && data !== undefined) {\r\n // La forma correcta de setear un input en Angular moderno\r\n this._currentRef.setInput('data', data); \r\n }\r\n });\r\n }\r\n}","import { ChangeDetectionStrategy, Component, forwardRef, inject, signal } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DialogBodyType, DialogConfig, NgxDialogContext, NgxDialogTemplateContext } from '../../models/dialog-config';\r\nimport { DynamicHostDirective } from '../../directives';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Diálogo genérico que abre NgxDialogService. El contenido (texto, HTML, componente o plantilla)\r\n * puede usar NgxDialogContext para devolver un resultado o deshabilitar el botón de confirmar.\r\n */\r\n@Component({\r\n selector: 'ngx-dialog',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n NgTemplateOutlet,\r\n DynamicHostDirective,\r\n ],\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrl: './ngx-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // El contenido (componente o plantilla) inyecta el diálogo como NgxDialogContext\r\n providers: [{ provide: NgxDialogContext, useExisting: forwardRef(() => NgxDialog) }],\r\n})\r\nexport class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {\r\n private readonly _dialogRef = inject(MatDialogRef<NgxDialog<T, R>>);\r\n private readonly _data = inject<DialogConfig<T>>(MAT_DIALOG_DATA);\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n readonly title = this._data.title;\r\n readonly icon = this._data.icon;\r\n readonly iconColor = this._data.iconColor;\r\n readonly subtitle = this._data.subtitle;\r\n readonly body = this._data.body;\r\n readonly showCancel = this._data.showCancel ?? true;\r\n readonly showConfirm = this._data.showConfirm ?? true;\r\n readonly destructive = this._data.destructive ?? false;\r\n /** La X no tiene sentido en un diálogo con disableClose (está pensado para no poder cerrarse sin decidir). */\r\n readonly showClose = this._data.showClose ?? !this._dialogRef.disableClose;\r\n readonly closeLabel = this._texts().dialog.close;\r\n readonly cancelText = this._data.cancelText ?? this._texts().dialog.cancel;\r\n readonly confirmText = this._data.confirmText ?? this._texts().dialog.accept;\r\n\r\n // ── NgxDialogContext ──────────────────────────────────────────────────────\r\n readonly result = signal<R | undefined>(undefined);\r\n readonly confirmDisabled = signal(false);\r\n\r\n close(result?: R | boolean): void {\r\n this._dialogRef.close(result);\r\n }\r\n\r\n // ── Plantilla ─────────────────────────────────────────────────────────────\r\n protected readonly DialogBodyType = DialogBodyType;\r\n protected readonly templateContext: NgxDialogTemplateContext<T, R> = {\r\n $implicit: this.body.data as T,\r\n dialog: this,\r\n };\r\n\r\n onCancelClick(): void {\r\n this._dialogRef.close(false);\r\n }\r\n\r\n onConfirmClick(): void {\r\n if (this.confirmDisabled()) return;\r\n const result = this.result();\r\n this._dialogRef.close(result === undefined ? true : result);\r\n }\r\n}\r\n","<!--\r\n Encabezado: el h2 (mat-dialog-title) da el nombre accesible al diálogo, así que la X va fuera de él,\r\n posicionada encima, para que no forme parte de ese nombre.\r\n-->\r\n<div class=\"ngx-dialog__header\" [class.ngx-dialog__header--closable]=\"showClose\">\r\n <h2 mat-dialog-title class=\"ngx-dialog__title\">\r\n @if (icon) {\r\n <mat-icon class=\"ngx-dialog__icon\" [style.color]=\"iconColor || null\" aria-hidden=\"true\">{{ icon }}</mat-icon>\r\n }\r\n <span class=\"ngx-dialog__heading\">\r\n <span class=\"ngx-dialog__title-text\">{{ title }}</span>\r\n @if (subtitle) {\r\n <span class=\"ngx-dialog__subtitle\">{{ subtitle }}</span>\r\n }\r\n </span>\r\n </h2>\r\n\r\n @if (showClose) {\r\n <button\r\n type=\"button\"\r\n matIconButton\r\n class=\"ngx-dialog__close\"\r\n [attr.aria-label]=\"closeLabel\"\r\n [matTooltip]=\"closeLabel\"\r\n (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</div>\r\n\r\n<mat-dialog-content>\r\n <div class=\"ngx-dialog__content\">\r\n @switch (body.type) {\r\n @case (DialogBodyType.TEXT) {\r\n <p class=\"ngx-dialog__text\">{{ body.content }}</p>\r\n }\r\n @case (DialogBodyType.HTML) {\r\n <div [innerHTML]=\"body.content\"></div>\r\n }\r\n @case (DialogBodyType.COMPONENT) {\r\n <ng-container\r\n ngxDynamicHost\r\n [component]=\"$any(body.content)\"\r\n [data]=\"body.data\"\r\n />\r\n }\r\n @case (DialogBodyType.TEMPLATE) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"$any(body.content)\"\r\n [ngTemplateOutletContext]=\"templateContext\"\r\n />\r\n }\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n\r\n@if (showCancel || showConfirm) {\r\n <mat-dialog-actions align=\"end\" class=\"ngx-dialog__actions\">\r\n @if (showCancel) {\r\n <button type=\"button\" matButton=\"outlined\" (click)=\"onCancelClick()\">\r\n {{ cancelText }}\r\n </button>\r\n }\r\n @if (showConfirm) {\r\n <button\r\n type=\"button\"\r\n matButton=\"filled\"\r\n class=\"ngx-dialog__confirm\"\r\n [class.ngx-dialog__confirm--destructive]=\"destructive\"\r\n [disabled]=\"confirmDisabled()\"\r\n (click)=\"onConfirmClick()\">\r\n {{ confirmText }}\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * @deprecated Usar `NgxDialogService.confirm()` (o `template()` con contenido propio), que tiene el\r\n * encabezado, el botón X y la opción `destructive` de ngx-dialog. Las tablas ya no lo usan; se\r\n * mantiene solo por compatibilidad con quien lo abra directamente.\r\n */\r\n@Component({\r\n selector: 'ngx-confirm-dialog',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-confirm-dialog.component.html',\r\n styleUrl: './ngx-confirm-dialog.component.scss'\r\n})\r\nexport class NgxConfirmDialogComponent {\r\n dialogRef = inject(MatDialogRef<NgxConfirmDialogComponent>);\r\n data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content>\r\n @if(data.body) {\r\n <p>{{data.body}}</p>\r\n }\r\n \r\n @if (data.template) {\r\n <ng-container *ngTemplateOutlet=\"data.template; context: { $implicit: data.row }\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"false\">{{ data.denyButtonLabel ?? texts().common.cancel }}</button>\r\n <button matButton [mat-dialog-close]=\"true\">{{ data.confirmButtonLabel ?? texts().common.confirm }}</button>\r\n</mat-dialog-actions>","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef, WritableSignal } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxDynamicCellHost]',\r\n})\r\nexport class DynamicCellHostDirective<T> {\r\n vcr = inject(ViewContainerRef);\r\n\r\n component = input<Type<any>>();\r\n row = input<T>();\r\n key = input<keyof T>();\r\n\r\n private _currentRef: ComponentRef<any> | null = null;\r\n private _rowSignal?: WritableSignal<T>;\r\n private _keySignal?: WritableSignal<keyof T>;\r\n\r\n effect = effect(() => {\r\n const component = this.component();\r\n const row = this.row();\r\n const key = this.key();\r\n\r\n //Si no hay componente, limpiamos lo que hubiera\r\n if (!component) {\r\n this.vcr.clear();\r\n this._currentRef = null;\r\n this._rowSignal = undefined;\r\n this._keySignal = undefined;\r\n return;\r\n }\r\n\r\n //Solo se recrea si cambia el tipo de componente. En caso contrario se reutiliza\r\n //la instancia y se actualizan sus signals, evitando apilar componentes en el DOM\r\n //cada vez que cambian los datos de la fila.\r\n if (this._currentRef?.componentType !== component) {\r\n this.vcr.clear();\r\n this._currentRef = this.vcr.createComponent(component);\r\n this._rowSignal = undefined;\r\n this._keySignal = undefined;\r\n }\r\n\r\n if (row === undefined || key === undefined)\r\n return;\r\n\r\n if (!this._rowSignal || !this._keySignal) {\r\n this._rowSignal = signal(row);\r\n this._keySignal = signal(key);\r\n this._currentRef!.instance.row = this._rowSignal;\r\n this._currentRef!.instance.key = this._keySignal;\r\n } else {\r\n this._rowSignal.set(row);\r\n this._keySignal.set(key);\r\n }\r\n });\r\n}\r\n","import { Pipe, type PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngxOnlyUpperFirstCharacter',\r\n})\r\nexport class OnlyUpperFirstCharacterPipe implements PipeTransform {\r\n\r\n transform(value: string): string {\r\n if (!value)\r\n return '';\r\n\r\n value = value.toLowerCase();\r\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\r\n }\r\n\r\n}\r\n","import { PipeTransform, TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\nimport jsPDF from \"jspdf\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PaginatedFilter } from \"./paginated-filter\";\r\nimport { PaginatedItems } from \"./paginated-items\";\r\n\r\nexport type FilterType = 'number' | 'text' | 'option' | 'option-multiple' | 'date' | 'date-range';\r\n\r\n//IMPORTANTE Si se añade aqui un color, hay que añadirlo tambien en paginated-table.component.scss\r\nexport type RowActionIconColor = 'Yellow' | 'Orange' | 'Pink' | 'Purple' | 'Green' | 'Blue' | 'Sky' | 'Brown';\r\n\r\nexport interface PaginatedTableConfig<T> {\r\n tableId: string;\r\n primaryKey: keyof T | Array<keyof T>;\r\n title: () => string;\r\n columns: PaginatedTableColumn<T>[];\r\n showQueryFilter?: boolean; //Filtro query para toda la tabla\r\n queryFilterPlaceholder?: string; //Placeholder del filtro query para toda la tabla\r\n create?: TableBasicAction<T>;\r\n update?: TableBasicAction<T>;\r\n clickOnRowForUpdate?: boolean; //Si esto se pone a true (desaparece el icono de acciones de update y toda la columna es el update) => Si expandableDetail true, esto se cancela y el editar se pone en acciones\r\n delete?: TableBasicAction<T>;\r\n deleteConfirm?: DeleteConfirm<T>;\r\n rowActions?: TableRowAction<T>[];\r\n showAdvancedFilters?: boolean;\r\n expandableDetail?: boolean;\r\n expandableDetailTemplateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n enableRowSelection?: boolean;\r\n showRowSelection?: (row: T) => boolean; //Para mostrar o no el checkbox de seleccion por fila\r\n rowSelectionAction?: RowSelectionAction<T>[]; //Para poner botones que actuen frente a una seleccion multiple,\r\n exportFileName?: () => string;\r\n mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;\r\n pdfConfig?: jsPDF;\r\n maxHeight?: string;\r\n defaultStickyColumn?: keyof T;\r\n showActions?: () => boolean; //Para mostrar o no la columna de acciones, en caso de que se tengan acciones de fila o clickOnRowForUpdate, esta propiedad se pondrá a true automaticamente, pero si no se quieren mostrar las acciones, se puede poner a false esta propiedad. En caso de que clickOnRowForUpdate sea true y expandableDetail sea true, entonces clickOnRowForUpdate se cancelará y las acciones de editar se pondrán en acciones de fila, por lo que en ese caso, showActions se pondrá a true automaticamente. Si se quieren ocultar las acciones en ese caso, habrá que poner showActions a false.\r\n hideExportData?: () => boolean; //Para mostrar o no el boton de exportar datos, en caso de que se tenga acciones de exportacion, esta propiedad se pondrá a false automaticamente, pero si no se quieren mostrar el boton de exportar datos, se puede poner a true esta propiedad.\r\n hideColumnConfig?: () => boolean; //Para ocultar el boton de configurar/visualizar columnas\r\n hideFullScreen?: () => boolean; //Para ocultar el boton de pantalla completa\r\n}\r\n\r\n/*\r\n PRIORIDAD DE CREACION DE LA VISTA \r\n 1 => componente\r\n 2 => template\r\n 3 => valueGetter\r\n 4 => valor de la columna por defecto aplicando pipes (en caso de que se especifiquen)\r\n*/\r\nexport interface PaginatedTableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n isSortable?: boolean; //Los datos de la columna se pueden ordenar\r\n filterType?: FilterType; //Los datos de la columna se pueden filtrar\r\n filterOptions?: FilterOption[]; //En caso de filterType = option o filterType = option-multiple entonces, se pintara un select y habra que mandar las opciones\r\n endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;\r\n filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;\r\n component?: Type<any>; //Para crear la vista desde un component\r\n templateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n valueGetter?: (row: T) => string;\r\n pipes?: ColumnPipe | ColumnPipe[];\r\n showTotalPerPage?: boolean;\r\n showTotalGeneral?: boolean;\r\n getTotalGeneral?: () => number;\r\n totalFooterFormatter?: (total: number) => string;\r\n style?: string;\r\n footerStyle?: string;\r\n}\r\n\r\nexport interface TableBasicAction<T> {\r\n show?: (row?: T) => boolean;\r\n disabled?: (row?: T) => boolean;\r\n tooltip?: (row?: T) => string;\r\n}\r\n\r\nexport interface TableRowAction<T> {\r\n id: string;\r\n show?: (row: T) => boolean;\r\n disabled?: (row: T) => boolean;\r\n icon: string;\r\n iconColor?: RowActionIconColor;\r\n tooltip: (row: T) => string;\r\n}\r\n\r\nexport interface FilterOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport function isFilterOption(obj: unknown): obj is FilterOption {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'value' in obj &&\r\n 'label' in obj &&\r\n typeof (obj as any).value === 'string' &&\r\n typeof (obj as any).label === 'string'\r\n );\r\n}\r\n\r\nexport interface ColumnPipe {\r\n pipe: PipeTransform;\r\n args?: any[];\r\n}\r\n\r\nexport interface DeleteConfirm<T> {\r\n title: (row: T) => string;\r\n body?: (row: T) => string;\r\n templateRef?: () => TemplateRef<{ $implicit: T }>;\r\n}\r\n\r\nexport interface RowSelectionAction<T> {\r\n id: string;\r\n icon: string;\r\n label: (row: T[], totalSelected: number) => string;\r\n}","import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ColumnValue } from \"./column-value\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isFilterOption, PaginatedTableColumn } from \"./paginated-table-config\";\r\nimport { DynamicFilter } from \"./dynamic-filter\";\r\nimport { AdvancedFilter, FilterGroup, FilterRule, FilterConnector, FilterOperator } from \"./advanced-filter\";\r\nimport { NgxEiffageTexts } from \"../i18n\";\r\n\r\nexport class AdvancedFilterUtils {\r\n static createAdvancedFilter = <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>): FormGroup => {\r\n return fb.group({\r\n name: [advancedFilter.name, Validators.required],\r\n groups: fb.array(advancedFilter.groups.map(g => this.createFilterGroup(fb, g)))\r\n });\r\n }\r\n\r\n static createFilterGroup = <T>(fb: FormBuilder, group: FilterGroup<T>): FormGroup => {\r\n return fb.group({\r\n id: [group.id ?? uuidv4()],\r\n connector: [group.connector, Validators.required],\r\n filters: fb.array(group.filters.map(f => {\r\n return this.isFilterGroup<T>(f)\r\n ? this.createFilterGroup(fb, f)\r\n : this.createFilterRule(fb, f);\r\n }), [Validators.required])\r\n });\r\n }\r\n\r\n static createFilterRule = <T>(fb: FormBuilder, rule: FilterRule<T>): FormGroup => {\r\n return fb.group({\r\n id: [rule.id ?? uuidv4()],\r\n key: [rule.key ?? null, Validators.required],\r\n operator: [rule.operator ?? null, Validators.required],\r\n value: [rule.value ?? null, Validators.required]\r\n });\r\n }\r\n\r\n static isFilterGroup = <T>(obj: any): obj is FilterGroup<T> => {\r\n return obj &&\r\n typeof obj === 'object' &&\r\n 'connector' in obj &&\r\n 'filters' in obj;\r\n }\r\n\r\n private static isFilterRule<T>(obj: any): obj is FilterRule<T> {\r\n return obj && typeof obj === 'object' && 'key' in obj;\r\n }\r\n\r\n static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>) {\r\n const groupFound = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (groupFound) {\r\n const filters = groupFound.get('filters') as FormArray;\r\n const formGroup = this.createFilterGroup(fb, group);\r\n filters.push(formGroup);\r\n }\r\n }\r\n\r\n static deleteGroup<T>(form: FormGroup, groupId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, groupId);\r\n }\r\n\r\n static addRuleToGroup = <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => {\r\n const group = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (group) {\r\n const filters = group.get('filters') as FormArray;\r\n const formRule = this.createFilterRule(fb, rule);\r\n filters.push(formRule);\r\n }\r\n }\r\n\r\n static deleteRule<T>(form: FormGroup, ruleId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, ruleId);\r\n }\r\n\r\n private static deleteByIdRecursive(array: FormArray, id: string): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n const control = array.at(i) as FormGroup;\r\n\r\n // Si el id coincide, eliminar directamente (da igual si es rule o group)\r\n if (control.get('id')?.value === id) {\r\n array.removeAt(i);\r\n return true;\r\n }\r\n\r\n // Si es un grupo, seguir buscando dentro de sus filtros\r\n const filters = control.get('filters');\r\n if (filters instanceof FormArray) {\r\n const deleted = this.deleteByIdRecursive(filters, id);\r\n if (deleted) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n static findGroupFormById(array: FormArray, id: string): FormGroup | null {\r\n for (const control of array.controls) {\r\n const group = control as FormGroup;\r\n if (group.get('id')?.value === id)\r\n return group;\r\n\r\n const filters = group.get('filters') as FormArray;\r\n if (filters) {\r\n const found = this.findGroupFormById(filters, id);\r\n if (found)\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isFilterGroupForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('connector') &&\r\n group.contains('filters')\r\n );\r\n }\r\n\r\n /*static isFilterRuleForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('key') &&\r\n group.contains('operator') &&\r\n group.contains('value') &&\r\n !group.contains('filters')\r\n );\r\n }*/\r\n\r\n static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T> {\r\n return {\r\n name: form.get('name')?.value,\r\n groups: (form.get('groups') as FormArray).controls\r\n .map(g => this.mapFormGroupToFilterGroup<T>(g as FormGroup))\r\n .filter(g => this.isNonEmptyGroup(g))\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterGroup<T>(groupForm: FormGroup): FilterGroup<T> {\r\n const id = groupForm.get('id')?.value as string;\r\n const connector = groupForm.get('connector')?.value as FilterConnector;\r\n const filtersArray = groupForm.get('filters') as FormArray;\r\n\r\n const filters = filtersArray.controls\r\n .map(control => {\r\n const value = control.value;\r\n if ('filters' in value)\r\n return this.mapFormGroupToFilterGroup<T>(control as FormGroup);\r\n else\r\n return this.mapFormGroupToFilterRule<T>(control as FormGroup);\r\n })\r\n .filter(f => this.isNonEmptyFilter(f));\r\n\r\n return {\r\n id: id,\r\n connector: connector,\r\n filters: filters\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterRule<T>(ruleForm: FormGroup): FilterRule<T> {\r\n return {\r\n id: ruleForm.get('id')?.value,\r\n key: ruleForm.get('key')?.value,\r\n operator: ruleForm.get('operator')?.value,\r\n value: ruleForm.get('value')?.value\r\n };\r\n }\r\n\r\n private static isNonEmptyFilter<T>(filter: FilterRule<T> | FilterGroup<T>): boolean {\r\n if (this.isFilterGroup(filter))\r\n return this.isNonEmptyGroup(filter);\r\n\r\n return this.isNonEmptyRule(filter);\r\n }\r\n\r\n private static isNonEmptyGroup<T>(group: FilterGroup<T>): boolean {\r\n return Array.isArray(group.filters) && group.filters.some(f => this.isNonEmptyFilter(f));\r\n }\r\n\r\n private static isNonEmptyRule<T>(rule: FilterRule<T>): boolean {\r\n return !!(rule.key && rule.operator && rule.value !== undefined && rule.value !== null && rule.value !== '');\r\n }\r\n\r\n static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n return this.groupToHtml(groups[0], columns, texts);\r\n //return groups.map(g => this.groupToString(g)).join(' OR ');\r\n }\r\n\r\n private static groupToHtml<T>(group: FilterGroup<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const connectorLabel = group.connector === 'AND' ? texts.advancedFilters.and : texts.advancedFilters.or;\r\n const connector = ` <strong>${connectorLabel}</strong> `;\r\n\r\n const parts = group.filters.map(filter => {\r\n if (this.isFilterGroup<T>(filter))\r\n return `<strong>[ </strong>${this.groupToHtml(filter, columns, texts)}<strong> ]</strong>`;\r\n else\r\n return this.ruleToHtml(filter, columns, texts);\r\n });\r\n\r\n return parts.join(connector);\r\n }\r\n\r\n private static ruleToHtml<T>(rule: FilterRule<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const column = columns.find(column => column.key == rule.key);\r\n\r\n if (!column)\r\n return \"\";\r\n\r\n const key = `<i>${column.label}</i>`;\r\n const operator = rule.operator ? this.getOperatorLabel(rule.operator, texts).toLowerCase() : '';\r\n //const operator = rule.operator ?? '';\r\n const value = this.valueToHtml(rule.value, column);\r\n return `${key} ${operator} \"${value}\"`;\r\n }\r\n\r\n private static getOperatorLabel(operator: FilterOperator, texts: NgxEiffageTexts): string {\r\n const operatorLabels: Record<FilterOperator, string> = {\r\n '=': texts.advancedFilters.operators.equals,\r\n '<>': texts.advancedFilters.operators.notEquals,\r\n '>': texts.advancedFilters.operators.greaterThan,\r\n '>=': texts.advancedFilters.operators.greaterOrEquals,\r\n '<': texts.advancedFilters.operators.lessThan,\r\n '<=': texts.advancedFilters.operators.lessOrEquals,\r\n 'LIKE': texts.advancedFilters.operators.like\r\n };\r\n return operatorLabels[operator];\r\n }\r\n\r\n private static valueToHtml<T>(value: ColumnValue, column: PaginatedTableColumn<T>): string {\r\n switch (column.filterType) {\r\n case 'option':\r\n case 'option-multiple':\r\n if (isFilterOption(value))\r\n return value.label;\r\n\r\n const optionSelected = column.filterOptions?.find(option => option.value == value);\r\n return optionSelected?.label ?? '';\r\n case 'date':\r\n case 'date-range':\r\n const pipe = new DatePipe('es-ES');\r\n return pipe.transform(value as string, 'dd/MM/yyyy') ?? '';\r\n }\r\n\r\n return value as string;\r\n }\r\n\r\n static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[] {\r\n const result: DynamicFilter<T>[] = [];\r\n\r\n for (const group of advancedFilter.groups) {\r\n result.push(...this.mapGroupToDynamicFilters(group));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static mapGroupToDynamicFilters<T>(group: FilterGroup<T>): DynamicFilter<T>[] {\r\n const filters: DynamicFilter<T>[] = [];\r\n\r\n for (const f of group.filters) {\r\n if (this.isFilterGroup<T>(f)) {\r\n filters.push(...this.mapGroupToDynamicFilters(f));\r\n } else if (this.isFilterRule<T>(f) && f.key && f.operator && f.value !== undefined && f.value !== null) {\r\n filters.push({\r\n campo: f.key,\r\n operador: f.operator,\r\n valor: f.value?.toString(),\r\n conector: group.connector,\r\n grupo: group.id ?? 'root'\r\n });\r\n }\r\n }\r\n\r\n return filters;\r\n }\r\n\r\n\r\n static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T> {\r\n return {\r\n ...filter,\r\n groups: filter.groups.map(group => this.normalizeGroupForBackend(group))\r\n };\r\n }\r\n\r\n private static normalizeGroupForBackend<T>(group: FilterGroup<T>): FilterGroup<T> {\r\n return {\r\n ...group,\r\n filters: group.filters.map(f => {\r\n if (this.isFilterGroup(f)) {\r\n return this.normalizeGroupForBackend(f);\r\n }\r\n\r\n return this.normalizeRuleForBackend(f);\r\n })\r\n };\r\n }\r\n\r\n private static normalizeRuleForBackend<T>(rule: FilterRule<T>): FilterRule<T> {\r\n if (isFilterOption(rule.value)) {\r\n return {\r\n ...rule,\r\n value: rule.value.value\r\n };\r\n }\r\n\r\n return rule;\r\n }\r\n}\r\n","import { InjectionToken, Signal, signal } from \"@angular/core\";\r\n\r\n/**\r\n * Signal con el identificador del usuario actual. Se usa para aislar por usuario\r\n * la configuracion de columnas y los filtros avanzados guardados en localStorage.\r\n *\r\n * Si la aplicacion no lo provee, el valor por defecto es `undefined`, lo que\r\n * desactiva la persistencia: las tablas siguen funcionando, pero no recuerdan\r\n * la configuracion entre sesiones.\r\n */\r\nexport const USER_ID_FACTORY = new InjectionToken<Signal<string | null | undefined>>(\r\n 'USER_ID_FACTORY',\r\n {\r\n providedIn: 'root',\r\n factory: () => signal<string | null | undefined>(undefined)\r\n }\r\n);\r\n","import { FilterOption, FilterType } from \"./paginated-table-config\";\r\nimport { ColumnValue } from \"../models/column-value\";\r\n\r\nexport type FilterConnector = 'AND' | 'OR';\r\n\r\nexport type FilterOperator = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'LIKE';\r\n\r\nexport interface AdvancedFilter<T> {\r\n name: string;\r\n groups: FilterGroup<T>[];\r\n}\r\n\r\nexport interface FilterGroup<T> {\r\n id?: string;\r\n connector: FilterConnector;\r\n filters: (FilterRule<T> | FilterGroup<T>)[];\r\n}\r\n\r\nexport interface FilterRule<T> {\r\n id?: string;\r\n key?: keyof T;\r\n operator?: FilterOperator;\r\n value?: ColumnValue;\r\n}\r\n\r\nexport const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]> = {\r\n number: ['=', '<>', '>', '>=', '<', '<='],\r\n text: ['=', 'LIKE', '<>'],\r\n option: ['=', '<>'],\r\n 'option-multiple': ['=', '<>'], //Actuara como un option\r\n date: ['=', '<>', '>', '>=', '<', '<='],\r\n 'date-range': ['=', '<>', '>', '>=', '<', '<='] //Actuara como un date normal\r\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { USER_ID_FACTORY } from '../models';\r\nimport { AdvancedFilter } from '../models/advanced-filter';\r\nimport { AdvancedFilterUtils } from '../models/advanced-filter-utils';\r\nimport { DynamicFilter } from '../models/dynamic-filter';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdvancedFilterService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG = 'advanced_filter';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG}_${userId}`;\r\n });\r\n\r\n private _advancedFilters = signal<Record<string, AdvancedFilter<any>[]>>({});\r\n advancedFilters = this._advancedFilters.asReadonly();\r\n\r\n private setAdvancedFiltersEffect = effect(() => {\r\n this.setAdvancedFilter();\r\n });\r\n\r\n constructor() {\r\n this.setAdvancedFilter();\r\n }\r\n\r\n private setAdvancedFilter() {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const recordAdvancedFitler = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordAdvancedFitler) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const advancedFilters: Record<string, AdvancedFilter<any>[]> = JSON.parse(recordAdvancedFitler);\r\n\r\n this._advancedFilters.set(advancedFilters);\r\n }\r\n\r\n saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const index = currentArray.findIndex(f => f.groups[0].id === advancedFilter.groups[0].id);\r\n let newArray: AdvancedFilter<any>[];\r\n if (index >= 0) { //Si existe, lo reemplazamos\r\n newArray = [...currentArray];\r\n newArray[index] = advancedFilter;\r\n } else { // Si no existe, lo añadimos\r\n newArray = [...currentArray, advancedFilter];\r\n }\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const newArray = currentArray.filter(f => f.groups[0].id !== advancedFilter.groups[0].id);\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend: boolean = true): AdvancedFilter<any> | undefined {\r\n const allAdvancedFiltersByTable = this._advancedFilters()[tableId];\r\n\r\n if (!allAdvancedFiltersByTable)\r\n return undefined;\r\n\r\n const advancedFilter = allAdvancedFiltersByTable.find(advancedFilter => {\r\n return advancedFilter.groups?.[0].id !== undefined && advancedFilter.groups[0].id == advancedFilterId;\r\n });\r\n\r\n if (!normalizeForBackend)\r\n return advancedFilter;\r\n\r\n if (!advancedFilter)\r\n return undefined;\r\n\r\n return AdvancedFilterUtils.normalizeAdvancedFilterForBackend(advancedFilter);\r\n }\r\n\r\n getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[] {\r\n const advancedFilter = this.getAdvancedFilterById(tableId, advancedFilterId);\r\n\r\n if (!advancedFilter)\r\n return [];\r\n\r\n return AdvancedFilterUtils.mapToDynamicFilter(advancedFilter);\r\n }\r\n}\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { ColumnConfig } from '../models/configure-table-column-data';\r\nimport { USER_ID_FACTORY } from '../models';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColumnConfigService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG = 'column_config';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_COLUMN_CONFIG}_${userId}`;\r\n });\r\n\r\n private _columnConfigs = signal<Record<string, ColumnConfig<any>[]>>({});\r\n columnConfigs = this._columnConfigs.asReadonly();\r\n\r\n private setColumnConfigEffect = effect(() => {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const recordColumnConfig = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordColumnConfig) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const columnConfigs: Record<string, ColumnConfig<any>[]> = JSON.parse(recordColumnConfig);\r\n\r\n this._columnConfigs.set(columnConfigs);\r\n });\r\n\r\n saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue = {\r\n ...currentValue,\r\n [tableId]: columnConfig\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteColumnConfig(tableId: string): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue: Record<string, ColumnConfig<any>[]> = { ...currentValue };\r\n delete newValue[tableId];\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n","import { inject, Injectable, PLATFORM_ID, Signal, signal } from '@angular/core';\r\nimport { fromEvent, map, startWith } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Pantalla } from '../models/pantalla';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatosPantallaService {\r\n\r\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n //En servidor no existe window, asi que se devuelve undefined en lugar de romper\r\n pantalla: Signal<Pantalla | undefined> = this.isBrowser\r\n ? toSignal(\r\n fromEvent(window, 'resize').pipe(\r\n startWith(this.obtenerDatosPantalla()),\r\n map(() => this.obtenerDatosPantalla())\r\n )\r\n )\r\n : signal<Pantalla | undefined>(undefined);\r\n\r\n private obtenerDatosPantalla(): Pantalla {\r\n let pantalla: Pantalla = {\r\n tipo: 'escritorio',\r\n ancho: window.innerWidth,\r\n alto: window.innerHeight\r\n }\r\n\r\n if (pantalla.ancho < 600) {\r\n pantalla.tipo = 'movil';\r\n return pantalla;\r\n }\r\n\r\n if (pantalla.ancho < 950) {\r\n pantalla.tipo = 'tablet';\r\n return pantalla;\r\n }\r\n\r\n return pantalla;\r\n }\r\n\r\n}\r\n","import { inject, Injectable, TemplateRef, Type } from \"@angular/core\";\nimport { MatDialog, MatDialogConfig } from \"@angular/material/dialog\";\nimport { Observable } from \"rxjs\";\nimport { DialogBodyConfig, DialogBodyType, DialogConfig, NgxDialogTemplateContext } from \"../models/dialog-config\";\nimport { NgxDialog } from \"../components\";\nimport { NgxTexts } from \"../i18n\";\n\n/** Opciones comunes a todos los diálogos. */\ninterface DialogHeaderOptions {\n title: string;\n subtitle?: string;\n icon?: string;\n iconColor?: string;\n cancelText?: string;\n confirmText?: string;\n showCancel?: boolean;\n showConfirm?: boolean;\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\n destructive?: boolean;\n /**\n * Muestra la X de cerrar en el encabezado; cerrar con ella devuelve undefined, igual que Esc.\n * Por defecto true, salvo si dialogConfig.disableClose es true.\n */\n showClose?: boolean;\n}\n\n/**\n * Ancho mínimo por defecto: 400px, pero nunca más que la pantalla menos un margen\n * (un 400px fijo se salía de los móviles).\n */\nconst DEFAULT_MIN_WIDTH = 'min(400px, calc(100vw - 32px))';\n\n/**\n * Abre diálogos de Material con una estructura común: título con icono opcional, subtítulo,\n * cuerpo (texto, HTML, componente o plantilla) y botones de cancelar/confirmar.\n *\n * Todos devuelven un Observable que emite al cerrarse y completa:\n * - `true` (o el resultado fijado por el contenido) si se confirma,\n * - `false` si se cancela,\n * - `undefined` si se cierra sin pulsar ningún botón (Esc o clic fuera).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxDialogService {\n private readonly _dialog = inject(MatDialog);\n private readonly _texts = inject(NgxTexts).texts;\n\n /** Diálogo con un texto. Base de `confirm()` e `info()`. */\n openText(\n config: DialogHeaderOptions & { content: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { content, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.TEXT, content }, dialogConfig);\n }\n\n /** Pregunta de confirmación con botones de cancelar y confirmar. */\n confirm(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n cancelText: config.cancelText ?? this._texts().dialog.cancel,\n confirmText: config.confirmText ?? this._texts().dialog.confirm,\n }, dialogConfig);\n }\n\n /** Aviso informativo con un único botón. */\n info(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm' | 'cancelText'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n showCancel: false,\n confirmText: config.confirmText ?? this._texts().dialog.accept,\n }, dialogConfig);\n }\n\n /**\n * Diálogo con HTML. Angular sanea el HTML: se quitan scripts, estilos en línea y atributos\n * peligrosos. Para contenido con interacción, usa `component()` o `template()`.\n */\n html(\n config: DialogHeaderOptions & { html: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { html, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.HTML, content: html }, dialogConfig);\n }\n\n /**\n * Diálogo con un componente propio. El componente recibe `componentData` por su input `data`\n * y puede inyectar `NgxDialogContext<R>` para devolver un resultado (`result`), cerrar\n * (`close()`) o deshabilitar el botón de confirmar (`confirmDisabled`).\n */\n component<T = any, R = boolean>(\n config: DialogHeaderOptions & { component: Type<any>; componentData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { component, componentData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.COMPONENT, content: component, data: componentData }, dialogConfig);\n }\n\n /**\n * Diálogo con una plantilla. La plantilla recibe `templateData` como `$implicit` y el contexto\n * del diálogo como `dialog` (`let-data let-dialog=\"dialog\"`).\n */\n template<T = any, R = boolean>(\n config: DialogHeaderOptions & { template: TemplateRef<NgxDialogTemplateContext<T, R>> | TemplateRef<{ $implicit: T }> | TemplateRef<T>; templateData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { template, templateData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.TEMPLATE, content: template, data: templateData }, dialogConfig);\n }\n\n private _open<R>(\n header: DialogHeaderOptions,\n body: DialogBodyConfig,\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const data: DialogConfig = { ...header, body };\n return this._dialog.open<NgxDialog, DialogConfig, R | boolean>(NgxDialog, {\n ...dialogConfig,\n data,\n minWidth: dialogConfig?.minWidth ?? DEFAULT_MIN_WIDTH,\n autoFocus: dialogConfig?.autoFocus ?? false,\n }).afterClosed();\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { DateRange } from '@angular/material/datepicker';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport moment from 'moment';\r\nimport { ConfigureTableColumnData, ColumnConfig } from '../../../models/configure-table-column-data';\r\nimport { ColumnConfigService } from '../../../services/column-config.service';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { isFilterOption } from '../../../models';\r\n\r\n@Component({\r\n selector: 'lib-configure-table-columns',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatIconModule,\r\n MatSlideToggleModule,\r\n CdkDropList,\r\n CdkDrag,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './configure-table-columns.component.html',\r\n styleUrl: './configure-table-columns.component.scss',\r\n})\r\nexport class ConfigureTableColumnsComponent<T> {\r\n columnConfigService = inject(ColumnConfigService);\r\n dialogRef = inject(MatDialogRef<ConfigureTableColumnsComponent<T>>);\r\n data = inject<ConfigureTableColumnData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = signal(this.data.columns);\r\n isConfirmDisabled = computed(() => {\r\n const allDisabled = this.columns().every(column => !column.show);\r\n const someHasFilter = this.columns().some(column => this.hasFilterAndDisabled(column));\r\n return allDisabled || someHasFilter;\r\n });\r\n\r\n startAnimationTimeout?: number = undefined;\r\n endAnimationTimeout?: number = undefined;\r\n animationTime: number = 250;\r\n animationIndex = signal<number | undefined>(undefined);\r\n\r\n hasFilterAndDisabled(column: ColumnConfig<T>): boolean {\r\n const value = this.data.filtersValue[column.key];\r\n if (Array.isArray(value))\r\n return value.length > 0 && !column.show;\r\n\r\n if (typeof value === 'string')\r\n return value.length > 0 && !column.show;\r\n\r\n if (value instanceof DateRange)\r\n return (value.start != null || value.end != null) && !column.show;\r\n\r\n if (moment.isMoment(value))\r\n return !column.show;\r\n\r\n if (isFilterOption(value))\r\n return !column.show;\r\n\r\n return false;\r\n }\r\n\r\n onUpClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index > 0) {\r\n [cols[index - 1], cols[index]] = [cols[index], cols[index - 1]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDownClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index < cols.length - 1) {\r\n [cols[index], cols[index + 1]] = [cols[index + 1], cols[index]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<any, any, any>) {\r\n const cols = [...this.columns()];\r\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\r\n this.columns.set(cols);\r\n }\r\n\r\n onToggleChange(columnClicked: ColumnConfig<T>) {\r\n this.columns.update(value => {\r\n return value.map(column => {\r\n if (column.key == columnClicked.key)\r\n return { ...column, show: !column.show };\r\n else\r\n return column;\r\n });\r\n });\r\n }\r\n\r\n onPinClick(columnConfig: ColumnConfig<T>, index: number) {\r\n const columns = [...this.columns()];\r\n const currentSticky = columns.find(c => c.isSticky);\r\n\r\n if (columnConfig.key == currentSticky?.key) {\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: false\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n return;\r\n }\r\n\r\n clearTimeout(this.startAnimationTimeout);\r\n clearTimeout(this.endAnimationTimeout);\r\n this.animationIndex.set(undefined);\r\n\r\n this.animationIndex.set(index);\r\n\r\n this.startAnimationTimeout = setTimeout(() => {\r\n moveItemInArray(columns, index, 0);\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: c.key == columnConfig.key\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n this.animationIndex.set(0);\r\n this.endAnimationTimeout = setTimeout(() => this.animationIndex.set(undefined), this.animationTime)\r\n }, this.animationTime);\r\n }\r\n\r\n onConfirmClick() {\r\n this.columnConfigService.saveColumnConfig(this.data.tableId, this.columns());\r\n this.dialogRef.close();\r\n }\r\n\r\n onResetClick() {\r\n this.columnConfigService.deleteColumnConfig(this.data.tableId);\r\n this.dialogRef.close();\r\n }\r\n}\r\n","<h2 mat-dialog-title>{{texts().columnsDialog.title}} {{data.tableName| lowercase}}</h2>\r\n<mat-dialog-content>\r\n\r\n <div class=\"columnsList\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n @for (column of columns(); track $index; let first = $first; let last = $last;) {\r\n <div \r\n class=\"columnContainer\" \r\n cdkDrag \r\n [class.pinned]=\"$index == animationIndex()\"\r\n [style]=\"{ transition: `background-color ${animationTime}ms ease` }\">\r\n\r\n <div class=\"labelContainer\">\r\n <mat-icon>drag_indicator</mat-icon>\r\n <p class=\"label\">\r\n {{data.columnsLabels[column.key] ?? ''}}\r\n @if(hasFilterAndDisabled(column)) {\r\n <span> {{texts().columnsDialog.hasFiltersApplied}}</span>\r\n }\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button \r\n matIconButton\r\n [matTooltip]=\"column.isSticky ? texts().columnsDialog.unpin : texts().columnsDialog.pin\"\r\n (click)=\"onPinClick(column, $index)\">\r\n <mat-icon>{{column.isSticky ? 'keep_off' : 'keep'}}</mat-icon>\r\n </button>\r\n\r\n <button [matTooltip]=\"texts().columnsDialog.moveUp\" matIconButton [disabled]=\"$first\" (click)=\"onUpClick($index)\"><mat-icon>keyboard_arrow_up</mat-icon></button>\r\n <button [matTooltip]=\"texts().columnsDialog.moveDown\" matIconButton [disabled]=\"$last\" (click)=\"onDownClick($index)\"><mat-icon>keyboard_arrow_down</mat-icon></button>\r\n <mat-slide-toggle [checked]=\"column.show\" (toggleChange)=\"onToggleChange(column)\"></mat-slide-toggle>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p class=\"note\"><span>{{texts().columnsDialog.note}}</span> {{texts().columnsDialog.hideColumnWithFiltersNote}}</p>\r\n \r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton (click)=\"onResetClick()\">{{texts().columnsDialog.reset}}</button>\r\n <button matButton [disabled]=\"isConfirmDisabled()\" (click)=\"onConfirmClick()\">{{texts().common.confirm}}</button>\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, OnDestroy, WritableSignal, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule,\r\n MatProgressBarModule\r\n ],\r\n templateUrl: './ngx-paginated-searchable-select.component.html',\r\n styleUrl: './ngx-paginated-searchable-select.component.scss',\r\n})\r\nexport class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, OnDestroy {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n } as U\r\n )\r\n );\r\n optionLabel = input<((option: T) => string)>(\r\n (o: T) => {\r\n if (isFilterOption(o))\r\n return o.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n compareWith = input<(o1: T, o2: T) => boolean>(\r\n (o1: T, o2: T) => {\r\n if (!o2)\r\n return false;\r\n\r\n if (isFilterOption(o1) && isFilterOption(o2))\r\n return o1.value == o2.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<T | T[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<T | T[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n private queryTimeout: number | undefined = undefined;\r\n private readonly debounceTime = 300;\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: T | T[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: T | T[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: T | T[] | undefined) => 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._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n\r\n protected options = signal<T[]>([]);\r\n\r\n setOptions = effect(() => {\r\n const paginatedRecords = this.dataResource.value();\r\n const pageNumber = this.filters()().pageNumber;\r\n\r\n if (!paginatedRecords)\r\n return;\r\n\r\n if (pageNumber > 1)\r\n this.options.update((oldValue: T[]) => [...oldValue, ...paginatedRecords.items]);\r\n else\r\n this.options.set(paginatedRecords.items);\r\n });\r\n /*protected options = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.records;\r\n });*/\r\n\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n this.onQueryChange();\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected onQueryChange() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n const query = searcher.nativeElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime);\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<T | T[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected optionsSelectedForView(): T[] {\r\n const innerControl = this.innerControl();\r\n\r\n if (!innerControl.value)\r\n return [];\r\n\r\n if (Array.isArray(innerControl.value))\r\n return innerControl.value;\r\n\r\n return [innerControl.value];\r\n };\r\n\r\n protected onMoreClick() {\r\n this.filters().update((value: U) => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageNumber + 1\r\n };\r\n });\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{ selectLabel() }}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\"\r\n [compareWith]=\"compareWith()\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\"\r\n [value]=\"filters()().query ?? ''\" \r\n (input)=\"onQueryChange()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\" />\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option [value]=\"option\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Es MUY importante que estos vayan los ultimos (al final de todas las opciones). -->\r\n @for (option of optionsSelectedForView(); track $index) {\r\n <mat-option [value]=\"option\" class=\"hideOption\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Si es multiple, como no esta el option de resetear, si filtran y no hay opciones, y luego cierran el select el desplegable no se abre y queda inutilizado, por eso, ponemos esta opcion dummy, que siempre esta oculta, y no hace nada, pero ya hace que haya un item, y el desplegable se abra -->\r\n @if(multiple()) {\r\n <mat-option class=\"hideOption\" dummyOption></mat-option>\r\n }\r\n\r\n @if (total() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n\r\n @if((filters()().pageNumber * filters()().pageSize) < total() && !dataResource.isLoading()) {\r\n <button matButton=\"text\" class=\"showMore\" (click)=\"onMoreClick()\">\r\n {{ texts().select.showMore }}\r\n </button>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","import { AfterViewInit, Component, ElementRef, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n\r\n@Component({\r\n selector: 'ngx-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-searchable-select.component.html',\r\n styleUrl: './ngx-searchable-select.component.scss',\r\n})\r\nexport class SearchableSelectComponent<T> implements ControlValueAccessor, AfterViewInit {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n options = input.required<T[]>();\r\n optionLabel = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n optionValue = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionValue\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<string | string[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<string | string[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: string | string[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: string | string[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: string | string[] | undefined) => 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._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n /*if (open)\r\n this.cleanQuery();*/\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n setTimeout(() => {\r\n searcher.nativeElement.focus();\r\n });\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected showOption(option: T): boolean {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const label = this.optionLabel()(option);\r\n return includeNoSensible(label, query);\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<string | string[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected numberOfResults(): number {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const optionLabel = this.optionLabel();\r\n const results = this.options().filter((option) => {\r\n const label = optionLabel(option);\r\n return includeNoSensible(label, query);\r\n });\r\n return results.length;\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{selectLabel()}}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option \r\n [value]=\"optionValue()(option)\"\r\n [class.hideOption]=\"!showOption(option)\">\r\n {{optionLabel()(option)}}\r\n </mat-option>\r\n }\r\n\r\n @if (numberOfResults() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{error()}}</mat-error>\r\n</mat-form-field>","import { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { PaginatedTableConfig, OPERATOR_BY_FILTER_TYPE, FilterOperator, FilterType, PaginatedTableColumn, FilterOption, PaginatedFilter } from '../../../models';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../../../components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../../../components/ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-rule',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatTooltipModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './advanced-filter-rule.component.html',\r\n styleUrl: './advanced-filter-rule.component.scss',\r\n})\r\nexport class AdvancedFilterRuleComponent<T> {\r\n rule = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n deleteFilter = output<string>();\r\n\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = computed(() => this.config().columns.filter(column => column.filterType != undefined));\r\n operatorByFilterType = OPERATOR_BY_FILTER_TYPE;\r\n \r\n filterOperatorLabel = computed<Record<FilterOperator, string>>(() => ({\r\n '=': this.texts().advancedFilters.operators.equals,\r\n '<>': this.texts().advancedFilters.operators.notEquals,\r\n '>': this.texts().advancedFilters.operators.greaterThan,\r\n '>=': this.texts().advancedFilters.operators.greaterOrEquals,\r\n '<': this.texts().advancedFilters.operators.lessThan,\r\n '<=': this.texts().advancedFilters.operators.lessOrEquals,\r\n 'LIKE': this.texts().advancedFilters.operators.like\r\n }));\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n getRuleId(): string {\r\n return (this.rule().get('id')! as FormControl).value;\r\n }\r\n\r\n getKey(): FormControl {\r\n return this.rule().get('key')! as FormControl\r\n }\r\n\r\n getOperator(): FormControl {\r\n return this.rule().get('operator')! as FormControl\r\n }\r\n\r\n getValue(): FormControl {\r\n return this.rule().get('value')! as FormControl\r\n }\r\n\r\n getColumnSelected(value: keyof T): PaginatedTableColumn<T> | undefined {\r\n return this.columns().find(column => column.key == value);\r\n }\r\n\r\n getOperatorsOption(value: keyof T): FilterOperator[] {\r\n const columnSelected = this.getColumnSelected(value);\r\n\r\n if (!columnSelected || !columnSelected.filterType)\r\n return [];\r\n\r\n return this.operatorByFilterType[columnSelected.filterType];\r\n }\r\n\r\n getFilterType(value: keyof T): FilterType | undefined {\r\n const columnSelected = this.getColumnSelected(value);\r\n return columnSelected?.filterType;\r\n }\r\n\r\n onKeyChange(_?: string | string[]) {\r\n this.getOperator().setValue(null);\r\n this.getValue().setValue(null);\r\n }\r\n\r\n keyOptionLabel = (column: PaginatedTableColumn<T>): string => column.label\r\n keyOptionValue = (column: PaginatedTableColumn<T>): string => column.key as string\r\n\r\n operatorOptionLabel = (filterOperator: FilterOperator): string => this.filterOperatorLabel()[filterOperator];\r\n operatorOptionValue = (filterOperator: FilterOperator): string => filterOperator;\r\n}\r\n\r\n","<button \n matIconButton \n [matTooltip]=\"texts().advancedFilters.deleteFilter\" \n (click)=\"deleteFilter.emit(getRuleId())\"\n class=\"deleteButton\"\n type=\"button\">\n <mat-icon>delete</mat-icon>\n</button>\n\n<ngx-searchable-select\n [formControl]=\"getKey()\"\n [options]=\"columns()\"\n [optionLabel]=\"keyOptionLabel\"\n [optionValue]=\"keyOptionValue\"\n (optionChange)=\"onKeyChange($event)\"\n [selectLabel]=\"texts().advancedFilters.field\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n<ngx-searchable-select\n [formControl]=\"getOperator()\"\n [options]=\"getOperatorsOption(getKey().value)\"\n [optionLabel]=\"operatorOptionLabel\"\n [optionValue]=\"operatorOptionValue\"\n [selectLabel]=\"texts().advancedFilters.condition\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n@if (getFilterType(getKey().value) == 'text' || getFilterType(getKey().value) == 'number') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input [formControl]=\"getValue()\" [type]=\"getFilterType(getKey().value) ?? 'text'\" matInput>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n@if (getFilterType(getKey().value) == 'option' || getFilterType(getKey().value) == 'option-multiple') {\n @if(getColumnSelected(getKey().value)?.endpointForPaginatedFilterOptions) {\n <ngx-paginated-searchable-select \n [formControl]=\"getValue()\"\n [endpoint]=\"getColumnSelected(getKey().value)!.endpointForPaginatedFilterOptions!\"\n [filters]=\"getColumnSelected(getKey().value)!.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n } @else {\n <ngx-searchable-select\n [formControl]=\"getValue()\"\n [options]=\"getColumnSelected(getKey().value)?.filterOptions ?? []\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n }\n}\n\n@if(getFilterType(getKey().value) == 'date' || getFilterType(getKey().value) == 'date-range') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input\n [formControl]=\"getValue()\"\n matInput \n [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PaginatedTableConfig, FilterOption } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { DatosPantallaService } from '../../../services/datos-pantalla.service';\r\nimport { AdvancedFilterRuleComponent } from '../advanced-filter-rule/advanced-filter-rule.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-group',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n AdvancedFilterRuleComponent,\r\n MatButtonToggleModule,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './advanced-filter-group.component.html',\r\n styleUrl: './advanced-filter-group.component.scss',\r\n})\r\nexport class AdvancedFilterGroupComponent<T> {\r\n isRootNode = input.required<boolean>();\r\n group = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n addGroup = output<string>();\r\n addFilter = output<string>();\r\n deleteGroup = output<string>();\r\n deleteFilter = output<string>();\r\n\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n readonly texts = inject(NgxTexts).texts;\r\n isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n optionsFilterConnector = computed<FilterOption[]>(() => [\r\n { value: 'AND', label: this.texts().advancedFilters.and },\r\n { value: 'OR', label: this.texts().advancedFilters.or }\r\n ]);\r\n\r\n isFilterGroupForm(group: AbstractControl): boolean {\r\n return AdvancedFilterUtils.isFilterGroupForm(group);\r\n }\r\n\r\n getConnector(): FormControl {\r\n return this.group().get('connector')! as FormControl\r\n }\r\n\r\n getGroupId(): string {\r\n return (this.group().get('id')! as FormControl).value;\r\n }\r\n\r\n getFilters(): FormGroup[] {\r\n return (this.group().get('filters') as FormArray).controls as FormGroup[];\r\n }\r\n}\r\n","<div class=\"grupo\" [formGroup]=\"group()\">\r\n \r\n <mat-button-toggle-group [formControl]=\"getConnector()\">\r\n @for (option of optionsFilterConnector(); track option.value) {\r\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\r\n }\r\n </mat-button-toggle-group>\r\n\r\n @if (isDesktop()) {\r\n <button \r\n matButton=\"outlined\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n {{texts().advancedFilters.addFilter}}\r\n </button>\r\n\r\n <button \r\n matButton=\"outlined\"\r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n {{texts().advancedFilters.addGroup}}\r\n </button>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addFilter\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addGroup\" \r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n </button>\r\n }\r\n \r\n\r\n @if(!isRootNode()) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteGroup\" \r\n (click)=\"deleteGroup.emit(getGroupId())\"\r\n class=\"deleteGroupButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (group of getFilters(); track $index) {\r\n @if(isFilterGroupForm(group)) {\r\n <lib-advanced-filter-group \r\n [group]=\"group\"\r\n [config]=\"config()\"\r\n [isRootNode]=\"false\"\r\n (addGroup)=\"addGroup.emit($event)\"\r\n (addFilter)=\"addFilter.emit($event)\"\r\n (deleteGroup)=\"deleteGroup.emit($event)\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n } @else {\r\n <lib-advanced-filter-rule \r\n [rule]=\"group\"\r\n [config]=\"config()\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n }\r\n }\r\n\r\n</div>","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { FilterGroup, FilterRule } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { ConfigureAdvancedFilterData } from '../../../models/configure-advanced-filter-data';\r\nimport { AdvancedFilterService } from '../../../services/advanced-filter.service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SendType } from '../../../models/send-type';\r\nimport { AdvancedFilterGroupComponent } from '../advanced-filter-group/advanced-filter-group.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-configure-advanced-filter',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n AdvancedFilterGroupComponent\r\n ],\r\n templateUrl: './configure-advanced-filter.component.html',\r\n styleUrl: './configure-advanced-filter.component.scss',\r\n})\r\nexport class ConfigureAdvancedFilterComponent<T> { \r\n private readonly fb = inject(FormBuilder);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n dialogRef = inject(MatDialogRef<ConfigureAdvancedFilterComponent<T>>);\r\n data = inject<ConfigureAdvancedFilterData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n query = signal('');\r\n\r\n form = AdvancedFilterUtils.createAdvancedFilter<T>(this.fb, this.data.advancedFilter);\r\n formChanges = toSignal(this.form.valueChanges);\r\n\r\n mapFormToAdvancedFilterEffect = effect(() => {\r\n const values = this.formChanges();\r\n\r\n if (this.form.invalid) {\r\n this.query.set('');\r\n return;\r\n }\r\n\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const queryString = AdvancedFilterUtils.groupsToReadableHtml(advancedFilter.groups, this.data.config.columns, this.texts());\r\n this.query.set(queryString);\r\n });\r\n\r\n getRootGroup(): FormGroup {\r\n return (this.form.get('groups') as FormArray).controls[0] as FormGroup;\r\n }\r\n\r\n addGroup(groupId: string) {\r\n const newGroup: FilterGroup<T> = {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [\r\n { id: uuidv4() }\r\n ]\r\n };\r\n AdvancedFilterUtils.addGroupToGroup<T>(this.fb, this.form, groupId, newGroup);\r\n }\r\n\r\n addFilter(groupId: string) {\r\n const newRule: FilterRule<T> = { id: uuidv4() };\r\n AdvancedFilterUtils.addRuleToGroup<T>(this.fb, this.form, groupId, newRule);\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n AdvancedFilterUtils.deleteGroup<T>(this.form, groupId);\r\n }\r\n\r\n deleteFilter(ruleId: string) {\r\n AdvancedFilterUtils.deleteRule<T>(this.form, ruleId);\r\n }\r\n\r\n onSubmit(sendType: SendType) {\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const tableId = this.data.config.tableId;\r\n this.advancedFilterService.saveAdvancedFilter(tableId, advancedFilter);\r\n switch (sendType) {\r\n case 'save':\r\n this.dialogRef.close();\r\n break;\r\n case 'save_and_apply':\r\n this.dialogRef.close(advancedFilter);\r\n break;\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit('save_and_apply')\">\r\n\r\n <h2 mat-dialog-title>{{texts().advancedFilters.dialogTitle}} {{data.config.title() | lowercase}}</h2>\r\n <mat-dialog-content>\r\n\r\n <p class=\"advancedFilterResult\" [innerHTML]=\"query()\" [style.visibility]=\"query() ? 'visible': 'hidden'\"></p>\r\n\r\n <mat-form-field>\r\n <mat-label>{{texts().advancedFilters.templateName}}</mat-label>\r\n <input matInput formControlName=\"name\" [maxlength]=\"16\">\r\n <mat-hint>{{form.get('name')?.value.length ?? 0}}/16</mat-hint>\r\n <mat-error>{{texts().advancedFilters.templateNameRequired}}</mat-error>\r\n </mat-form-field>\r\n\r\n <lib-advanced-filter-group \r\n [group]=\"getRootGroup()\"\r\n [config]=\"data.config\"\r\n [isRootNode]=\"true\"\r\n (addGroup)=\"addGroup($event)\"\r\n (addFilter)=\"addFilter($event)\"\r\n (deleteGroup)=\"deleteGroup($event)\"\r\n (deleteFilter)=\"deleteFilter($event)\"\r\n />\r\n\r\n <div class=\"helperContainer\">\r\n <p class=\"helperTitle\"><strong>{{texts().advancedFilters.helpTitle}}</strong></p>\r\n <p class=\"helper\">\r\n <strong>{{texts().advancedFilters.group}} </strong>{{texts().advancedFilters.groupHelp}}<br>\r\n <strong>{{texts().advancedFilters.filter}} </strong>{{texts().advancedFilters.ruleHelp}}\r\n </p>\r\n </div>\r\n \r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save')\">{{texts().common.save}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save_and_apply')\">{{texts().common.saveAndApply}}</button>\r\n </mat-dialog-actions>\r\n\r\n\r\n</form>","import { CommonModule } from '@angular/common';\nimport { Component, computed, HostListener, inject, input, OnDestroy, output, Signal, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { OnlyUpperFirstCharacterPipe } from '../../pipes/only-upper-first-character.pipe';\nimport { Observable } from 'rxjs';\nimport { ColumnPipe, FilterOption, isFilterOption, PaginatedTableColumn, PaginatedTableConfig, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport moment from 'moment';\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { AdvancedFilter, PaginatedFilter, PaginatedItems } from '../../models';\nimport { AdvancedFilterUtils } from '../../models/advanced-filter-utils';\nimport { ColumnValue } from '../../models/column-value';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { AdvancedFilterService } from '../../services/advanced-filter.service';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { v4 as uuidv4 } from 'uuid';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { ConfigureAdvancedFilterData } from '../../models/configure-advanced-filter-data';\nimport { ConfigureAdvancedFilterComponent } from '../../common/components/configure-advanced-filter/configure-advanced-filter.component';\nimport { NgxTexts } from '../../i18n';\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\n\n@Component({\n selector: 'ngx-paginated-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n OnlyUpperFirstCharacterPipe,\n MatCheckboxModule,\n PaginatedSearchableSelectComponent,\n SearchableSelectComponent\n ],\n templateUrl: './ngx-paginated-table.component.html',\n styleUrl: './ngx-paginated-table.component.scss',\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDestroy {\n \n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly advancedFilterService = inject(AdvancedFilterService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n\n // Inyectar el servicio de internacionalización.\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\n // el override sigue siendo posible sin necesidad de instanciarlo a mano.\n readonly texts = inject(NgxTexts).texts;\n\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n pageNumber: 1,\n pageSize: 10,\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined,\n advancedFilterId: undefined\n } as U\n )\n );\n\n config = input.required<WritableSignal<PaginatedTableConfig<T>>>();\n\n protected createClick = output<void>();\n protected updateClick = output<T>();\n protected deleteClick = output<T>();\n protected rowActionClick = output<RowActionClickEvent<T>>();\n protected expandedItemChange = output<T | null>();\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\n\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n protected readonly debounceTime = 300;\n dataResource = rxResource<PaginatedItems<T>, U>({\n params: () => this.filters()(),\n stream: ({ params }) => {\n const endpointPaginated = this.endpoint();\n return endpointPaginated(params);\n },\n defaultValue: { total: 0, items: [] }\n });\n protected data = computed(() => {\n if (this.dataResource.error())\n return [];\n\n const value = this.dataResource.value();\n return value.items;\n });\n protected total = computed(() => {\n if (this.dataResource.error())\n return 0;\n\n const value = this.dataResource.value();\n return value.total\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType) && !configValue.showAdvancedFilters;\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n //En la tabla paginada el total general solo puede calcularlo el consumidor,\n //asi que sin getTotalGeneral la fila quedaria vacia\n return keys.some(key => {\n const column = columns.find(column => key == column.key);\n return column?.showTotalGeneral && !!column.getTotalGeneral;\n });\n });\n\n protected queryTimeout: number | undefined = undefined;\n\n protected timeoutsByKey: Partial<Record<keyof T, number>> = {}\n\n protected advancedFilters: Signal<AdvancedFilter<T>[]> = computed(() => {\n const allTablesAdvancedFilters = this.advancedFilterService.advancedFilters();\n const tableId = this.config()().tableId;\n //Si la tabla todavia no tiene filtros guardados, la clave no existe en el record\n return allTablesAdvancedFilters[tableId] ?? [];\n });\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n protected selection = signal<T[]>([]);\n\n protected isFullScreen = signal(false);\n private readonly overlay = inject(Overlay);\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly viewContainerRef = inject(ViewContainerRef);\n tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n @HostListener('document:keydown.escape')\n onEscape() {\n if (this.overlayRef && this.isMyOverlayOnTop())\n this.exitFullscreen();\n }\n\n ngOnDestroy(): void {\n //Limpiamos timeout de filtro query\n if (this.queryTimeout !== undefined)\n clearTimeout(this.queryTimeout);\n\n //Limpiamos todos los timeouts de filtros tipo texto de columnas\n Object.keys(this.timeoutsByKey).forEach((key) => {\n const timeout = this.timeoutsByKey[key as keyof T]\n clearTimeout(timeout);\n });\n }\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n protected onPageChange(event: PageEvent) {\n this.filters().update(value => {\n return {\n ...value,\n pageNumber: value.pageSize == event.pageSize ? event.pageIndex + 1 : 1,\n pageSize: event.pageSize\n };\n });\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n\n if (this.queryTimeout !== undefined)\n clearTimeout(this.queryTimeout);\n\n this.queryTimeout = setTimeout(() => {\n this.filters().update((value: U) => {\n return { ...value, query: query, pageNumber: 1 };\n });\n }, this.debounceTime)\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n pageNumber: 1,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n return this.config()().update\n && this.config()().clickOnRowForUpdate\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\n && !this.config()().update?.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onTextFilterColumnChange(column: PaginatedTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n\n //Si existe, limpio el anterior\n if (column.key in this.timeoutsByKey)\n clearTimeout(this.timeoutsByKey[column.key]);\n\n this.timeoutsByKey[column.key] = setTimeout(() => {\n this.onColumnFilterChange(column.key, query);\n }, this.debounceTime);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: PaginatedTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: PaginatedTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: PaginatedTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: PaginatedTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\n if (!pipes)\n return value;\n\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\n\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\n }\n\n\n protected onNewAdvancedFiltersClick() {\n const data: ConfigureAdvancedFilterData<T> = {\n config: this.config()(),\n advancedFilter: {\n name: '',\n groups: [\n {\n id: uuidv4(),\n connector: 'AND',\n filters: [{ id: uuidv4() }]\n }\n ]\n }\n };\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\n\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\n if (advancedFilter)\n this.onApplyTemplateClick(advancedFilter);\n });\n }\n\n protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>) {\n const advancedFilterId: string | undefined = advancedFilter?.groups?.[0].id;\n this.filters().update(currentValue => {\n return {\n ...currentValue,\n advancedFilterId: advancedFilterId,\n pageNumber: 1\n };\n });\n }\n\n protected onSelectedAdvancedFilterUpdate(event: Event) {\n const advancedFilterId = this.filters()().advancedFilterId;\n if (!advancedFilterId)\n return;\n\n const tableId = this.config()().tableId;\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\n\n if (!advancedFilter)\n return;\n\n this.onAdvancedFilterUpdate(event, advancedFilter);\n }\n\n protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger) {\n event.stopPropagation();\n advancedFiltersMenuTrigger?.closeMenu();\n\n const data: ConfigureAdvancedFilterData<T> = {\n config: this.config()(),\n advancedFilter: advancedFilter\n };\n\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\n\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\n if (advancedFilter)\n this.onApplyTemplateClick(advancedFilter);\n });\n }\n\n protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>) {\n event.stopPropagation();\n advancedFiltersMenuTrigger.closeMenu();\n\n const texts = this.texts();\n this.dialogService.confirm({\n title: texts.advancedFilters.deleteTitle,\n message: texts.advancedFilters.deleteMessage(advancedFilter.name),\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n }).subscribe(confirm => {\n if (confirm === true) {\n if (this.filters()().advancedFilterId == advancedFilter.groups[0].id)\n this.onApplyTemplateClick();\n\n this.advancedFilterService.deleteAdvancedFilter(this.config()().tableId, advancedFilter);\n }\n });\n }\n\n protected onQuitAdvancedFilter(event: Event) {\n event.stopPropagation();\n this.onApplyTemplateClick();\n }\n\n protected getAdvancedFilterLabel(): string {\n const advancedFilterId = this.filters()().advancedFilterId;\n if (!advancedFilterId)\n return '';\n\n const tableId = this.config()().tableId;\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\n\n if (!advancedFilter)\n return '';\n\n return AdvancedFilterUtils.groupsToReadableHtml<T>(advancedFilter.groups, this.config()().columns, this.texts());\n }\n\n protected rowIsExpanded(row: T): boolean {\n return this.expandedItem() == row;\n }\n\n protected expandableToggle(row: T) {\n this.expandedItem.update(currentValue => {\n const newValue = currentValue != row ? row : null;\n this.expandedItemChange.emit(newValue);\n return newValue;\n });\n }\n\n protected getTotalOfColum(columnKey: keyof T): number {\n const result = this.data().reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n return result;\n }\n\n protected areEqualByKeys(record1: T, record2: T): boolean {\n const primaryKey = this.config()().primaryKey;\n\n if (Array.isArray(primaryKey))\n return primaryKey.every(key => record1[key] === record2[key]);\n else\n return record1[primaryKey] === record2[primaryKey];\n }\n\n protected isRowSelected(row: T): boolean {\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\n }\n\n protected toggleRowSelection(row: T) {\n if (this.isRowSelected(row)) {\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\n });\n } else {\n this.selection.update(recordsSelected => [...recordsSelected, row]);\n }\n }\n\n protected isAllPageRowSelected(): boolean {\n const records = this.getSelectableRows();\n return records.length > 0 && records.every(record => this.isRowSelected(record));\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.getSelectableRows();\n\n if (this.isAllPageRowSelected()) {\n //Deseleccionar todas las filas seleccionables de la página actual\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\n );\n });\n } else {\n //Seleccionar todas las filas seleccionables visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n\n this.selection.update(recordsSelected => {\n // Evitar duplicados por si ya hay seleccionadas\n const nuevas = notSelected.filter(\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\n );\n return [...recordsSelected, ...nuevas];\n });\n }\n }\n\n private getSelectableRows(): T[] {\n const showRowSelection = this.config()().showRowSelection;\n return showRowSelection ? this.data().filter(row => showRowSelection(row)) : this.data();\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n private getDocumentHeaders(): string[] {\n const config = this.config()();\n return config.columns.map(c => c.label);\n }\n\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\n const config = this.config()();\n const columns = config.columns;\n\n const data = this.data();\n\n return data.map(row => {\n if (config.mapperForExportData) {\n const mapped = config.mapperForExportData(row);\n return columns.map(c => mapped[c.key]);\n }\n\n return columns.map(c => row[c.key] ?? '');\n });\n }\n\n protected exportToCsvCurrentPage() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const aoaData = [headers, ...rows];\n\n //const workSheet = utils.json_to_sheet(data);\n\n const workSheet = utils.aoa_to_sheet(aoaData);\n const workBook = utils.book_new();\n\n //El nombre de la hoja no puede exceder de 31 caracteres\n const name = title.substring(0, 31);\n utils.book_append_sheet(workBook, workSheet, name);\n writeFileXLSX(workBook, `${fileName}.xlsx`);\n }\n\n protected exportToPdfCurrentPage() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const doc = config.pdfConfig ?? new jsPDF({\n orientation: 'landscape',\n unit: 'pt',\n format: 'A4'\n });\n\n doc.setFontSize(14);\n doc.text(title, 40, 40);\n\n autoTable(doc, {\n startY: 60,\n head: [headers],\n body: rows,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n\n doc.save(`${fileName}.pdf`);\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.portal = undefined;\n\n this.isFullScreen.set(false);\n }\n\n private isMyOverlayOnTop(): boolean {\n if (!this.overlayRef)\n return false;\n\n //Contenedor principal de overlays en el DOM\n const containerElement = this.overlayContainer.getContainerElement();\n // Los overlays se añaden como hijos dentro de este contenedor\n const overlays = Array.from(containerElement.children);\n // El último hijo es el overlay más \"arriba\"\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\n\n return topOverlay === this.overlayRef.hostElement;\n }\n \n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().showAdvancedFilters) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.label\"\r\n [matMenuTriggerFor]=\"advancedFiltersMenu\" \r\n #advancedFiltersMenuTrigger=\"matMenuTrigger\">\r\n\r\n <mat-icon>filter_alt</mat-icon>\r\n </button>\r\n\r\n <mat-menu #advancedFiltersMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"onNewAdvancedFiltersClick()\">\r\n <mat-icon>filter_alt</mat-icon>\r\n <span>{{ texts().advancedFilters.new }}</span>\r\n </button>\r\n\r\n @for (advancedFilter of advancedFilters(); track $index; let first = $first) {\r\n @if (first) {\r\n <mat-divider />\r\n }\r\n\r\n <div mat-menu-item (click)=\"onApplyTemplateClick(advancedFilter)\">\r\n <div class=\"templateContainer\"> \r\n <span>{{advancedFilter.name | ngxOnlyUpperFirstCharacter}}</span>\r\n\r\n <div class=\"buttonTemplateContainer\">\r\n <button\r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.editTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterUpdate($event, advancedFilter, advancedFiltersMenuTrigger)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n\r\n <button\r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterDelete($event, advancedFiltersMenuTrigger, advancedFilter)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsvCurrentPage()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdfCurrentPage()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(config()().showQueryFilter) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n @if(filters()().advancedFilterId) {\r\n <div class=\"advancedFiltersApplied\" (click)=\"onSelectedAdvancedFilterUpdate($event)\">\r\n <p [innerHTML]=\"getAdvancedFilterLabel()\"></p>\r\n <button matIconButton [matTooltip]=\"texts().advancedFilters.remove\" class=\"\" (click)=\"onQuitAdvancedFilter($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"data()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n @if(!config()().showRowSelection || config()().showRowSelection?.(row)) {\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n }\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!column.isSortable\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td \r\n mat-footer-cell \r\n *matFooterCellDef \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral && column.getTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(column.getTotalGeneral(), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(column.getTotalGeneral()) }}\r\n } @else {\r\n {{ column.getTotalGeneral() }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n }\r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ dataResource.isLoading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator [length]=\"total()\" [pageSize]=\"filters()().pageSize\" [pageIndex]=\"filters()().pageNumber - 1\" (page)=\"onPageChange($event)\"/>\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, effect, HostListener, inject, input, output, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { BasicFilter } from '../../models/basic-filter';\nimport { BasicTableColumn, BasicTableConfig } from '../../models/basic-table-config';\n\nimport { PaginatedFilter, SortBy } from '../../models/paginated-filter';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { ColumnPipe, FilterOption, isFilterOption, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { ColumnValue } from '../../models/column-value';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport moment from 'moment';\n\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { includeNoSensible } from '../../utils/string-operations';\nimport { NgxTexts } from '../../i18n';\n\n@Component({\n selector: 'ngx-basic-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n MatCheckboxModule,\n SearchableSelectComponent,\n PaginatedSearchableSelectComponent\n ],\n templateUrl: './ngx-basic-table.component.html',\n styleUrl: './ngx-basic-table.component.scss',\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxBasicTable<T, U extends BasicFilter<T>> {\n\n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n \n // Inyectar el servicio de internacionalización\n readonly texts = inject(NgxTexts).texts;\n \n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined\n } as U\n )\n );\n config = input.required<WritableSignal<BasicTableConfig<T>>>();\n data = input.required<T[]>();\n loading = input<boolean>(false);\n queryFilter = input<(query: string, data: T[]) => T[]>();\n\n moreFilters = input<(data: T[], filters: U) => T[]>(\n (data: T[], _: U) => {\n return data;\n }\n );\n\n protected createClick = output<void>();\n protected updateClick = output<T>();\n protected deleteClick = output<T>();\n protected rowActionClick = output<RowActionClickEvent<T>>();\n protected expandedItemChange = output<T | null>();\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\n\n dataSource = computed(() => {\n const data = this.data();\n const paginator = this.paginator();\n const dataSource = new MatTableDataSource(data);\n\n if (paginator)\n dataSource.paginator = paginator;\n\n return dataSource;\n });\n\n filtersEffect = effect(() => {\n let data = this.data();\n const filters = this.filters()();\n const config = this.config()();\n const queryFilter = this.queryFilter();\n const moreFilters = this.moreFilters();\n\n if (queryFilter)\n data = queryFilter(filters.query ?? '', data);\n else if (this.someColumnFilterable(config.columns))\n data = this.applyInputFilter(config.columns, data, filters.query);\n\n data = this.applySort(data, config.columns, filters.sortBy);\n\n data = this.applyColumnFilter(data, config.columns, filters.columnsFiltersValue);\n\n data = moreFilters(data, filters);\n\n this.dataSource().data = data;\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType);\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\n });\n\n protected showQueryFilter = computed(() => {\n const queryFilter = this.queryFilter();\n const config = this.config()();\n\n if (queryFilter)\n return true;\n\n return this.someColumnFilterable(config.columns);\n });\n\n protected tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n protected isFullScreen = signal(false);\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n private readonly overlay = inject(Overlay);\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n protected selection = signal<T[]>([]);\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n\n protected paginator = viewChild(MatPaginator);\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape() {\n if (this.overlayRef && this.isMyOverlayOnTop())\n this.exitFullscreen();\n }\n\n private someColumnFilterable(columns: BasicTableColumn<T>[]): boolean {\n return columns.some((column) => column.isFilterableByInput === true);\n }\n\n private applyInputFilter(columns: BasicTableColumn<T>[], data: T[], query?: string): T[] {\n if (!query)\n return data;\n\n const filterableColumns = columns.filter(c => c.isFilterableByInput);\n\n return data.filter(item =>\n filterableColumns.some(column => {\n const value = item[column.key];\n return typeof value === 'string' && includeNoSensible(value, query);\n })\n );\n }\n\n private applySort(data: T[], columns: BasicTableColumn<T>[], sortBy?: SortBy): T[] {\n if (!sortBy)\n return data;\n\n const column = columns.find(c => c.key === sortBy.key);\n\n if (!column || column.sortType === undefined)\n return data;\n\n const { key, direction } = sortBy;\n const factor = direction === 'asc' ? 1 : -1;\n\n return [...data].sort((a, b) => {\n const aValue = (a as any)[key];\n const bValue = (b as any)[key];\n\n if (aValue == null && bValue == null)\n return 0;\n\n if (aValue == null)\n return -1 * factor;\n\n if (bValue == null)\n return 1 * factor;\n\n switch (column.sortType) {\n case 'number':\n return (Number(aValue) - Number(bValue)) * factor;\n\n case 'date':\n return (Date.parse(aValue) - Date.parse(bValue)) * factor;\n\n case 'string':\n default:\n if(column.sortByKey) {\n const aObjectString = column.sortByKey(a) ?? '';\n const bObjectString = column.sortByKey(b) ?? '';\n return aObjectString.localeCompare(bObjectString) * factor;\n }\n\n return String(aValue).localeCompare(String(bValue)) * factor;\n }\n });\n }\n\n private applyColumnFilter(data: T[], columns: BasicTableColumn<T>[], columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>): T[] {\n if (!this.showFiltersRow() || !columnsFiltersValue)\n return data;\n\n columns.forEach(column => {\n const columnFilterValue = columnsFiltersValue[column.key];\n\n if (columnFilterValue) {\n switch (column.filterType) {\n case 'number':\n case 'option':\n const filterValue = isFilterOption(columnFilterValue) ? columnFilterValue.value : columnFilterValue\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnValue == filterValue\n });\n break;\n case 'text':\n const query = columnFilterValue as string;\n data = data.filter(d => {\n const word = (column.filterByKey?.(d) ?? d[column.key] ?? '') as string;\n return includeNoSensible(word, query);\n });\n break;\n case 'option-multiple':\n if (!Array.isArray(columnFilterValue) || columnFilterValue.length <= 0)\n break;\n\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnFilterValue.some(f => {\n const columnValueString = isFilterOption(f) ? f.value : f;\n return columnValueString == columnValue;\n });\n });\n break;\n case 'date':\n const date = columnFilterValue as moment.Moment\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n return date.isSame(momentValue, 'day');\n });\n break;\n case 'date-range':\n const dateRange = columnFilterValue as DateRange<moment.Moment | null>\n if (dateRange.start != null || dateRange.end != null) {\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n\n if (dateRange.start && dateRange.end)\n return momentValue.isBetween(dateRange.start, dateRange.end, 'day', '[]');\n\n if (dateRange.start)\n return momentValue.isSameOrAfter(dateRange.start, 'day');\n\n if (dateRange.end)\n return momentValue.isSameOrBefore(dateRange.end, 'day');\n\n return true;\n });\n }\n break;\n }\n }\n });\n\n return data;\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.portal = undefined;\n\n this.isFullScreen.set(false);\n }\n\n private isMyOverlayOnTop(): boolean {\n if (!this.overlayRef)\n return false;\n\n //Contenedor principal de overlays en el DOM\n const containerElement = this.overlayContainer.getContainerElement();\n // Los overlays se añaden como hijos dentro de este contenedor\n const overlays = Array.from(containerElement.children);\n // El último hijo es el overlay más \"arriba\"\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\n\n return topOverlay === this.overlayRef.hostElement;\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n return this.config()().update\n && this.config()().clickOnRowForUpdate\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\n && !this.config()().update?.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n private getDocumentHeaders(): string[] {\n const config = this.config()();\n return config.columns.map(c => c.label);\n }\n\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\n const config = this.config()();\n const columns = config.columns;\n\n const data = this.dataSource().data;\n\n return data.map(row => {\n if (config.mapperForExportData) {\n const mapped = config.mapperForExportData(row);\n return columns.map(c => mapped[c.key]);\n }\n\n return columns.map(c => row[c.key] ?? '');\n });\n }\n\n protected exportToCsv() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const aoaData = [headers, ...rows];\n\n //const workSheet = utils.json_to_sheet(data);\n\n const workSheet = utils.aoa_to_sheet(aoaData);\n const workBook = utils.book_new();\n\n //El nombre de la hoja no puede exceder de 31 caracteres\n const name = title.substring(0, 31);\n utils.book_append_sheet(workBook, workSheet, name);\n writeFileXLSX(workBook, `${fileName}.xlsx`);\n }\n\n protected exportToPdf() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const doc = config.pdfConfig ?? new jsPDF({\n orientation: 'landscape',\n unit: 'pt',\n format: 'A4'\n });\n\n doc.setFontSize(14);\n doc.text(title, 40, 40);\n\n autoTable(doc, {\n startY: 60,\n head: [headers],\n body: rows,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n\n doc.save(`${fileName}.pdf`);\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n\n this.filters().update((value: U) => {\n //return { ...value, query: query, pageNumber: 1 };\n //Hay que ver el tema del paginador si hay que volver a la pagina 1\n return { ...value, query: query };\n });\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n //pageNumber: 1,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.getDataOfCurrentPage();\n\n if (this.isAllPageRowSelected()) {\n //Deseleccionar todas las filas de la página actual\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\n );\n });\n } else {\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n\n this.selection.update(recordsSelected => {\n // Evitar duplicados por si ya hay seleccionadas\n const nuevas = notSelected.filter(\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\n );\n return [...recordsSelected, ...nuevas];\n });\n }\n }\n\n protected isAllPageRowSelected(): boolean {\n const records = this.getDataOfCurrentPage();\n //Sin registros no hay nada seleccionado (every sobre un array vacio devuelve true)\n return records.length > 0 && records.every(record => this.isRowSelected(record));\n }\n\n protected areEqualByKeys(record1: T, record2: T): boolean {\n const primaryKey = this.config()().primaryKey;\n\n if (Array.isArray(primaryKey))\n return primaryKey.every(key => record1[key] === record2[key]);\n else\n return record1[primaryKey] === record2[primaryKey];\n }\n\n protected isRowSelected(row: T): boolean {\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\n }\n\n protected toggleRowSelection(row: T) {\n if (this.isRowSelected(row)) {\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\n });\n } else {\n this.selection.update(recordsSelected => [...recordsSelected, row]);\n }\n }\n\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\n if (!pipes)\n return value;\n\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\n\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\n }\n\n protected getTotalPerPageOfColum(columnKey: keyof T): number {\n const dataOfCurrentPage = this.getDataOfCurrentPage();\n return dataOfCurrentPage.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n }\n\n protected getDataOfCurrentPage(): T[] {\n const paginator = this.dataSource().paginator;\n\n if (!paginator)\n return [];\n\n const startIndex = paginator.pageIndex * paginator.pageSize;\n const endIndex = startIndex + paginator.pageSize;\n\n return this.dataSource().data.slice(startIndex, endIndex);\n }\n\n protected getTotalOfColum(columnKey: keyof T): number {\n return this.dataSource().data.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onTextFilterColumnChange(column: BasicTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n this.onColumnFilterChange(column.key, query);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: BasicTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: BasicTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n protected rowIsExpanded(row: T): boolean {\n return this.expandedItem() == row;\n }\n\n protected expandableToggle(row: T) {\n this.expandedItem.update(currentValue => {\n const newValue = currentValue != row ? row : null;\n this.expandedItemChange.emit(newValue);\n return newValue;\n });\n }\n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdf()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(showQueryFilter()) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"loading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"dataSource()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"celdaSelection\"></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"column.sortType === undefined\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td\r\n mat-footer-cell \r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalPerPageOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalPerPageOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalPerPageOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } \r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ loading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator />\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AlertAppearance, AlertType } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst DEFAULT_ICONS: Record<AlertType, string> = {\r\n info: 'info',\r\n success: 'check_circle',\r\n warning: 'warning',\r\n error: 'error',\r\n};\r\n\r\n@Component({\r\n selector: 'ngx-alert',\r\n imports: [MatIconModule, MatButtonModule, MatTooltipModule],\r\n templateUrl: './ngx-alert.component.html',\r\n styleUrl: './ngx-alert.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'isDismissed() ? null : resolvedRole()',\r\n '[class.ngx-alert--dismissed]': 'isDismissed()',\r\n },\r\n})\r\nexport class NgxAlert {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Gravedad del mensaje: define color, icono por defecto y cómo se anuncia. */\r\n readonly type = input<AlertType>('info');\r\n\r\n /** Título en negrita sobre el mensaje. */\r\n readonly title = input<string>();\r\n\r\n /** Mensaje en texto plano. Para contenido con formato o enlaces, proyéctalo como contenido. */\r\n readonly message = input<string>();\r\n\r\n /** Estilo visual: standard (fondo + franja lateral), soft (solo fondo) u outlined (solo borde). */\r\n readonly appearance = input<AlertAppearance>('standard');\r\n\r\n /** Icono de Material Symbols. Por defecto, el del tipo (info, check_circle, warning, error). */\r\n readonly icon = input<string>();\r\n\r\n /** Oculta el icono. */\r\n readonly hideIcon = input(false, { transform: booleanAttribute });\r\n\r\n /** Muestra un botón para cerrar el aviso. Al pulsarlo se oculta y emite `dismissed`. */\r\n readonly dismissible = input(false, { transform: booleanAttribute });\r\n\r\n /** Etiqueta accesible del botón de cerrar. Por defecto, el texto `alert.dismiss` de la librería. */\r\n readonly dismissLabel = input<string>();\r\n\r\n /**\r\n * Cómo lo anuncia el lector de pantalla. assertive interrumpe (role=\"alert\"), polite espera\r\n * a que termine (role=\"status\") y off no lo anuncia. Por defecto: assertive para error y\r\n * warning, polite para info y success.\r\n */\r\n readonly politeness = input<'assertive' | 'polite' | 'off'>();\r\n\r\n /** Se emite cuando el usuario cierra el aviso con el botón de cerrar. */\r\n readonly dismissed = output<void>();\r\n\r\n protected readonly isDismissed = signal(false);\r\n\r\n protected readonly resolvedIcon = computed(() => this.icon() || DEFAULT_ICONS[this.type()] || DEFAULT_ICONS.info);\r\n\r\n protected readonly resolvedDismissLabel = computed(() => {\r\n return this.dismissLabel() ?? this._texts().alert.dismiss;\r\n });\r\n\r\n protected readonly resolvedRole = computed(() => {\r\n const politeness = this.politeness()\r\n ?? (this.type() === 'error' || this.type() === 'warning' ? 'assertive' : 'polite');\r\n\r\n switch (politeness) {\r\n case 'assertive': return 'alert';\r\n case 'polite': return 'status';\r\n default: return null;\r\n }\r\n });\r\n\r\n protected dismiss(): void {\r\n this.isDismissed.set(true);\r\n this.dismissed.emit();\r\n }\r\n}\r\n","@if (!isDismissed()) {\n <div class=\"alert\" [class]=\"'alert alert--' + type() + ' alert--' + appearance()\">\n @if (!hideIcon()) {\n <mat-icon class=\"alert__icon\" aria-hidden=\"true\">{{ resolvedIcon() }}</mat-icon>\n }\n\n <div class=\"alert__content\">\n @if (title()) {\n <div class=\"alert__title\">{{ title() }}</div>\n }\n\n <div class=\"alert__description\">\n @if (message()) {\n <p class=\"alert__message\">{{ message() }}</p>\n }\n <ng-content />\n </div>\n\n <div class=\"alert__actions\">\n <ng-content select=\"[alertActions]\" />\n </div>\n </div>\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"alert__dismiss\"\n matIconButton\n [attr.aria-label]=\"resolvedDismissLabel()\"\n [matTooltip]=\"resolvedDismissLabel()\"\n (click)=\"dismiss()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet';\r\nimport { PaginatedFilter } from '../../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../../models/select-config';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { catchError, debounceTime, distinctUntilChanged, merge, Observable, of, skip, Subject } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\nexport interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {\r\n title: string;\r\n config: PaginatedSelectConfig<T>;\r\n endpoint: (filters: U) => Observable<PaginatedItems<T>>;\r\n filters: WritableSignal<U>;\r\n /** Accepts full objects OR partials containing only the valueKey */\r\n selectedItems: Partial<T>[];\r\n multiple: boolean;\r\n showSearch: boolean;\r\n searchPlaceholder: string;\r\n noResultsMessage: string;\r\n confirmLabel: string;\r\n resetLabel: string;\r\n optionTemplate: TemplateRef<{ $implicit: T }> | null;\r\n extraFiltersTemplate: TemplateRef<void> | null;\r\n showSelectAll: boolean;\r\n selectAllLabel: string;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select-bottom-sheet',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatRippleModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n MatBadgeModule,\r\n ],\r\n templateUrl: './ngx-paginated-select-bottom-sheet.component.html',\r\n styleUrl: './ngx-paginated-select-bottom-sheet.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _ref = inject(MatBottomSheetRef<NgxPaginatedSelectBottomSheetComponent<T, U>>);\r\n private readonly _destroy = inject(DestroyRef);\r\n readonly data = inject<NgxPaginatedSelectBottomSheetData<T, U>>(MAT_BOTTOM_SHEET_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── State ─────────────────────────────────────────────────────────────────\r\n /** Raw input value — updates on every keystroke, does NOT trigger the resource */\r\n readonly query = signal(this.data.filters().query);\r\n /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */\r\n readonly selectedItems = signal<Partial<T>[]>([...this.data.selectedItems]);\r\n\r\n /**\r\n * Subject used to bypass the 400 ms debounce (e.g. when the user clears\r\n * the search field — we want an immediate response).\r\n */\r\n private readonly _immediateQuery$ = new Subject<string>();\r\n\r\n private readonly accumulatedItems = signal<T[]>([]);\r\n\r\n // ─── Resource (single trigger: data.filters) ───────────────────────────────\r\n /**\r\n * IMPORTANT: the resource depends ONLY on `data.filters`.\r\n * The debounce subscription (below) is the only thing that mutates\r\n * `data.filters.query`, so the resource fires at most once per debounce\r\n * period — never on every keystroke.\r\n */\r\n readonly resource = rxResource({\r\n params: () => ({ ...this.data.filters() }),\r\n // Un fallo de red degrada a lista vacía (estado \"sin resultados\") en vez de\r\n // dejar el resource en error —que rompería el render y ensuciaría la consola—.\r\n stream: ({ params }) =>\r\n this.data.endpoint(params).pipe(\r\n catchError(() => of({ items: [], total: 0 } as PaginatedItems<T>))\r\n ),\r\n defaultValue: { items: [], total: 0 } as PaginatedItems<T>,\r\n });\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n readonly isLoading = computed(() => this.resource.isLoading());\r\n readonly options = computed(() => this.accumulatedItems());\r\n readonly hasError = computed(() => !!this.resource.error());\r\n readonly selectedCount = computed(() => this.selectedItems().length);\r\n\r\n /**\r\n * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante\r\n * la carga por scroll, resource.value() pasa transitoriamente al defaultValue\r\n * (total: 0); leerlo directamente hacía parpadear el footer a \"0 resultados\"\r\n * aunque el total real no cambie. Con este signal el total se mantiene estable\r\n * mientras se cargan más páginas.\r\n */\r\n private readonly _total = signal(0);\r\n readonly total = this._total.asReadonly();\r\n private readonly _totalEffect = effect(() => {\r\n if (this.resource.isLoading())\r\n return;\r\n try {\r\n this._total.set(this.resource.error() ? 0 : this.resource.value().total);\r\n } catch {\r\n // El recurso puede lanzar si está en error o se elimina durante el teardown;\r\n // se conserva el último total y no se rompe el ciclo de detección de cambios.\r\n }\r\n });\r\n\r\n /** Cargando la PRIMERA página (lista vacía) → se muestran skeletons. */\r\n readonly isInitialLoading = computed(() => this.isLoading() && this.options().length === 0);\r\n /** Cargando MÁS páginas (scroll) → fila inline \"cargando más…\", sin barra superior. */\r\n readonly isLoadingMore = computed(() => this.isLoading() && this.options().length > 0);\r\n /** Ya se han cargado todos los resultados disponibles. */\r\n readonly allLoaded = computed(() => this.total() > 0 && this.options().length >= this.total());\r\n /** Cabecera con sombra solo cuando la lista está desplazada. */\r\n readonly headerScrolled = signal(false);\r\n\r\n readonly allSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n return items.every(item => this.isSelected(item));\r\n });\r\n\r\n readonly someSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n const count = items.filter(item => this.isSelected(item)).length;\r\n return count > 0 && count < items.length;\r\n });\r\n\r\n // ─── Accumulate pages ──────────────────────────────────────────────────────\r\n /**\r\n * Reactively depends ONLY on `resource.value()`. The filter snapshot is read\r\n * via `untracked` so external filter changes (parent-driven, e.g. an extra\r\n * filters panel) do NOT create a reactive dependency here — that would make\r\n * the effect re-run on scroll page increments with stale resource data,\r\n * duplicating items and breaking `onScroll` (see original limitation).\r\n *\r\n * Reset logic:\r\n * - Fingerprint the current filter identity (everything except `pageNumber`).\r\n * - If the fingerprint changed since the previous fetch, this fetch belongs\r\n * to a different filter set → replace the accumulated array.\r\n * - If only `pageNumber` moved, this is a scroll-load-more → append.\r\n *\r\n * This is what allows callers to mutate `data.filters` from outside (extra\r\n * filter selects, checkboxes, etc.) and have the list refresh cleanly\r\n * without the previous page's items lingering.\r\n */\r\n private _lastFilterFingerprint: string | null = null;\r\n private readonly _accumEffect = effect(() => {\r\n // Si el endpoint falla, resource.value() lanza: se trata como lista vacía.\r\n if (this.resource.error()) {\r\n this.accumulatedItems.set([]);\r\n return;\r\n }\r\n\r\n let value: PaginatedItems<T>;\r\n try {\r\n value = this.resource.value();\r\n } catch {\r\n // El recurso puede lanzar si se elimina durante el teardown; se ignora para\r\n // no romper el ciclo de detección de cambios.\r\n return;\r\n }\r\n const { pageNumber, ...rest } = untracked(() => this.data.filters()) as U;\r\n const fingerprint = JSON.stringify(rest);\r\n\r\n // Cambio de filtros, o refetch de la primera pagina (reintento, error que\r\n // devuelve el defaultValue del resource...): se reemplaza en vez de acumular.\r\n if (fingerprint !== this._lastFilterFingerprint || pageNumber <= 1) {\r\n this._lastFilterFingerprint = fingerprint;\r\n this.accumulatedItems.set([...value.items]);\r\n return;\r\n }\r\n\r\n // Scroll: se anaden solo los que no estuvieran ya, para que un refetch de la\r\n // misma pagina no duplique elementos en la lista.\r\n const key = this.data.config.valueKey as keyof T;\r\n this.accumulatedItems.update(acc => {\r\n const known = new Set(acc.map(item => item[key]));\r\n const nuevos = value.items.filter(item => !known.has(item[key]));\r\n return nuevos.length > 0 ? [...acc, ...nuevos] : acc;\r\n });\r\n });\r\n\r\n constructor() {\r\n // Reset to page 1 when the sheet opens\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n /**\r\n * Debounce pipeline:\r\n * typed input → wait 400 ms → push into data.filters\r\n * _immediateQuery$ → no wait → push into data.filters (used by clearQuery)\r\n *\r\n * The merged stream has a final distinctUntilChanged so that an immediate\r\n * clear followed by the debounced '' 400 ms later does NOT fire twice.\r\n */\r\n merge(\r\n this._immediateQuery$,\r\n // skip(1) skips the initial BehaviorSubject-like emission from toObservable\r\n // so we don't re-fetch 400ms after the sheet opens with an empty query\r\n toObservable(this.query).pipe(skip(1), debounceTime(400), distinctUntilChanged()),\r\n )\r\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this._destroy))\r\n .subscribe(q => {\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, query: q, pageNumber: 1 }));\r\n });\r\n\r\n }\r\n\r\n // ─── Helpers ────────────────────────────────────────────────────────────────\r\n\r\n isSelected(item: T): boolean {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n return this.selectedItems().some(s => s[key] === val);\r\n }\r\n\r\n /**\r\n * Safe label: tries displayedLabel(item), falls back to String(item[valueKey]).\r\n * Works for both full objects and partials.\r\n */\r\n getLabel(item: Partial<T>): string {\r\n const cfg = this.data.config;\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n getAvatarText(item: Partial<T>): string {\r\n if (this.data.config.avatarText) {\r\n try { return this.data.config.avatarText(item as T); } catch { /* fall through */ }\r\n }\r\n return this.getLabel(item).charAt(0).toUpperCase();\r\n }\r\n\r\n /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */\r\n private readonly failedImages = signal<Set<unknown>>(new Set());\r\n\r\n /** URL de imagen del avatar, o null si no hay o si falló al cargar. */\r\n getAvatarImage(item: Partial<T>): string | null | undefined {\r\n const key = item[this.data.config.valueKey as keyof T];\r\n if (this.failedImages().has(key))\r\n return null;\r\n return this.data.config.avatarImage?.(item as T);\r\n }\r\n\r\n /** Marca la imagen como fallida para caer al texto/icono. */\r\n onAvatarError(item: Partial<T>): void {\r\n const key = item[this.data.config.valueKey as keyof T];\r\n this.failedImages.update(s => new Set(s).add(key));\r\n }\r\n\r\n // ─── Selection ──────────────────────────────────────────────────────────────\r\n\r\n toggleItem(item: T): void {\r\n if (this.data.config.disabled?.(item)) return;\r\n\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n\r\n if (this.data.multiple) {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n } else {\r\n // Remove any existing partial with the same key, then add the full object\r\n this.selectedItems.update(items => [\r\n ...items.filter(s => s[key] !== val),\r\n item,\r\n ]);\r\n }\r\n } else {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.set([]);\r\n } else {\r\n this.selectedItems.set([item]);\r\n this.confirm();\r\n }\r\n }\r\n }\r\n\r\n removeSelectedChip(item: Partial<T>): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n }\r\n\r\n // ─── Search ──────────────────────────────────────────────────────────────────\r\n\r\n onQueryInput(event: Event, container: HTMLElement): void {\r\n container.scrollTop = 0;\r\n // Only update the raw signal — the debounce subscription handles the rest\r\n this.query.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n clearQuery(container?: HTMLElement): void {\r\n // El input refleja la query vía [value]=\"query()\", así que basta con resetear\r\n // el signal (no hace falta el ref del DOM, que no está en scope en el estado vacío).\r\n if (container) container.scrollTop = 0;\r\n this.query.set('');\r\n // Emit on the immediate subject to bypass the 400 ms debounce\r\n this._immediateQuery$.next('');\r\n }\r\n\r\n // ─── Scroll ──────────────────────────────────────────────────────────────────\r\n\r\n onScroll(container: HTMLElement): void {\r\n // Sombra bajo la cabecera al desplazar\r\n this.headerScrolled.set(container.scrollTop > 4);\r\n\r\n if (this.isLoading()) return;\r\n const { scrollTop, clientHeight, scrollHeight } = container;\r\n // Prefetch: se pide la siguiente página ~320px antes del final para que la\r\n // fila de \"cargando más\" apenas se vea (scroll infinito fluido).\r\n if (\r\n scrollTop + clientHeight + 320 >= scrollHeight &&\r\n this.options().length < this.total()\r\n ) {\r\n this.data.filters.update(f => ({ ...f, pageNumber: f.pageNumber + 1 }));\r\n }\r\n }\r\n\r\n /** Reintenta la carga tras un error. */\r\n retry(): void {\r\n this.resource.reload();\r\n }\r\n\r\n // ─── Select all ─────────────────────────────────────────────────────────────\r\n\r\n toggleSelectAll(): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n if (this.allSelected()) {\r\n const visibleValues = new Set(this.options().map(item => item[key]));\r\n this.selectedItems.update(items =>\r\n items.filter(s => !visibleValues.has(s[key] as T[keyof T]))\r\n );\r\n } else {\r\n const newItems = this.options().filter(\r\n item => !this.isSelected(item) && !this.data.config.disabled?.(item)\r\n );\r\n this.selectedItems.update(items => [...items, ...newItems]);\r\n }\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\n confirm(): void {\r\n this._ref.dismiss(this.selectedItems());\r\n }\r\n\r\n reset(): void {\r\n this.selectedItems.set([]);\r\n }\r\n\r\n close(): void {\r\n this._ref.dismiss(undefined);\r\n }\r\n}\r\n","<div class=\"ps-bs\">\r\n\r\n <!-- ── Handle bar (mobile) ───────────────────────────────────────────────── -->\r\n <div class=\"ps-bs__handle\">\r\n <div class=\"ps-bs__handle-bar\"></div>\r\n </div>\r\n\r\n <!-- ── Header (pinned: title + search only) ──────────────────────────────── -->\r\n <div class=\"ps-bs__header\" [class.ps-bs__header--scrolled]=\"headerScrolled()\">\r\n <div class=\"ps-bs__header-top\">\r\n <div class=\"ps-bs__title-area\">\r\n <span class=\"ps-bs__title\">{{ data.title }}</span>\r\n @if (data.multiple && selectedCount() > 0) {\r\n <span class=\"ps-bs__badge\">{{ selectedCount() }}</span>\r\n }\r\n </div>\r\n <button mat-icon-button class=\"ps-bs__close-btn\" [attr.aria-label]=\"texts().common.close\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Pill search -->\r\n @if (data.showSearch) {\r\n <div class=\"ps-bs__search\">\r\n <mat-icon class=\"ps-bs__search-icon\">search</mat-icon>\r\n <input\r\n class=\"ps-bs__search-input\"\r\n #searchInput\r\n type=\"text\"\r\n [value]=\"query() ?? ''\"\r\n [placeholder]=\"data.searchPlaceholder\"\r\n (input)=\"onQueryInput($event, bodyContainer)\"\r\n />\r\n @if (searchInput.value.length > 0) {\r\n <button\r\n class=\"ps-bs__search-clear\"\r\n type=\"button\"\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"clearQuery(bodyContainer); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- ── Body (ÚNICA zona de scroll: filtros + chips + select-all + lista) ──── -->\r\n <div class=\"ps-bs__body\" #bodyContainer (scroll)=\"onScroll(bodyContainer)\">\r\n\r\n <!-- Extra filters projection -->\r\n @if (data.extraFiltersTemplate) {\r\n <div class=\"ps-bs__extra-filters\">\r\n <ng-container *ngTemplateOutlet=\"data.extraFiltersTemplate\" />\r\n </div>\r\n }\r\n\r\n <!-- Selected chips (custom lightweight chips) -->\r\n @if (data.multiple && selectedItems().length > 0) {\r\n <div class=\"ps-bs__selected-chips\">\r\n @for (item of selectedItems(); track item[data.config.valueKey]) {\r\n <div class=\"ps-bs__chip\">\r\n <span class=\"ps-bs__chip-label\">{{ getLabel(item) }}</span>\r\n <button class=\"ps-bs__chip-remove\" type=\"button\" [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"removeSelectedChip(item)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Select all (sticky top of the scroll area) -->\r\n @if (data.multiple && data.showSelectAll && options().length > 0) {\r\n <div class=\"ps-bs__select-all\" matRipple (click)=\"toggleSelectAll()\">\r\n <mat-checkbox\r\n [checked]=\"allSelected()\"\r\n [indeterminate]=\"someSelected()\"\r\n (click)=\"$event.preventDefault()\"\r\n />\r\n <span class=\"ps-bs__select-all-label\">{{ data.selectAllLabel }}</span>\r\n </div>\r\n }\r\n\r\n <!-- ── Options list ──────────────────────────────────────────────────── -->\r\n <div class=\"ps-bs__list\">\r\n\r\n <!-- Skeleton loading (only for the first page) -->\r\n @if (isInitialLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"ps-bs__skeleton\">\r\n <div class=\"ps-bs__skeleton-avatar\"></div>\r\n <div class=\"ps-bs__skeleton-content\">\r\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--title\"></div>\r\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--subtitle\"></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Error state -->\r\n @if (hasError() && !isLoading() && options().length === 0) {\r\n <div class=\"ps-bs__state ps-bs__error\">\r\n <div class=\"ps-bs__state-icon-wrap ps-bs__error-icon-wrap\">\r\n <mat-icon>error_outline</mat-icon>\r\n </div>\r\n <div class=\"ps-bs__state-title\">{{ texts().paginatedSelect.errorTitle }}</div>\r\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.errorHint }}</div>\r\n <button matButton=\"tonal\" (click)=\"retry()\">\r\n <mat-icon>refresh</mat-icon>\r\n {{ texts().paginatedSelect.retry }}\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Empty state -->\r\n @if (!hasError() && options().length === 0 && !isLoading()) {\r\n <div class=\"ps-bs__state ps-bs__empty\">\r\n <div class=\"ps-bs__state-icon-wrap\">\r\n <mat-icon>search_off</mat-icon>\r\n </div>\r\n <div class=\"ps-bs__state-title\">{{ data.noResultsMessage }}</div>\r\n @if (query()) {\r\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.noResultsHint }}</div>\r\n <button matButton (click)=\"clearQuery(bodyContainer)\">\r\n {{ texts().paginatedSelect.clearSearch }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Option rows -->\r\n @for (item of options(); track item[data.config.valueKey]) {\r\n @let disabled = data.config.disabled ? data.config.disabled(item) : false;\r\n @let selected = isSelected(item);\r\n @let avatarImg = getAvatarImage(item);\r\n\r\n <div\r\n class=\"ps-bs__option\"\r\n [class.ps-bs__option--selected]=\"selected\"\r\n [class.ps-bs__option--disabled]=\"disabled\"\r\n matRipple\r\n [matRippleDisabled]=\"disabled\"\r\n (click)=\"toggleItem(item)\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"selected\"\r\n [attr.aria-disabled]=\"disabled\"\r\n >\r\n <!-- Avatar (al seleccionar se voltea a un check, estilo Gmail) -->\r\n <div class=\"ps-bs__option-avatar\" [class.ps-bs__option-avatar--selected]=\"selected\">\r\n @if (selected) {\r\n <mat-icon class=\"ps-bs__option-avatar-check\">check</mat-icon>\r\n } @else if (avatarImg) {\r\n <img [src]=\"avatarImg\" [alt]=\"getLabel(item)\" (error)=\"onAvatarError(item)\" loading=\"lazy\" />\r\n } @else if (data.config.avatarText) {\r\n {{ getAvatarText(item) }}\r\n } @else if (data.config.avatarIcon) {\r\n <mat-icon>{{ data.config.avatarIcon }}</mat-icon>\r\n } @else {\r\n {{ getAvatarText(item) }}\r\n }\r\n </div>\r\n\r\n <!-- Content -->\r\n <div class=\"ps-bs__option-content\">\r\n @if (data.optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"data.optionTemplate; context: { $implicit: item }\" />\r\n } @else {\r\n <span class=\"ps-bs__option-label\">{{ getLabel(item) }}</span>\r\n @if (data.config.subtitle) {\r\n <span class=\"ps-bs__option-subtitle\">{{ data.config.subtitle(item) }}</span>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Check indicator -->\r\n @if (data.multiple) {\r\n <mat-checkbox [checked]=\"selected\" [disabled]=\"disabled\" (click)=\"$event.preventDefault()\" />\r\n } @else if (selected) {\r\n <mat-icon class=\"ps-bs__option-check\">check_circle</mat-icon>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Loading more (pagination) / end of list -->\r\n @if (isLoadingMore()) {\r\n <div class=\"ps-bs__loading-more\" aria-live=\"polite\">\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-text\">{{ texts().paginatedSelect.loadingMore }}</span>\r\n </div>\r\n } @else if (allLoaded() && options().length > 0) {\r\n <div class=\"ps-bs__list-end\">{{ texts().paginatedSelect.endOfList }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- ── Footer (ALWAYS VISIBLE — never scrolls) ──────────────────────────── -->\r\n <div class=\"ps-bs__footer\">\r\n <span class=\"ps-bs__footer-count\">\r\n @if (data.multiple) {\r\n {{ texts().paginatedSelect.selectedCount(selectedCount(), total()) }}\r\n } @else {\r\n {{ texts().paginatedSelect.resultsCount(total()) }}\r\n }\r\n </span>\r\n\r\n @if (data.multiple) {\r\n <div class=\"ps-bs__footer-actions\">\r\n @if (selectedCount() > 0) {\r\n <button matButton (click)=\"reset()\">{{ data.resetLabel }}</button>\r\n }\r\n <button matButton=\"filled\" color=\"primary\" (click)=\"confirm()\">{{ data.confirmLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule, MatChipEvent } from '@angular/material/chips';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter } from '../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../models/select-config';\r\nimport { NgxTexts } from '../../i18n';\r\nimport {\r\n NgxPaginatedSelectBottomSheetComponent,\r\n NgxPaginatedSelectBottomSheetData,\r\n} from './bottom-sheet/ngx-paginated-select-bottom-sheet.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-paginated-select.component.html',\r\n styleUrl: './ngx-paginated-select.component.scss',\r\n})\r\nexport class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _bottomSheet = inject(MatBottomSheet);\r\n /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intento enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── Inputs ────────────────────────────────────────────────────────────────\r\n /** Label that floats on the form field */\r\n readonly label = input.required<string>();\r\n /** Title shown in the bottom sheet header */\r\n readonly title = input<string>('');\r\n /** Endpoint to fetch paginated data */\r\n readonly endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n /** Config for display and value binding */\r\n readonly config = input.required<PaginatedSelectConfig<T>>();\r\n /** Writable signal with the current filter state */\r\n readonly filters = input<WritableSignal<U>>(\r\n signal<U>({\r\n pageNumber: 1,\r\n pageSize: 25,\r\n query: undefined,\r\n sortBy: undefined,\r\n } as U)\r\n );\r\n /** Pre-selected items — accepts full objects OR partials with only the valueKey set */\r\n readonly selectedItems = input<Partial<T>[]>([]);\r\n /** Allow selecting multiple items */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Whether the component is disabled */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Show a clear button when items are selected */\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Controls how selected items are shown in the trigger:\r\n * - 'chips': a chip per selected item (default when multiple=true)\r\n * - 'text': a single comma-joined text line\r\n */\r\n readonly displayMode = input<'chips' | 'text'>('chips');\r\n /** Whether to show the search input inside the bottom sheet */\r\n readonly showSearch = input(true, { transform: booleanAttribute });\r\n /** Placeholder for the search input inside the bottom sheet (defaults to the library texts) */\r\n readonly searchPlaceholder = input<string>();\r\n /** Message when no results are found (defaults to the library texts) */\r\n readonly noResultsMessage = input<string>();\r\n /** Label for the confirm button (multiple mode, defaults to intl) */\r\n readonly confirmLabel = input<string>();\r\n /** Label for the reset button (multiple mode, defaults to intl) */\r\n readonly resetLabel = input<string>();\r\n /** Controls how the subscript wrapper (hint/error) reserves space */\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n /** Error message rendered inside mat-error */\r\n readonly error = input<string>('');\r\n /** Hint message rendered inside mat-hint */\r\n readonly hint = input<string>('');\r\n /** Custom template for each option row inside the bottom sheet */\r\n readonly optionTemplate = input<TemplateRef<{ $implicit: T }> | null>(null);\r\n /**\r\n * Optional template projected into the bottom sheet header (e.g. toggle filters).\r\n * Pass an `ng-template` reference from the consumer: `[extraFiltersTemplate]=\"myTpl\"`\r\n */\r\n readonly extraFiltersTemplate = input<TemplateRef<void> | null>(null);\r\n\r\n /** Maximum number of chips to display before showing \"+N more\" */\r\n readonly maxChipsDisplayed = input(5);\r\n /** Layout direction for chips in the trigger: 'row' (horizontal wrap) or 'column' (vertical stack) */\r\n readonly chipsDirection = input<'row' | 'column'>('column');\r\n /** Whether to show a \"Select all\" toggle in the bottom sheet (multiple mode) */\r\n readonly showSelectAll = input(false, { transform: booleanAttribute });\r\n /** Label for the select all toggle (defaults to the library texts) */\r\n readonly selectAllLabel = input<string>();\r\n\r\n // ─── Outputs ───────────────────────────────────────────────────────────────\r\n /** Emits the full T object (single) or T[] (multiple) when selection changes */\r\n readonly valueChange = output<Partial<T> | Partial<T>[] | undefined>();\r\n /** Emits the raw array of selected items (may be partial if never confirmed) */\r\n readonly selectionChange = output<Partial<T>[]>();\r\n\r\n // ─── Internal state ────────────────────────────────────────────────────────\r\n protected readonly _selectedItems = signal<Partial<T>[]>([]);\r\n private readonly _cvaDisabled = signal(false);\r\n protected readonly _isOpen = signal(false);\r\n\r\n /**\r\n * Control interno que gobierna el estado visual del mat-form-field.\r\n * MatInput y MatChipGrid solo reevaluan su errorState (en ngDoCheck) si\r\n * tienen un NgControl asociado; sin el, el campo nunca se pintaba en rojo\r\n * aunque el control real del formulario fuese invalido. El valor real sigue\r\n * viviendo en el CVA: este control solo refleja la etiqueta visible.\r\n */\r\n protected readonly innerControl = new FormControl<string>('');\r\n\r\n private onChange: (value: T[keyof T] | T[keyof T][] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n /** Evita re-emitir onChange cuando el cambio viene del formulario (writeValue). */\r\n private _suppressEmit = false;\r\n /** Huella de la última selección aplicada desde el input `selectedItems`. */\r\n private _lastSyncedSelection: string | null = null;\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n protected readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\r\n\r\n protected readonly selectedLabel = computed(() => {\r\n const items = this._selectedItems();\r\n if (items.length === 0) return '';\r\n return items.map(i => this.getLabel(i)).join(', ');\r\n });\r\n\r\n protected readonly hasSelection = computed(() => this._selectedItems().length > 0);\r\n\r\n protected readonly showChips = computed(() => this.multiple() && this.displayMode() === 'chips');\r\n\r\n protected readonly displayedChips = computed(() =>\r\n this._selectedItems().slice(0, this.maxChipsDisplayed())\r\n );\r\n\r\n protected readonly remainingChipsCount = computed(() =>\r\n Math.max(0, this._selectedItems().length - this.maxChipsDisplayed())\r\n );\r\n\r\n /** ErrorStateMatcher que refleja el estado del control del formulario. */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`.\r\n * Se propaga al input interno para que el mat-form-field pinte el asterisco,\r\n * igual que hace Material con un `<input matInput>` normal.\r\n */\r\n protected isRequired(): boolean {\r\n return this._ngControl?.control?.hasValidator(Validators.required) ?? false;\r\n }\r\n\r\n // Etiquetas efectivas (override por input o valor por defecto de NgxTexts)\r\n protected readonly effectiveSearchPlaceholder = computed(() => this.searchPlaceholder() ?? this.texts().common.search);\r\n protected readonly effectiveNoResults = computed(() => this.noResultsMessage() ?? this.texts().select.noResults);\r\n protected readonly effectiveConfirmLabel = computed(() => this.confirmLabel() ?? this.texts().paginatedSelect.confirm);\r\n protected readonly effectiveResetLabel = computed(() => this.resetLabel() ?? this.texts().paginatedSelect.reset);\r\n protected readonly effectiveSelectAllLabel = computed(() => this.selectAllLabel() ?? this.texts().paginatedSelect.selectAll);\r\n\r\n constructor() {\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sync selectedItems input → estado interno (solo si el contenido cambia de verdad;\r\n // un literal `[...]` recreado en cada CD no debe borrar la selección del usuario).\r\n effect(() => {\r\n const incoming = this.selectedItems();\r\n const key = this.config().valueKey as keyof T;\r\n const fingerprint = JSON.stringify(incoming.map(item => item?.[key]));\r\n\r\n if (fingerprint === this._lastSyncedSelection)\r\n return;\r\n\r\n this._lastSyncedSelection = fingerprint;\r\n this._selectedItems.set(incoming);\r\n });\r\n\r\n // Estado interno → formulario + outputs (se omite cuando el cambio viene de writeValue).\r\n effect(() => {\r\n const items = this._selectedItems();\r\n if (this._suppressEmit) {\r\n this._suppressEmit = false;\r\n return;\r\n }\r\n untracked(() => this.emitChange(items));\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una senal:\r\n * al enviar, nada marca este componente (OnPush) para revision, asi que el\r\n * control interno no reevaluaba su errorStateMatcher y el campo no se\r\n * pintaba en rojo. Al enviarse el formulario se fuerza la revision.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n\r\n // El control interno solo refleja la etiqueta visible y el estado deshabilitado.\r\n effect(() => {\r\n const label = this.selectedLabel();\r\n if (this.innerControl.value !== label)\r\n this.innerControl.setValue(label, { emitEvent: false });\r\n });\r\n\r\n effect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────────────────\r\n writeValue(value: T[keyof T] | T[keyof T][] | null): void {\r\n const key = this.config().valueKey as keyof T;\r\n const keys = this.keysFromValue(value);\r\n const currentKeys = this._selectedItems().map(i => i[key]);\r\n\r\n // Mismo conjunto de claves → no tocamos el estado (conserva objetos enriquecidos).\r\n if (this.sameKeySet(keys, currentKeys))\r\n return;\r\n\r\n this._suppressEmit = true;\r\n this.applyValueFromKeys(keys);\r\n }\r\n\r\n registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | 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._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Helpers de valor ───────────────────────────────────────────────────────\r\n private keysFromValue(value: T[keyof T] | T[keyof T][] | null): T[keyof T][] {\r\n if (value == null) return [];\r\n return Array.isArray(value) ? value : [value];\r\n }\r\n\r\n private applyValueFromKeys(keys: T[keyof T][]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se conservan los objetos completos ya conocidos para no perder las etiquetas.\r\n const known = new Map(this._selectedItems().map(i => [i[key], i] as const));\r\n this._selectedItems.set(keys.map(k => known.get(k) ?? ({ [key]: k } as Partial<T>)));\r\n }\r\n\r\n private sameKeySet(a: T[keyof T][], b: (T[keyof T] | undefined)[]): boolean {\r\n if (a.length !== b.length) return false;\r\n const set = new Set(b);\r\n return a.every(k => set.has(k));\r\n }\r\n\r\n private emitChange(items: Partial<T>[]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se descartan items sin valueKey (meterían undefined → null en el payload).\r\n const validItems = items.filter(i => i != null && i[key] != null);\r\n\r\n if (this.multiple()) {\r\n // null en vez de [] para que Validators.required marque vacío correctamente\r\n this.onChange(validItems.length > 0 ? validItems.map(i => i[key] as T[keyof T]) : null);\r\n this.valueChange.emit(validItems);\r\n } else {\r\n this.onChange((validItems[0]?.[key] as T[keyof T]) ?? null);\r\n this.valueChange.emit(validItems[0]);\r\n }\r\n this.selectionChange.emit(validItems);\r\n }\r\n\r\n /**\r\n * Safe label resolver: tries `displayedLabel(item)`, falls back to\r\n * `String(item[valueKey])` so partial objects never throw.\r\n */\r\n protected getLabel(item: Partial<T>): string {\r\n const cfg = this.config();\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n // ─── Bottom sheet ──────────────────────────────────────────────────────────\r\n openBottomSheet(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this.isDisabled()) return;\r\n\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n this._isOpen.set(true);\r\n\r\n const filtersSignal = this.filters();\r\n filtersSignal.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n const data: NgxPaginatedSelectBottomSheetData<T, U> = {\r\n title: this.title() || this.label(),\r\n config: this.config(),\r\n endpoint: this.endpoint(),\r\n filters: filtersSignal,\r\n selectedItems: [...this._selectedItems()],\r\n multiple: this.multiple(),\r\n showSearch: this.showSearch(),\r\n searchPlaceholder: this.effectiveSearchPlaceholder(),\r\n noResultsMessage: this.effectiveNoResults(),\r\n confirmLabel: this.effectiveConfirmLabel(),\r\n resetLabel: this.effectiveResetLabel(),\r\n optionTemplate: this.optionTemplate(),\r\n extraFiltersTemplate: this.extraFiltersTemplate(),\r\n showSelectAll: this.showSelectAll(),\r\n selectAllLabel: this.effectiveSelectAllLabel(),\r\n };\r\n\r\n this._bottomSheet\r\n .open<NgxPaginatedSelectBottomSheetComponent<T, U>, typeof data, Partial<T>[] | undefined>(\r\n NgxPaginatedSelectBottomSheetComponent,\r\n {\r\n data,\r\n panelClass: 'ngx-paginated-select-panel',\r\n backdropClass: 'ngx-paginated-select-backdrop',\r\n autoFocus: data.showSearch ? '.ps-bs__search-input' : 'first-tabbable',\r\n }\r\n )\r\n .afterDismissed()\r\n .subscribe(result => {\r\n this._isOpen.set(false);\r\n if (result !== undefined) {\r\n this._selectedItems.set(result);\r\n }\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n });\r\n }\r\n\r\n /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */\r\n onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled()) return;\r\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.openBottomSheet(event);\r\n }\r\n }\r\n\r\n // ─── Chip actions ──────────────────────────────────────────────────────────\r\n // La propagación del click de la \"x\" se detiene en la plantilla para que no\r\n // burbujee al form-field y abra el bottom sheet.\r\n removeChip(item: Partial<T>, _event: MatChipEvent): void {\r\n const key = this.config().valueKey as keyof T;\r\n this._selectedItems.update(items => items.filter(i => i[key] !== item[key]));\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n\r\n clearSelection(event: Event): void {\r\n event.stopPropagation();\r\n this._selectedItems.set([]);\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","<!-- ── Chips mode (multiple + displayMode = 'chips') ─────────────────────── -->\r\n@if (showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n [class.ps-trigger--row]=\"chipsDirection() === 'row'\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ps-trigger__chip-grid\"\r\n [class.ps-trigger__chip-grid--column]=\"chipsDirection() === 'column'\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n >\r\n @for (item of displayedChips(); track item[config().valueKey]) {\r\n <mat-chip-row\r\n class=\"ps-trigger__chip\"\r\n [value]=\"item[config().valueKey]\"\r\n [disabled]=\"isDisabled()\"\r\n (removed)=\"removeChip(item, $event)\"\r\n >\r\n {{ getLabel(item) }}\r\n <button matChipRemove [disabled]=\"isDisabled()\" (click)=\"$event.stopPropagation()\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n\r\n @if (remainingChipsCount() > 0) {\r\n <span class=\"ps-trigger__remaining\">+{{ remainingChipsCount() }}</span>\r\n }\r\n\r\n <!-- Hidden input required for mat-chip-grid; también da foco de teclado al trigger -->\r\n <input\r\n matInput\r\n [matChipInputFor]=\"chipGrid\"\r\n class=\"ps-trigger__kbd-input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [attr.aria-label]=\"label()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n\r\n<!-- ── Text mode (single or multiple + displayMode = 'text') ─────────────── -->\r\n@if (!showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <input\r\n matInput\r\n class=\"ps-trigger__input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, numberAttribute } from '@angular/core';\r\nimport { SkeletonAnimation, SkeletonVariant } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst UNITLESS_NUMBER = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n/**\r\n * Convierte un tamaño a CSS: un número, o un texto que solo es un número (`height=\"56\"`\r\n * en un atributo estático), se interpreta como píxeles.\r\n */\r\nfunction toCssSize(value: string | number): string {\r\n if (typeof value === 'number') return `${value}px`;\r\n const trimmed = value.trim();\r\n return UNITLESS_NUMBER.test(trimmed) ? `${trimmed}px` : trimmed;\r\n}\r\n\r\nfunction toOptionalCssSize(value: string | number | null | undefined): string | null {\r\n return value === null || value === undefined || value === '' ? null : toCssSize(value);\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-skeleton',\r\n templateUrl: './ngx-skeleton.component.html',\r\n styleUrl: './ngx-skeleton.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'decorative() ? null : \"status\"',\r\n '[attr.aria-label]': 'decorative() ? null : resolvedAriaLabel()',\r\n '[attr.aria-busy]': 'decorative() ? null : \"true\"',\r\n '[attr.aria-hidden]': 'decorative() ? \"true\" : null',\r\n '[style.--ngx-skeleton-duration]': 'animationDuration() ?? null',\r\n },\r\n})\r\nexport class NgxSkeleton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Forma: text (barras de texto), circle, rect o rounded (rectángulo redondeado). */\r\n readonly variant = input<SkeletonVariant>('rect');\r\n\r\n /** Ancho. Cualquier valor CSS; un número se interpreta como px. Se ignora en `circle`. */\r\n readonly width = input<string, string | number>('100%', { transform: toCssSize });\r\n\r\n /** Alto. Cualquier valor CSS; un número se interpreta como px. En `circle` también es el diámetro. */\r\n readonly height = input<string, string | number>('1rem', { transform: toCssSize });\r\n\r\n /** Número de líneas. Solo aplica con `variant=\"text\"`. */\r\n readonly lines = input(1, { transform: numberAttribute });\r\n\r\n /** Separación vertical entre líneas de texto. */\r\n readonly lineSpacing = input<string, string | number>('0.5rem', { transform: toCssSize });\r\n\r\n /** Ancho de la última línea, para que el párrafo parezca real. Solo con varias líneas. */\r\n readonly lastLineWidth = input<string, string | number>('70%', { transform: toCssSize });\r\n\r\n /** Animación: shimmer (brillo que se desliza), pulse (opacidad) o none. */\r\n readonly animation = input<SkeletonAnimation>('shimmer');\r\n\r\n /**\r\n * Duración de un ciclo de animación (cualquier tiempo CSS). Por defecto 1.5s, o el valor\r\n * de la variable CSS `--ngx-skeleton-duration` si el consumidor la define.\r\n */\r\n readonly animationDuration = input<string>();\r\n\r\n /** Sustituye el border-radius que corresponde a la variante. */\r\n readonly borderRadius = input<string | null, string | number | null | undefined>(null, { transform: toOptionalCssSize });\r\n\r\n /** Etiqueta accesible. Por defecto, el texto `skeleton.loading` de la librería. */\r\n readonly ariaLabel = input<string>();\r\n\r\n /**\r\n * Oculta el skeleton a lectores de pantalla (sin role ni etiqueta). Úsalo cuando varios\r\n * skeletons forman una misma pieza: márcalos todos como decorativos y anuncia la carga\r\n * una sola vez en el contenedor (p. ej. con `aria-busy` o un skeleton sin `decorative`).\r\n */\r\n readonly decorative = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly resolvedAriaLabel = computed(() => {\r\n return this.ariaLabel() ?? this._texts().skeleton.loading;\r\n });\r\n\r\n /** Una entrada por línea a pintar (siempre al menos una). */\r\n protected readonly lineIndices = computed(() => {\r\n const count = this.variant() === 'text' ? Math.max(1, Math.floor(this.lines())) : 1;\r\n return Array.from({ length: count }, (_, i) => i);\r\n });\r\n\r\n protected readonly isMultiLine = computed(() => this.lineIndices().length > 1);\r\n\r\n /** border-radius de la variante, salvo que se indique `borderRadius`. */\r\n protected readonly computedBorderRadius = computed(() => {\r\n const override = this.borderRadius();\r\n if (override !== null) return override;\r\n\r\n switch (this.variant()) {\r\n case 'text': return '4px';\r\n case 'circle': return '50%';\r\n case 'rounded': return '12px';\r\n case 'rect':\r\n default: return '0';\r\n }\r\n });\r\n\r\n /** En `circle` el ancho es el alto, para que sea un círculo perfecto. */\r\n protected readonly computedWidth = computed(() => this.variant() === 'circle' ? this.height() : this.width());\r\n}\r\n","<div class=\"ngx-skeleton-lines\" [style.gap]=\"isMultiLine() ? lineSpacing() : null\">\n @for (i of lineIndices(); track i; let last = $last) {\n <div\n class=\"ngx-skeleton-bone\"\n [class.ngx-skeleton-shimmer]=\"animation() === 'shimmer'\"\n [class.ngx-skeleton-pulse]=\"animation() === 'pulse'\"\n [style.width]=\"isMultiLine() && last ? lastLineWidth() : computedWidth()\"\n [style.height]=\"height()\"\n [style.border-radius]=\"computedBorderRadius()\"\n ></div>\n }\n</div>\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n model,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\nimport { NgxTexts } from '../../i18n';\nimport { NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem } from '../../models/file-input-types';\nimport { fileIcon, fileKind, formatFileSize, isSameFile, matchesAccept, parseAccept } from '../shared/file-utils';\n\nlet nextId = 0;\n\n/** Entrada interna de la lista: el fichero y, si se rechazó, el motivo (el mensaje se traduce al pintarlo). */\ninterface Entry {\n item: NgxFileItem;\n code?: NgxFileErrorCode;\n}\n\n/**\n * Zona para soltar o seleccionar ficheros, con lista de ficheros y previsualización de imágenes.\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: los `File[]` válidos) o con `[(files)]`.\n */\n@Component({\n selector: 'ngx-file-input',\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-file-input.component.html',\n styleUrl: './ngx-file-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-file-input',\n '[class.ngx-fi--default]': \"variant() === 'default'\",\n '[class.ngx-fi--compact]': \"variant() === 'compact'\",\n '[class.ngx-fi--button]': \"variant() === 'button'\",\n '[class.ngx-fi--disabled]': 'isDisabled()',\n '[class.ngx-fi--dragover]': 'isDragOver()',\n '[class.ngx-fi--invalid]': 'showError()',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class NgxFileInput implements ControlValueAccessor, AfterViewInit, DoCheck {\n // Se registra como value accessor a mano para poder leer el control (obligatorio y error), como ngx-input-file\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _locale = inject(LOCALE_ID);\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n protected readonly texts = inject(NgxTexts).texts;\n\n // ── Inputs ──────────────────────────────────────────────────────────────────\n\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). `'*'` = cualquiera. */\n readonly accept = input<string | string[]>('*');\n /** Admite varios ficheros: cada selección se añade a la anterior. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamaño máximo por fichero, en bytes. `null` = sin límite. */\n readonly maxSize = input<number | null>(null);\n /** Número máximo de ficheros válidos (con `multiple`). `null` = sin límite. */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Texto principal. Por defecto, el texto `fileInput.dropLabel` de la librería. */\n readonly label = input<string>();\n /** Texto secundario (formatos, tamaños…). */\n readonly hint = input<string | null>(null);\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\n readonly error = input<string>('');\n /** Muestra la lista de ficheros (con miniatura de las imágenes). */\n readonly showPreview = input(true, { transform: booleanAttribute });\n /** `'default'` (zona grande), `'compact'` (barra horizontal) o `'button'` (solo un botón). */\n readonly variant = input<NgxFileInputVariant>('default');\n\n /** Ficheros válidos seleccionados. Admite `[(files)]` para usarlo sin formularios. */\n readonly files = model<File[]>([]);\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n\n /** Ficheros válidos añadidos en una selección o al soltar. */\n readonly filesSelected = output<NgxFileItem[]>();\n /** Fichero quitado de la lista (válido o rechazado). */\n readonly fileRemoved = output<NgxFileItem>();\n /** Un fichero rechazado (tipo, tamaño o número). */\n readonly validationError = output<NgxFileError>();\n\n // ── Estado ──────────────────────────────────────────────────────────────────\n\n protected readonly id = `ngx-fi-${nextId++}`;\n private readonly _entries = signal<Entry[]>([]);\n private readonly _cvaDisabled = signal(false);\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n protected readonly isDragOver = signal(false);\n protected readonly showDropConfirm = signal(false);\n protected readonly announcement = signal('');\n protected readonly isRequired = signal(false);\n protected readonly showError = signal(false);\n\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().fileInput.dropLabel);\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\n protected readonly describedBy = computed(() =>\n [this.hint() ? `${this.id}-hint` : '', this.showError() && this.error() ? `${this.id}-error` : ''].filter(Boolean).join(' ') || null\n );\n /** Lo que pinta la lista: icono, color, tamaño legible y mensaje de error ya traducido. */\n protected readonly views = computed(() =>\n this._entries().map(({ item, code }) => ({\n item,\n icon: fileIcon(item.file),\n kind: fileKind(item.file),\n size: formatFileSize(item.size, this._locale),\n error: code ? this._message(item.file, code) : null,\n }))\n );\n\n private _onChange: (files: File[]) => void = () => {};\n private _onTouched: () => void = () => {};\n private _controlSub?: Subscription;\n private _confirmTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n\n // [files] o [(files)] desde fuera: reconstruye la lista si no coincide con los válidos actuales\n effect(() => {\n const files = this.files();\n untracked(() => {\n const valid = this._validFiles();\n if (files.length !== valid.length || files.some((file, i) => file !== valid[i])) this._resetFrom(files);\n });\n });\n\n inject(DestroyRef).onDestroy(() => {\n this._controlSub?.unsubscribe();\n clearTimeout(this._confirmTimer);\n this._entries().forEach(({ item }) => this._revokePreview(item));\n });\n }\n\n ngAfterViewInit(): void {\n // formControlName asigna su control después de registerOnChange: aquí ya está\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n ngDoCheck(): void {\n // resetForm quita el «enviado» sin emitir evento: se recalcula en cada comprobación\n this._syncFormState();\n }\n\n // ── API pública ─────────────────────────────────────────────────────────────\n\n /** Abre el selector de ficheros del sistema (no hace nada si está deshabilitado). */\n openFilePicker(): void {\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\n }\n\n /** Quita un fichero de la lista, válido o rechazado. */\n removeFile(item: NgxFileItem): void {\n const entry = this._entries().find(e => e.item.id === item.id);\n if (!entry) return;\n this._revokePreview(item);\n this._entries.update(list => list.filter(e => e !== entry));\n this.fileRemoved.emit(item);\n this.announcement.set(this.texts().fileInput.removed(item.name));\n if (!entry.code) this._commit();\n }\n\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\n\n protected onZoneKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openFilePicker();\n }\n }\n\n protected onZoneBlur(): void {\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._addFiles(Array.from(input.files ?? []));\n input.value = '';\n }\n\n protected onDragOver(event: DragEvent): void {\n // Siempre: si no, el navegador abre el fichero al soltarlo\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\n if (!this.isDisabled()) this.isDragOver.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDragOver.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver.set(false);\n if (this.isDisabled()) return;\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (!files.length) return;\n this._addFiles(files);\n this._flashDropConfirm();\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────────────\n\n writeValue(files: File[] | null | undefined): void {\n this.files.set(Array.isArray(files) ? files : []);\n }\n\n registerOnChange(fn: (files: File[]) => void): void {\n this._onChange = fn;\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n // ── Privado ─────────────────────────────────────────────────────────────────\n\n private _validFiles(): File[] {\n return this._entries().filter(e => !e.code).map(e => e.item.file);\n }\n\n private _addFiles(incoming: File[]): void {\n const patterns = parseAccept(this.accept());\n const maxSize = this.maxSize();\n const max = this.multiple() ? this.maxFiles() : 1;\n const current = this.multiple() ? this._entries() : [];\n let validCount = current.filter(e => !e.code).length;\n const added: Entry[] = [];\n\n for (const file of this.multiple() ? incoming : incoming.slice(0, 1)) {\n // Repetidos (ya en la lista o dos veces en la misma tanda): se ignoran\n if ([...current, ...added].some(e => isSameFile(e.item.file, file))) continue;\n\n let code: NgxFileErrorCode | undefined;\n if (!matchesAccept(file, patterns)) code = 'TYPE_NOT_ALLOWED';\n else if (maxSize != null && file.size > maxSize) code = 'SIZE_EXCEEDED';\n else if (max != null && validCount >= max) code = 'MAX_FILES_EXCEEDED';\n else validCount++;\n\n added.push({ item: this._toItem(file, code), code });\n }\n if (!added.length) return;\n\n if (!this.multiple()) this._entries().forEach(({ item }) => this._revokePreview(item));\n this._entries.set([...current, ...added]);\n\n const rejected = added.filter(e => e.code);\n for (const { item, code } of rejected) this.validationError.emit({ file: item.file, code: code!, message: item.error! });\n\n const valid = added.filter(e => !e.code).map(e => e.item);\n if (valid.length) {\n this.filesSelected.emit(valid);\n this.announcement.set(this.texts().fileInput.added(valid.length));\n } else {\n this.announcement.set(rejected.map(e => `${e.item.name}: ${e.item.error}`).join('. '));\n }\n\n this._commit();\n }\n\n /** Publica los ficheros válidos: model, formulario y estado de tocado. */\n private _commit(): void {\n const files = this._validFiles();\n this.files.set(files);\n this._onChange(files);\n this._markTouched();\n }\n\n /** Lista nueva a partir de un valor externo (writeValue o [files]); los rechazados se descartan. */\n private _resetFrom(files: File[]): void {\n const previous = this._entries();\n previous.filter(e => !files.includes(e.item.file)).forEach(({ item }) => this._revokePreview(item));\n this._entries.set(files.map(file => previous.find(e => e.item.file === file && !e.code) ?? { item: this._toItem(file) }));\n }\n\n private _toItem(file: File, code?: NgxFileErrorCode): NgxFileItem {\n const item: NgxFileItem = {\n file,\n id: `${this.id}-file-${nextId++}`,\n name: file.name,\n size: file.size,\n type: file.type,\n status: code ? 'error' : 'valid',\n };\n if (code) item.error = this._message(file, code);\n // URL temporal en vez de leer la imagen entera a base64; se libera al quitarla\n else if (this._isBrowser && file.type.startsWith('image/')) item.preview = URL.createObjectURL(file);\n return item;\n }\n\n private _revokePreview(item: NgxFileItem): void {\n if (item.preview?.startsWith('blob:')) URL.revokeObjectURL(item.preview);\n }\n\n private _message(file: File, code: NgxFileErrorCode): string {\n const texts = this.texts().fileInput;\n switch (code) {\n case 'TYPE_NOT_ALLOWED': {\n // La extensión («.exe») se entiende mejor que el MIME («application/x-msdownload»)\n const dot = file.name.lastIndexOf('.');\n return texts.typeNotAllowed(dot > 0 ? file.name.slice(dot).toLowerCase() : file.type || file.name);\n }\n case 'SIZE_EXCEEDED':\n return texts.tooLarge(formatFileSize(this.maxSize() ?? 0, this._locale));\n case 'MAX_FILES_EXCEEDED':\n return texts.maxFiles(this.maxFiles() ?? 1);\n }\n }\n\n private _bindControl(control: AbstractControl): void {\n this._controlSub?.unsubscribe();\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState());\n this._syncFormState();\n }\n\n private _syncFormState(): void {\n const control = this._ngControl?.control;\n // Signals con el mismo valor no repintan: se puede llamar en cada ngDoCheck\n this.isRequired.set(control?.hasValidator(Validators.required) ?? false);\n this.showError.set(!!control && control.invalid && (control.touched || !!this._parentForm?.submitted));\n }\n\n private _markTouched(): void {\n this._onTouched();\n this._syncFormState();\n }\n\n private _flashDropConfirm(): void {\n this.showDropConfirm.set(true);\n clearTimeout(this._confirmTimer);\n this._confirmTimer = setTimeout(() => this.showDropConfirm.set(false), 450);\n }\n}\n","<!-- Input nativo oculto: lo abre la zona o el botón -->\n<input\n #nativeInput\n class=\"ngx-fi__native\"\n type=\"file\"\n hidden\n tabindex=\"-1\"\n [accept]=\"acceptAttr()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onNativeChange($event)\"\n (cancel)=\"onZoneBlur()\" />\n\n@switch (variant()) {\n @case ('button') {\n <button\n matButton=\"filled\"\n type=\"button\"\n class=\"ngx-fi__button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (blur)=\"onZoneBlur()\">\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabel() }}@if (isRequired()) {<span class=\"ngx-fi__required\" aria-hidden=\"true\">*</span>}\n </button>\n @if (hint()) {\n <span class=\"ngx-fi__hint\" [id]=\"id + '-hint'\">{{ hint() }}</span>\n }\n }\n\n @default {\n <!-- Zona de arrastre: es un botón (abre el selector) con la etiqueta como nombre accesible -->\n <div\n class=\"ngx-fi__zone\"\n [class.ngx-fi__zone--compact]=\"variant() === 'compact'\"\n role=\"button\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (keydown)=\"onZoneKeydown($event)\"\n (blur)=\"onZoneBlur()\">\n <mat-icon class=\"ngx-fi__zone-icon\" aria-hidden=\"true\">cloud_upload</mat-icon>\n\n <span class=\"ngx-fi__zone-text\">\n <span class=\"ngx-fi__label\">\n {{ resolvedLabel() }}@if (isRequired()) {<span class=\"ngx-fi__required\" aria-hidden=\"true\">*</span>}\n </span>\n @if (hint()) {\n <span class=\"ngx-fi__hint\" [id]=\"id + '-hint'\">{{ hint() }}</span>\n }\n @if (variant() === 'default') {\n <span class=\"ngx-fi__browse\">{{ texts().fileInput.browse }}</span>\n }\n </span>\n\n @if (showDropConfirm()) {\n <span class=\"ngx-fi__confirm\" aria-hidden=\"true\"><mat-icon>check_circle</mat-icon></span>\n }\n </div>\n }\n}\n\n@if (showError() && error()) {\n <span class=\"ngx-fi__error\" [id]=\"id + '-error'\">{{ error() }}</span>\n}\n\n@if (showPreview() && views().length) {\n <ul class=\"ngx-fi__list\">\n @for (view of views(); track view.item.id) {\n <li class=\"ngx-fi__item\" [class.ngx-fi__item--error]=\"view.error\">\n <span class=\"ngx-fi__thumb\" [attr.data-kind]=\"view.kind\">\n @if (view.item.preview) {\n <img [src]=\"view.item.preview\" alt=\"\" />\n } @else {\n <mat-icon aria-hidden=\"true\">{{ view.icon }}</mat-icon>\n }\n </span>\n\n <span class=\"ngx-fi__info\">\n <span class=\"ngx-fi__name\" [title]=\"view.item.name\">{{ view.item.name }}</span>\n <span class=\"ngx-fi__meta\">\n {{ view.size }}\n @if (view.error) {\n <span class=\"ngx-fi__item-error\"><mat-icon aria-hidden=\"true\">error</mat-icon>{{ view.error }}</span>\n }\n </span>\n </span>\n\n <button\n matIconButton\n type=\"button\"\n class=\"ngx-fi__remove\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"texts().fileInput.remove(view.item.name)\"\n [matTooltip]=\"texts().fileInput.remove(view.item.name)\"\n (click)=\"removeFile(view.item)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n </ul>\n}\n\n<!-- Región viva fija: añadidos, quitados y rechazados -->\n<div class=\"ngx-fi__live\" aria-live=\"polite\">{{ announcement() }}</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i5","i4","i7","uuidv4","i1","i6","i8","i9","i13"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-eiffage-material.mjs","sources":["../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-tables.ts","../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-eiffage-texts.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.html","../../../projects/ngx-eiffage-material/src/lib/components/shared/file-utils.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.html","../../../projects/ngx-eiffage-material/src/lib/utils/string-operations.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.html","../../../projects/ngx-eiffage-material/src/lib/models/dialog-config.ts","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog-header/ngx-dialog-header.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog-header/ngx-dialog-header.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-cell-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/pipes/only-upper-first-character.pipe.ts","../../../projects/ngx-eiffage-material/src/lib/models/paginated-table-config.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter-utils.ts","../../../projects/ngx-eiffage-material/src/lib/models/user-id-factory.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter.ts","../../../projects/ngx-eiffage-material/src/lib/services/advanced-filter.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/column-config.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/datos-pantalla.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/ngx-dialog.service.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.html","../../../projects/ngx-eiffage-material/src/lib/components/shared/table-utils.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.html","../../../projects/ngx-eiffage-material/src/ngx-eiffage-material.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * @deprecated Usa `provideNgxEiffageTexts()`: solo hay que indicar los textos que cambian, se agrupan\r\n * por componente y se actualizan solos al cambiar de idioma (signals). Mientras tanto, una subclase de\r\n * NgxTablesIntl provista en la app se sigue respetando. Esta clase no recibirá textos nuevos y se\r\n * eliminará en una versión mayor.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTablesIntl {\r\n /**\r\n * Stream que emite cuando las etiquetas cambian.\r\n * Los componentes deben reaccionar a estos cambios.\r\n */\r\n readonly changes = new Subject<void>();\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-TABLE ===\r\n // ========================================\r\n\r\n // === Botones de acciones ===\r\n /** Etiqueta del botón de crear/nuevo */\r\n createButtonLabel: string = 'Nuevo';\r\n\r\n /** Tooltip del botón de editar */\r\n editTooltip: string = 'Editar';\r\n\r\n /** Tooltip del botón de eliminar */\r\n deleteTooltip: string = 'Eliminar';\r\n\r\n /** Etiqueta del botón de confirmar eliminación */\r\n confirmDeleteLabel: string = 'Eliminar';\r\n\r\n // === Búsqueda y filtros ===\r\n /** Placeholder del campo de búsqueda */\r\n searchPlaceholder: string = 'Buscar...';\r\n\r\n /** Tooltip del botón de limpiar búsqueda */\r\n clearSearchTooltip: string = 'Limpiar búsqueda';\r\n\r\n /** Tooltip del botón de editar columnas */\r\n editColumnsTooltip: string = 'Visualizar y ordenar columnas';\r\n\r\n /** Etiqueta para filtros avanzados */\r\n advancedFiltersLabel: string = 'Filtros avanzados';\r\n\r\n /** Etiqueta para nuevo filtro avanzado */\r\n newAdvancedFilterLabel: string = 'Nuevo filtro';\r\n\r\n /** Tooltip del botón de editar filtro avanzado - usa función getEditAdvancedFilterTooltip() */\r\n editAdvancedFilterTooltip: string = 'Editar filtro';\r\n\r\n /** Tooltip del botón de eliminar filtro avanzado - usa función getDeleteAdvancedFilterTooltip() */\r\n deleteAdvancedFilterTooltip: string = 'Eliminar filtro';\r\n\r\n /** Tooltip del botón de quitar filtro avanzado aplicado */\r\n removeAdvancedFilterTooltip: string = 'Quitar filtros avanzados';\r\n\r\n /** Texto cuando no hay filtros avanzados */\r\n noAdvancedFiltersLabel: string = 'No hay filtros guardados';\r\n\r\n /** Etiqueta para quitar filtro en select */\r\n removeFilterLabel: string = '-- Quitar filtro --';\r\n\r\n // === Selección de filas ===\r\n /** Tooltip del checkbox de seleccionar todas las filas */\r\n selectAllTooltip: string = 'Seleccionar todo';\r\n\r\n /** Tooltip del checkbox de deseleccionar todas las filas */\r\n deselectAllTooltip: string = 'Deseleccionar todo';\r\n\r\n /** Etiqueta del botón de deseleccionar todos */\r\n deselectAllLabel: string = 'Desmarcar todos los registros';\r\n\r\n /** Tooltip del menú de acciones de selección */\r\n selectionActionsTooltip: string = 'Operaciones sobre los registros seleccionados';\r\n\r\n // === Exportación ===\r\n /** Tooltip del botón de exportar */\r\n exportTooltip: string = 'Exportar datos';\r\n\r\n /** Etiqueta para exportar a Excel */\r\n exportToExcelLabel: string = 'Exportar a XLSX la página actual';\r\n\r\n /** Etiqueta para exportar a PDF */\r\n exportToPdfLabel: string = 'Exportar a PDF la página actual';\r\n\r\n // === Pantalla completa ===\r\n /** Tooltip para entrar en pantalla completa */\r\n enterFullscreenTooltip: string = 'Pantalla completa';\r\n\r\n /** Tooltip para salir de pantalla completa */\r\n exitFullscreenTooltip: string = 'Salir del modo de pantalla completa';\r\n\r\n // === Mensajes ===\r\n /** Mensaje cuando no hay datos */\r\n noDataMessage: string = 'No se han encontrado resultados...';\r\n\r\n /** Mensaje mientras se cargan los datos */\r\n loadingMessage: string = 'Cargando...';\r\n\r\n /** Título del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmTitle: string = 'Eliminar';\r\n\r\n /** Cuerpo del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmBody: string = 'Vas a eliminar el registro seleccionado. ¿Estas seguro?';\r\n\r\n /** Título del diálogo de eliminación de filtro avanzado */\r\n deleteAdvancedFilterTitle: string = 'Eliminar plantilla de filtro avanzado';\r\n\r\n // === Columnas ===\r\n /** Etiqueta para la columna de acciones */\r\n actionsLabel: string = 'Acciones';\r\n\r\n // === Filtros de columna ===\r\n /** Placeholder para filtros de fecha */\r\n datePlaceholder: string = 'Fecha';\r\n\r\n /** Placeholder para filtro de rango de fechas - inicio */\r\n dateRangeStartPlaceholder: string = 'Desde';\r\n\r\n /** Placeholder para filtro de rango de fechas - fin */\r\n dateRangeEndPlaceholder: string = 'Hasta';\r\n\r\n // === Filas expandibles ===\r\n /** Tooltip para expandir detalles */\r\n expandDetailsTooltip: string = 'Ver detalles';\r\n\r\n /** Tooltip para contraer detalles */\r\n collapseDetailsTooltip: string = 'Ocultar detalles';\r\n\r\n // === Totales en pie de tabla ===\r\n /** Etiqueta para total por página */\r\n totalPerPageLabel: string = 'Total parcial (por página)';\r\n\r\n /** Etiqueta para total general */\r\n totalGeneralLabel: string = 'Total (todos los registros)';\r\n\r\n // === Diálogos ===\r\n /** Botón de cancelar en diálogos */\r\n cancelButtonLabel: string = 'Cancelar';\r\n\r\n /** Botón de confirmar en diálogos */\r\n confirmButtonLabel: string = 'Confirmar';\r\n\r\n /** Botón de cerrar en diálogos */\r\n closeButtonLabel: string = 'Cerrar';\r\n\r\n /** Botón de guardar en diálogos */\r\n saveButtonLabel: string = 'Guardar';\r\n\r\n /** Botón de guardar y aplicar en diálogos */\r\n saveAndApplyButtonLabel: string = 'Guardar y aplicar';\r\n\r\n // === Diálogo de configurar columnas ===\r\n /** Título del diálogo de configurar columnas */\r\n configureColumnsTitle: string = 'Ordenar y visualizar columnas de la tabla';\r\n\r\n /** Tooltip para anclar columna */\r\n pinColumnTooltip: string = 'Anclar columna';\r\n\r\n /** Tooltip para desanclar columna */\r\n unpinColumnTooltip: string = 'Desanclar';\r\n\r\n /** Tooltip para subir columna */\r\n moveUpTooltip: string = 'Subir';\r\n\r\n /** Tooltip para bajar columna */\r\n moveDownTooltip: string = 'Bajar';\r\n\r\n /** Texto para columnas con filtros aplicados */\r\n hasFiltersAppliedText: string = '(hay filtros aplicados)';\r\n\r\n /** Nota sobre ocultar columnas con filtros */\r\n hideColumnWithFiltersNote: string = 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados';\r\n\r\n /** Etiqueta de nota */\r\n noteLabel: string = 'Nota:';\r\n\r\n /** Botón de restablecer configuración de columnas */\r\n resetColumnsButtonLabel: string = 'Reestablecer orden y visualización';\r\n\r\n // === Diálogo de filtros avanzados ===\r\n /** Título del diálogo de filtros avanzados */\r\n advancedFiltersDialogTitle: string = 'Filtros avanzados para la tabla';\r\n\r\n /** Label del campo de nombre de plantilla */\r\n templateNameLabel: string = 'Nombre de la plantilla';\r\n\r\n /** Error de nombre obligatorio */\r\n templateNameRequiredError: string = 'El nombre es obligatorio';\r\n\r\n /** Título de ayuda de filtros avanzados */\r\n advancedFiltersHelpTitle: string = 'Uso de filtros avanzados';\r\n\r\n /** Texto de ayuda sobre grupos */\r\n advancedFiltersGroupHelp: string = 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos';\r\n\r\n /** Texto de ayuda sobre filtros */\r\n advancedFiltersRuleHelp: string = 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)';\r\n\r\n /** Label de grupo en ayuda */\r\n groupLabel: string = 'Grupo:';\r\n\r\n /** Label de filtro en ayuda */\r\n filterLabel: string = 'Filtro:';\r\n\r\n /** Botón añadir filtro */\r\n addFilterButtonLabel: string = 'Añadir filtro';\r\n\r\n /** Botón añadir grupo */\r\n addGroupButtonLabel: string = 'Añadir grupo';\r\n\r\n /** Tooltip eliminar grupo */\r\n deleteGroupTooltip: string = 'Eliminar grupo';\r\n\r\n /** Tooltip eliminar filtro */\r\n deleteFilterTooltip: string = 'Eliminar filtro';\r\n\r\n // === Reglas de filtros avanzados ===\r\n /** Label de campo */\r\n fieldLabel: string = 'Campo';\r\n\r\n /** Label de condición */\r\n conditionLabel: string = 'Condición';\r\n\r\n /** Label de valor */\r\n valueLabel: string = 'Valor';\r\n\r\n /** Placeholder de seleccionar opción */\r\n selectOptionPlaceholder: string = 'Selecciona una opción';\r\n\r\n /** Opción para quitar campo */\r\n removeFieldOption: string = '-- Quitar campo --';\r\n\r\n /** Opción para quitar condición */\r\n removeConditionOption: string = '-- Quitar condición --';\r\n\r\n /** Opción para quitar valor */\r\n removeValueOption: string = '-- Quitar valor --';\r\n\r\n /** Error de campo obligatorio */\r\n requiredFieldError: string = 'Obligatorio';\r\n\r\n // === Conectores y operadores de filtros ===\r\n /** Conector AND */\r\n connectorAnd: string = 'Y';\r\n\r\n /** Conector OR */\r\n connectorOr: string = 'O';\r\n\r\n /** Operador igual a */\r\n operatorEquals: string = 'Igual a';\r\n\r\n /** Operador distinto de */\r\n operatorNotEquals: string = 'Distinto de';\r\n\r\n /** Operador mayor que */\r\n operatorGreaterThan: string = 'Mayor que';\r\n\r\n /** Operador mayor o igual que */\r\n operatorGreaterOrEquals: string = 'Mayor o igual que';\r\n\r\n /** Operador menor que */\r\n operatorLessThan: string = 'Menor que';\r\n\r\n /** Operador menor o igual que */\r\n operatorLessOrEquals: string = 'Menor o igual que';\r\n\r\n /** Operador contiene */\r\n operatorLike: string = 'Contiene';\r\n\r\n // ========================================\r\n // === NGX-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Mensaje cuando no hay resultados en select */\r\n noResultsMessage: string = 'No se han encontrado resultados...';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Etiqueta del botón de ver más resultados */\r\n showMoreLabel: string = 'Ver más';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SELECT ===\r\n // ========================================\r\n\r\n /** Botón de confirmar selección (modo múltiple) */\r\n paginatedSelectConfirmLabel: string = 'Confirmar';\r\n\r\n /** Botón de limpiar selección (modo múltiple) */\r\n paginatedSelectResetLabel: string = 'Limpiar';\r\n\r\n /** Etiqueta del toggle \"Seleccionar todo\" */\r\n paginatedSelectSelectAllLabel: string = 'Seleccionar todo';\r\n\r\n /** Fila \"cargando más…\" al paginar por scroll */\r\n paginatedSelectLoadingMoreLabel: string = 'Cargando más…';\r\n\r\n /** Fila de fin de lista cuando ya no quedan más resultados */\r\n paginatedSelectEndOfListLabel: string = 'No hay más resultados';\r\n\r\n /** Ayuda bajo el mensaje de \"sin resultados\" cuando hay búsqueda activa */\r\n paginatedSelectNoResultsHint: string = 'Prueba con otro término de búsqueda';\r\n\r\n /** Botón para limpiar la búsqueda desde el estado vacío */\r\n paginatedSelectClearSearchLabel: string = 'Limpiar búsqueda';\r\n\r\n /** Título del estado de error al fallar la carga */\r\n paginatedSelectErrorTitle: string = 'No se pudieron cargar los datos';\r\n\r\n /** Ayuda del estado de error */\r\n paginatedSelectErrorHint: string = 'Revisa tu conexión e inténtalo de nuevo';\r\n\r\n /** Botón de reintentar la carga */\r\n paginatedSelectRetryLabel: string = 'Reintentar';\r\n\r\n // ========================================\r\n // === FUNCIONES AUXILIARES ===\r\n // ========================================\r\n\r\n /**\r\n * Función para obtener el mensaje de confirmación de eliminación\r\n * @param itemName Nombre del elemento a eliminar (opcional)\r\n */\r\n getDeleteConfirmMessage(itemName?: string): string {\r\n if (itemName) {\r\n return `Vas a eliminar '${itemName}'. ¿Estas seguro?`;\r\n }\r\n return this.deleteConfirmBody;\r\n }\r\n\r\n /**\r\n * Función para obtener el mensaje de eliminación de filtro avanzado\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterMessage(filterName: string): string {\r\n return `Vas a eliminar la plantilla de filtro avanzado '${filterName}'. ¿Estas seguro?`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de editar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getEditAdvancedFilterTooltip(filterName: string): string {\r\n return `Editar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de eliminar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterTooltip(filterName: string): string {\r\n return `Eliminar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el label de elementos seleccionados\r\n * @param count Número de elementos seleccionados\r\n */\r\n getSelectedItemsLabel(count: number): string {\r\n return count === 1\r\n ? `${count} elemento seleccionado`\r\n : `${count} elementos seleccionados`;\r\n }\r\n\r\n /**\r\n * Función para obtener el texto de quitar selección en selects\r\n * @param optionName Nombre de la opción (opcional)\r\n */\r\n getRemoveOptionText(optionName: string): string {\r\n return `-- Quitar ${optionName} --`;\r\n }\r\n\r\n /**\r\n * Mensaje anunciado por lectores de pantalla (aria-live) con el número de\r\n * resultados tras filtrar en un select buscable.\r\n * @param count Número de resultados visibles\r\n */\r\n getSearchResultsCountMessage(count: number): string {\r\n return count === 1 ? '1 resultado' : `${count} resultados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo múltiple: elementos seleccionados\r\n * sobre el total disponible.\r\n */\r\n getPaginatedSelectSelectedCountLabel(selected: number, total: number): string {\r\n return `${selected} de ${total} seleccionados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo simple: número total de resultados.\r\n */\r\n getPaginatedSelectResultsCountLabel(total: number): string {\r\n return total === 1 ? '1 resultado' : `${total} resultados`;\r\n }\r\n}\r\n","import {\r\n computed,\r\n EnvironmentProviders,\r\n inject,\r\n Injectable,\r\n InjectionToken,\r\n isSignal,\r\n makeEnvironmentProviders,\r\n Signal,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { NgxTablesIntl } from './ngx-tables';\r\n\r\n/**\r\n * Todos los textos de la librería, agrupados por componente.\r\n * Los que dependen de un dato (nombre, número…) son funciones.\r\n */\r\nexport interface NgxEiffageTexts {\r\n /** Textos compartidos por varios componentes. */\r\n common: {\r\n search: string;\r\n clearSearch: string;\r\n noData: string;\r\n loading: string;\r\n cancel: string;\r\n confirm: string;\r\n close: string;\r\n save: string;\r\n saveAndApply: string;\r\n };\r\n /** ngx-basic-table y ngx-paginated-table. */\r\n table: {\r\n create: string;\r\n edit: string;\r\n delete: string;\r\n confirmDelete: string;\r\n deleteConfirmTitle: string;\r\n deleteConfirmBody: string;\r\n editColumns: string;\r\n deselectAll: string;\r\n selectionActions: string;\r\n export: string;\r\n exportExcel: string;\r\n exportPdf: string;\r\n enterFullscreen: string;\r\n exitFullscreen: string;\r\n actions: string;\r\n dateRangeStart: string;\r\n dateRangeEnd: string;\r\n totalPerPage: string;\r\n totalGeneral: string;\r\n /** Exportar en ngx-basic-table: todos los registros filtrados, no solo la página. */\r\n exportExcelAll: string;\r\n exportPdfAll: string;\r\n /** Casilla de selección de una fila (lectores de pantalla). */\r\n selectRow: string;\r\n /** Casilla de la cabecera: seleccionar las filas de la página. */\r\n selectPage: string;\r\n expandRow: string;\r\n collapseRow: string;\r\n /** Nombre del filtro de columna en la opción «Sin …» de los selects de filtro. */\r\n columnFilter: string;\r\n };\r\n /** Diálogo de ordenar y mostrar columnas de las tablas. */\r\n columnsDialog: {\r\n title: string;\r\n pin: string;\r\n unpin: string;\r\n moveUp: string;\r\n moveDown: string;\r\n hasFiltersApplied: string;\r\n hideColumnWithFiltersNote: string;\r\n note: string;\r\n reset: string;\r\n };\r\n /** Filtros avanzados de ngx-paginated-table. */\r\n advancedFilters: {\r\n label: string;\r\n new: string;\r\n remove: string;\r\n editTooltip: (filterName: string) => string;\r\n deleteTooltip: (filterName: string) => string;\r\n deleteTitle: string;\r\n deleteMessage: (filterName: string) => string;\r\n dialogTitle: string;\r\n templateName: string;\r\n templateNameRequired: string;\r\n helpTitle: string;\r\n groupHelp: string;\r\n ruleHelp: string;\r\n group: string;\r\n filter: string;\r\n addFilter: string;\r\n addGroup: string;\r\n deleteGroup: string;\r\n deleteFilter: string;\r\n field: string;\r\n condition: string;\r\n value: string;\r\n selectOption: string;\r\n required: string;\r\n and: string;\r\n or: string;\r\n operators: {\r\n equals: string;\r\n notEquals: string;\r\n greaterThan: string;\r\n greaterOrEquals: string;\r\n lessThan: string;\r\n lessOrEquals: string;\r\n like: string;\r\n };\r\n };\r\n /** ngx-basic-select, ngx-searchable-select y ngx-paginated-searchable-select. */\r\n select: {\r\n noResults: string;\r\n showMore: string;\r\n /** Etiqueta accesible del botón X que quita la selección (clearable). */\r\n clear: string;\r\n removeOption: (optionName: string) => string;\r\n resultsCount: (count: number) => string;\r\n };\r\n /** ngx-paginated-select. */\r\n paginatedSelect: {\r\n confirm: string;\r\n reset: string;\r\n selectAll: string;\r\n loadingMore: string;\r\n endOfList: string;\r\n noResultsHint: string;\r\n clearSearch: string;\r\n errorTitle: string;\r\n errorHint: string;\r\n retry: string;\r\n selectedCount: (selected: number, total: number) => string;\r\n resultsCount: (total: number) => string;\r\n /** Etiqueta accesible del botón que quita un elemento seleccionado (chips). */\r\n removeItem: (label: string) => string;\r\n /** Texto accesible del indicador «+N» de chips que no caben. */\r\n moreSelected: (count: number) => string;\r\n /** Resumen de la selección en modo texto: las primeras etiquetas y cuántas más hay. */\r\n summary: (labels: string[], rest: number) => string;\r\n /** Aviso al cerrar el panel múltiple con cambios sin confirmar. */\r\n discardChanges: string;\r\n discard: string;\r\n keepEditing: string;\r\n /** Búsqueda demasiado corta (minSearchLength). */\r\n minSearch: (min: number) => string;\r\n };\r\n /** NgxDialogService y ngx-dialog (botones por defecto). */\r\n dialog: {\r\n cancel: string;\r\n /** Botón de confirmar de NgxDialogService.confirm(). */\r\n confirm: string;\r\n /** Botón de aceptar de NgxDialogService.info() y de ngx-dialog. */\r\n accept: string;\r\n /** Etiqueta accesible y tooltip del botón X de cerrar. */\r\n close: string;\r\n };\r\n /** ngx-file-input. */\r\n fileInput: {\r\n dropLabel: string;\r\n browse: string;\r\n remove: (fileName: string) => string;\r\n removed: (fileName: string) => string;\r\n added: (count: number) => string;\r\n maxFiles: (max: number) => string;\r\n typeNotAllowed: (type: string) => string;\r\n tooLarge: (maxSize: string) => string;\r\n };\r\n /** ngx-input-file. */\r\n inputFile: {\r\n label: string;\r\n /** Texto del campo vacío. */\r\n placeholder: string;\r\n /** Pista mientras se arrastran ficheros encima. */\r\n dropping: string;\r\n /** Etiqueta accesible y tooltip del botón de examinar. */\r\n browse: string;\r\n remove: (fileName: string) => string;\r\n /** Fichero descartado por no cumplir `accept`. */\r\n rejectedType: (fileName: string) => string;\r\n /** Fichero descartado por superar `maxSize` (ya formateado: «2 MB»). */\r\n rejectedSize: (fileName: string, maxSize: string) => string;\r\n /** Ficheros descartados por superar `maxFiles`. */\r\n rejectedCount: (max: number) => string;\r\n };\r\n skeleton: {\r\n loading: string;\r\n };\r\n alert: {\r\n dismiss: string;\r\n };\r\n loadingButton: {\r\n busy: string;\r\n };\r\n}\r\n\r\n/** Igual que T pero con todo opcional, a cualquier profundidad (las funciones se quedan como están). */\r\ntype DeepPartial<T> = {\r\n [K in keyof T]?: T[K] extends (...args: never[]) => unknown ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];\r\n};\r\n\r\n/** Textos que la app quiere cambiar: solo los que difieren de los valores por defecto. */\r\nexport type NgxEiffageTextsOverrides = DeepPartial<NgxEiffageTexts>;\r\n\r\nconst plural = (count: number, one: string, many: string) => (count === 1 ? one : many);\r\n\r\n/** Valores por defecto (castellano). */\r\nexport const NGX_EIFFAGE_DEFAULT_TEXTS: NgxEiffageTexts = {\r\n common: {\r\n search: 'Buscar...',\r\n clearSearch: 'Limpiar búsqueda',\r\n noData: 'No se han encontrado resultados...',\r\n loading: 'Cargando...',\r\n cancel: 'Cancelar',\r\n confirm: 'Confirmar',\r\n close: 'Cerrar',\r\n save: 'Guardar',\r\n saveAndApply: 'Guardar y aplicar',\r\n },\r\n table: {\r\n create: 'Nuevo',\r\n edit: 'Editar',\r\n delete: 'Eliminar',\r\n confirmDelete: 'Eliminar',\r\n deleteConfirmTitle: 'Eliminar',\r\n deleteConfirmBody: 'Vas a eliminar el registro seleccionado. ¿Estas seguro?',\r\n editColumns: 'Visualizar y ordenar columnas',\r\n deselectAll: 'Desmarcar todos los registros',\r\n selectionActions: 'Operaciones sobre los registros seleccionados',\r\n export: 'Exportar datos',\r\n exportExcel: 'Exportar a XLSX la página actual',\r\n exportPdf: 'Exportar a PDF la página actual',\r\n enterFullscreen: 'Pantalla completa',\r\n exitFullscreen: 'Salir del modo de pantalla completa',\r\n actions: 'Acciones',\r\n dateRangeStart: 'Desde',\r\n dateRangeEnd: 'Hasta',\r\n totalPerPage: 'Total parcial (por página)',\r\n totalGeneral: 'Total (todos los registros)',\r\n exportExcelAll: 'Exportar a XLSX',\r\n exportPdfAll: 'Exportar a PDF',\r\n selectRow: 'Seleccionar fila',\r\n selectPage: 'Seleccionar las filas de la página',\r\n expandRow: 'Ver detalle',\r\n collapseRow: 'Ocultar detalle',\r\n columnFilter: 'filtro',\r\n },\r\n columnsDialog: {\r\n title: 'Ordenar y visualizar columnas de la tabla',\r\n pin: 'Anclar columna',\r\n unpin: 'Desanclar',\r\n moveUp: 'Subir',\r\n moveDown: 'Bajar',\r\n hasFiltersApplied: '(hay filtros aplicados)',\r\n hideColumnWithFiltersNote: 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados',\r\n note: 'Nota:',\r\n reset: 'Reestablecer orden y visualización',\r\n },\r\n advancedFilters: {\r\n label: 'Filtros avanzados',\r\n new: 'Nuevo filtro',\r\n remove: 'Quitar filtros avanzados',\r\n editTooltip: name => `Editar '${name}'`,\r\n deleteTooltip: name => `Eliminar '${name}'`,\r\n deleteTitle: 'Eliminar plantilla de filtro avanzado',\r\n deleteMessage: name => `Vas a eliminar la plantilla de filtro avanzado '${name}'. ¿Estas seguro?`,\r\n dialogTitle: 'Filtros avanzados para la tabla',\r\n templateName: 'Nombre de la plantilla',\r\n templateNameRequired: 'El nombre es obligatorio',\r\n helpTitle: 'Uso de filtros avanzados',\r\n groupHelp: 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos',\r\n ruleHelp: 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)',\r\n group: 'Grupo:',\r\n filter: 'Filtro:',\r\n addFilter: 'Añadir filtro',\r\n addGroup: 'Añadir grupo',\r\n deleteGroup: 'Eliminar grupo',\r\n deleteFilter: 'Eliminar filtro',\r\n field: 'Campo',\r\n condition: 'Condición',\r\n value: 'Valor',\r\n selectOption: 'Selecciona una opción',\r\n required: 'Obligatorio',\r\n and: 'Y',\r\n or: 'O',\r\n operators: {\r\n equals: 'Igual a',\r\n notEquals: 'Distinto de',\r\n greaterThan: 'Mayor que',\r\n greaterOrEquals: 'Mayor o igual que',\r\n lessThan: 'Menor que',\r\n lessOrEquals: 'Menor o igual que',\r\n like: 'Contiene',\r\n },\r\n },\r\n select: {\r\n noResults: 'No se han encontrado resultados...',\r\n showMore: 'Ver más',\r\n clear: 'Quitar selección',\r\n removeOption: name => `-- Quitar ${name} --`,\r\n resultsCount: count => plural(count, '1 resultado', `${count} resultados`),\r\n },\r\n paginatedSelect: {\r\n confirm: 'Confirmar',\r\n reset: 'Limpiar',\r\n selectAll: 'Seleccionar todo',\r\n loadingMore: 'Cargando más…',\r\n endOfList: 'No hay más resultados',\r\n noResultsHint: 'Prueba con otro término de búsqueda',\r\n clearSearch: 'Limpiar búsqueda',\r\n errorTitle: 'No se pudieron cargar los datos',\r\n errorHint: 'Revisa tu conexión e inténtalo de nuevo',\r\n retry: 'Reintentar',\r\n selectedCount: (selected, total) => `${selected} de ${total} seleccionados`,\r\n resultsCount: total => plural(total, '1 resultado', `${total} resultados`),\r\n removeItem: label => `Quitar ${label}`,\r\n moreSelected: count => plural(count, 'y 1 más seleccionado', `y ${count} más seleccionados`),\r\n summary: (labels, rest) => (rest ? `${labels.join(', ')} y ${rest} más` : labels.join(', ')),\r\n discardChanges: '¿Descartar los cambios sin confirmar?',\r\n discard: 'Descartar',\r\n keepEditing: 'Seguir editando',\r\n minSearch: min => `Escribe al menos ${min} caracteres para buscar`,\r\n },\r\n dialog: {\r\n cancel: 'Cancelar',\r\n confirm: 'Confirmar',\r\n accept: 'Aceptar',\r\n close: 'Cerrar',\r\n },\r\n fileInput: {\r\n dropLabel: 'Arrastra archivos aquí',\r\n browse: 'o haz clic para seleccionar',\r\n remove: name => `Eliminar ${name}`,\r\n removed: name => `Archivo ${name} eliminado`,\r\n added: count => plural(count, '1 archivo añadido', `${count} archivos añadidos`),\r\n maxFiles: max => plural(max, 'Solo se permite 1 archivo', `Máximo ${max} archivos permitidos`),\r\n typeNotAllowed: type => `Tipo no permitido: ${type}`,\r\n tooLarge: maxSize => `Excede el tamaño máximo (${maxSize})`,\r\n },\r\n inputFile: {\r\n label: 'Seleccionar archivo',\r\n placeholder: 'Haz clic o arrastra aquí',\r\n dropping: 'Suelta los archivos para añadirlos',\r\n browse: 'Examinar',\r\n remove: name => `Eliminar ${name}`,\r\n rejectedType: name => `«${name}»: tipo de archivo no permitido`,\r\n rejectedSize: (name, maxSize) => `«${name}» supera el tamaño máximo (${maxSize})`,\r\n rejectedCount: max => plural(max, 'Solo se permite 1 archivo', `Solo se permiten ${max} archivos`),\r\n },\r\n skeleton: {\r\n loading: 'Cargando…',\r\n },\r\n alert: {\r\n dismiss: 'Cerrar aviso',\r\n },\r\n loadingButton: {\r\n busy: 'Cargando…',\r\n },\r\n};\r\n\r\n/** Lo que acepta provideNgxEiffageTexts: un objeto fijo o un signal (para cambiar de idioma en caliente). */\r\nexport type NgxEiffageTextsSource = NgxEiffageTextsOverrides | Signal<NgxEiffageTextsOverrides>;\r\n\r\n/** Textos que la app consumidora sustituye. Se provee con provideNgxEiffageTexts(). */\r\nexport const NGX_EIFFAGE_TEXTS = new InjectionToken<Signal<NgxEiffageTextsOverrides>>('NGX_EIFFAGE_TEXTS');\r\n\r\n/**\r\n * Cambia los textos de la librería. Solo hay que indicar los que difieren de los valores por defecto.\r\n *\r\n * ```ts\r\n * // Textos fijos\r\n * provideNgxEiffageTexts({ alert: { dismiss: 'Dismiss' } })\r\n *\r\n * // Según el idioma de la app: una función (se ejecuta en contexto de inyección) que devuelve un signal\r\n * provideNgxEiffageTexts(() => {\r\n * const language = inject(LanguageService);\r\n * return computed(() => language.current() === 'en' ? EN_TEXTS : {});\r\n * })\r\n * ```\r\n */\r\nexport function provideNgxEiffageTexts(\r\n texts: NgxEiffageTextsSource | (() => NgxEiffageTextsSource),\r\n): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: NGX_EIFFAGE_TEXTS,\r\n useFactory: (): Signal<NgxEiffageTextsOverrides> => {\r\n const source = typeof texts === 'function' && !isSignal(texts) ? texts() : texts;\r\n return isSignal(source) ? source : signal(source);\r\n },\r\n },\r\n ]);\r\n}\r\n\r\n/** Textos efectivos de la librería: valores por defecto + NgxTablesIntl (obsoleto) + provideNgxEiffageTexts. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTexts {\r\n private readonly _overrides = inject(NGX_EIFFAGE_TEXTS, { optional: true });\r\n private readonly _legacyIntl = inject(NgxTablesIntl);\r\n private readonly _legacyChanges = toSignal(this._legacyIntl.changes);\r\n\r\n /** Todos los textos ya combinados. En plantilla: `texts().alert.dismiss`. */\r\n readonly texts: Signal<NgxEiffageTexts> = computed(() => {\r\n this._legacyChanges();\r\n const legacy = isCustomizedLegacyIntl(this._legacyIntl) ? textsFromLegacyIntl(this._legacyIntl) : {};\r\n return deepMerge(deepMerge(NGX_EIFFAGE_DEFAULT_TEXTS, legacy), this._overrides?.() ?? {});\r\n });\r\n}\r\n\r\n// ── Compatibilidad con NgxTablesIntl ────────────────────────────────────────\r\n\r\n/** Solo se leen los valores de NgxTablesIntl si el consumidor la ha sustituido (subclase o useValue). */\r\nfunction isCustomizedLegacyIntl(intl: NgxTablesIntl): boolean {\r\n return Object.getPrototypeOf(intl) !== NgxTablesIntl.prototype;\r\n}\r\n\r\n/** Traduce una NgxTablesIntl personalizada al formato nuevo. */\r\nfunction textsFromLegacyIntl(intl: NgxTablesIntl): NgxEiffageTextsOverrides {\r\n return {\r\n common: {\r\n search: intl.searchPlaceholder,\r\n clearSearch: intl.clearSearchTooltip,\r\n noData: intl.noDataMessage,\r\n loading: intl.loadingMessage,\r\n cancel: intl.cancelButtonLabel,\r\n confirm: intl.confirmButtonLabel,\r\n close: intl.closeButtonLabel,\r\n save: intl.saveButtonLabel,\r\n saveAndApply: intl.saveAndApplyButtonLabel,\r\n },\r\n table: {\r\n create: intl.createButtonLabel,\r\n edit: intl.editTooltip,\r\n delete: intl.deleteTooltip,\r\n confirmDelete: intl.confirmDeleteLabel,\r\n deleteConfirmTitle: intl.deleteConfirmTitle,\r\n deleteConfirmBody: intl.deleteConfirmBody,\r\n editColumns: intl.editColumnsTooltip,\r\n deselectAll: intl.deselectAllLabel,\r\n selectionActions: intl.selectionActionsTooltip,\r\n export: intl.exportTooltip,\r\n exportExcel: intl.exportToExcelLabel,\r\n exportPdf: intl.exportToPdfLabel,\r\n enterFullscreen: intl.enterFullscreenTooltip,\r\n exitFullscreen: intl.exitFullscreenTooltip,\r\n actions: intl.actionsLabel,\r\n dateRangeStart: intl.dateRangeStartPlaceholder,\r\n dateRangeEnd: intl.dateRangeEndPlaceholder,\r\n totalPerPage: intl.totalPerPageLabel,\r\n totalGeneral: intl.totalGeneralLabel,\r\n },\r\n columnsDialog: {\r\n title: intl.configureColumnsTitle,\r\n pin: intl.pinColumnTooltip,\r\n unpin: intl.unpinColumnTooltip,\r\n moveUp: intl.moveUpTooltip,\r\n moveDown: intl.moveDownTooltip,\r\n hasFiltersApplied: intl.hasFiltersAppliedText,\r\n hideColumnWithFiltersNote: intl.hideColumnWithFiltersNote,\r\n note: intl.noteLabel,\r\n reset: intl.resetColumnsButtonLabel,\r\n },\r\n advancedFilters: {\r\n label: intl.advancedFiltersLabel,\r\n new: intl.newAdvancedFilterLabel,\r\n remove: intl.removeAdvancedFilterTooltip,\r\n editTooltip: name => intl.getEditAdvancedFilterTooltip(name),\r\n deleteTooltip: name => intl.getDeleteAdvancedFilterTooltip(name),\r\n deleteTitle: intl.deleteAdvancedFilterTitle,\r\n deleteMessage: name => intl.getDeleteAdvancedFilterMessage(name),\r\n dialogTitle: intl.advancedFiltersDialogTitle,\r\n templateName: intl.templateNameLabel,\r\n templateNameRequired: intl.templateNameRequiredError,\r\n helpTitle: intl.advancedFiltersHelpTitle,\r\n groupHelp: intl.advancedFiltersGroupHelp,\r\n ruleHelp: intl.advancedFiltersRuleHelp,\r\n group: intl.groupLabel,\r\n filter: intl.filterLabel,\r\n addFilter: intl.addFilterButtonLabel,\r\n addGroup: intl.addGroupButtonLabel,\r\n deleteGroup: intl.deleteGroupTooltip,\r\n deleteFilter: intl.deleteFilterTooltip,\r\n field: intl.fieldLabel,\r\n condition: intl.conditionLabel,\r\n value: intl.valueLabel,\r\n selectOption: intl.selectOptionPlaceholder,\r\n required: intl.requiredFieldError,\r\n and: intl.connectorAnd,\r\n or: intl.connectorOr,\r\n operators: {\r\n equals: intl.operatorEquals,\r\n notEquals: intl.operatorNotEquals,\r\n greaterThan: intl.operatorGreaterThan,\r\n greaterOrEquals: intl.operatorGreaterOrEquals,\r\n lessThan: intl.operatorLessThan,\r\n lessOrEquals: intl.operatorLessOrEquals,\r\n like: intl.operatorLike,\r\n },\r\n },\r\n select: {\r\n noResults: intl.noResultsMessage,\r\n showMore: intl.showMoreLabel,\r\n removeOption: name => intl.getRemoveOptionText(name),\r\n resultsCount: count => intl.getSearchResultsCountMessage(count),\r\n },\r\n paginatedSelect: {\r\n confirm: intl.paginatedSelectConfirmLabel,\r\n reset: intl.paginatedSelectResetLabel,\r\n selectAll: intl.paginatedSelectSelectAllLabel,\r\n loadingMore: intl.paginatedSelectLoadingMoreLabel,\r\n endOfList: intl.paginatedSelectEndOfListLabel,\r\n noResultsHint: intl.paginatedSelectNoResultsHint,\r\n clearSearch: intl.paginatedSelectClearSearchLabel,\r\n errorTitle: intl.paginatedSelectErrorTitle,\r\n errorHint: intl.paginatedSelectErrorHint,\r\n retry: intl.paginatedSelectRetryLabel,\r\n selectedCount: (selected, total) => intl.getPaginatedSelectSelectedCountLabel(selected, total),\r\n resultsCount: total => intl.getPaginatedSelectResultsCountLabel(total),\r\n },\r\n };\r\n}\r\n\r\n// ── Utilidades ──────────────────────────────────────────────────────────────\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !isSignal(value);\r\n}\r\n\r\n/** Copia profunda de `base` con los valores de `overrides` encima; ignora los undefined. */\r\nfunction deepMerge<T>(base: T, overrides: DeepPartial<T>): T {\r\n const result: Record<string, unknown> = { ...(base as Record<string, unknown>) };\r\n for (const [key, value] of Object.entries(overrides as Record<string, unknown>)) {\r\n if (value === undefined) continue;\r\n const current = result[key];\r\n result[key] = isPlainObject(current) && isPlainObject(value)\r\n ? deepMerge(current, value as DeepPartial<typeof current>)\r\n : value;\r\n }\r\n return result as T;\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { LoadingButtonAppearance, LoadingButtonColor } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Botón de Material que muestra un spinner mientras dura una acción y no deja volver a pulsarlo.\r\n *\r\n * El clic se escucha en el propio selector: `<ngx-loading-button (click)=\"save()\" />`.\r\n * Mientras `isLoading` es true el clic no llega (ni el submit del formulario, ni con Enter).\r\n */\r\n@Component({\r\n selector: 'ngx-loading-button',\r\n imports: [MatButtonModule, MatProgressSpinnerModule],\r\n templateUrl: './ngx-loading-button.component.html',\r\n styleUrl: './ngx-loading-button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.ngx-loading-button--secondary]': 'color() === \"secondary\"',\r\n '[class.ngx-loading-button--tertiary]': 'color() === \"tertiary\"',\r\n '[class.ngx-loading-button--error]': 'color() === \"error\"',\r\n '[class.ngx-loading-button--loading]': 'isLoading() && !disabled()',\r\n },\r\n})\r\nexport class NgxLoadingButton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Muestra el spinner y bloquea el botón. */\r\n readonly isLoading = input(false, { transform: booleanAttribute });\r\n\r\n /** Texto del botón. Para iconos o contenido con formato, proyéctalo en su lugar. */\r\n readonly label = input<string>();\r\n\r\n /**\r\n * Texto que sustituye al contenido mientras carga, con un spinner pequeño delante\r\n * (p. ej. «Guardando…»). Sin él, el spinner se superpone y el botón mantiene su ancho.\r\n */\r\n readonly loadingText = input<string>();\r\n\r\n /** Apariencia de Material: text, filled, elevated, outlined o tonal. */\r\n readonly matButton = input<LoadingButtonAppearance>('filled');\r\n\r\n /** Tipo nativo del botón. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n\r\n /** Deshabilita el botón (independiente de isLoading). */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n /** Color. Sin valor, el primary del tema. */\r\n readonly color = input<LoadingButtonColor>();\r\n\r\n /** Diámetro en px del spinner superpuesto. */\r\n readonly spinnerDiameter = input(24, { transform: numberAttribute });\r\n\r\n /** Grosor en px del trazo del spinner. */\r\n readonly spinnerStrokeWidth = input(3, { transform: numberAttribute });\r\n\r\n /** Lo que anuncia el lector de pantalla mientras carga. Por defecto, el texto `loadingButton.busy` de la librería. */\r\n readonly busyLabel = input<string>();\r\n\r\n /** El spinner va encima del contenido (que se oculta sin cambiar el ancho). */\r\n protected readonly overlaySpinner = computed(() => this.isLoading() && !this.loadingText());\r\n\r\n /** El spinner va en línea, delante de loadingText. */\r\n protected readonly inlineSpinner = computed(() => this.isLoading() && !!this.loadingText());\r\n\r\n protected readonly resolvedBusyLabel = computed(() => {\r\n return this.busyLabel() ?? this._texts().loadingButton.busy;\r\n });\r\n\r\n /**\r\n * Mientras carga, anula el clic en el propio botón: preventDefault evita el submit del formulario\r\n * (también el implícito al pulsar Enter en un campo) y stopImmediatePropagation evita que llegue\r\n * al (click) que el consumidor escucha en <ngx-loading-button>.\r\n */\r\n protected blockWhileLoading(event: Event): void {\r\n if (!this.isLoading()) return;\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n}\r\n","<!--\r\n Mientras carga: disabledInteractive mantiene el foco en el botón (el lector de pantalla sigue en él\r\n y oye aria-busy). Material NO bloquea el clic de un <button> en ese estado: lo hace blockWhileLoading.\r\n Con disabled, el botón se deshabilita del todo y el navegador ya no emite clics.\r\n-->\r\n<button\r\n class=\"loadingButton\"\r\n [matButton]=\"matButton()\"\r\n [type]=\"type()\"\r\n [disabled]=\"disabled() || isLoading()\"\r\n [disabledInteractive]=\"isLoading() && !disabled()\"\r\n [attr.aria-busy]=\"isLoading() || null\"\r\n (click)=\"blockWhileLoading($event)\"\r\n>\r\n <span class=\"loadingButton__content\" [class.loadingButton__content--hidden]=\"overlaySpinner()\" [class.loadingButton__content--gone]=\"inlineSpinner()\">\r\n {{ label() }}\r\n <ng-content />\r\n </span>\r\n\r\n @if (inlineSpinner()) {\r\n <span class=\"loadingButton__content\">\r\n <mat-spinner class=\"loadingButton__inlineSpinner\" diameter=\"18\" strokeWidth=\"2.5\" aria-hidden=\"true\" />\r\n {{ loadingText() }}\r\n </span>\r\n }\r\n\r\n @if (overlaySpinner()) {\r\n <mat-spinner\r\n class=\"loadingButton__overlaySpinner\"\r\n [diameter]=\"spinnerDiameter()\"\r\n [strokeWidth]=\"spinnerStrokeWidth()\"\r\n [attr.aria-label]=\"resolvedBusyLabel()\"\r\n />\r\n }\r\n</button>\r\n","// Utilidades internas de ngx-input-file y ngx-file-input (no se exportan en el barril).\n\n/** Normaliza `accept` (array o cadena separada por comas) a patrones en minúsculas. `*` o vacío = sin filtro. */\nexport function parseAccept(accept: string | readonly string[] | null | undefined): string[] {\n const parts = Array.isArray(accept) ? accept : String(accept ?? '').split(',');\n return parts.map(part => part.trim().toLowerCase()).filter(part => part && part !== '*' && part !== '*/*');\n}\n\n/** ¿Cumple el fichero alguno de los patrones? Admite extensiones (`.pdf`), MIME (`application/pdf`) y comodines (`image/*`). */\nexport function matchesAccept(file: File, patterns: readonly string[]): boolean {\n if (!patterns.length) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n\n return patterns.some(pattern => {\n if (pattern.startsWith('.')) return name.endsWith(pattern);\n if (pattern.endsWith('/*')) return type.startsWith(pattern.slice(0, -1));\n return type === pattern;\n });\n}\n\n/** Mismo fichero = mismo nombre, tamaño y fecha de modificación (el navegador da objetos File distintos en cada selección). */\nexport function isSameFile(a: File, b: File): boolean {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\n}\n\nconst UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/** Tamaño legible con el formato numérico del idioma: 845 B, 12 KB, 1,4 MB. */\nexport function formatFileSize(bytes: number, locale: string): string {\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit++;\n }\n const digits = unit === 0 || value >= 10 ? 0 : 1;\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: digits }).format(value)} ${UNITS[unit]}`;\n}\n\n/** Icono de Material Symbols según el tipo; si el navegador no da MIME (pasa con .docx, .dwg…), según la extensión. */\nexport function fileIcon(file: File): string {\n const type = file.type.toLowerCase();\n const extension = file.name.toLowerCase().split('.').pop() ?? '';\n\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || extension === 'pdf') return 'picture_as_pdf';\n if (type.startsWith('video/')) return 'videocam';\n if (type.startsWith('audio/')) return 'audio_file';\n if (/spreadsheet|excel|csv/.test(type) || ['xls', 'xlsx', 'csv', 'ods'].includes(extension)) return 'table_chart';\n if (/word|document|text\\//.test(type) || ['doc', 'docx', 'odt', 'txt', 'rtf'].includes(extension)) return 'description';\n if (/zip|compressed|tar|rar|7z/.test(type) || ['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) return 'folder_zip';\n return 'draft';\n}\n\n/** Familia del fichero, para el color de su icono en ngx-file-input. */\nexport type FileKind = 'image' | 'pdf' | 'video' | 'audio' | 'generic';\n\nexport function fileKind(file: File): FileKind {\n const type = file.type.toLowerCase();\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || file.name.toLowerCase().endsWith('.pdf')) return 'pdf';\n if (type.startsWith('video/')) return 'video';\n if (type.startsWith('audio/')) return 'audio';\n return 'generic';\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n DoCheck,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipGrid, MatChipsModule } from '@angular/material/chips';\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\nimport { NgxTexts } from '../../i18n';\nimport { NgxFileError, NgxFileErrorCode } from '../../models/file-input-types';\nimport { fileIcon, formatFileSize, isSameFile, matchesAccept, parseAccept } from '../shared/file-utils';\n\n/**\n * Selector de ficheros con forma de campo de formulario: un `mat-form-field` con los ficheros como chips.\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: `File[]`) o con `[(files)]`.\n */\n@Component({\n selector: 'ngx-input-file',\n imports: [MatButtonModule, MatChipsModule, MatFormFieldModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-input-file.component.html',\n styleUrl: './ngx-input-file.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-input-file',\n '[class.ngx-input-file--disabled]': 'isDisabled()',\n '[class.ngx-input-file--dropping]': 'isDropping()',\n '[class.ngx-input-file--has-files]': 'files().length > 0',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class NgxInputFile implements ControlValueAccessor, AfterViewInit, DoCheck {\n // Se registra como value accessor a mano (en vez de con NG_VALUE_ACCESSOR) para poder leer el\n // control del formulario: su estado decide el asterisco de obligatorio y cuándo se ve el error.\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\n private readonly _cdr = inject(ChangeDetectorRef);\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _locale = inject(LOCALE_ID);\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n private readonly _chipGrid = viewChild(MatChipGrid);\n protected readonly texts = inject(NgxTexts).texts;\n\n /** Etiqueta del campo. Por defecto, el texto `inputFile.label` de la librería. */\n readonly label = input<string>();\n /** Texto del campo vacío. Por defecto, el texto `inputFile.placeholder` de la librería. */\n readonly placeholder = input<string>();\n /** Texto de ayuda bajo el campo. */\n readonly hint = input<string>('');\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\n readonly error = input<string>('');\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). Se comprueba también al arrastrar. */\n readonly accept = input<string | string[]>([]);\n /** Permite varios ficheros; cada selección se añade a los que ya hay. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamaño máximo por fichero, en bytes. Los mayores se descartan. */\n readonly maxSize = input<number | null>(null);\n /** Número máximo de ficheros (con `multiple`). Los que no caben se descartan. */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Apariencia del `mat-form-field`. */\n readonly appearance = input<MatFormFieldAppearance>('outline');\n /** Ficheros seleccionados. Admite `[(files)]` para usarlo sin formularios. */\n readonly files = model<File[]>([]);\n /** Fichero descartado al seleccionar o arrastrar (tipo, tamaño o número), con el mismo formato que ngx-file-input. */\n readonly validationError = output<NgxFileError>();\n\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().inputFile.label);\n protected readonly resolvedPlaceholder = computed(() =>\n this.files().length ? '' : (this.placeholder() ?? this.texts().inputFile.placeholder)\n );\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\n protected readonly items = computed(() =>\n this.files().map(file => ({ file, icon: fileIcon(file), size: formatFileSize(file.size, this._locale) }))\n );\n\n private readonly _cvaDisabled = signal(false);\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n protected readonly isDropping = signal(false);\n protected readonly isRequired = signal(false);\n\n /** Ficheros descartados en la última selección; el mensaje se recalcula si cambia el idioma. */\n private readonly _rejected = signal<{ file: File; code: NgxFileErrorCode }[]>([]);\n protected readonly rejectionMessage = computed(() => {\n const messages = this._rejected().map(({ file, code }) => this._message(file, code));\n return [...new Set(messages)].join(' · ');\n });\n\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\n protected readonly errorStateMatcher: ErrorStateMatcher = {\n isErrorState: () => {\n const control = this._control();\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\n },\n };\n protected readonly noSeparators: number[] = [];\n\n private _onChange: (files: File[]) => void = () => {};\n private _onTouched: () => void = () => {};\n private _controlSub?: Subscription;\n\n constructor() {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n inject(DestroyRef).onDestroy(() => this._controlSub?.unsubscribe());\n }\n\n ngAfterViewInit(): void {\n // formControlName asigna su control después de registerOnChange: aquí ya está\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n ngDoCheck(): void {\n // Como hacen los campos de Material: hay cambios sin evento (resetForm quita el «enviado» después del reset)\n this._chipGrid()?.updateErrorState();\n }\n\n /** Abre el selector de ficheros del sistema. */\n openPicker(): void {\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\n }\n\n /** Quita un fichero de la selección. */\n remove(file: File): void {\n this._rejected.set([]);\n this._commit(this.files().filter(item => item !== file));\n }\n\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\n\n protected onFieldClick(event: MouseEvent): void {\n // Pulsar un chip (o su botón de quitar) no abre el selector\n if ((event.target as Element).closest('.mat-mdc-chip, .ngx-input-file__browse')) return;\n this.openPicker();\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected onTriggerBlur(): void {\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._addFiles(input.files);\n input.value = '';\n }\n\n protected onNativeCancel(): void {\n this._markTouched();\n }\n\n protected onDragOver(event: DragEvent): void {\n // Siempre: si no, el navegador abre el fichero al soltarlo\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\n if (!this.isDisabled()) this.isDropping.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDropping.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDropping.set(false);\n if (!this.isDisabled()) this._addFiles(event.dataTransfer?.files);\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────────────\n\n writeValue(files: File[] | null | undefined): void {\n this.files.set(Array.isArray(files) ? files : []);\n this._rejected.set([]);\n }\n\n registerOnChange(fn: (files: File[]) => void): void {\n this._onChange = fn;\n // [formControl] ya tiene aquí su control (también si se cambia por otro); formControlName, en ngAfterViewInit\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n // ── Privado ─────────────────────────────────────────────────────────────────\n\n private _control(): AbstractControl | null {\n return this._ngControl?.control ?? null;\n }\n\n /** Escucha el control (y el envío del formulario) para refrescar el asterisco y el estado de error con OnPush. */\n private _bindControl(control: AbstractControl | null): void {\n this._controlSub?.unsubscribe();\n if (!control) return;\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\n\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState(control));\n this._syncFormState(control);\n }\n\n private _syncFormState(control: AbstractControl): void {\n this.isRequired.set(control.hasValidator(Validators.required));\n // mat-chip-grid solo recalcula su error en ngDoCheck y si tiene NgControl propio, que aquí no tiene\n this._chipGrid()?.updateErrorState();\n this._cdr.markForCheck();\n }\n\n private _addFiles(list: FileList | null | undefined): void {\n const incoming = Array.from(list ?? []);\n if (!incoming.length) return;\n\n const patterns = parseAccept(this.accept());\n const maxSize = this.maxSize();\n const rejected: { file: File; code: NgxFileErrorCode }[] = [];\n const valid: File[] = [];\n\n for (const file of incoming) {\n if (!matchesAccept(file, patterns)) rejected.push({ file, code: 'TYPE_NOT_ALLOWED' });\n else if (maxSize != null && file.size > maxSize) rejected.push({ file, code: 'SIZE_EXCEEDED' });\n else valid.push(file);\n }\n\n let next = this.files();\n if (!this.multiple()) {\n if (valid.length) next = [valid[0]];\n } else {\n // Los repetidos (ya seleccionados o dos veces en la misma tanda) se ignoran sin avisar\n const fresh = valid.filter((file, index) =>\n !next.some(current => isSameFile(current, file)) && valid.findIndex(other => isSameFile(other, file)) === index\n );\n const max = this.maxFiles();\n const room = max == null ? fresh.length : Math.max(max - next.length, 0);\n fresh.slice(room).forEach(file => rejected.push({ file, code: 'MAX_FILES_EXCEEDED' }));\n if (room > 0 && fresh.length) next = [...next, ...fresh.slice(0, room)];\n }\n\n this._rejected.set(rejected);\n for (const { file, code } of rejected) this.validationError.emit({ file, code, message: this._message(file, code) });\n\n if (next !== this.files()) this._commit(next);\n else this._markTouched();\n }\n\n private _commit(files: File[]): void {\n this.files.set(files);\n this._onChange(files);\n this._markTouched();\n }\n\n private _markTouched(): void {\n this._onTouched();\n this._chipGrid()?.updateErrorState();\n this._cdr.markForCheck();\n }\n\n private _message(file: File, code: NgxFileErrorCode): string {\n const texts = this.texts().inputFile;\n switch (code) {\n case 'TYPE_NOT_ALLOWED':\n return texts.rejectedType(file.name);\n case 'SIZE_EXCEEDED':\n return texts.rejectedSize(file.name, formatFileSize(this.maxSize() ?? 0, this._locale));\n case 'MAX_FILES_EXCEEDED':\n return texts.rejectedCount(this.maxFiles() ?? 0);\n }\n }\n}\n","<mat-form-field\r\n class=\"ngx-input-file__field\"\r\n [appearance]=\"appearance()\"\r\n floatLabel=\"always\"\r\n subscriptSizing=\"dynamic\"\r\n (click)=\"onFieldClick($event)\">\r\n <mat-label>{{ resolvedLabel() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ngx-input-file__chips\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"isRequired()\"\r\n [errorStateMatcher]=\"errorStateMatcher\">\r\n @for (item of items(); track item.file) {\r\n <mat-chip-row class=\"ngx-input-file__chip\" [title]=\"item.file.name + ' · ' + item.size\" (removed)=\"remove(item.file)\">\r\n <mat-icon matChipAvatar aria-hidden=\"true\">{{ item.icon }}</mat-icon>\r\n <span class=\"ngx-input-file__chip-name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-input-file__chip-size\">{{ item.size }}</span>\r\n <button matChipRemove type=\"button\" [attr.aria-label]=\"texts().inputFile.remove(item.file.name)\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n\r\n <!-- Entrada de texto de solo lectura: da el foco con Tab, el placeholder y abre el selector con Intro o Espacio -->\r\n <input\r\n class=\"ngx-input-file__trigger\"\r\n readonly\r\n [matChipInputFor]=\"chipGrid\"\r\n [matChipInputSeparatorKeyCodes]=\"noSeparators\"\r\n [placeholder]=\"resolvedPlaceholder()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n (blur)=\"onTriggerBlur()\" />\r\n </mat-chip-grid>\r\n\r\n <button\r\n matIconSuffix\r\n matIconButton\r\n type=\"button\"\r\n class=\"ngx-input-file__browse\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"texts().inputFile.browse\"\r\n [matTooltip]=\"texts().inputFile.browse\"\r\n (click)=\"openPicker()\">\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #nativeInput\r\n type=\"file\"\r\n hidden\r\n tabindex=\"-1\"\r\n [accept]=\"acceptAttr()\"\r\n [multiple]=\"multiple()\"\r\n (change)=\"onNativeChange($event)\"\r\n (cancel)=\"onNativeCancel()\" />\r\n\r\n <mat-hint>\r\n @if (isDropping()) {\r\n {{ texts().inputFile.dropping }}\r\n } @else if (rejectionMessage()) {\r\n <span class=\"ngx-input-file__rejection\">{{ rejectionMessage() }}</span>\r\n } @else {\r\n {{ hint() }}\r\n }\r\n </mat-hint>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n</mat-form-field>\r\n\r\n<!-- Región viva fija: los descartes se anuncian aunque el lector esté en otro sitio -->\r\n<div class=\"ngx-input-file__live\" aria-live=\"polite\">{{ rejectionMessage() }}</div>\r\n","export const includeNoSensible = (cadena: string, query: string): boolean => {\r\n const nomalizadoCadena = cadena\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n const nomalizadoQuery = query\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n return nomalizadoCadena.includes(nomalizadoQuery);\r\n};\r\n\r\nexport const base64ToUtf8 = (str: string): string => {\r\n return decodeURIComponent(\r\n atob(str)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n};\r\n","import {\r\n afterRenderEffect,\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n DoCheck,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\r\nimport { BasicSelectConfig } from '../../models';\r\nimport { includeNoSensible } from '../../utils';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */\r\ninterface ResolvedOption<T> {\r\n value: T[keyof T];\r\n label: string;\r\n disabled: boolean;\r\n visible: boolean;\r\n}\r\n\r\n/** Teclas que deben llegar al mat-select para navegar/seleccionar desde el buscador. */\r\nconst NAVIGATION_KEYS = new Set([\r\n 'ArrowDown',\r\n 'ArrowUp',\r\n 'Enter',\r\n 'Escape',\r\n 'Home',\r\n 'End',\r\n 'Tab',\r\n]);\r\n\r\n@Component({\r\n selector: 'ngx-basic-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatInputModule,\r\n MatSelectModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n ReactiveFormsModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-basic-select.component.html',\r\n styleUrl: './ngx-basic-select.component.scss',\r\n})\r\nexport class NgxBasicSelect<T> implements ControlValueAccessor, AfterViewInit, DoCheck {\r\n\r\n // Servicio de internacionalización (placeholder del buscador, mensajes de estado…)\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n /**\r\n * Se auto-registra como ControlValueAccessor del control del formulario.\r\n * Se usa `self`/`optional` para poder leer el estado de validación (invalid/touched)\r\n * y para no fallar cuando el componente se usa sin formulario.\r\n */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intentó enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // ─── Inputs ──────────────────────────────────────────────────────────────\r\n readonly label = input.required<string>();\r\n readonly options = input.required<T[]>();\r\n readonly basicSelectConfig = input.required<BasicSelectConfig<T>>();\r\n readonly isLoading = input(false, { transform: booleanAttribute });\r\n readonly placeholder = input<string>('');\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n readonly appearance = input<'fill' | 'outline'>('fill');\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n readonly error = input<string>('');\r\n readonly class = input<string>('');\r\n\r\n // ─── Outputs ─────────────────────────────────────────────────────────────\r\n /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */\r\n selectionChange = output<T[keyof T] | T[keyof T][] | null>();\r\n\r\n // ─── ViewChilds ──────────────────────────────────────────────────────────\r\n readonly matSelect = viewChild.required<MatSelect>('matSelect');\r\n readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\r\n /** Igual que matSelect, pero sin fallar antes de crear la vista (ngDoCheck se llama antes). */\r\n private readonly _matSelectRef = viewChild<MatSelect>('matSelect');\r\n\r\n // ─── Estado interno ──────────────────────────────────────────────────────\r\n /** FormControl interno que gobierna el mat-select (independiente del control del form). */\r\n protected readonly innerControl = new FormControl<any>(null);\r\n /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */\r\n protected readonly value = signal<any>(null);\r\n /** Deshabilitado que llega vía setDisabledState (reactive forms). */\r\n private readonly cvaDisabled = signal(false);\r\n /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */\r\n protected readonly searchQuery = signal('');\r\n /** Anchos (en %) de las filas fantasma mientras se carga: distintos para que parezca texto. */\r\n protected readonly skeletonWidths = [72, 48, 84, 60];\r\n\r\n private onChange: (value: any) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */\r\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\r\n\r\n /**\r\n * Opciones resueltas y marcadas con `visible` según el buscador. Las no visibles\r\n * NO se quitan del DOM (se ocultan con display:none) para que el mat-select siga\r\n * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.\r\n */\r\n protected readonly resolvedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const query = this.searchQuery();\r\n const options = this.options();\r\n const config = this.basicSelectConfig();\r\n\r\n return options.map(option => {\r\n const label = String(config.displayedLabel(option));\r\n return {\r\n value: option[config.valueKey],\r\n label,\r\n disabled: config.disabled ? config.disabled(option) : false,\r\n visible: includeNoSensible(label, query),\r\n };\r\n });\r\n });\r\n\r\n /** Buscador visible según `basicSelectConfig.search` (true, false o número mínimo de opciones). */\r\n protected readonly showSearch = computed(() => {\r\n const search = this.basicSelectConfig().search ?? true;\r\n return typeof search === 'number' ? this.options().length > search : search;\r\n });\r\n\r\n /** Hay datos de entrada (con independencia del buscador). */\r\n protected readonly hasData = computed(() => this.resolvedOptions().length > 0);\r\n\r\n /**\r\n * Opciones que se renderizan realmente: las que casan con el buscador MÁS las que\r\n * estén seleccionadas (aunque no casen). Se quitan del DOM las que no casan para que\r\n * el ListKeyManager de mat-select no las pueda enfocar con las flechas —marcarlas\r\n * `disabled` no basta: con el panel abierto Material permite enfocar deshabilitadas\r\n * (recomendación WAI-ARIA)—. Las seleccionadas se conservan para que el trigger\r\n * pueda pintar su etiqueta y no se pierda el valor al filtrar.\r\n */\r\n protected readonly displayedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const value = this.value();\r\n const selected = new Set(Array.isArray(value) ? value : (value != null ? [value] : []));\r\n return this.resolvedOptions().filter(o => o.visible || selected.has(o.value));\r\n });\r\n\r\n /** No hay ninguna opción que mostrar (ni coincidencia ni seleccionada). */\r\n protected readonly showNoOptionsMessage = computed(() => this.displayedOptions().length === 0);\r\n\r\n /** Mensaje aria-live con el recuento de resultados al filtrar. */\r\n protected readonly searchAnnouncement = computed(() => {\r\n const query = this.searchQuery();\r\n if (!query)\r\n return '';\r\n\r\n const count = this.resolvedOptions().filter(o => o.visible).length;\r\n return this.texts().select.resultsCount(count);\r\n });\r\n\r\n /**\r\n * ErrorStateMatcher que refleja el estado del control del formulario.\r\n * Replica el criterio por defecto de Material: se muestra el error si el\r\n * control es inválido y además ha sido tocado O ya se ha enviado el\r\n * formulario. Sin la parte de `submitted`, al pulsar \"Guardar\" los campos\r\n * obligatorios que el usuario no llegó a tocar no se marcaban en rojo.\r\n */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`. Se propaga al\r\n * mat-select interno para que el mat-form-field pinte el asterisco. Es un signal (no un\r\n * método en plantilla): se actualiza con los eventos del control y en cada ngDoCheck.\r\n */\r\n protected readonly isRequired = signal(false);\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n constructor() {\r\n // Auto-registro como CVA (evita el provider NG_VALUE_ACCESSOR y su DI circular).\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sincroniza el deshabilitado efectivo con el control interno.\r\n afterRenderEffect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n\r\n // Propaga los cambios del control interno al formulario, al output y al signal de valor.\r\n this.innerControl.valueChanges\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(value => {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.selectionChange.emit(value);\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una señal:\r\n * al enviar, nada marca este componente (OnPush) para revisión, así que el\r\n * mat-select no reevaluaba su errorStateMatcher y el campo no se pintaba en\r\n * rojo. Al enviarse el formulario se fuerza la revisión.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._syncFormState();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this._syncFormState();\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Hay cambios sin evento ni señal (validadores añadidos después, resetForm que quita el\r\n // «enviado»…). Con OnPush el mat-select interno no se revisaría: se fuerza aquí.\r\n this._syncFormState();\r\n }\r\n\r\n private _syncFormState(): void {\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n const select = this._matSelectRef();\r\n if (!select) return;\r\n const before = select.errorState;\r\n select.updateErrorState();\r\n if (select.errorState !== before) this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n // ─── ControlValueAccessor ─────────────────────────────────────────────────\r\n writeValue(value: any): void {\r\n this.innerControl.setValue(value, { emitEvent: false });\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: any) => 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.cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Interacción ──────────────────────────────────────────────────────────\r\n onOpenedChange(opened: boolean): void {\r\n if (opened) {\r\n this.searchQuery.set('');\r\n setTimeout(() => {\r\n this.searchInput()?.nativeElement.focus();\r\n const panel = this.matSelect().panel?.nativeElement;\r\n if (panel)\r\n panel.scrollTop = 0;\r\n });\r\n } else {\r\n // Al cerrar marcamos como tocado para que salte la validación\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n }\r\n\r\n onSearchInput(value: string): void {\r\n this.searchQuery.set(value);\r\n }\r\n\r\n /**\r\n * Deja pasar al mat-select las teclas de navegación (flechas, Enter, Escape…) para\r\n * poder moverse por la lista sin salir del buscador, y detiene las de carácter para\r\n * que no disparen el typeahead nativo del mat-select.\r\n */\r\n onSearchKeydown(event: KeyboardEvent): void {\r\n if (!NAVIGATION_KEYS.has(event.key))\r\n event.stopPropagation();\r\n }\r\n\r\n clearSearch(): void {\r\n this.searchQuery.set('');\r\n this.searchInput()?.nativeElement.focus();\r\n }\r\n\r\n onClearClick(): void {\r\n const newValue = this.multiple() ? [] : null;\r\n this.innerControl.setValue(newValue); // emite → onChange + output + signal\r\n this.innerControl.markAsTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","\r\n<mat-form-field [appearance]=\"appearance()\" [className]=\"class()\" [subscriptSizing]=\"subscriptSizing()\">\r\n <mat-label>{{ label() }}</mat-label>\r\n <mat-select\r\n #matSelect\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n [placeholder]=\"placeholder()\"\r\n (openedChange)=\"onOpenedChange($event)\"\r\n >\r\n @if(isLoading()) {\r\n <!--\r\n Filas fantasma como opciones deshabilitadas (no divs): mat-select no abre el\r\n panel si no tiene ninguna mat-option (_canOpen exige options.length > 0).\r\n El texto «Cargando…» solo lo leen los lectores de pantalla (en la primera fila).\r\n -->\r\n @for (width of skeletonWidths; track $index) {\r\n <mat-option disabled class=\"skeletonOption\" [attr.aria-hidden]=\"$first ? null : true\">\r\n @if ($first) {\r\n <span class=\"srOnly\">{{ texts().common.loading }}</span>\r\n }\r\n <span class=\"skeletonBar\" [style.width.%]=\"width\" aria-hidden=\"true\"></span>\r\n </mat-option>\r\n }\r\n } @else {\r\n @if (showSearch()) {\r\n <div class=\"searchFilter\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n <input\r\n matInput\r\n #searchInput\r\n type=\"text\"\r\n [attr.aria-label]=\"texts().common.search\"\r\n [placeholder]=\"texts().common.search\"\r\n [value]=\"searchQuery()\"\r\n (input)=\"onSearchInput($any($event.target).value)\"\r\n (keydown)=\"onSearchKeydown($event)\"\r\n />\r\n <button type=\"button\" matIconButton [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n <!--\r\n Solo se renderizan las opciones que casan con el buscador (mas las\r\n seleccionadas). Las que no casan se quitan del DOM para que no se puedan\r\n enfocar con las flechas: con el panel abierto mat-select permite navegar\r\n a opciones deshabilitadas, asi que ocultarlas + disabled no bastaria.\r\n -->\r\n @for(option of displayedOptions(); track option.value) {\r\n <mat-option [value]=\"option.value\" [disabled]=\"option.disabled\">\r\n {{ option.label }}\r\n </mat-option>\r\n }\r\n @if(showNoOptionsMessage()) {\r\n <mat-option disabled class=\"stateOption noResults\">\r\n {{ hasData() ? texts().select.noResults : texts().common.noData }}\r\n </mat-option>\r\n }\r\n }\r\n </mat-select>\r\n @if(isLoading()) {\r\n <mat-icon matSuffix><mat-spinner diameter=\"20\" /></mat-icon>\r\n } @else if(clearable() && (multiple() ? value()?.length : value())) {\r\n <button\r\n matIconButton\r\n matSuffix\r\n [attr.aria-label]=\"texts().select.clear\"\r\n (click)=\"onClearClick(); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>\r\n\r\n<!-- Anuncio para lectores de pantalla del numero de resultados al filtrar -->\r\n<div class=\"srOnly\" aria-live=\"polite\">{{ searchAnnouncement() }}</div>\r\n","import { TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\n\r\nexport enum DialogBodyType {\r\n TEXT = 'text',\r\n HTML = 'html',\r\n COMPONENT = 'component',\r\n TEMPLATE = 'template'\r\n}\r\n\r\nexport interface DialogBodyConfig<T = any> {\r\n type: DialogBodyType;\r\n content: string | Type<T> | TemplateRef<any>;\r\n data?: T;\r\n}\r\n\r\nexport interface DialogConfig<T = any> {\r\n title: string;\r\n icon?: string;\r\n iconColor?: string;\r\n subtitle?: string;\r\n body: DialogBodyConfig<T>;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n cancelText?: string;\r\n confirmText?: string;\r\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\r\n destructive?: boolean;\r\n /** Muestra la X de cerrar en el encabezado (cierra devolviendo undefined). Por defecto true, salvo con disableClose. */\r\n showClose?: boolean;\r\n}\r\n\r\n/**\r\n * Lo que un componente o plantilla dentro de un diálogo de NgxDialogService puede controlar.\r\n *\r\n * - En un componente: `inject(NgxDialogContext)`.\r\n * - En una plantilla: viene en el contexto como `dialog` (`let-dialog=\"dialog\"`).\r\n */\r\nexport abstract class NgxDialogContext<R = unknown> {\r\n /** Resultado que se devuelve al pulsar confirmar. Si se queda sin valor, se devuelve `true`. */\r\n abstract readonly result: WritableSignal<R | undefined>;\r\n\r\n /** Deshabilita el botón de confirmar (p. ej. mientras un formulario no es válido). */\r\n abstract readonly confirmDisabled: WritableSignal<boolean>;\r\n\r\n /** Cierra el diálogo devolviendo `result` (o `false`/`undefined` para cancelar). */\r\n abstract close(result?: R | boolean): void;\r\n}\r\n\r\n/** Contexto que recibe una plantilla usada como cuerpo de un diálogo. */\r\nexport interface NgxDialogTemplateContext<T = any, R = unknown> {\r\n /** Los datos que se pasaron en `templateData`. */\r\n $implicit: T;\r\n /** Para cerrar el diálogo, fijar el resultado o deshabilitar el botón de confirmar. */\r\n dialog: NgxDialogContext<R>;\r\n}\r\n","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[ngxDynamicHost]'\r\n})\r\nexport class DynamicHostDirective<T> {\r\n private _vcr = inject(ViewContainerRef);\r\n private _currentRef: ComponentRef<any> | null = null;\r\n\r\n component = input<Type<any>>();\r\n data = input<T>();\r\n\r\n constructor() {\r\n effect(() => {\r\n const componentType = this.component();\r\n \r\n // 1. Gestión de la creación/destrucción del componente\r\n if (!componentType) {\r\n this._vcr.clear();\r\n this._currentRef = null;\r\n return;\r\n }\r\n\r\n // Si el componente es diferente al que tenemos, lo recreamos\r\n if (this._currentRef?.componentType !== componentType) {\r\n this._vcr.clear();\r\n this._currentRef = this._vcr.createComponent(componentType);\r\n }\r\n \r\n // 2. Actualización de datos (siempre, tanto si es nuevo como si ya existía)\r\n const data = this.data();\r\n if (this._currentRef && data !== undefined) {\r\n // La forma correcta de setear un input en Angular moderno\r\n this._currentRef.setInput('data', data); \r\n }\r\n });\r\n }\r\n}","import { ChangeDetectionStrategy, Component, computed, DoCheck, inject, input, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { NgxTexts } from '../../i18n';\n\n/**\n * Encabezado de diálogo con botón X para cerrar: el mismo que usa ngx-dialog, para diálogos propios\n * abiertos con MatDialog. Va en lugar de `<h2 mat-dialog-title>`:\n *\n * ```html\n * <ngx-dialog-header [title]=\"'Editar proyecto'\" icon=\"edit\" />\n * <!-- o con contenido propio -->\n * <ngx-dialog-header>{{ (isNew ? 'PROJECTS.create' : 'PROJECTS.edit') | translate }}</ngx-dialog-header>\n * ```\n */\n@Component({\n selector: 'ngx-dialog-header',\n imports: [MatDialogTitle, MatButtonModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-dialog-header.component.html',\n styleUrl: './ngx-dialog-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxDialogHeader implements DoCheck {\n private readonly _dialogRef = inject(MatDialogRef, { optional: true });\n protected readonly texts = inject(NgxTexts).texts;\n\n /** Título. También se puede poner como contenido (`<ngx-dialog-header>…</ngx-dialog-header>`). */\n readonly title = input<string>();\n /** Línea secundaria bajo el título. */\n readonly subtitle = input<string>();\n /** Icono de Material Symbols delante del título. */\n readonly icon = input<string>();\n /** Color del icono (p. ej. `var(--mat-sys-error)`). */\n readonly iconColor = input<string>();\n /**\n * Muestra la X. Sin indicar, se ve mientras el diálogo se pueda cerrar: se oculta si el diálogo tiene\n * `disableClose` (también si se activa después, p. ej. durante una subida) y vuelve al quitarlo.\n */\n readonly showClose = input<boolean | undefined>(undefined);\n /** Valor con el que se cierra al pulsar la X. Por defecto `undefined`, igual que con Esc o al pulsar fuera. */\n readonly closeResult = input<unknown>(undefined);\n\n /** disableClose es una propiedad normal del MatDialogRef: se lee en cada comprobación. */\n private readonly _closable = signal(!this._dialogRef?.disableClose);\n\n protected readonly closeVisible = computed(() => !!this._dialogRef && (this.showClose() ?? this._closable()));\n\n ngDoCheck(): void {\n this._closable.set(!this._dialogRef?.disableClose);\n }\n\n /** Cierra el diálogo con `closeResult`. */\n close(): void {\n this._dialogRef?.close(this.closeResult());\n }\n}\n","<!--\n El h2 (mat-dialog-title) da el nombre accesible al diálogo, así que la X va fuera de él,\n posicionada encima, para que no forme parte de ese nombre.\n-->\n<div class=\"ngx-dialog__header\" [class.ngx-dialog__header--closable]=\"closeVisible()\">\n <h2 mat-dialog-title class=\"ngx-dialog__title\">\n @if (icon()) {\n <mat-icon class=\"ngx-dialog__icon\" [style.color]=\"iconColor() || null\" aria-hidden=\"true\">{{ icon() }}</mat-icon>\n }\n <span class=\"ngx-dialog__heading\">\n <span class=\"ngx-dialog__title-text\">{{ title() }}<ng-content /></span>\n @if (subtitle()) {\n <span class=\"ngx-dialog__subtitle\">{{ subtitle() }}</span>\n }\n </span>\n </h2>\n\n @if (closeVisible()) {\n <button\n type=\"button\"\n matIconButton\n class=\"ngx-dialog__close\"\n [attr.aria-label]=\"texts().dialog.close\"\n [matTooltip]=\"texts().dialog.close\"\n (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, forwardRef, inject, signal } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { DialogBodyType, DialogConfig, NgxDialogContext, NgxDialogTemplateContext } from '../../models/dialog-config';\r\nimport { DynamicHostDirective } from '../../directives';\r\nimport { NgxTexts } from '../../i18n';\r\nimport { NgxDialogHeader } from '../ngx-dialog-header/ngx-dialog-header.component';\r\n\r\n/**\r\n * Diálogo genérico que abre NgxDialogService. El contenido (texto, HTML, componente o plantilla)\r\n * puede usar NgxDialogContext para devolver un resultado o deshabilitar el botón de confirmar.\r\n */\r\n@Component({\r\n selector: 'ngx-dialog',\r\n imports: [\r\n NgxDialogHeader,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatButtonModule,\r\n NgTemplateOutlet,\r\n DynamicHostDirective,\r\n ],\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrl: './ngx-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // El contenido (componente o plantilla) inyecta el diálogo como NgxDialogContext\r\n providers: [{ provide: NgxDialogContext, useExisting: forwardRef(() => NgxDialog) }],\r\n})\r\nexport class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {\r\n private readonly _dialogRef = inject(MatDialogRef<NgxDialog<T, R>>);\r\n private readonly _data = inject<DialogConfig<T>>(MAT_DIALOG_DATA);\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n readonly title = this._data.title;\r\n readonly icon = this._data.icon;\r\n readonly iconColor = this._data.iconColor;\r\n readonly subtitle = this._data.subtitle;\r\n readonly body = this._data.body;\r\n readonly showCancel = this._data.showCancel ?? true;\r\n readonly showConfirm = this._data.showConfirm ?? true;\r\n readonly destructive = this._data.destructive ?? false;\r\n /** La X no tiene sentido en un diálogo con disableClose (está pensado para no poder cerrarse sin decidir). */\r\n readonly showClose = this._data.showClose ?? !this._dialogRef.disableClose;\r\n readonly cancelText = this._data.cancelText ?? this._texts().dialog.cancel;\r\n readonly confirmText = this._data.confirmText ?? this._texts().dialog.accept;\r\n\r\n // ── NgxDialogContext ──────────────────────────────────────────────────────\r\n readonly result = signal<R | undefined>(undefined);\r\n readonly confirmDisabled = signal(false);\r\n\r\n close(result?: R | boolean): void {\r\n this._dialogRef.close(result);\r\n }\r\n\r\n // ── Plantilla ─────────────────────────────────────────────────────────────\r\n protected readonly DialogBodyType = DialogBodyType;\r\n protected readonly templateContext: NgxDialogTemplateContext<T, R> = {\r\n $implicit: this.body.data as T,\r\n dialog: this,\r\n };\r\n\r\n onCancelClick(): void {\r\n this._dialogRef.close(false);\r\n }\r\n\r\n onConfirmClick(): void {\r\n if (this.confirmDisabled()) return;\r\n const result = this.result();\r\n this._dialogRef.close(result === undefined ? true : result);\r\n }\r\n}\r\n","<!-- Encabezado compartido con los diálogos propios (ngx-dialog-header) -->\r\n<ngx-dialog-header\r\n [title]=\"title\"\r\n [subtitle]=\"subtitle\"\r\n [icon]=\"icon\"\r\n [iconColor]=\"iconColor\"\r\n [showClose]=\"showClose\" />\r\n\r\n<mat-dialog-content>\r\n <div class=\"ngx-dialog__content\">\r\n @switch (body.type) {\r\n @case (DialogBodyType.TEXT) {\r\n <p class=\"ngx-dialog__text\">{{ body.content }}</p>\r\n }\r\n @case (DialogBodyType.HTML) {\r\n <div [innerHTML]=\"body.content\"></div>\r\n }\r\n @case (DialogBodyType.COMPONENT) {\r\n <ng-container\r\n ngxDynamicHost\r\n [component]=\"$any(body.content)\"\r\n [data]=\"body.data\"\r\n />\r\n }\r\n @case (DialogBodyType.TEMPLATE) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"$any(body.content)\"\r\n [ngTemplateOutletContext]=\"templateContext\"\r\n />\r\n }\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n\r\n@if (showCancel || showConfirm) {\r\n <mat-dialog-actions align=\"end\" class=\"ngx-dialog__actions\">\r\n @if (showCancel) {\r\n <button type=\"button\" matButton=\"outlined\" (click)=\"onCancelClick()\">\r\n {{ cancelText }}\r\n </button>\r\n }\r\n @if (showConfirm) {\r\n <button\r\n type=\"button\"\r\n matButton=\"filled\"\r\n class=\"ngx-dialog__confirm\"\r\n [class.ngx-dialog__confirm--destructive]=\"destructive\"\r\n [disabled]=\"confirmDisabled()\"\r\n (click)=\"onConfirmClick()\">\r\n {{ confirmText }}\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * @deprecated Usar `NgxDialogService.confirm()` (o `template()` con contenido propio), que tiene el\r\n * encabezado, el botón X y la opción `destructive` de ngx-dialog. Las tablas ya no lo usan; se\r\n * mantiene solo por compatibilidad con quien lo abra directamente.\r\n */\r\n@Component({\r\n selector: 'ngx-confirm-dialog',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-confirm-dialog.component.html',\r\n styleUrl: './ngx-confirm-dialog.component.scss'\r\n})\r\nexport class NgxConfirmDialogComponent {\r\n dialogRef = inject(MatDialogRef<NgxConfirmDialogComponent>);\r\n data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content>\r\n @if(data.body) {\r\n <p>{{data.body}}</p>\r\n }\r\n \r\n @if (data.template) {\r\n <ng-container *ngTemplateOutlet=\"data.template; context: { $implicit: data.row }\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"false\">{{ data.denyButtonLabel ?? texts().common.cancel }}</button>\r\n <button matButton [mat-dialog-close]=\"true\">{{ data.confirmButtonLabel ?? texts().common.confirm }}</button>\r\n</mat-dialog-actions>","import { ComponentRef, Directive, effect, inject, input, reflectComponentType, signal, Type, ViewContainerRef, WritableSignal } from '@angular/core';\n\n@Directive({\n selector: '[ngxDynamicCellHost]',\n})\nexport class DynamicCellHostDirective<T> {\n vcr = inject(ViewContainerRef);\n\n component = input<Type<any>>();\n row = input<T>();\n key = input<keyof T>();\n\n private _currentRef: ComponentRef<any> | null = null;\n private _rowSignal?: WritableSignal<T>;\n private _keySignal?: WritableSignal<keyof T>;\n\n effect = effect(() => {\n const component = this.component();\n const row = this.row();\n const key = this.key();\n\n //Si no hay componente, limpiamos lo que hubiera\n if (!component) {\n this.vcr.clear();\n this._currentRef = null;\n this._rowSignal = undefined;\n this._keySignal = undefined;\n return;\n }\n\n //Solo se recrea si cambia el tipo de componente. En caso contrario se reutiliza\n //la instancia y se actualizan sus signals, evitando apilar componentes en el DOM\n //cada vez que cambian los datos de la fila.\n if (this._currentRef?.componentType !== component) {\n this.vcr.clear();\n this._currentRef = this.vcr.createComponent(component);\n this._rowSignal = undefined;\n this._keySignal = undefined;\n }\n\n if (row === undefined || key === undefined)\n return;\n\n // Si el componente declara row/key como input() (lo normal), se usan los inputs de verdad\n const inputs = reflectComponentType(component)?.inputs.map(i => i.templateName) ?? [];\n if (inputs.includes('row')) {\n this._currentRef!.setInput('row', row);\n if (inputs.includes('key'))\n this._currentRef!.setInput('key', key);\n return;\n }\n\n // Compatibilidad: componentes antiguos con row/key como propiedades (se les da un signal)\n if (!this._rowSignal || !this._keySignal) {\n this._rowSignal = signal(row);\n this._keySignal = signal(key);\n this._currentRef!.instance.row = this._rowSignal;\n this._currentRef!.instance.key = this._keySignal;\n } else {\n this._rowSignal.set(row);\n this._keySignal.set(key);\n }\n });\n}\n","import { Pipe, type PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngxOnlyUpperFirstCharacter',\r\n})\r\nexport class OnlyUpperFirstCharacterPipe implements PipeTransform {\r\n\r\n transform(value: string): string {\r\n if (!value)\r\n return '';\r\n\r\n value = value.toLowerCase();\r\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\r\n }\r\n\r\n}\r\n","import { PipeTransform, TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\nimport jsPDF from \"jspdf\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PaginatedFilter } from \"./paginated-filter\";\r\nimport { PaginatedItems } from \"./paginated-items\";\r\n\r\nexport type FilterType = 'number' | 'text' | 'option' | 'option-multiple' | 'date' | 'date-range';\r\n\r\n//IMPORTANTE Si se añade aqui un color, hay que añadirlo tambien en paginated-table.component.scss\r\nexport type RowActionIconColor = 'Yellow' | 'Orange' | 'Pink' | 'Purple' | 'Green' | 'Blue' | 'Sky' | 'Brown';\r\n\r\nexport interface PaginatedTableConfig<T> {\r\n tableId: string;\r\n primaryKey: keyof T | Array<keyof T>;\r\n title: () => string;\r\n columns: PaginatedTableColumn<T>[];\r\n showQueryFilter?: boolean; //Filtro query para toda la tabla\r\n queryFilterPlaceholder?: string; //Placeholder del filtro query para toda la tabla\r\n create?: TableBasicAction<T>;\r\n update?: TableBasicAction<T>;\r\n clickOnRowForUpdate?: boolean; //Si esto se pone a true (desaparece el icono de acciones de update y toda la columna es el update) => Si expandableDetail true, esto se cancela y el editar se pone en acciones\r\n delete?: TableBasicAction<T>;\r\n deleteConfirm?: DeleteConfirm<T>;\r\n rowActions?: TableRowAction<T>[];\r\n showAdvancedFilters?: boolean;\r\n expandableDetail?: boolean;\r\n expandableDetailTemplateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n enableRowSelection?: boolean;\r\n showRowSelection?: (row: T) => boolean; //Para mostrar o no el checkbox de seleccion por fila\r\n rowSelectionAction?: RowSelectionAction<T>[]; //Para poner botones que actuen frente a una seleccion multiple,\r\n exportFileName?: () => string;\r\n mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;\r\n pdfConfig?: jsPDF;\r\n maxHeight?: string;\r\n defaultStickyColumn?: keyof T;\r\n showActions?: () => boolean; //Para mostrar o no la columna de acciones, en caso de que se tengan acciones de fila o clickOnRowForUpdate, esta propiedad se pondrá a true automaticamente, pero si no se quieren mostrar las acciones, se puede poner a false esta propiedad. En caso de que clickOnRowForUpdate sea true y expandableDetail sea true, entonces clickOnRowForUpdate se cancelará y las acciones de editar se pondrán en acciones de fila, por lo que en ese caso, showActions se pondrá a true automaticamente. Si se quieren ocultar las acciones en ese caso, habrá que poner showActions a false.\r\n hideExportData?: () => boolean; //Para mostrar o no el boton de exportar datos, en caso de que se tenga acciones de exportacion, esta propiedad se pondrá a false automaticamente, pero si no se quieren mostrar el boton de exportar datos, se puede poner a true esta propiedad.\r\n hideColumnConfig?: () => boolean; //Para ocultar el boton de configurar/visualizar columnas\r\n hideFullScreen?: () => boolean; //Para ocultar el boton de pantalla completa\r\n}\r\n\r\n/*\r\n PRIORIDAD DE CREACION DE LA VISTA \r\n 1 => componente\r\n 2 => template\r\n 3 => valueGetter\r\n 4 => valor de la columna por defecto aplicando pipes (en caso de que se especifiquen)\r\n*/\r\nexport interface PaginatedTableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n isSortable?: boolean; //Los datos de la columna se pueden ordenar\r\n filterType?: FilterType; //Los datos de la columna se pueden filtrar\r\n filterOptions?: FilterOption[]; //En caso de filterType = option o filterType = option-multiple entonces, se pintara un select y habra que mandar las opciones\r\n endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;\r\n filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;\r\n component?: Type<any>; //Para crear la vista desde un component\r\n templateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n valueGetter?: (row: T) => string;\r\n pipes?: ColumnPipe | ColumnPipe[];\r\n showTotalPerPage?: boolean;\r\n showTotalGeneral?: boolean;\r\n getTotalGeneral?: () => number;\r\n totalFooterFormatter?: (total: number) => string;\r\n style?: string;\r\n footerStyle?: string;\r\n}\r\n\r\nexport interface TableBasicAction<T> {\r\n show?: (row?: T) => boolean;\r\n disabled?: (row?: T) => boolean;\r\n tooltip?: (row?: T) => string;\r\n}\r\n\r\nexport interface TableRowAction<T> {\r\n id: string;\r\n show?: (row: T) => boolean;\r\n disabled?: (row: T) => boolean;\r\n icon: string;\r\n iconColor?: RowActionIconColor;\r\n tooltip: (row: T) => string;\r\n}\r\n\r\nexport interface FilterOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport function isFilterOption(obj: unknown): obj is FilterOption {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'value' in obj &&\r\n 'label' in obj &&\r\n typeof (obj as any).value === 'string' &&\r\n typeof (obj as any).label === 'string'\r\n );\r\n}\r\n\r\nexport interface ColumnPipe {\r\n pipe: PipeTransform;\r\n args?: any[];\r\n}\r\n\r\nexport interface DeleteConfirm<T> {\r\n title: (row: T) => string;\r\n body?: (row: T) => string;\r\n templateRef?: () => TemplateRef<{ $implicit: T }>;\r\n}\r\n\r\nexport interface RowSelectionAction<T> {\r\n id: string;\r\n icon: string;\r\n label: (row: T[], totalSelected: number) => string;\r\n}","import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ColumnValue } from \"./column-value\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isFilterOption, PaginatedTableColumn } from \"./paginated-table-config\";\r\nimport { DynamicFilter } from \"./dynamic-filter\";\r\nimport { AdvancedFilter, FilterGroup, FilterRule, FilterConnector, FilterOperator } from \"./advanced-filter\";\r\nimport { NgxEiffageTexts } from \"../i18n\";\r\n\r\nexport class AdvancedFilterUtils {\r\n static createAdvancedFilter = <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>): FormGroup => {\r\n return fb.group({\r\n name: [advancedFilter.name, Validators.required],\r\n groups: fb.array(advancedFilter.groups.map(g => this.createFilterGroup(fb, g)))\r\n });\r\n }\r\n\r\n static createFilterGroup = <T>(fb: FormBuilder, group: FilterGroup<T>): FormGroup => {\r\n return fb.group({\r\n id: [group.id ?? uuidv4()],\r\n connector: [group.connector, Validators.required],\r\n filters: fb.array(group.filters.map(f => {\r\n return this.isFilterGroup<T>(f)\r\n ? this.createFilterGroup(fb, f)\r\n : this.createFilterRule(fb, f);\r\n }), [Validators.required])\r\n });\r\n }\r\n\r\n static createFilterRule = <T>(fb: FormBuilder, rule: FilterRule<T>): FormGroup => {\r\n return fb.group({\r\n id: [rule.id ?? uuidv4()],\r\n key: [rule.key ?? null, Validators.required],\r\n operator: [rule.operator ?? null, Validators.required],\r\n value: [rule.value ?? null, Validators.required]\r\n });\r\n }\r\n\r\n static isFilterGroup = <T>(obj: any): obj is FilterGroup<T> => {\r\n return obj &&\r\n typeof obj === 'object' &&\r\n 'connector' in obj &&\r\n 'filters' in obj;\r\n }\r\n\r\n private static isFilterRule<T>(obj: any): obj is FilterRule<T> {\r\n return obj && typeof obj === 'object' && 'key' in obj;\r\n }\r\n\r\n static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>) {\r\n const groupFound = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (groupFound) {\r\n const filters = groupFound.get('filters') as FormArray;\r\n const formGroup = this.createFilterGroup(fb, group);\r\n filters.push(formGroup);\r\n }\r\n }\r\n\r\n static deleteGroup<T>(form: FormGroup, groupId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, groupId);\r\n }\r\n\r\n static addRuleToGroup = <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => {\r\n const group = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (group) {\r\n const filters = group.get('filters') as FormArray;\r\n const formRule = this.createFilterRule(fb, rule);\r\n filters.push(formRule);\r\n }\r\n }\r\n\r\n static deleteRule<T>(form: FormGroup, ruleId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, ruleId);\r\n }\r\n\r\n private static deleteByIdRecursive(array: FormArray, id: string): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n const control = array.at(i) as FormGroup;\r\n\r\n // Si el id coincide, eliminar directamente (da igual si es rule o group)\r\n if (control.get('id')?.value === id) {\r\n array.removeAt(i);\r\n return true;\r\n }\r\n\r\n // Si es un grupo, seguir buscando dentro de sus filtros\r\n const filters = control.get('filters');\r\n if (filters instanceof FormArray) {\r\n const deleted = this.deleteByIdRecursive(filters, id);\r\n if (deleted) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n static findGroupFormById(array: FormArray, id: string): FormGroup | null {\r\n for (const control of array.controls) {\r\n const group = control as FormGroup;\r\n if (group.get('id')?.value === id)\r\n return group;\r\n\r\n const filters = group.get('filters') as FormArray;\r\n if (filters) {\r\n const found = this.findGroupFormById(filters, id);\r\n if (found)\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isFilterGroupForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('connector') &&\r\n group.contains('filters')\r\n );\r\n }\r\n\r\n /*static isFilterRuleForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('key') &&\r\n group.contains('operator') &&\r\n group.contains('value') &&\r\n !group.contains('filters')\r\n );\r\n }*/\r\n\r\n static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T> {\r\n return {\r\n name: form.get('name')?.value,\r\n groups: (form.get('groups') as FormArray).controls\r\n .map(g => this.mapFormGroupToFilterGroup<T>(g as FormGroup))\r\n .filter(g => this.isNonEmptyGroup(g))\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterGroup<T>(groupForm: FormGroup): FilterGroup<T> {\r\n const id = groupForm.get('id')?.value as string;\r\n const connector = groupForm.get('connector')?.value as FilterConnector;\r\n const filtersArray = groupForm.get('filters') as FormArray;\r\n\r\n const filters = filtersArray.controls\r\n .map(control => {\r\n const value = control.value;\r\n if ('filters' in value)\r\n return this.mapFormGroupToFilterGroup<T>(control as FormGroup);\r\n else\r\n return this.mapFormGroupToFilterRule<T>(control as FormGroup);\r\n })\r\n .filter(f => this.isNonEmptyFilter(f));\r\n\r\n return {\r\n id: id,\r\n connector: connector,\r\n filters: filters\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterRule<T>(ruleForm: FormGroup): FilterRule<T> {\r\n return {\r\n id: ruleForm.get('id')?.value,\r\n key: ruleForm.get('key')?.value,\r\n operator: ruleForm.get('operator')?.value,\r\n value: ruleForm.get('value')?.value\r\n };\r\n }\r\n\r\n private static isNonEmptyFilter<T>(filter: FilterRule<T> | FilterGroup<T>): boolean {\r\n if (this.isFilterGroup(filter))\r\n return this.isNonEmptyGroup(filter);\r\n\r\n return this.isNonEmptyRule(filter);\r\n }\r\n\r\n private static isNonEmptyGroup<T>(group: FilterGroup<T>): boolean {\r\n return Array.isArray(group.filters) && group.filters.some(f => this.isNonEmptyFilter(f));\r\n }\r\n\r\n private static isNonEmptyRule<T>(rule: FilterRule<T>): boolean {\r\n return !!(rule.key && rule.operator && rule.value !== undefined && rule.value !== null && rule.value !== '');\r\n }\r\n\r\n static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n return this.groupToHtml(groups[0], columns, texts);\r\n //return groups.map(g => this.groupToString(g)).join(' OR ');\r\n }\r\n\r\n private static groupToHtml<T>(group: FilterGroup<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const connectorLabel = group.connector === 'AND' ? texts.advancedFilters.and : texts.advancedFilters.or;\r\n const connector = ` <strong>${connectorLabel}</strong> `;\r\n\r\n const parts = group.filters.map(filter => {\r\n if (this.isFilterGroup<T>(filter))\r\n return `<strong>[ </strong>${this.groupToHtml(filter, columns, texts)}<strong> ]</strong>`;\r\n else\r\n return this.ruleToHtml(filter, columns, texts);\r\n });\r\n\r\n return parts.join(connector);\r\n }\r\n\r\n private static ruleToHtml<T>(rule: FilterRule<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const column = columns.find(column => column.key == rule.key);\r\n\r\n if (!column)\r\n return \"\";\r\n\r\n const key = `<i>${column.label}</i>`;\r\n const operator = rule.operator ? this.getOperatorLabel(rule.operator, texts).toLowerCase() : '';\r\n //const operator = rule.operator ?? '';\r\n const value = this.valueToHtml(rule.value, column);\r\n return `${key} ${operator} \"${value}\"`;\r\n }\r\n\r\n private static getOperatorLabel(operator: FilterOperator, texts: NgxEiffageTexts): string {\r\n const operatorLabels: Record<FilterOperator, string> = {\r\n '=': texts.advancedFilters.operators.equals,\r\n '<>': texts.advancedFilters.operators.notEquals,\r\n '>': texts.advancedFilters.operators.greaterThan,\r\n '>=': texts.advancedFilters.operators.greaterOrEquals,\r\n '<': texts.advancedFilters.operators.lessThan,\r\n '<=': texts.advancedFilters.operators.lessOrEquals,\r\n 'LIKE': texts.advancedFilters.operators.like\r\n };\r\n return operatorLabels[operator];\r\n }\r\n\r\n private static valueToHtml<T>(value: ColumnValue, column: PaginatedTableColumn<T>): string {\r\n switch (column.filterType) {\r\n case 'option':\r\n case 'option-multiple':\r\n if (isFilterOption(value))\r\n return value.label;\r\n\r\n const optionSelected = column.filterOptions?.find(option => option.value == value);\r\n return optionSelected?.label ?? '';\r\n case 'date':\r\n case 'date-range':\r\n const pipe = new DatePipe('es-ES');\r\n return pipe.transform(value as string, 'dd/MM/yyyy') ?? '';\r\n }\r\n\r\n return value as string;\r\n }\r\n\r\n static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[] {\r\n const result: DynamicFilter<T>[] = [];\r\n\r\n for (const group of advancedFilter.groups) {\r\n result.push(...this.mapGroupToDynamicFilters(group));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static mapGroupToDynamicFilters<T>(group: FilterGroup<T>): DynamicFilter<T>[] {\r\n const filters: DynamicFilter<T>[] = [];\r\n\r\n for (const f of group.filters) {\r\n if (this.isFilterGroup<T>(f)) {\r\n filters.push(...this.mapGroupToDynamicFilters(f));\r\n } else if (this.isFilterRule<T>(f) && f.key && f.operator && f.value !== undefined && f.value !== null) {\r\n filters.push({\r\n campo: f.key,\r\n operador: f.operator,\r\n valor: f.value?.toString(),\r\n conector: group.connector,\r\n grupo: group.id ?? 'root'\r\n });\r\n }\r\n }\r\n\r\n return filters;\r\n }\r\n\r\n\r\n static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T> {\r\n return {\r\n ...filter,\r\n groups: filter.groups.map(group => this.normalizeGroupForBackend(group))\r\n };\r\n }\r\n\r\n private static normalizeGroupForBackend<T>(group: FilterGroup<T>): FilterGroup<T> {\r\n return {\r\n ...group,\r\n filters: group.filters.map(f => {\r\n if (this.isFilterGroup(f)) {\r\n return this.normalizeGroupForBackend(f);\r\n }\r\n\r\n return this.normalizeRuleForBackend(f);\r\n })\r\n };\r\n }\r\n\r\n private static normalizeRuleForBackend<T>(rule: FilterRule<T>): FilterRule<T> {\r\n if (isFilterOption(rule.value)) {\r\n return {\r\n ...rule,\r\n value: rule.value.value\r\n };\r\n }\r\n\r\n return rule;\r\n }\r\n}\r\n","import { InjectionToken, Signal, signal } from \"@angular/core\";\r\n\r\n/**\r\n * Signal con el identificador del usuario actual. Se usa para aislar por usuario\r\n * la configuracion de columnas y los filtros avanzados guardados en localStorage.\r\n *\r\n * Si la aplicacion no lo provee, el valor por defecto es `undefined`, lo que\r\n * desactiva la persistencia: las tablas siguen funcionando, pero no recuerdan\r\n * la configuracion entre sesiones.\r\n */\r\nexport const USER_ID_FACTORY = new InjectionToken<Signal<string | null | undefined>>(\r\n 'USER_ID_FACTORY',\r\n {\r\n providedIn: 'root',\r\n factory: () => signal<string | null | undefined>(undefined)\r\n }\r\n);\r\n","import { FilterOption, FilterType } from \"./paginated-table-config\";\r\nimport { ColumnValue } from \"../models/column-value\";\r\n\r\nexport type FilterConnector = 'AND' | 'OR';\r\n\r\nexport type FilterOperator = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'LIKE';\r\n\r\nexport interface AdvancedFilter<T> {\r\n name: string;\r\n groups: FilterGroup<T>[];\r\n}\r\n\r\nexport interface FilterGroup<T> {\r\n id?: string;\r\n connector: FilterConnector;\r\n filters: (FilterRule<T> | FilterGroup<T>)[];\r\n}\r\n\r\nexport interface FilterRule<T> {\r\n id?: string;\r\n key?: keyof T;\r\n operator?: FilterOperator;\r\n value?: ColumnValue;\r\n}\r\n\r\nexport const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]> = {\r\n number: ['=', '<>', '>', '>=', '<', '<='],\r\n text: ['=', 'LIKE', '<>'],\r\n option: ['=', '<>'],\r\n 'option-multiple': ['=', '<>'], //Actuara como un option\r\n date: ['=', '<>', '>', '>=', '<', '<='],\r\n 'date-range': ['=', '<>', '>', '>=', '<', '<='] //Actuara como un date normal\r\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { USER_ID_FACTORY } from '../models';\r\nimport { AdvancedFilter } from '../models/advanced-filter';\r\nimport { AdvancedFilterUtils } from '../models/advanced-filter-utils';\r\nimport { DynamicFilter } from '../models/dynamic-filter';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdvancedFilterService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG = 'advanced_filter';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG}_${userId}`;\r\n });\r\n\r\n private _advancedFilters = signal<Record<string, AdvancedFilter<any>[]>>({});\r\n advancedFilters = this._advancedFilters.asReadonly();\r\n\r\n private setAdvancedFiltersEffect = effect(() => {\r\n this.setAdvancedFilter();\r\n });\r\n\r\n constructor() {\r\n this.setAdvancedFilter();\r\n }\r\n\r\n private setAdvancedFilter() {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const recordAdvancedFitler = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordAdvancedFitler) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const advancedFilters: Record<string, AdvancedFilter<any>[]> = JSON.parse(recordAdvancedFitler);\r\n\r\n this._advancedFilters.set(advancedFilters);\r\n }\r\n\r\n saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const index = currentArray.findIndex(f => f.groups[0].id === advancedFilter.groups[0].id);\r\n let newArray: AdvancedFilter<any>[];\r\n if (index >= 0) { //Si existe, lo reemplazamos\r\n newArray = [...currentArray];\r\n newArray[index] = advancedFilter;\r\n } else { // Si no existe, lo añadimos\r\n newArray = [...currentArray, advancedFilter];\r\n }\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const newArray = currentArray.filter(f => f.groups[0].id !== advancedFilter.groups[0].id);\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend: boolean = true): AdvancedFilter<any> | undefined {\r\n const allAdvancedFiltersByTable = this._advancedFilters()[tableId];\r\n\r\n if (!allAdvancedFiltersByTable)\r\n return undefined;\r\n\r\n const advancedFilter = allAdvancedFiltersByTable.find(advancedFilter => {\r\n return advancedFilter.groups?.[0].id !== undefined && advancedFilter.groups[0].id == advancedFilterId;\r\n });\r\n\r\n if (!normalizeForBackend)\r\n return advancedFilter;\r\n\r\n if (!advancedFilter)\r\n return undefined;\r\n\r\n return AdvancedFilterUtils.normalizeAdvancedFilterForBackend(advancedFilter);\r\n }\r\n\r\n getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[] {\r\n const advancedFilter = this.getAdvancedFilterById(tableId, advancedFilterId);\r\n\r\n if (!advancedFilter)\r\n return [];\r\n\r\n return AdvancedFilterUtils.mapToDynamicFilter(advancedFilter);\r\n }\r\n}\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { ColumnConfig } from '../models/configure-table-column-data';\r\nimport { USER_ID_FACTORY } from '../models';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColumnConfigService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG = 'column_config';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_COLUMN_CONFIG}_${userId}`;\r\n });\r\n\r\n private _columnConfigs = signal<Record<string, ColumnConfig<any>[]>>({});\r\n columnConfigs = this._columnConfigs.asReadonly();\r\n\r\n private setColumnConfigEffect = effect(() => {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const recordColumnConfig = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordColumnConfig) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const columnConfigs: Record<string, ColumnConfig<any>[]> = JSON.parse(recordColumnConfig);\r\n\r\n this._columnConfigs.set(columnConfigs);\r\n });\r\n\r\n saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue = {\r\n ...currentValue,\r\n [tableId]: columnConfig\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteColumnConfig(tableId: string): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue: Record<string, ColumnConfig<any>[]> = { ...currentValue };\r\n delete newValue[tableId];\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n","import { inject, Injectable, PLATFORM_ID, Signal, signal } from '@angular/core';\r\nimport { fromEvent, map, startWith } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Pantalla } from '../models/pantalla';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatosPantallaService {\r\n\r\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n //En servidor no existe window, asi que se devuelve undefined en lugar de romper\r\n pantalla: Signal<Pantalla | undefined> = this.isBrowser\r\n ? toSignal(\r\n fromEvent(window, 'resize').pipe(\r\n startWith(this.obtenerDatosPantalla()),\r\n map(() => this.obtenerDatosPantalla())\r\n )\r\n )\r\n : signal<Pantalla | undefined>(undefined);\r\n\r\n private obtenerDatosPantalla(): Pantalla {\r\n let pantalla: Pantalla = {\r\n tipo: 'escritorio',\r\n ancho: window.innerWidth,\r\n alto: window.innerHeight\r\n }\r\n\r\n if (pantalla.ancho < 600) {\r\n pantalla.tipo = 'movil';\r\n return pantalla;\r\n }\r\n\r\n if (pantalla.ancho < 950) {\r\n pantalla.tipo = 'tablet';\r\n return pantalla;\r\n }\r\n\r\n return pantalla;\r\n }\r\n\r\n}\r\n","import { inject, Injectable, TemplateRef, Type } from \"@angular/core\";\nimport { MatDialog, MatDialogConfig } from \"@angular/material/dialog\";\nimport { Observable } from \"rxjs\";\nimport { DialogBodyConfig, DialogBodyType, DialogConfig, NgxDialogTemplateContext } from \"../models/dialog-config\";\nimport { NgxDialog } from \"../components\";\nimport { NgxTexts } from \"../i18n\";\n\n/** Opciones comunes a todos los diálogos. */\ninterface DialogHeaderOptions {\n title: string;\n subtitle?: string;\n icon?: string;\n iconColor?: string;\n cancelText?: string;\n confirmText?: string;\n showCancel?: boolean;\n showConfirm?: boolean;\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\n destructive?: boolean;\n /**\n * Muestra la X de cerrar en el encabezado; cerrar con ella devuelve undefined, igual que Esc.\n * Por defecto true, salvo si dialogConfig.disableClose es true.\n */\n showClose?: boolean;\n}\n\n/**\n * Ancho mínimo por defecto: 400px, pero nunca más que la pantalla menos un margen\n * (un 400px fijo se salía de los móviles).\n */\nconst DEFAULT_MIN_WIDTH = 'min(400px, calc(100vw - 32px))';\n\n/**\n * Abre diálogos de Material con una estructura común: título con icono opcional, subtítulo,\n * cuerpo (texto, HTML, componente o plantilla) y botones de cancelar/confirmar.\n *\n * Todos devuelven un Observable que emite al cerrarse y completa:\n * - `true` (o el resultado fijado por el contenido) si se confirma,\n * - `false` si se cancela,\n * - `undefined` si se cierra sin pulsar ningún botón (Esc o clic fuera).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxDialogService {\n private readonly _dialog = inject(MatDialog);\n private readonly _texts = inject(NgxTexts).texts;\n\n /** Diálogo con un texto. Base de `confirm()` e `info()`. */\n openText(\n config: DialogHeaderOptions & { content: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { content, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.TEXT, content }, dialogConfig);\n }\n\n /** Pregunta de confirmación con botones de cancelar y confirmar. */\n confirm(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n cancelText: config.cancelText ?? this._texts().dialog.cancel,\n confirmText: config.confirmText ?? this._texts().dialog.confirm,\n }, dialogConfig);\n }\n\n /** Aviso informativo con un único botón. */\n info(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm' | 'cancelText'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n showCancel: false,\n confirmText: config.confirmText ?? this._texts().dialog.accept,\n }, dialogConfig);\n }\n\n /**\n * Diálogo con HTML. Angular sanea el HTML: se quitan scripts, estilos en línea y atributos\n * peligrosos. Para contenido con interacción, usa `component()` o `template()`.\n */\n html(\n config: DialogHeaderOptions & { html: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { html, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.HTML, content: html }, dialogConfig);\n }\n\n /**\n * Diálogo con un componente propio. El componente recibe `componentData` por su input `data`\n * y puede inyectar `NgxDialogContext<R>` para devolver un resultado (`result`), cerrar\n * (`close()`) o deshabilitar el botón de confirmar (`confirmDisabled`).\n */\n component<T = any, R = boolean>(\n config: DialogHeaderOptions & { component: Type<any>; componentData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { component, componentData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.COMPONENT, content: component, data: componentData }, dialogConfig);\n }\n\n /**\n * Diálogo con una plantilla. La plantilla recibe `templateData` como `$implicit` y el contexto\n * del diálogo como `dialog` (`let-data let-dialog=\"dialog\"`).\n */\n template<T = any, R = boolean>(\n config: DialogHeaderOptions & { template: TemplateRef<NgxDialogTemplateContext<T, R>> | TemplateRef<{ $implicit: T }> | TemplateRef<T>; templateData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { template, templateData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.TEMPLATE, content: template, data: templateData }, dialogConfig);\n }\n\n private _open<R>(\n header: DialogHeaderOptions,\n body: DialogBodyConfig,\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const data: DialogConfig = { ...header, body };\n return this._dialog.open<NgxDialog, DialogConfig, R | boolean>(NgxDialog, {\n ...dialogConfig,\n data,\n minWidth: dialogConfig?.minWidth ?? DEFAULT_MIN_WIDTH,\n autoFocus: dialogConfig?.autoFocus ?? false,\n }).afterClosed();\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { DateRange } from '@angular/material/datepicker';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport moment from 'moment';\r\nimport { ConfigureTableColumnData, ColumnConfig } from '../../../models/configure-table-column-data';\r\nimport { ColumnConfigService } from '../../../services/column-config.service';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { isFilterOption } from '../../../models';\r\n\r\n@Component({\r\n selector: 'lib-configure-table-columns',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatIconModule,\r\n MatSlideToggleModule,\r\n CdkDropList,\r\n CdkDrag,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './configure-table-columns.component.html',\r\n styleUrl: './configure-table-columns.component.scss',\r\n})\r\nexport class ConfigureTableColumnsComponent<T> {\r\n columnConfigService = inject(ColumnConfigService);\r\n dialogRef = inject(MatDialogRef<ConfigureTableColumnsComponent<T>>);\r\n data = inject<ConfigureTableColumnData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = signal(this.data.columns);\r\n isConfirmDisabled = computed(() => {\r\n const allDisabled = this.columns().every(column => !column.show);\r\n const someHasFilter = this.columns().some(column => this.hasFilterAndDisabled(column));\r\n return allDisabled || someHasFilter;\r\n });\r\n\r\n startAnimationTimeout?: number = undefined;\r\n endAnimationTimeout?: number = undefined;\r\n animationTime: number = 250;\r\n animationIndex = signal<number | undefined>(undefined);\r\n\r\n hasFilterAndDisabled(column: ColumnConfig<T>): boolean {\r\n const value = this.data.filtersValue[column.key];\r\n if (Array.isArray(value))\r\n return value.length > 0 && !column.show;\r\n\r\n if (typeof value === 'string')\r\n return value.length > 0 && !column.show;\r\n\r\n if (value instanceof DateRange)\r\n return (value.start != null || value.end != null) && !column.show;\r\n\r\n if (moment.isMoment(value))\r\n return !column.show;\r\n\r\n if (isFilterOption(value))\r\n return !column.show;\r\n\r\n return false;\r\n }\r\n\r\n onUpClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index > 0) {\r\n [cols[index - 1], cols[index]] = [cols[index], cols[index - 1]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDownClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index < cols.length - 1) {\r\n [cols[index], cols[index + 1]] = [cols[index + 1], cols[index]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<any, any, any>) {\r\n const cols = [...this.columns()];\r\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\r\n this.columns.set(cols);\r\n }\r\n\r\n onToggleChange(columnClicked: ColumnConfig<T>) {\r\n this.columns.update(value => {\r\n return value.map(column => {\r\n if (column.key == columnClicked.key)\r\n return { ...column, show: !column.show };\r\n else\r\n return column;\r\n });\r\n });\r\n }\r\n\r\n onPinClick(columnConfig: ColumnConfig<T>, index: number) {\r\n const columns = [...this.columns()];\r\n const currentSticky = columns.find(c => c.isSticky);\r\n\r\n if (columnConfig.key == currentSticky?.key) {\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: false\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n return;\r\n }\r\n\r\n clearTimeout(this.startAnimationTimeout);\r\n clearTimeout(this.endAnimationTimeout);\r\n this.animationIndex.set(undefined);\r\n\r\n this.animationIndex.set(index);\r\n\r\n this.startAnimationTimeout = setTimeout(() => {\r\n moveItemInArray(columns, index, 0);\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: c.key == columnConfig.key\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n this.animationIndex.set(0);\r\n this.endAnimationTimeout = setTimeout(() => this.animationIndex.set(undefined), this.animationTime)\r\n }, this.animationTime);\r\n }\r\n\r\n onConfirmClick() {\r\n this.columnConfigService.saveColumnConfig(this.data.tableId, this.columns());\r\n this.dialogRef.close();\r\n }\r\n\r\n onResetClick() {\r\n this.columnConfigService.deleteColumnConfig(this.data.tableId);\r\n this.dialogRef.close();\r\n }\r\n}\r\n","<h2 mat-dialog-title>{{texts().columnsDialog.title}} {{data.tableName| lowercase}}</h2>\r\n<mat-dialog-content>\r\n\r\n <div class=\"columnsList\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n @for (column of columns(); track $index; let first = $first; let last = $last;) {\r\n <div \r\n class=\"columnContainer\" \r\n cdkDrag \r\n [class.pinned]=\"$index == animationIndex()\"\r\n [style]=\"{ transition: `background-color ${animationTime}ms ease` }\">\r\n\r\n <div class=\"labelContainer\">\r\n <mat-icon>drag_indicator</mat-icon>\r\n <p class=\"label\">\r\n {{data.columnsLabels[column.key] ?? ''}}\r\n @if(hasFilterAndDisabled(column)) {\r\n <span> {{texts().columnsDialog.hasFiltersApplied}}</span>\r\n }\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button \r\n matIconButton\r\n [matTooltip]=\"column.isSticky ? texts().columnsDialog.unpin : texts().columnsDialog.pin\"\r\n (click)=\"onPinClick(column, $index)\">\r\n <mat-icon>{{column.isSticky ? 'keep_off' : 'keep'}}</mat-icon>\r\n </button>\r\n\r\n <button [matTooltip]=\"texts().columnsDialog.moveUp\" matIconButton [disabled]=\"$first\" (click)=\"onUpClick($index)\"><mat-icon>keyboard_arrow_up</mat-icon></button>\r\n <button [matTooltip]=\"texts().columnsDialog.moveDown\" matIconButton [disabled]=\"$last\" (click)=\"onDownClick($index)\"><mat-icon>keyboard_arrow_down</mat-icon></button>\r\n <mat-slide-toggle [checked]=\"column.show\" (toggleChange)=\"onToggleChange(column)\"></mat-slide-toggle>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p class=\"note\"><span>{{texts().columnsDialog.note}}</span> {{texts().columnsDialog.hideColumnWithFiltersNote}}</p>\r\n \r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton (click)=\"onResetClick()\">{{texts().columnsDialog.reset}}</button>\r\n <button matButton [disabled]=\"isConfirmDisabled()\" (click)=\"onConfirmClick()\">{{texts().common.confirm}}</button>\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, OnDestroy, WritableSignal, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule,\r\n MatProgressBarModule\r\n ],\r\n templateUrl: './ngx-paginated-searchable-select.component.html',\r\n styleUrl: './ngx-paginated-searchable-select.component.scss',\r\n})\r\nexport class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, OnDestroy {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n } as U\r\n )\r\n );\r\n optionLabel = input<((option: T) => string)>(\r\n (o: T) => {\r\n if (isFilterOption(o))\r\n return o.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n compareWith = input<(o1: T, o2: T) => boolean>(\r\n (o1: T, o2: T) => {\r\n if (!o2)\r\n return false;\r\n\r\n if (isFilterOption(o1) && isFilterOption(o2))\r\n return o1.value == o2.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<T | T[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<T | T[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n private queryTimeout: number | undefined = undefined;\r\n private readonly debounceTime = 300;\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: T | T[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: T | T[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: T | T[] | undefined) => 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._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n\r\n protected options = signal<T[]>([]);\r\n\r\n setOptions = effect(() => {\r\n const paginatedRecords = this.dataResource.value();\r\n const pageNumber = this.filters()().pageNumber;\r\n\r\n if (!paginatedRecords)\r\n return;\r\n\r\n if (pageNumber > 1)\r\n this.options.update((oldValue: T[]) => [...oldValue, ...paginatedRecords.items]);\r\n else\r\n this.options.set(paginatedRecords.items);\r\n });\r\n /*protected options = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.records;\r\n });*/\r\n\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n this.onQueryChange();\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected onQueryChange() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n const query = searcher.nativeElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime);\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<T | T[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected optionsSelectedForView(): T[] {\r\n const innerControl = this.innerControl();\r\n\r\n if (!innerControl.value)\r\n return [];\r\n\r\n if (Array.isArray(innerControl.value))\r\n return innerControl.value;\r\n\r\n return [innerControl.value];\r\n };\r\n\r\n protected onMoreClick() {\r\n this.filters().update((value: U) => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageNumber + 1\r\n };\r\n });\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{ selectLabel() }}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\"\r\n [compareWith]=\"compareWith()\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\"\r\n [value]=\"filters()().query ?? ''\" \r\n (input)=\"onQueryChange()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\" />\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option [value]=\"option\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Es MUY importante que estos vayan los ultimos (al final de todas las opciones). -->\r\n @for (option of optionsSelectedForView(); track $index) {\r\n <mat-option [value]=\"option\" class=\"hideOption\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Si es multiple, como no esta el option de resetear, si filtran y no hay opciones, y luego cierran el select el desplegable no se abre y queda inutilizado, por eso, ponemos esta opcion dummy, que siempre esta oculta, y no hace nada, pero ya hace que haya un item, y el desplegable se abra -->\r\n @if(multiple()) {\r\n <mat-option class=\"hideOption\" dummyOption></mat-option>\r\n }\r\n\r\n @if (total() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n\r\n @if((filters()().pageNumber * filters()().pageSize) < total() && !dataResource.isLoading()) {\r\n <button matButton=\"text\" class=\"showMore\" (click)=\"onMoreClick()\">\r\n {{ texts().select.showMore }}\r\n </button>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","import { AfterViewInit, Component, ElementRef, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n\r\n@Component({\r\n selector: 'ngx-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-searchable-select.component.html',\r\n styleUrl: './ngx-searchable-select.component.scss',\r\n})\r\nexport class SearchableSelectComponent<T> implements ControlValueAccessor, AfterViewInit {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n options = input.required<T[]>();\r\n optionLabel = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n optionValue = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionValue\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<string | string[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<string | string[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: string | string[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: string | string[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: string | string[] | undefined) => 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._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n /*if (open)\r\n this.cleanQuery();*/\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n setTimeout(() => {\r\n searcher.nativeElement.focus();\r\n });\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected showOption(option: T): boolean {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const label = this.optionLabel()(option);\r\n return includeNoSensible(label, query);\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<string | string[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected numberOfResults(): number {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const optionLabel = this.optionLabel();\r\n const results = this.options().filter((option) => {\r\n const label = optionLabel(option);\r\n return includeNoSensible(label, query);\r\n });\r\n return results.length;\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{selectLabel()}}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option \r\n [value]=\"optionValue()(option)\"\r\n [class.hideOption]=\"!showOption(option)\">\r\n {{optionLabel()(option)}}\r\n </mat-option>\r\n }\r\n\r\n @if (numberOfResults() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{error()}}</mat-error>\r\n</mat-form-field>","import { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { PaginatedTableConfig, OPERATOR_BY_FILTER_TYPE, FilterOperator, FilterType, PaginatedTableColumn, FilterOption, PaginatedFilter } from '../../../models';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../../../components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../../../components/ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-rule',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatTooltipModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './advanced-filter-rule.component.html',\r\n styleUrl: './advanced-filter-rule.component.scss',\r\n})\r\nexport class AdvancedFilterRuleComponent<T> {\r\n rule = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n deleteFilter = output<string>();\r\n\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = computed(() => this.config().columns.filter(column => column.filterType != undefined));\r\n operatorByFilterType = OPERATOR_BY_FILTER_TYPE;\r\n \r\n filterOperatorLabel = computed<Record<FilterOperator, string>>(() => ({\r\n '=': this.texts().advancedFilters.operators.equals,\r\n '<>': this.texts().advancedFilters.operators.notEquals,\r\n '>': this.texts().advancedFilters.operators.greaterThan,\r\n '>=': this.texts().advancedFilters.operators.greaterOrEquals,\r\n '<': this.texts().advancedFilters.operators.lessThan,\r\n '<=': this.texts().advancedFilters.operators.lessOrEquals,\r\n 'LIKE': this.texts().advancedFilters.operators.like\r\n }));\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n getRuleId(): string {\r\n return (this.rule().get('id')! as FormControl).value;\r\n }\r\n\r\n getKey(): FormControl {\r\n return this.rule().get('key')! as FormControl\r\n }\r\n\r\n getOperator(): FormControl {\r\n return this.rule().get('operator')! as FormControl\r\n }\r\n\r\n getValue(): FormControl {\r\n return this.rule().get('value')! as FormControl\r\n }\r\n\r\n getColumnSelected(value: keyof T): PaginatedTableColumn<T> | undefined {\r\n return this.columns().find(column => column.key == value);\r\n }\r\n\r\n getOperatorsOption(value: keyof T): FilterOperator[] {\r\n const columnSelected = this.getColumnSelected(value);\r\n\r\n if (!columnSelected || !columnSelected.filterType)\r\n return [];\r\n\r\n return this.operatorByFilterType[columnSelected.filterType];\r\n }\r\n\r\n getFilterType(value: keyof T): FilterType | undefined {\r\n const columnSelected = this.getColumnSelected(value);\r\n return columnSelected?.filterType;\r\n }\r\n\r\n onKeyChange(_?: string | string[]) {\r\n this.getOperator().setValue(null);\r\n this.getValue().setValue(null);\r\n }\r\n\r\n keyOptionLabel = (column: PaginatedTableColumn<T>): string => column.label\r\n keyOptionValue = (column: PaginatedTableColumn<T>): string => column.key as string\r\n\r\n operatorOptionLabel = (filterOperator: FilterOperator): string => this.filterOperatorLabel()[filterOperator];\r\n operatorOptionValue = (filterOperator: FilterOperator): string => filterOperator;\r\n}\r\n\r\n","<button \n matIconButton \n [matTooltip]=\"texts().advancedFilters.deleteFilter\" \n (click)=\"deleteFilter.emit(getRuleId())\"\n class=\"deleteButton\"\n type=\"button\">\n <mat-icon>delete</mat-icon>\n</button>\n\n<ngx-searchable-select\n [formControl]=\"getKey()\"\n [options]=\"columns()\"\n [optionLabel]=\"keyOptionLabel\"\n [optionValue]=\"keyOptionValue\"\n (optionChange)=\"onKeyChange($event)\"\n [selectLabel]=\"texts().advancedFilters.field\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n<ngx-searchable-select\n [formControl]=\"getOperator()\"\n [options]=\"getOperatorsOption(getKey().value)\"\n [optionLabel]=\"operatorOptionLabel\"\n [optionValue]=\"operatorOptionValue\"\n [selectLabel]=\"texts().advancedFilters.condition\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n@if (getFilterType(getKey().value) == 'text' || getFilterType(getKey().value) == 'number') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input [formControl]=\"getValue()\" [type]=\"getFilterType(getKey().value) ?? 'text'\" matInput>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n@if (getFilterType(getKey().value) == 'option' || getFilterType(getKey().value) == 'option-multiple') {\n @if(getColumnSelected(getKey().value)?.endpointForPaginatedFilterOptions) {\n <ngx-paginated-searchable-select \n [formControl]=\"getValue()\"\n [endpoint]=\"getColumnSelected(getKey().value)!.endpointForPaginatedFilterOptions!\"\n [filters]=\"getColumnSelected(getKey().value)!.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n } @else {\n <ngx-searchable-select\n [formControl]=\"getValue()\"\n [options]=\"getColumnSelected(getKey().value)?.filterOptions ?? []\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n }\n}\n\n@if(getFilterType(getKey().value) == 'date' || getFilterType(getKey().value) == 'date-range') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input\n [formControl]=\"getValue()\"\n matInput \n [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PaginatedTableConfig, FilterOption } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { DatosPantallaService } from '../../../services/datos-pantalla.service';\r\nimport { AdvancedFilterRuleComponent } from '../advanced-filter-rule/advanced-filter-rule.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-group',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n AdvancedFilterRuleComponent,\r\n MatButtonToggleModule,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './advanced-filter-group.component.html',\r\n styleUrl: './advanced-filter-group.component.scss',\r\n})\r\nexport class AdvancedFilterGroupComponent<T> {\r\n isRootNode = input.required<boolean>();\r\n group = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n addGroup = output<string>();\r\n addFilter = output<string>();\r\n deleteGroup = output<string>();\r\n deleteFilter = output<string>();\r\n\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n readonly texts = inject(NgxTexts).texts;\r\n isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n optionsFilterConnector = computed<FilterOption[]>(() => [\r\n { value: 'AND', label: this.texts().advancedFilters.and },\r\n { value: 'OR', label: this.texts().advancedFilters.or }\r\n ]);\r\n\r\n isFilterGroupForm(group: AbstractControl): boolean {\r\n return AdvancedFilterUtils.isFilterGroupForm(group);\r\n }\r\n\r\n getConnector(): FormControl {\r\n return this.group().get('connector')! as FormControl\r\n }\r\n\r\n getGroupId(): string {\r\n return (this.group().get('id')! as FormControl).value;\r\n }\r\n\r\n getFilters(): FormGroup[] {\r\n return (this.group().get('filters') as FormArray).controls as FormGroup[];\r\n }\r\n}\r\n","<div class=\"grupo\" [formGroup]=\"group()\">\r\n \r\n <mat-button-toggle-group [formControl]=\"getConnector()\">\r\n @for (option of optionsFilterConnector(); track option.value) {\r\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\r\n }\r\n </mat-button-toggle-group>\r\n\r\n @if (isDesktop()) {\r\n <button \r\n matButton=\"outlined\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n {{texts().advancedFilters.addFilter}}\r\n </button>\r\n\r\n <button \r\n matButton=\"outlined\"\r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n {{texts().advancedFilters.addGroup}}\r\n </button>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addFilter\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addGroup\" \r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n </button>\r\n }\r\n \r\n\r\n @if(!isRootNode()) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteGroup\" \r\n (click)=\"deleteGroup.emit(getGroupId())\"\r\n class=\"deleteGroupButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (group of getFilters(); track $index) {\r\n @if(isFilterGroupForm(group)) {\r\n <lib-advanced-filter-group \r\n [group]=\"group\"\r\n [config]=\"config()\"\r\n [isRootNode]=\"false\"\r\n (addGroup)=\"addGroup.emit($event)\"\r\n (addFilter)=\"addFilter.emit($event)\"\r\n (deleteGroup)=\"deleteGroup.emit($event)\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n } @else {\r\n <lib-advanced-filter-rule \r\n [rule]=\"group\"\r\n [config]=\"config()\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n }\r\n }\r\n\r\n</div>","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { FilterGroup, FilterRule } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { ConfigureAdvancedFilterData } from '../../../models/configure-advanced-filter-data';\r\nimport { AdvancedFilterService } from '../../../services/advanced-filter.service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SendType } from '../../../models/send-type';\r\nimport { AdvancedFilterGroupComponent } from '../advanced-filter-group/advanced-filter-group.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-configure-advanced-filter',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n AdvancedFilterGroupComponent\r\n ],\r\n templateUrl: './configure-advanced-filter.component.html',\r\n styleUrl: './configure-advanced-filter.component.scss',\r\n})\r\nexport class ConfigureAdvancedFilterComponent<T> { \r\n private readonly fb = inject(FormBuilder);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n dialogRef = inject(MatDialogRef<ConfigureAdvancedFilterComponent<T>>);\r\n data = inject<ConfigureAdvancedFilterData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n query = signal('');\r\n\r\n form = AdvancedFilterUtils.createAdvancedFilter<T>(this.fb, this.data.advancedFilter);\r\n formChanges = toSignal(this.form.valueChanges);\r\n\r\n mapFormToAdvancedFilterEffect = effect(() => {\r\n const values = this.formChanges();\r\n\r\n if (this.form.invalid) {\r\n this.query.set('');\r\n return;\r\n }\r\n\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const queryString = AdvancedFilterUtils.groupsToReadableHtml(advancedFilter.groups, this.data.config.columns, this.texts());\r\n this.query.set(queryString);\r\n });\r\n\r\n getRootGroup(): FormGroup {\r\n return (this.form.get('groups') as FormArray).controls[0] as FormGroup;\r\n }\r\n\r\n addGroup(groupId: string) {\r\n const newGroup: FilterGroup<T> = {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [\r\n { id: uuidv4() }\r\n ]\r\n };\r\n AdvancedFilterUtils.addGroupToGroup<T>(this.fb, this.form, groupId, newGroup);\r\n }\r\n\r\n addFilter(groupId: string) {\r\n const newRule: FilterRule<T> = { id: uuidv4() };\r\n AdvancedFilterUtils.addRuleToGroup<T>(this.fb, this.form, groupId, newRule);\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n AdvancedFilterUtils.deleteGroup<T>(this.form, groupId);\r\n }\r\n\r\n deleteFilter(ruleId: string) {\r\n AdvancedFilterUtils.deleteRule<T>(this.form, ruleId);\r\n }\r\n\r\n onSubmit(sendType: SendType) {\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const tableId = this.data.config.tableId;\r\n this.advancedFilterService.saveAdvancedFilter(tableId, advancedFilter);\r\n switch (sendType) {\r\n case 'save':\r\n this.dialogRef.close();\r\n break;\r\n case 'save_and_apply':\r\n this.dialogRef.close(advancedFilter);\r\n break;\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit('save_and_apply')\">\r\n\r\n <h2 mat-dialog-title>{{texts().advancedFilters.dialogTitle}} {{data.config.title() | lowercase}}</h2>\r\n <mat-dialog-content>\r\n\r\n <p class=\"advancedFilterResult\" [innerHTML]=\"query()\" [style.visibility]=\"query() ? 'visible': 'hidden'\"></p>\r\n\r\n <mat-form-field>\r\n <mat-label>{{texts().advancedFilters.templateName}}</mat-label>\r\n <input matInput formControlName=\"name\" [maxlength]=\"16\">\r\n <mat-hint>{{form.get('name')?.value.length ?? 0}}/16</mat-hint>\r\n <mat-error>{{texts().advancedFilters.templateNameRequired}}</mat-error>\r\n </mat-form-field>\r\n\r\n <lib-advanced-filter-group \r\n [group]=\"getRootGroup()\"\r\n [config]=\"data.config\"\r\n [isRootNode]=\"true\"\r\n (addGroup)=\"addGroup($event)\"\r\n (addFilter)=\"addFilter($event)\"\r\n (deleteGroup)=\"deleteGroup($event)\"\r\n (deleteFilter)=\"deleteFilter($event)\"\r\n />\r\n\r\n <div class=\"helperContainer\">\r\n <p class=\"helperTitle\"><strong>{{texts().advancedFilters.helpTitle}}</strong></p>\r\n <p class=\"helper\">\r\n <strong>{{texts().advancedFilters.group}} </strong>{{texts().advancedFilters.groupHelp}}<br>\r\n <strong>{{texts().advancedFilters.filter}} </strong>{{texts().advancedFilters.ruleHelp}}\r\n </p>\r\n </div>\r\n \r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save')\">{{texts().common.save}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save_and_apply')\">{{texts().common.saveAndApply}}</button>\r\n </mat-dialog-actions>\r\n\r\n\r\n</form>","// Lógica común de ngx-basic-table y ngx-paginated-table. Interno: no está en el barril.\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { ColumnPipe } from '../../models/paginated-table-config';\nimport { ColumnConfig } from '../../models/configure-table-column-data';\n\n/** Lo que las dos tablas tienen en común en cada columna. */\nexport interface TableColumnLike<T> {\n key: keyof T;\n label: string;\n valueGetter?: (row: T) => string;\n pipes?: ColumnPipe | ColumnPipe[];\n}\n\nexport function applyPipes(value: unknown, pipes?: ColumnPipe | ColumnPipe[]): unknown {\n if (!pipes) return value;\n const list = Array.isArray(pipes) ? pipes : [pipes];\n return list.reduce((v, p) => p.pipe.transform(v, ...(p.args ?? [])), value);\n}\n\n/**\n * Texto de una celda: valueGetter → pipes → valor. Es lo que se pinta (si la columna no tiene\n * componente ni plantilla), lo que se exporta y en lo que busca el buscador general.\n * Un objeto sin valueGetter no tiene texto útil: cadena vacía en vez de «[object Object]».\n */\nexport function cellText<T>(row: T, column: TableColumnLike<T>): string {\n if (column.valueGetter) return column.valueGetter(row) ?? '';\n const value = applyPipes(row[column.key], column.pipes);\n if (value == null) return '';\n if (typeof value === 'object') return '';\n return String(value);\n}\n\n/** Clave estable de una fila según primaryKey (una o varias propiedades). */\nexport function rowKeyOf<T>(row: T, primaryKey: keyof T | Array<keyof T>): unknown {\n if (Array.isArray(primaryKey)) return JSON.stringify(primaryKey.map(key => row[key]));\n return row[primaryKey];\n}\n\n/** Columnas visibles en el orden que eligió el usuario (diálogo de columnas). */\nexport function visibleColumns<T, C extends TableColumnLike<T>>(columns: C[], columnConfig: ColumnConfig<T>[]): C[] {\n return columnConfig\n .filter(config => config.show)\n .map(config => columns.find(column => column.key === config.key))\n .filter((column): column is C => !!column);\n}\n\n/** Suma numérica de una columna (los valores que no son número cuentan 0). */\nexport function sumColumn<T>(rows: T[], key: keyof T): number {\n return rows.reduce((total, row) => {\n const value = Number(row[key]);\n return Number.isFinite(value) ? total + value : total;\n }, 0);\n}\n\nexport interface TableExport<T> {\n title: string;\n fileName: string;\n columns: TableColumnLike<T>[];\n rows: T[];\n mapper?: (row: T) => Partial<Record<keyof T, unknown>>;\n pdf?: jsPDF;\n /** Color de la cabecera del PDF (CSS); por defecto, el primary del tema. */\n headerColor?: string;\n /** Elemento desde el que se resuelven las variables CSS del tema. */\n host: HTMLElement;\n}\n\nfunction exportMatrix<T>({ columns, rows, mapper }: TableExport<T>): string[][] {\n const head = columns.map(column => column.label);\n const body = rows.map(row => {\n if (mapper) {\n const mapped = mapper(row);\n return columns.map(column => {\n const value = mapped[column.key];\n return value == null ? '' : String(value);\n });\n }\n return columns.map(column => cellText(row, column));\n });\n return [head, ...body];\n}\n\nexport function exportToXlsx<T>(options: TableExport<T>): void {\n const sheet = utils.aoa_to_sheet(exportMatrix(options));\n const book = utils.book_new();\n // El nombre de la hoja no puede pasar de 31 caracteres\n utils.book_append_sheet(book, sheet, (options.title || 'Datos').substring(0, 31));\n writeFileXLSX(book, `${options.fileName}.xlsx`);\n}\n\nexport function exportToPdf<T>(options: TableExport<T>): void {\n const [head, ...body] = exportMatrix(options);\n const doc = options.pdf ?? new jsPDF({ orientation: 'landscape', unit: 'pt', format: 'A4' });\n const header = cssColorToRgb(options.host, options.headerColor ?? 'var(--mat-sys-primary)') ?? [91, 95, 98];\n const onHeader = cssColorToRgb(options.host, 'var(--mat-sys-on-primary)') ?? [255, 255, 255];\n\n doc.setFontSize(14);\n doc.text(options.title, 40, 40);\n autoTable(doc, {\n startY: 60,\n head: [head],\n body,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: header, textColor: onHeader },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n doc.save(`${options.fileName}.pdf`);\n}\n\n/**\n * Resuelve un color CSS (también variables del tema) a RGB para jsPDF. Primary y on-primary son\n * pareja en los dos modos, así que la cabecera del PDF siempre se lee.\n */\nfunction cssColorToRgb(host: HTMLElement, color: string): [number, number, number] | null {\n if (typeof getComputedStyle === 'undefined') return null;\n const probe = document.createElement('span');\n probe.style.color = color;\n probe.style.display = 'none';\n host.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n probe.remove();\n const numbers = (computed.match(/-?\\d*\\.?\\d+/g) ?? []).map(Number);\n if (numbers.length < 3) return null;\n // rgb(r, g, b) viene en 0-255; color(srgb r g b) (p. ej. con color-mix), en 0-1\n const scale = computed.startsWith('color(') ? 255 : 1;\n const [r, g, b] = numbers.slice(0, 3).map(n => Math.round(n * scale));\n return [r, g, b];\n}\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, DestroyRef, ElementRef, inject, input, linkedSignal, OnDestroy, output, Signal, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { MatSortModule, Sort } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\r\nimport { OnlyUpperFirstCharacterPipe } from '../../pipes/only-upper-first-character.pipe';\r\nimport { filter, Observable } from 'rxjs';\r\nimport { FilterOption, isFilterOption, PaginatedTableColumn, PaginatedTableConfig, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\r\nimport moment from 'moment';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { AdvancedFilter, PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { AdvancedFilterUtils } from '../../models/advanced-filter-utils';\r\nimport { ColumnValue } from '../../models/column-value';\r\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\r\nimport { AdvancedFilterService } from '../../services/advanced-filter.service';\r\nimport { ColumnConfigService } from '../../services/column-config.service';\r\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\r\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\r\nimport { SelectionActionEvent } from '../../models/selection-action-event';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\r\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\r\nimport { ConfigureAdvancedFilterData } from '../../models/configure-advanced-filter-data';\r\nimport { ConfigureAdvancedFilterComponent } from '../../common/components/configure-advanced-filter/configure-advanced-filter.component';\r\nimport { NgxTexts } from '../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\r\nimport { applyPipes, exportToPdf, exportToXlsx, rowKeyOf, sumColumn, visibleColumns } from '../shared/table-utils';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-table',\r\n imports: [\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n CommonModule,\r\n DynamicCellHostDirective,\r\n MatMenuModule,\r\n MatDividerModule,\r\n OnlyUpperFirstCharacterPipe,\r\n MatCheckboxModule,\r\n PaginatedSearchableSelectComponent,\r\n SearchableSelectComponent\r\n ],\r\n templateUrl: './ngx-paginated-table.component.html',\r\n styleUrl: './ngx-paginated-table.component.scss',\r\n // contenedorDefecto: compatibilidad con apps que estilan esa clase (la tarjeta ya la da :host)\r\n host: { class: 'contenedorDefecto' }\r\n})\r\nexport class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDestroy {\r\n \r\n private readonly columnConfigService = inject(ColumnConfigService);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n private readonly dialog = inject(MatDialog);\r\n private readonly dialogService = inject(NgxDialogService);\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible sin necesidad de instanciarlo a mano.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 10,\r\n query: undefined,\r\n sortBy: undefined,\r\n columnsFiltersValue: undefined,\r\n advancedFilterId: undefined\r\n } as U\r\n )\r\n );\r\n\r\n config = input.required<WritableSignal<PaginatedTableConfig<T>>>();\r\n\r\n readonly createClick = output<void>();\r\n readonly updateClick = output<T>();\r\n readonly deleteClick = output<T>();\r\n readonly rowActionClick = output<RowActionClickEvent<T>>();\r\n readonly expandedItemChange = output<T | null>();\r\n readonly selectionActionEvent = output<SelectionActionEvent<T>>();\r\n\r\n\r\n protected readonly filterKeyPrefix = 'filter';\r\n protected readonly nameOfActionsColumn = 'actionsPerRow';\r\n protected readonly generalFooterKeyPrefix = 'footer';\r\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\r\n protected readonly debounceTime = 300;\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n protected data = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.items;\r\n });\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n protected columnConfig = computed(() => {\r\n const columnConfigs = this.columnConfigService.columnConfigs();\r\n const configValue = this.config()();\r\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\r\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\r\n return {\r\n key: column.key,\r\n show: true,\r\n isSticky: configValue.defaultStickyColumn == column.key\r\n }\r\n });\r\n\r\n if (!columnConfig)\r\n return defaultColumnConfig;\r\n\r\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\r\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\r\n\r\n //Por si a posteriori se añaden nuevas columnas\r\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\r\n\r\n return [...filteredColumns, ...columnsAdded];\r\n });\r\n\r\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\r\n\r\n protected keys = computed(() => {\r\n const configValue = this.config()();\r\n const columnConfig = this.columnConfig();\r\n\r\n let keys: (string | keyof T)[] = [...columnConfig]\r\n .filter(column => column.show)\r\n .map(column => column.key);\r\n\r\n if ((configValue.showActions?.() ?? true) &&\r\n ((configValue.update && !configValue.clickOnRowForUpdate)\r\n || configValue.delete\r\n || (configValue.rowActions && configValue.rowActions.length > 0)\r\n || configValue.expandableDetail)\r\n ) {\r\n keys = [...keys, this.nameOfActionsColumn];\r\n }\r\n\r\n if (configValue.enableRowSelection)\r\n keys = [this.nameOfRowSelectionColumn, ...keys];\r\n\r\n return keys;\r\n });\r\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected showFiltersRow = computed(() => {\r\n const configValue = this.config()();\r\n return [...configValue.columns].some(column => column.filterType) && !configValue.showAdvancedFilters;\r\n });\r\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\r\n protected showTotalPerPageFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\r\n });\r\n protected showTotalGeneralFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n //En la tabla paginada el total general solo puede calcularlo el consumidor,\r\n //asi que sin getTotalGeneral la fila quedaria vacia\r\n return keys.some(key => {\r\n const column = columns.find(column => key == column.key);\r\n return column?.showTotalGeneral && !!column.getTotalGeneral;\r\n });\r\n });\r\n\r\n /** Texto del buscador (para la X de borrar; antes se leía el DOM desde la plantilla). */\r\n protected readonly queryText = linkedSignal(() => this.filters()().query ?? '');\r\n\r\n /** Texto de cada celda de la página (sin componente ni plantilla), calculado una vez. */\r\n protected readonly cellTexts = computed(() => {\r\n const columns = this.config()().columns.filter(column => !column.component && !column.templateRef);\r\n return new Map(this.data().map(row => [row, Object.fromEntries(\r\n columns.map(column => [column.key, this.displayText(row, column)])\r\n ) as Record<keyof T, string>]));\r\n });\r\n\r\n /** Total por página (de lo cargado) y general (lo da el consumidor con getTotalGeneral), ya formateados. */\r\n protected readonly pageTotals = computed(() => {\r\n const rows = this.data();\r\n return this.totalsText(column => column.showTotalPerPage ? sumColumn(rows, column.key) : undefined);\r\n });\r\n protected readonly generalTotals = computed(() =>\r\n this.totalsText(column => column.showTotalGeneral ? column.getTotalGeneral?.() : undefined)\r\n );\r\n\r\n /** Descripción del filtro avanzado aplicado (HTML). */\r\n protected readonly advancedFilterLabel = computed(() => {\r\n const advancedFilterId = this.filters()().advancedFilterId;\r\n if (!advancedFilterId)\r\n return '';\r\n\r\n const tableId = this.config()().tableId;\r\n // Depende de la lista de filtros: si se edita el aplicado, la etiqueta se actualiza\r\n this.advancedFilters();\r\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\r\n\r\n if (!advancedFilter)\r\n return '';\r\n\r\n return AdvancedFilterUtils.groupsToReadableHtml<T>(advancedFilter.groups, this.config()().columns, this.texts());\r\n });\r\n\r\n protected queryTimeout: number | undefined = undefined;\r\n\r\n protected timeoutsByKey: Partial<Record<keyof T, number>> = {}\r\n\r\n protected advancedFilters: Signal<AdvancedFilter<T>[]> = computed(() => {\r\n const allTablesAdvancedFilters = this.advancedFilterService.advancedFilters();\r\n const tableId = this.config()().tableId;\r\n //Si la tabla todavia no tiene filtros guardados, la clave no existe en el record\r\n return allTablesAdvancedFilters[tableId] ?? [];\r\n });\r\n\r\n protected readonly expandableColumnDef = 'expandedDetail';\r\n protected expandedItem = signal<T | null>(null);\r\n\r\n protected selection = signal<T[]>([]);\r\n /** Claves de las filas seleccionadas: comprobar una fila es O(1). */\r\n private readonly _selectedKeys = computed(() => {\r\n const primaryKey = this.config()().primaryKey;\r\n return new Set(this.selection().map(row => rowKeyOf(row, primaryKey)));\r\n });\r\n protected readonly allPageSelected = computed(() => {\r\n const rows = this.getSelectableRows();\r\n return rows.length > 0 && rows.every(row => this.isRowSelected(row));\r\n });\r\n\r\n protected isFullScreen = signal(false);\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\r\n private overlayRef?: OverlayRef;\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n ngOnDestroy(): void {\r\n this.exitFullscreen();\r\n\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n //Limpiamos todos los timeouts de filtros tipo texto de columnas\r\n Object.keys(this.timeoutsByKey).forEach((key) => {\r\n const timeout = this.timeoutsByKey[key as keyof T]\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\r\n return allColumns.some(column => searchedColumn.key == column.key);\r\n }\r\n\r\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\r\n\r\n protected onPageChange(event: PageEvent) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageSize == event.pageSize ? event.pageIndex + 1 : 1,\r\n pageSize: event.pageSize\r\n };\r\n });\r\n }\r\n\r\n protected onQueryChange(inputElement: HTMLInputElement) {\r\n const query = inputElement.value;\r\n this.queryText.set(query);\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime)\r\n }\r\n\r\n protected onQueryReset(inputElement: HTMLInputElement) {\r\n inputElement.value = '';\r\n this.onQueryChange(inputElement);\r\n inputElement.focus();\r\n }\r\n\r\n protected onSortChange(sort: Sort) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n pageNumber: 1,\r\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\r\n };\r\n });\r\n }\r\n\r\n protected onNewClick() {\r\n this.createClick.emit();\r\n }\r\n\r\n protected onUpdateClick(row: T, event: Event) {\r\n this.updateClick.emit(row);\r\n event.stopPropagation();\r\n }\r\n\r\n protected onRowClick(row: T) {\r\n if (this.isRowEnabled(row))\r\n this.updateClick.emit(row);\r\n }\r\n\r\n protected isRowEnabled(row: T): boolean | undefined {\r\n const config = this.config()();\r\n return config.update\r\n && config.clickOnRowForUpdate\r\n && (!config.update.show || config.update.show(row))\r\n && !config.update.disabled?.(row);\r\n }\r\n\r\n protected onDeleteClick(row: T, event: Event) {\r\n event.stopPropagation();\r\n\r\n const texts = this.texts();\r\n const header = {\r\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\r\n confirmText: texts.table.confirmDelete,\r\n cancelText: texts.common.cancel,\r\n destructive: true,\r\n };\r\n const template = this.config()().deleteConfirm?.templateRef?.();\r\n const confirm$ = template\r\n ? this.dialogService.template({ ...header, template, templateData: row })\r\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\r\n\r\n confirm$.subscribe(confirm => {\r\n if (confirm === true)\r\n this.deleteClick.emit(row);\r\n });\r\n }\r\n\r\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\r\n this.rowActionClick.emit({ id: rowAction.id, row: row })\r\n event.stopPropagation();\r\n }\r\n\r\n protected onTextFilterColumnChange(column: PaginatedTableColumn<T>, event: Event) {\r\n const query = (event.target as HTMLInputElement).value;\r\n\r\n //Si existe, limpio el anterior\r\n if (column.key in this.timeoutsByKey)\r\n clearTimeout(this.timeoutsByKey[column.key]);\r\n\r\n this.timeoutsByKey[column.key] = setTimeout(() => {\r\n this.onColumnFilterChange(column.key, query);\r\n }, this.debounceTime);\r\n }\r\n\r\n protected onPaginatedOptionFilterColumnChange(column: PaginatedTableColumn<T>, option?: FilterOption | FilterOption[]) {\r\n this.onColumnFilterChange(column.key, option);\r\n }\r\n\r\n protected onOptionFilterColumnChange(column: PaginatedTableColumn<T>, value?: string | string[]) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateFilterChange(column: PaginatedTableColumn<T>, value: moment.Moment | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateRangeFilterChange(column: PaginatedTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\r\n this.filters().update(currentValue => {\r\n //Se clona para no mutar el estado anterior de la signal\r\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\r\n ...(currentValue.columnsFiltersValue ?? {}),\r\n [columnKey]: value\r\n };\r\n return {\r\n ...currentValue,\r\n pageNumber: 1,\r\n columnsFiltersValue: columnsFiltersValue\r\n }\r\n });\r\n }\r\n\r\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\r\n return this.filters()().columnsFiltersValue?.[key];\r\n }\r\n\r\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\r\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\r\n\r\n if (!value)\r\n return null;\r\n\r\n return type == 'start' ? value.start : value.end\r\n }\r\n\r\n protected onEditColumns() {\r\n const config = this.config()();\r\n const filters = this.filters()();\r\n const columnConfig = this.columnConfig();\r\n\r\n const columnsLabel = Object.fromEntries(\r\n config.columns.map(column => [column.key, column.label])\r\n ) as Record<keyof T, string>;\r\n\r\n const data: ConfigureTableColumnData<T> = {\r\n tableId: config.tableId,\r\n tableName: config.title(),\r\n columns: columnConfig,\r\n filtersValue: filters.columnsFiltersValue ?? {},\r\n columnsLabels: columnsLabel\r\n };\r\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\r\n }\r\n\r\n\r\n\r\n protected onNewAdvancedFiltersClick() {\r\n const data: ConfigureAdvancedFilterData<T> = {\r\n config: this.config()(),\r\n advancedFilter: {\r\n name: '',\r\n groups: [\r\n {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [{ id: uuidv4() }]\r\n }\r\n ]\r\n }\r\n };\r\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\r\n\r\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\r\n if (advancedFilter)\r\n this.onApplyTemplateClick(advancedFilter);\r\n });\r\n }\r\n\r\n protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>) {\r\n const advancedFilterId: string | undefined = advancedFilter?.groups?.[0].id;\r\n this.filters().update(currentValue => {\r\n return {\r\n ...currentValue,\r\n advancedFilterId: advancedFilterId,\r\n pageNumber: 1\r\n };\r\n });\r\n }\r\n\r\n protected onSelectedAdvancedFilterUpdate(event: Event) {\r\n const advancedFilterId = this.filters()().advancedFilterId;\r\n if (!advancedFilterId)\r\n return;\r\n\r\n const tableId = this.config()().tableId;\r\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\r\n\r\n if (!advancedFilter)\r\n return;\r\n\r\n this.onAdvancedFilterUpdate(event, advancedFilter);\r\n }\r\n\r\n protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger) {\r\n event.stopPropagation();\r\n advancedFiltersMenuTrigger?.closeMenu();\r\n\r\n const data: ConfigureAdvancedFilterData<T> = {\r\n config: this.config()(),\r\n advancedFilter: advancedFilter\r\n };\r\n\r\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\r\n\r\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\r\n if (advancedFilter)\r\n this.onApplyTemplateClick(advancedFilter);\r\n });\r\n }\r\n\r\n protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>) {\r\n event.stopPropagation();\r\n advancedFiltersMenuTrigger.closeMenu();\r\n\r\n const texts = this.texts();\r\n this.dialogService.confirm({\r\n title: texts.advancedFilters.deleteTitle,\r\n message: texts.advancedFilters.deleteMessage(advancedFilter.name),\r\n confirmText: texts.table.confirmDelete,\r\n cancelText: texts.common.cancel,\r\n destructive: true,\r\n }).subscribe(confirm => {\r\n if (confirm === true) {\r\n if (this.filters()().advancedFilterId == advancedFilter.groups[0].id)\r\n this.onApplyTemplateClick();\r\n\r\n this.advancedFilterService.deleteAdvancedFilter(this.config()().tableId, advancedFilter);\r\n }\r\n });\r\n }\r\n\r\n protected onQuitAdvancedFilter(event: Event) {\r\n event.stopPropagation();\r\n this.onApplyTemplateClick();\r\n }\r\n\r\n\r\n /** Por clave y no por referencia: el detalle sigue abierto si la página se recarga. */\r\n protected rowIsExpanded(row: T): boolean {\r\n const expanded = this.expandedItem();\r\n const primaryKey = this.config()().primaryKey;\r\n return expanded != null && rowKeyOf(expanded, primaryKey) === rowKeyOf(row, primaryKey);\r\n }\r\n\r\n protected expandableToggle(row: T) {\r\n const newValue = this.rowIsExpanded(row) ? null : row;\r\n this.expandedItem.set(newValue);\r\n this.expandedItemChange.emit(newValue);\r\n }\r\n\r\n /** Lo que se pinta en una celda sin componente ni plantilla: valueGetter, o el valor con sus pipes, o «-». */\r\n private displayText(row: T, column: PaginatedTableColumn<T>): string {\r\n if (column.valueGetter)\r\n return column.valueGetter(row);\r\n const value = applyPipes(row[column.key], column.pipes);\r\n return value == null ? '-' : String(value);\r\n }\r\n\r\n private totalsText(totalOf: (column: PaginatedTableColumn<T>) => number | undefined): Record<string, string> {\r\n const totals: Record<string, string> = {};\r\n for (const column of this.config()().columns) {\r\n const total = totalOf(column);\r\n if (total === undefined)\r\n continue;\r\n const text = column.pipes\r\n ? applyPipes(total, column.pipes)\r\n : column.totalFooterFormatter ? column.totalFooterFormatter(total) : total;\r\n totals[this.getKeyAsString(column.key)] = String(text ?? '');\r\n }\r\n return totals;\r\n }\r\n\r\n protected isRowSelected(row: T): boolean {\r\n return this._selectedKeys().has(rowKeyOf(row, this.config()().primaryKey));\r\n }\r\n\r\n protected toggleRowSelection(row: T) {\r\n const primaryKey = this.config()().primaryKey;\r\n const key = rowKeyOf(row, primaryKey);\r\n\r\n if (this.isRowSelected(row))\r\n this.selection.update(selected => selected.filter(record => rowKeyOf(record, primaryKey) !== key));\r\n else\r\n this.selection.update(selected => [...selected, row]);\r\n }\r\n\r\n protected toggleAllPageRowSelection() {\r\n const records = this.getSelectableRows();\r\n const primaryKey = this.config()().primaryKey;\r\n const pageKeys = new Set(records.map(row => rowKeyOf(row, primaryKey)));\r\n\r\n if (this.allPageSelected()) {\r\n //Deseleccionar todas las filas seleccionables de la página actual\r\n this.selection.update(selected => selected.filter(row => !pageKeys.has(rowKeyOf(row, primaryKey))));\r\n } else {\r\n //Seleccionar todas las filas seleccionables visibles que aún no estén seleccionadas\r\n const notSelected = records.filter(record => !this.isRowSelected(record));\r\n this.selection.update(selected => [...selected, ...notSelected]);\r\n }\r\n }\r\n\r\n private getSelectableRows(): T[] {\r\n const showRowSelection = this.config()().showRowSelection;\r\n return showRowSelection ? this.data().filter(row => showRowSelection(row)) : this.data();\r\n }\r\n\r\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\r\n return this.config()().rowSelectionAction ?? [];\r\n }\r\n\r\n protected uncheckAllSelection() {\r\n this.selection.set([]);\r\n }\r\n\r\n protected onRowSelectionActionClick(actionId: string) {\r\n this.selectionActionEvent.emit(\r\n {\r\n id: actionId,\r\n rows: this.selection()\r\n }\r\n );\r\n }\r\n\r\n\r\n /** Exporta la página cargada, con las columnas visibles y en el orden elegido. */\r\n protected exportToCsvCurrentPage() {\r\n exportToXlsx(this.exportOptions());\r\n }\r\n\r\n protected exportToPdfCurrentPage() {\r\n exportToPdf(this.exportOptions());\r\n }\r\n\r\n private exportOptions() {\r\n const config = this.config()();\r\n const title = config.title();\r\n return {\r\n title,\r\n fileName: config.exportFileName?.() ?? title,\r\n columns: visibleColumns(config.columns, this.columnConfig()),\r\n rows: this.data(),\r\n mapper: config.mapperForExportData,\r\n pdf: config.pdfConfig,\r\n host: this._host.nativeElement,\r\n };\r\n }\r\n\r\n protected onToggleFullScreen() {\r\n if (this.isFullScreen())\r\n this.exitFullscreen()\r\n else\r\n this.enterFullscreen();\r\n }\r\n\r\n private enterFullscreen() {\r\n if (this.overlayRef)\r\n return;\r\n\r\n this.overlayRef = this.overlay.create({\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.block(),\r\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\r\n });\r\n\r\n // Escape solo llega a este overlay cuando es el de más arriba (no si hay un diálogo encima)\r\n this.overlayRef.keydownEvents()\r\n .pipe(filter(event => event.key === 'Escape'), takeUntilDestroyed(this._destroyRef))\r\n .subscribe(() => this.exitFullscreen());\r\n\r\n this.overlayRef.attach(new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef));\r\n this.isFullScreen.set(true);\r\n }\r\n\r\n private exitFullscreen() {\r\n if (!this.overlayRef)\r\n return;\r\n\r\n this.overlayRef.dispose();\r\n this.overlayRef = undefined;\r\n this.isFullScreen.set(false);\r\n }\r\n\r\n \r\n}\r\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\"\r\n [attr.aria-label]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\"\r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" [attr.aria-label]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().showAdvancedFilters) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().advancedFilters.label\"\r\n [attr.aria-label]=\"texts().advancedFilters.label\"\r\n [matMenuTriggerFor]=\"advancedFiltersMenu\"\r\n #advancedFiltersMenuTrigger=\"matMenuTrigger\">\r\n\r\n <mat-icon>filter_alt</mat-icon>\r\n </button>\r\n\r\n <mat-menu #advancedFiltersMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"onNewAdvancedFiltersClick()\">\r\n <mat-icon>filter_alt</mat-icon>\r\n <span>{{ texts().advancedFilters.new }}</span>\r\n </button>\r\n\r\n @for (advancedFilter of advancedFilters(); track $index; let first = $first) {\r\n @if (first) {\r\n <mat-divider />\r\n }\r\n\r\n <div mat-menu-item (click)=\"onApplyTemplateClick(advancedFilter)\">\r\n <div class=\"templateContainer\">\r\n <span>{{advancedFilter.name | ngxOnlyUpperFirstCharacter}}</span>\r\n\r\n <div class=\"buttonTemplateContainer\">\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().advancedFilters.editTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n [attr.aria-label]=\"texts().advancedFilters.editTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterUpdate($event, advancedFilter, advancedFiltersMenuTrigger)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().advancedFilters.deleteTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n [attr.aria-label]=\"texts().advancedFilters.deleteTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterDelete($event, advancedFiltersMenuTrigger, advancedFilter)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [attr.aria-label]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().table.deselectAll\"\r\n [attr.aria-label]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [attr.aria-label]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsvCurrentPage()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdfCurrentPage()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\"\r\n [attr.aria-label]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\"\r\n [attr.aria-pressed]=\"isFullScreen()\"\r\n (click)=\"onToggleFullScreen()\">\r\n <mat-icon aria-hidden=\"true\">{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(config()().showQueryFilter) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix aria-hidden=\"true\">search</mat-icon>\r\n <input\r\n #queryElement\r\n matInput\r\n type=\"search\"\r\n [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\"\r\n [attr.aria-label]=\"config()().queryFilterPlaceholder ?? texts().common.search\"\r\n [value]=\"queryText()\"\r\n (input)=\"onQueryChange(queryElement)\">\r\n <button\r\n matIconButton\r\n matSuffix\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"onQueryReset(queryElement)\"\r\n [style.visibility]=\"queryText() ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n @if(filters()().advancedFilterId) {\r\n <div\r\n class=\"advancedFiltersApplied\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onSelectedAdvancedFilterUpdate($event)\"\r\n (keydown.enter)=\"onSelectedAdvancedFilterUpdate($event)\">\r\n <p [innerHTML]=\"advancedFilterLabel()\"></p>\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().advancedFilters.remove\"\r\n [attr.aria-label]=\"texts().advancedFilters.remove\"\r\n (click)=\"onQuitAdvancedFilter($event)\"\r\n (keydown.enter)=\"$event.stopPropagation()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table\r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"data()\"\r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\"\r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n }\r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n class=\"headerCheckbox\"\r\n [aria-label]=\"texts().table.selectPage\"\r\n (change)=\"toggleAllPageRowSelection()\"\r\n [checked]=\"allPageSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !allPageSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n @if(!config()().showRowSelection || config()().showRowSelection?.(row)) {\r\n <mat-checkbox\r\n [aria-label]=\"texts().table.selectRow\"\r\n (change)=\"toggleRowSelection(row)\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n }\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container\r\n [matColumnDef]=\"getKeyAsString(column.key)\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!column.isSortable\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container\r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"column.templateRef();\r\n context: { $implicit: row }\" />\r\n } @else {\r\n {{ cellTexts().get(row)?.[column.key] }}\r\n }\r\n </td>\r\n\r\n <td\r\n mat-footer-cell\r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n {{ pageTotals()[getKeyAsString(column.key)] }}\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container\r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral && column.getTotalGeneral) {\r\n {{ generalTotals()[getKeyAsString(column.key)] }}\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container\r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [attr.aria-label]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix aria-hidden=\"true\">{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n [clearableOptionLabel]=\"texts().table.columnFilter\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n [clearableOptionLabel]=\"texts().table.columnFilter\"\r\n />\r\n }\r\n }\r\n\r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input\r\n matInput\r\n [matDatepicker]=\"picker\"\r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input\r\n matStartDate\r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input\r\n matEndDate\r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n }\r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"rowIsExpanded(row) ? texts().table.collapseRow : texts().table.expandRow\"\r\n [attr.aria-label]=\"rowIsExpanded(row) ? texts().table.collapseRow : texts().table.expandRow\"\r\n [attr.aria-expanded]=\"rowIsExpanded(row)\"\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon class=\"expandIcon\" [class.expandIcon--open]=\"rowIsExpanded(row)\">keyboard_arrow_down</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\"\r\n [attr.aria-label]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\"\r\n [disabled]=\"config()().update?.disabled?.(row)\"\r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\"\r\n [attr.aria-label]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\"\r\n [disabled]=\"config()().delete?.disabled?.(row)\"\r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"rowAction.tooltip(row)\"\r\n [attr.aria-label]=\"rowAction.tooltip(row)\"\r\n [disabled]=\"rowAction.disabled?.(row)\"\r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div\r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!();\r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n\r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n\r\n <tr mat-row *matRowDef=\"let row; columns: keys();\"\r\n (click)=\"onRowClick(row)\"\r\n (keydown.enter)=\"onRowClick(row)\"\r\n [attr.tabindex]=\"isRowEnabled(row) ? 0 : null\"\r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.rowSelected]=\"isRowSelected(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n\r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row\r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\"\r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row\r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\"\r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ dataResource.isLoading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p>\r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator [length]=\"total()\" [pageSize]=\"filters()().pageSize\" [pageIndex]=\"filters()().pageNumber - 1\" (page)=\"onPageChange($event)\"/>\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, DestroyRef, effect, ElementRef, inject, input, linkedSignal, output, signal, TemplateRef, untracked, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { BasicFilter } from '../../models/basic-filter';\nimport { BasicTableColumn, BasicTableConfig } from '../../models/basic-table-config';\n\nimport { PaginatedFilter, SortBy } from '../../models/paginated-filter';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { filter, of, switchMap } from 'rxjs';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { FilterOption, isFilterOption, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport { ColumnValue } from '../../models/column-value';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport moment from 'moment';\n\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { includeNoSensible } from '../../utils/string-operations';\nimport { NgxTexts } from '../../i18n';\nimport { applyPipes, cellText, exportToPdf, exportToXlsx, rowKeyOf, sumColumn, visibleColumns } from '../shared/table-utils';\n\n@Component({\n selector: 'ngx-basic-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n MatCheckboxModule,\n SearchableSelectComponent,\n PaginatedSearchableSelectComponent\n ],\n templateUrl: './ngx-basic-table.component.html',\n styleUrl: './ngx-basic-table.component.scss',\n // contenedorDefecto: compatibilidad con apps que estilan esa clase (la tarjeta ya la da :host)\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxBasicTable<T, U extends BasicFilter<T>> {\n\n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _destroyRef = inject(DestroyRef);\n\n readonly texts = inject(NgxTexts).texts;\n\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined\n } as U\n )\n );\n config = input.required<WritableSignal<BasicTableConfig<T>>>();\n data = input.required<T[]>();\n loading = input<boolean>(false);\n queryFilter = input<(query: string, data: T[]) => T[]>();\n\n moreFilters = input<(data: T[], filters: U) => T[]>(\n (data: T[], _: U) => {\n return data;\n }\n );\n\n readonly createClick = output<void>();\n readonly updateClick = output<T>();\n readonly deleteClick = output<T>();\n readonly rowActionClick = output<RowActionClickEvent<T>>();\n readonly expandedItemChange = output<T | null>();\n readonly selectionActionEvent = output<SelectionActionEvent<T>>();\n\n protected paginator = viewChild(MatPaginator);\n\n /** Búsqueda, orden, filtros de columna y moreFilters aplicados: lo que se pagina y se exporta. */\n protected readonly filteredData = computed(() => {\n let data = this.data();\n const filters = this.filters()();\n const config = this.config()();\n const queryFilter = this.queryFilter();\n\n if (queryFilter)\n data = queryFilter(filters.query ?? '', data);\n else if (this.someColumnFilterable(config.columns))\n data = this.applyInputFilter(config.columns, data, filters.query);\n\n data = this.applySort(data, config.columns, filters.sortBy);\n data = this.applyColumnFilter(data, config.columns, filters.columnsFiltersValue);\n return this.moreFilters()(data, filters);\n });\n\n dataSource = computed(() => {\n const paginator = this.paginator();\n const dataSource = new MatTableDataSource<T>(untracked(() => this.filteredData()));\n\n if (paginator)\n dataSource.paginator = paginator;\n\n return dataSource;\n });\n\n private readonly _syncData = effect(() => {\n this.dataSource().data = this.filteredData();\n });\n\n /** Filas de la página visible (cambia con el paginador): totales por página y «seleccionar página». */\n protected readonly pageRows = toSignal(\n toObservable(this.dataSource).pipe(switchMap(dataSource => dataSource?.connect() ?? of([] as T[]))),\n { initialValue: [] as T[] }\n );\n\n /** Al cambiar la búsqueda, el orden o un filtro se vuelve a la primera página. */\n private _lastFilters?: U;\n private readonly _resetPage = effect(() => {\n const filters = this.filters()();\n untracked(() => {\n if (this._lastFilters && this._lastFilters !== filters)\n this.paginator()?.firstPage();\n this._lastFilters = filters;\n });\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType);\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\n });\n\n protected showQueryFilter = computed(() => {\n const queryFilter = this.queryFilter();\n const config = this.config()();\n\n if (queryFilter)\n return true;\n\n return this.someColumnFilterable(config.columns);\n });\n\n /** Texto del buscador (para la X de borrar; antes se leía el DOM desde la plantilla). */\n protected readonly queryText = linkedSignal(() => this.filters()().query ?? '');\n\n /** Texto de cada celda de la página (sin componente ni plantilla), calculado una vez. */\n protected readonly cellTexts = computed(() => {\n const columns = this.config()().columns.filter(column => !column.component && !column.templateRef);\n return new Map(this.pageRows().map(row => [row, Object.fromEntries(\n columns.map(column => [column.key, this.displayText(row, column)])\n ) as Record<keyof T, string>]));\n });\n\n /** Totales por página y generales ya formateados, por clave de columna. */\n protected readonly pageTotals = computed(() => this.totalsText(this.pageRows(), column => !!column.showTotalPerPage));\n protected readonly generalTotals = computed(() => this.totalsText(this.filteredData(), column => !!column.showTotalGeneral));\n\n protected tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n protected isFullScreen = signal(false);\n private overlayRef?: OverlayRef;\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n protected selection = signal<T[]>([]);\n /** Claves de las filas seleccionadas: comprobar una fila es O(1). */\n private readonly _selectedKeys = computed(() => {\n const primaryKey = this.config()().primaryKey;\n return new Set(this.selection().map(row => rowKeyOf(row, primaryKey)));\n });\n protected readonly allPageSelected = computed(() => {\n const rows = this.pageRows();\n return rows.length > 0 && rows.every(row => this.isRowSelected(row));\n });\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n constructor() {\n this._destroyRef.onDestroy(() => this.exitFullscreen());\n }\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n private someColumnFilterable(columns: BasicTableColumn<T>[]): boolean {\n return columns.some((column) => column.isFilterableByInput === true);\n }\n\n /** Busca en el texto que se ve de cada columna buscable (también números, fechas con pipe y valueGetter). */\n private applyInputFilter(columns: BasicTableColumn<T>[], data: T[], query?: string): T[] {\n if (!query)\n return data;\n\n const filterableColumns = columns.filter(c => c.isFilterableByInput);\n\n return data.filter(item =>\n filterableColumns.some(column => includeNoSensible(cellText(item, column), query))\n );\n }\n\n private applySort(data: T[], columns: BasicTableColumn<T>[], sortBy?: SortBy): T[] {\n if (!sortBy)\n return data;\n\n const column = columns.find(c => c.key === sortBy.key);\n\n if (!column || column.sortType === undefined)\n return data;\n\n const { key, direction } = sortBy;\n const factor = direction === 'asc' ? 1 : -1;\n\n return [...data].sort((a, b) => {\n const aValue = (a as any)[key];\n const bValue = (b as any)[key];\n\n if (aValue == null && bValue == null)\n return 0;\n\n if (aValue == null)\n return -1 * factor;\n\n if (bValue == null)\n return 1 * factor;\n\n switch (column.sortType) {\n case 'number':\n return (Number(aValue) - Number(bValue)) * factor;\n\n case 'date':\n return (Date.parse(aValue) - Date.parse(bValue)) * factor;\n\n case 'string':\n default:\n if(column.sortByKey) {\n const aObjectString = column.sortByKey(a) ?? '';\n const bObjectString = column.sortByKey(b) ?? '';\n return aObjectString.localeCompare(bObjectString) * factor;\n }\n\n return String(aValue).localeCompare(String(bValue)) * factor;\n }\n });\n }\n\n private applyColumnFilter(data: T[], columns: BasicTableColumn<T>[], columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>): T[] {\n if (!columns.some(column => column.filterType) || !columnsFiltersValue)\n return data;\n\n columns.forEach(column => {\n const columnFilterValue = columnsFiltersValue[column.key];\n\n if (columnFilterValue) {\n switch (column.filterType) {\n case 'number':\n case 'option':\n const filterValue = isFilterOption(columnFilterValue) ? columnFilterValue.value : columnFilterValue\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnValue == filterValue\n });\n break;\n case 'text':\n const query = columnFilterValue as string;\n data = data.filter(d => {\n const word = (column.filterByKey?.(d) ?? d[column.key] ?? '') as string;\n return includeNoSensible(String(word), query);\n });\n break;\n case 'option-multiple':\n if (!Array.isArray(columnFilterValue) || columnFilterValue.length <= 0)\n break;\n\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnFilterValue.some(f => {\n const columnValueString = isFilterOption(f) ? f.value : f;\n return columnValueString == columnValue;\n });\n });\n break;\n case 'date':\n const date = columnFilterValue as moment.Moment\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n return date.isSame(momentValue, 'day');\n });\n break;\n case 'date-range':\n const dateRange = columnFilterValue as DateRange<moment.Moment | null>\n if (dateRange.start != null || dateRange.end != null) {\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n\n if (dateRange.start && dateRange.end)\n return momentValue.isBetween(dateRange.start, dateRange.end, 'day', '[]');\n\n if (dateRange.start)\n return momentValue.isSameOrAfter(dateRange.start, 'day');\n\n if (dateRange.end)\n return momentValue.isSameOrBefore(dateRange.end, 'day');\n\n return true;\n });\n }\n break;\n }\n }\n });\n\n return data;\n }\n\n /** Lo que se pinta en una celda sin componente ni plantilla: valueGetter, o el valor con sus pipes, o «-». */\n private displayText(row: T, column: BasicTableColumn<T>): string {\n if (column.valueGetter)\n return column.valueGetter(row);\n const value = applyPipes(row[column.key], column.pipes);\n return value == null ? '-' : String(value);\n }\n\n private totalsText(rows: T[], include: (column: BasicTableColumn<T>) => boolean): Record<string, string> {\n const totals: Record<string, string> = {};\n for (const column of this.config()().columns.filter(include)) {\n const total = sumColumn(rows, column.key);\n const text = column.pipes\n ? applyPipes(total, column.pipes)\n : column.totalFooterFormatter ? column.totalFooterFormatter(total) : total;\n totals[this.getKeyAsString(column.key)] = String(text ?? '');\n }\n return totals;\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n // Escape solo llega a este overlay cuando es el de más arriba (no si hay un diálogo encima)\n this.overlayRef.keydownEvents()\n .pipe(filter(event => event.key === 'Escape'), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this.exitFullscreen());\n\n this.overlayRef.attach(new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef));\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.isFullScreen.set(false);\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n const config = this.config()();\n return config.update\n && config.clickOnRowForUpdate\n && (!config.update.show || config.update.show(row))\n && !config.update.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n /** Exporta todos los registros filtrados, con las columnas visibles y en el orden elegido. */\n protected exportToCsv() {\n exportToXlsx(this.exportOptions());\n }\n\n protected exportToPdf() {\n exportToPdf(this.exportOptions());\n }\n\n private exportOptions() {\n const config = this.config()();\n const title = config.title();\n return {\n title,\n fileName: config.exportFileName?.() ?? title,\n columns: visibleColumns(config.columns, this.columnConfig()),\n rows: this.filteredData(),\n mapper: config.mapperForExportData,\n pdf: config.pdfConfig,\n host: this._host.nativeElement,\n };\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n this.queryText.set(query);\n this.filters().update((value: U) => ({ ...value, query: query }));\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n inputElement.focus();\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.pageRows();\n const primaryKey = this.config()().primaryKey;\n const pageKeys = new Set(records.map(row => rowKeyOf(row, primaryKey)));\n\n if (this.allPageSelected()) {\n //Deseleccionar todas las filas de la página actual\n this.selection.update(selected => selected.filter(row => !pageKeys.has(rowKeyOf(row, primaryKey))));\n } else {\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n this.selection.update(selected => [...selected, ...notSelected]);\n }\n }\n\n protected isRowSelected(row: T): boolean {\n return this._selectedKeys().has(rowKeyOf(row, this.config()().primaryKey));\n }\n\n protected toggleRowSelection(row: T) {\n const primaryKey = this.config()().primaryKey;\n const key = rowKeyOf(row, primaryKey);\n\n if (this.isRowSelected(row))\n this.selection.update(selected => selected.filter(record => rowKeyOf(record, primaryKey) !== key));\n else\n this.selection.update(selected => [...selected, row]);\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onTextFilterColumnChange(column: BasicTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n this.onColumnFilterChange(column.key, query);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: BasicTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: BasicTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n /** Por clave y no por referencia: el detalle sigue abierto si los datos se recargan. */\n protected rowIsExpanded(row: T): boolean {\n const expanded = this.expandedItem();\n const primaryKey = this.config()().primaryKey;\n return expanded != null && rowKeyOf(expanded, primaryKey) === rowKeyOf(row, primaryKey);\n }\n\n protected expandableToggle(row: T) {\n const newValue = this.rowIsExpanded(row) ? null : row;\n this.expandedItem.set(newValue);\n this.expandedItemChange.emit(newValue);\n }\n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\"\r\n [attr.aria-label]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\"\r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" [attr.aria-label]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [attr.aria-label]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"texts().table.deselectAll\"\r\n [attr.aria-label]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [attr.aria-label]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcelAll }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdf()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdfAll }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\"\r\n [attr.aria-label]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\"\r\n [attr.aria-pressed]=\"isFullScreen()\"\r\n (click)=\"onToggleFullScreen()\">\r\n <mat-icon aria-hidden=\"true\">{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(showQueryFilter()) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix aria-hidden=\"true\">search</mat-icon>\r\n <input\r\n #queryElement\r\n matInput\r\n type=\"search\"\r\n [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\"\r\n [attr.aria-label]=\"config()().queryFilterPlaceholder ?? texts().common.search\"\r\n [value]=\"queryText()\"\r\n (input)=\"onQueryChange(queryElement)\">\r\n <button\r\n matIconButton\r\n matSuffix\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"onQueryReset(queryElement)\"\r\n [style.visibility]=\"queryText() ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"loading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table\r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"dataSource()\"\r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\"\r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n }\r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n class=\"headerCheckbox\"\r\n [aria-label]=\"texts().table.selectPage\"\r\n (change)=\"toggleAllPageRowSelection()\"\r\n [checked]=\"allPageSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !allPageSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n [aria-label]=\"texts().table.selectRow\"\r\n (change)=\"toggleRowSelection(row)\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"celdaSelection\"></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container\r\n [matColumnDef]=\"getKeyAsString(column.key)\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"column.sortType === undefined\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container\r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"column.templateRef();\r\n context: { $implicit: row }\" />\r\n } @else {\r\n {{ cellTexts().get(row)?.[column.key] }}\r\n }\r\n </td>\r\n\r\n <td\r\n mat-footer-cell\r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n {{ pageTotals()[getKeyAsString(column.key)] }}\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container\r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral) {\r\n {{ generalTotals()[getKeyAsString(column.key)] }}\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container\r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [attr.aria-label]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix aria-hidden=\"true\">{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n [clearableOptionLabel]=\"texts().table.columnFilter\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n [clearableOptionLabel]=\"texts().table.columnFilter\"\r\n />\r\n }\r\n }\r\n\r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input\r\n matInput\r\n [matDatepicker]=\"picker\"\r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input\r\n matStartDate\r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input\r\n matEndDate\r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n }\r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"rowIsExpanded(row) ? texts().table.collapseRow : texts().table.expandRow\"\r\n [attr.aria-label]=\"rowIsExpanded(row) ? texts().table.collapseRow : texts().table.expandRow\"\r\n [attr.aria-expanded]=\"rowIsExpanded(row)\"\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon class=\"expandIcon\" [class.expandIcon--open]=\"rowIsExpanded(row)\">keyboard_arrow_down</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"rowAction.tooltip(row)\"\r\n [attr.aria-label]=\"rowAction.tooltip(row)\"\r\n [disabled]=\"rowAction.disabled?.(row)\"\r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\"\r\n [attr.aria-label]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\"\r\n [disabled]=\"config()().update?.disabled?.(row)\"\r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button\r\n matIconButton\r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\"\r\n [attr.aria-label]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\"\r\n [disabled]=\"config()().delete?.disabled?.(row)\"\r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div\r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!();\r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n\r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n\r\n <tr mat-row *matRowDef=\"let row; columns: keys();\"\r\n (click)=\"onRowClick(row)\"\r\n (keydown.enter)=\"onRowClick(row)\"\r\n [attr.tabindex]=\"isRowEnabled(row) ? 0 : null\"\r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.rowSelected]=\"isRowSelected(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n\r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row\r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\"\r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row\r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\"\r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ loading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p>\r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator />\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AlertAppearance, AlertType } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst DEFAULT_ICONS: Record<AlertType, string> = {\r\n info: 'info',\r\n success: 'check_circle',\r\n warning: 'warning',\r\n error: 'error',\r\n};\r\n\r\n@Component({\r\n selector: 'ngx-alert',\r\n imports: [MatIconModule, MatButtonModule, MatTooltipModule],\r\n templateUrl: './ngx-alert.component.html',\r\n styleUrl: './ngx-alert.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'isDismissed() ? null : resolvedRole()',\r\n '[class.ngx-alert--dismissed]': 'isDismissed()',\r\n },\r\n})\r\nexport class NgxAlert {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Gravedad del mensaje: define color, icono por defecto y cómo se anuncia. */\r\n readonly type = input<AlertType>('info');\r\n\r\n /** Título en negrita sobre el mensaje. */\r\n readonly title = input<string>();\r\n\r\n /** Mensaje en texto plano. Para contenido con formato o enlaces, proyéctalo como contenido. */\r\n readonly message = input<string>();\r\n\r\n /** Estilo visual: standard (fondo + franja lateral), soft (solo fondo) u outlined (solo borde). */\r\n readonly appearance = input<AlertAppearance>('standard');\r\n\r\n /** Icono de Material Symbols. Por defecto, el del tipo (info, check_circle, warning, error). */\r\n readonly icon = input<string>();\r\n\r\n /** Oculta el icono. */\r\n readonly hideIcon = input(false, { transform: booleanAttribute });\r\n\r\n /** Muestra un botón para cerrar el aviso. Al pulsarlo se oculta y emite `dismissed`. */\r\n readonly dismissible = input(false, { transform: booleanAttribute });\r\n\r\n /** Etiqueta accesible del botón de cerrar. Por defecto, el texto `alert.dismiss` de la librería. */\r\n readonly dismissLabel = input<string>();\r\n\r\n /**\r\n * Cómo lo anuncia el lector de pantalla. assertive interrumpe (role=\"alert\"), polite espera\r\n * a que termine (role=\"status\") y off no lo anuncia. Por defecto: assertive para error y\r\n * warning, polite para info y success.\r\n */\r\n readonly politeness = input<'assertive' | 'polite' | 'off'>();\r\n\r\n /** Se emite cuando el usuario cierra el aviso con el botón de cerrar. */\r\n readonly dismissed = output<void>();\r\n\r\n protected readonly isDismissed = signal(false);\r\n\r\n protected readonly resolvedIcon = computed(() => this.icon() || DEFAULT_ICONS[this.type()] || DEFAULT_ICONS.info);\r\n\r\n protected readonly resolvedDismissLabel = computed(() => {\r\n return this.dismissLabel() ?? this._texts().alert.dismiss;\r\n });\r\n\r\n protected readonly resolvedRole = computed(() => {\r\n const politeness = this.politeness()\r\n ?? (this.type() === 'error' || this.type() === 'warning' ? 'assertive' : 'polite');\r\n\r\n switch (politeness) {\r\n case 'assertive': return 'alert';\r\n case 'polite': return 'status';\r\n default: return null;\r\n }\r\n });\r\n\r\n protected dismiss(): void {\r\n this.isDismissed.set(true);\r\n this.dismissed.emit();\r\n }\r\n}\r\n","@if (!isDismissed()) {\n <div class=\"alert\" [class]=\"'alert alert--' + type() + ' alert--' + appearance()\">\n @if (!hideIcon()) {\n <mat-icon class=\"alert__icon\" aria-hidden=\"true\">{{ resolvedIcon() }}</mat-icon>\n }\n\n <div class=\"alert__content\">\n @if (title()) {\n <div class=\"alert__title\">{{ title() }}</div>\n }\n\n <div class=\"alert__description\">\n @if (message()) {\n <p class=\"alert__message\">{{ message() }}</p>\n }\n <ng-content />\n </div>\n\n <div class=\"alert__actions\">\n <ng-content select=\"[alertActions]\" />\n </div>\n </div>\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"alert__dismiss\"\n matIconButton\n [attr.aria-label]=\"resolvedDismissLabel()\"\n [matTooltip]=\"resolvedDismissLabel()\"\n (click)=\"dismiss()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n}\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet';\r\nimport { PaginatedFilter } from '../../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../../models/select-config';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { debounce, distinctUntilChanged, filter, merge, Observable, skip, Subject, timer } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n/** Trozo de una etiqueta: `match` = coincide con la búsqueda (se resalta). */\r\ninterface LabelPart {\r\n text: string;\r\n match: boolean;\r\n}\r\n\r\n/** Estado ya resuelto de cada fila: se calcula una vez por cambio, no en cada pasada de la plantilla. */\r\ninterface OptionView<T> {\r\n item: T;\r\n key: unknown;\r\n index: number;\r\n id: string;\r\n label: string;\r\n labelParts: LabelPart[];\r\n subtitle: string | null;\r\n disabled: boolean;\r\n selected: boolean;\r\n /** Seleccionada que no está en las páginas cargadas: se fija arriba para que se vea al abrir. */\r\n pinned: boolean;\r\n avatarImage: string | null;\r\n avatarText: string;\r\n /** Tono del avatar de texto (0-3), estable para cada elemento. */\r\n avatarTone: number;\r\n}\r\n\r\n/** Primera página guardada entre aperturas: se muestra al instante mientras se recarga. */\r\nexport interface NgxPaginatedSelectPageCache<T> {\r\n value: { fingerprint: string; page: PaginatedItems<T> } | null;\r\n}\r\n\r\nlet nextSheetId = 0;\r\n\r\nconst DIACRITICS = /[̀-ͯ]/g;\r\nconst normalizeChar = (char: string) => char.normalize('NFD').replace(DIACRITICS, '').toLowerCase();\r\n\r\n/** Divide `label` en trozos según dónde aparece `query`, sin distinguir mayúsculas ni acentos. */\r\nfunction highlight(label: string, query: string): LabelPart[] {\r\n const q = query.normalize('NFD').replace(DIACRITICS, '').toLowerCase().trim();\r\n if (!q) return [{ text: label, match: false }];\r\n\r\n // Texto normalizado carácter a carácter, recordando a qué posición del original corresponde\r\n const chars = [...label];\r\n let normalized = '';\r\n const origin: number[] = [];\r\n chars.forEach((char, i) => {\r\n for (const n of normalizeChar(char)) {\r\n normalized += n;\r\n origin.push(i);\r\n }\r\n });\r\n\r\n const parts: LabelPart[] = [];\r\n let cursor = 0;\r\n let from = normalized.indexOf(q);\r\n while (from !== -1) {\r\n const start = origin[from];\r\n const end = origin[from + q.length - 1] + 1;\r\n if (start > cursor) parts.push({ text: chars.slice(cursor, start).join(''), match: false });\r\n parts.push({ text: chars.slice(start, end).join(''), match: true });\r\n cursor = end;\r\n from = normalized.indexOf(q, from + q.length);\r\n }\r\n if (cursor < chars.length) parts.push({ text: chars.slice(cursor).join(''), match: false });\r\n return parts;\r\n}\r\n\r\n/** Tono 0-3 a partir de la clave: el mismo elemento siempre tiene el mismo color de avatar. */\r\nfunction toneOf(key: unknown): number {\r\n const text = String(key ?? '');\r\n let hash = 0;\r\n for (let i = 0; i < text.length; i++) hash = (hash * 31 + text.charCodeAt(i)) | 0;\r\n return Math.abs(hash) % 4;\r\n}\r\n\r\nexport interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {\r\n title: string;\r\n config: PaginatedSelectConfig<T>;\r\n endpoint: (filters: U) => Observable<PaginatedItems<T>>;\r\n filters: WritableSignal<U>;\r\n /** Accepts full objects OR partials containing only the valueKey */\r\n selectedItems: Partial<T>[];\r\n multiple: boolean;\r\n showSearch: boolean;\r\n searchPlaceholder: string;\r\n noResultsMessage: string;\r\n confirmLabel: string;\r\n resetLabel: string;\r\n optionTemplate: TemplateRef<{ $implicit: T }> | null;\r\n extraFiltersTemplate: TemplateRef<void> | null;\r\n showSelectAll: boolean;\r\n selectAllLabel: string;\r\n /** Primera página de aperturas anteriores (opcional). */\r\n cache?: NgxPaginatedSelectPageCache<T>;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select-bottom-sheet',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatRippleModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n MatBadgeModule,\r\n ],\r\n templateUrl: './ngx-paginated-select-bottom-sheet.component.html',\r\n styleUrl: './ngx-paginated-select-bottom-sheet.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _ref = inject(MatBottomSheetRef<NgxPaginatedSelectBottomSheetComponent<T, U>>);\r\n private readonly _destroy = inject(DestroyRef);\r\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _injector = inject(Injector);\r\n readonly data = inject<NgxPaginatedSelectBottomSheetData<T, U>>(MAT_BOTTOM_SHEET_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n /** Prefijo de ids para aria-activedescendant. */\r\n readonly listId = `ngx-ps-list-${nextSheetId++}`;\r\n\r\n private readonly _key = this.data.config.valueKey as keyof T;\r\n /** Mínimo de caracteres para lanzar una búsqueda. */\r\n readonly minSearch = Math.max(1, this.data.config.minSearchLength ?? 1);\r\n\r\n // ─── State ─────────────────────────────────────────────────────────────────\r\n /** Raw input value — updates on every keystroke, does NOT trigger the resource */\r\n readonly query = signal(this.data.filters().query);\r\n /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */\r\n private readonly failedImages = signal<Set<unknown>>(new Set());\r\n\r\n /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */\r\n readonly selectedItems = signal<Partial<T>[]>([...this.data.selectedItems]);\r\n /** Claves seleccionadas al abrir: para saber si hay cambios sin confirmar. */\r\n private readonly _initialKeys = this.data.selectedItems.map(item => item[this._key]);\r\n\r\n /** Aviso «¿Descartar los cambios?» visible (múltiple). */\r\n readonly confirmDiscard = signal(false);\r\n\r\n /**\r\n * Subject used to bypass the debounce (e.g. when the user clears\r\n * the search field — we want an immediate response).\r\n */\r\n private readonly _immediateQuery$ = new Subject<string>();\r\n\r\n private readonly accumulatedItems = signal<T[]>([]);\r\n\r\n // ─── Resource (single trigger: data.filters) ───────────────────────────────\r\n /**\r\n * IMPORTANT: the resource depends ONLY on `data.filters`.\r\n * The debounce subscription (below) is the only thing that mutates\r\n * `data.filters.query`, so the resource fires at most once per debounce\r\n * period — never on every keystroke.\r\n */\r\n readonly resource = rxResource({\r\n params: () => ({ ...this.data.filters() }),\r\n // Los errores se dejan en el resource: la plantilla muestra «No se pudieron cargar los datos»\r\n // con «Reintentar». (Antes se convertían en una lista vacía y parecía que no había resultados.)\r\n stream: ({ params }) => this.data.endpoint(params),\r\n defaultValue: { items: [], total: 0 } as PaginatedItems<T>,\r\n });\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n readonly isLoading = computed(() => this.resource.isLoading());\r\n readonly options = computed(() => this.accumulatedItems());\r\n readonly hasError = computed(() => !!this.resource.error());\r\n readonly selectedCount = computed(() => this.selectedItems().length);\r\n\r\n /** Claves seleccionadas en un Set: comprobar si una opción está elegida es O(1). */\r\n private readonly _selectedKeys = computed(() => new Set<unknown>(this.selectedItems().map(item => item[this._key])));\r\n\r\n /** Hay cambios respecto a la selección con la que se abrió el panel. */\r\n readonly isDirty = computed(() => {\r\n const now = this._selectedKeys();\r\n return now.size !== this._initialKeys.length || this._initialKeys.some(key => !now.has(key));\r\n });\r\n\r\n /** Búsqueda escrita pero más corta que minSearchLength. */\r\n readonly searchTooShort = computed(() => {\r\n const length = (this.query() ?? '').trim().length;\r\n return length > 0 && length < this.minSearch;\r\n });\r\n\r\n /** Opción activa del teclado (índice en optionViews); -1 = ninguna. */\r\n readonly activeIndex = signal(-1);\r\n readonly activeId = computed(() => {\r\n const view = this.optionViews()[this.activeIndex()];\r\n return view ? view.id : null;\r\n });\r\n\r\n /**\r\n * Todo lo que pinta cada fila, resuelto de una vez. En simple, si lo seleccionado no está en\r\n * las páginas cargadas y no se está buscando, se fija arriba para que se vea al abrir.\r\n */\r\n readonly optionViews = computed<OptionView<T>[]>(() => {\r\n const cfg = this.data.config;\r\n const selectedKeys = this._selectedKeys();\r\n const failed = this.failedImages();\r\n const query = this.data.optionTemplate ? '' : (this.query() ?? '');\r\n const loaded = this.options();\r\n const loadedKeys = new Set(loaded.map(item => item[this._key]));\r\n\r\n const pinned = !this.data.multiple && !query.trim()\r\n ? (this.selectedItems() as T[]).filter(item => !loadedKeys.has(item[this._key]))\r\n : [];\r\n\r\n return [...pinned, ...loaded].map((item, index) => {\r\n const value = item[this._key];\r\n const label = this.getLabel(item);\r\n return {\r\n item,\r\n key: value,\r\n index,\r\n id: `${this.listId}-opt-${index}`,\r\n label,\r\n labelParts: highlight(label, query),\r\n subtitle: (cfg.subtitle ? this._safe(() => cfg.subtitle!(item)) : null) ?? null,\r\n disabled: cfg.disabled ? this._safe(() => cfg.disabled!(item)) ?? false : false,\r\n selected: selectedKeys.has(value),\r\n pinned: index < pinned.length,\r\n avatarImage: failed.has(value) ? null : (this._safe(() => cfg.avatarImage?.(item)) ?? null),\r\n avatarText: this.getAvatarText(item),\r\n avatarTone: toneOf(value),\r\n };\r\n });\r\n });\r\n\r\n /**\r\n * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante\r\n * la carga por scroll, resource.value() pasa transitoriamente al defaultValue\r\n * (total: 0); leerlo directamente hacía parpadear el footer a \"0 resultados\"\r\n * aunque el total real no cambie. Con este signal el total se mantiene estable\r\n * mientras se cargan más páginas.\r\n */\r\n private readonly _total = signal(0);\r\n readonly total = this._total.asReadonly();\r\n private readonly _totalEffect = effect(() => {\r\n if (this.resource.isLoading())\r\n return;\r\n try {\r\n this._total.set(this.resource.error() ? 0 : this.resource.value().total);\r\n } catch {\r\n // El recurso puede lanzar si está en error o se elimina durante el teardown;\r\n // se conserva el último total y no se rompe el ciclo de detección de cambios.\r\n }\r\n });\r\n\r\n /** Cargando la PRIMERA página sin nada que enseñar → skeletons. */\r\n readonly isInitialLoading = computed(() => this.isLoading() && this.options().length === 0);\r\n /** Cargando MÁS páginas (scroll) → fila «cargando más…». Recargar la primera (caché) no la muestra. */\r\n readonly isLoadingMore = computed(() =>\r\n this.isLoading() && this.options().length > 0 && this.data.filters().pageNumber > 1\r\n );\r\n /** Ya se han cargado todos los resultados disponibles. */\r\n readonly allLoaded = computed(() => this.total() > 0 && this.options().length >= this.total());\r\n /** Cabecera con sombra solo cuando la lista está desplazada. */\r\n readonly headerScrolled = signal(false);\r\n\r\n readonly allSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n return items.every(item => this.isSelected(item));\r\n });\r\n\r\n readonly someSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n const count = items.filter(item => this.isSelected(item)).length;\r\n return count > 0 && count < items.length;\r\n });\r\n\r\n // ─── Accumulate pages ──────────────────────────────────────────────────────\r\n /**\r\n * Reactively depends ONLY on `resource.value()`. The filter snapshot is read\r\n * via `untracked` so external filter changes (parent-driven, e.g. an extra\r\n * filters panel) do NOT create a reactive dependency here.\r\n *\r\n * Reset logic:\r\n * - Fingerprint the current filter identity (everything except `pageNumber`).\r\n * - If the fingerprint changed since the previous fetch, or this is page 1 → replace.\r\n * - If only `pageNumber` moved, this is a scroll-load-more → append.\r\n */\r\n private _lastFilterFingerprint: string | null = null;\r\n private readonly _accumEffect = effect(() => {\r\n // Si el endpoint falla, resource.value() lanza. En la primera página no hay nada que\r\n // enseñar; al cargar más (scroll) se conservan las páginas ya cargadas y se ofrece reintentar.\r\n if (this.resource.error()) {\r\n if (untracked(() => this.data.filters()).pageNumber <= 1) this.accumulatedItems.set([]);\r\n return;\r\n }\r\n if (this.resource.isLoading()) return;\r\n\r\n let value: PaginatedItems<T>;\r\n try {\r\n value = this.resource.value();\r\n } catch {\r\n // El recurso puede lanzar si se elimina durante el teardown; se ignora.\r\n return;\r\n }\r\n const filters = untracked(() => this.data.filters());\r\n const fingerprint = this._fingerprint(filters);\r\n\r\n if (fingerprint !== this._lastFilterFingerprint || filters.pageNumber <= 1) {\r\n this._lastFilterFingerprint = fingerprint;\r\n this.accumulatedItems.set([...value.items]);\r\n // Primera página para la próxima apertura\r\n if (filters.pageNumber <= 1 && this.data.cache) this.data.cache.value = { fingerprint, page: value };\r\n return;\r\n }\r\n\r\n // Scroll: se añaden solo los que no estuvieran ya, para que un refetch de la\r\n // misma página no duplique elementos en la lista.\r\n this.accumulatedItems.update(acc => {\r\n const known = new Set(acc.map(item => item[this._key]));\r\n const nuevos = value.items.filter(item => !known.has(item[this._key]));\r\n return nuevos.length > 0 ? [...acc, ...nuevos] : acc;\r\n });\r\n });\r\n\r\n constructor() {\r\n this.data.filters.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n // Primera página de la apertura anterior con los mismos filtros: se enseña al instante\r\n // (sin skeletons) mientras se recarga por detrás.\r\n const cached = this.data.cache?.value;\r\n const fingerprint = this._fingerprint(untracked(() => this.data.filters()));\r\n if (cached && cached.fingerprint === fingerprint) {\r\n this.accumulatedItems.set([...cached.page.items]);\r\n this._total.set(cached.page.total);\r\n this._lastFilterFingerprint = fingerprint;\r\n } else {\r\n this.accumulatedItems.set([]);\r\n }\r\n\r\n /**\r\n * Búsqueda:\r\n * lo que se escribe → espera searchDebounce ms (400 por defecto) → data.filters\r\n * _immediateQuery$ → sin espera → data.filters (al limpiar el buscador)\r\n * Con menos de minSearchLength caracteres no se busca (se mantiene la lista y se avisa).\r\n */\r\n const wait = this.data.config.searchDebounce ?? 400;\r\n merge(\r\n this._immediateQuery$,\r\n // skip(1): la emisión inicial de toObservable no debe relanzar la búsqueda al abrir\r\n toObservable(this.query).pipe(skip(1), debounce(() => timer(wait))),\r\n )\r\n .pipe(\r\n filter(q => !q || q.trim().length >= this.minSearch),\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this._destroy),\r\n )\r\n .subscribe(q => {\r\n this.accumulatedItems.set([]);\r\n this.activeIndex.set(-1);\r\n this.data.filters.update(f => ({ ...f, query: q, pageNumber: 1 }));\r\n });\r\n\r\n // En múltiple el panel se abre con disableClose: Escape y el fondo pasan por requestClose,\r\n // que avisa si hay cambios sin confirmar en vez de perderlos.\r\n if (this.data.multiple) {\r\n this._ref.backdropClick().pipe(takeUntilDestroyed(this._destroy)).subscribe(() => this.requestClose());\r\n this._ref.keydownEvents()\r\n .pipe(filter(e => e.key === 'Escape'), takeUntilDestroyed(this._destroy))\r\n .subscribe(e => {\r\n e.preventDefault();\r\n this.requestClose();\r\n });\r\n }\r\n }\r\n\r\n // ─── Helpers ────────────────────────────────────────────────────────────────\r\n\r\n isSelected(item: T): boolean {\r\n return this._selectedKeys().has(item[this._key]);\r\n }\r\n\r\n /**\r\n * Safe label: tries displayedLabel(item), falls back to String(item[valueKey]).\r\n * Works for both full objects and partials.\r\n */\r\n getLabel(item: Partial<T>): string {\r\n const cfg = this.data.config;\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n // Solo con la clave (writeValue con ids) displayedLabel daría «undefined undefined»\r\n if (!cfg.displayedLabel || Object.keys(item).length <= 1) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n getAvatarText(item: Partial<T>): string {\r\n if (this.data.config.avatarText) {\r\n try { return this.data.config.avatarText(item as T); } catch { /* fall through */ }\r\n }\r\n return this.getLabel(item).charAt(0).toUpperCase();\r\n }\r\n\r\n /** URL de imagen del avatar, o null si no hay o si falló al cargar. */\r\n getAvatarImage(item: Partial<T>): string | null | undefined {\r\n const key = item[this._key];\r\n if (this.failedImages().has(key))\r\n return null;\r\n return this._safe(() => this.data.config.avatarImage?.(item as T));\r\n }\r\n\r\n /** Marca la imagen como fallida para caer al texto/icono. */\r\n onAvatarError(item: Partial<T>): void {\r\n const key = item[this._key];\r\n this.failedImages.update(s => new Set(s).add(key));\r\n }\r\n\r\n // ─── Selection ──────────────────────────────────────────────────────────────\r\n\r\n toggleItem(item: T): void {\r\n if (this.data.config.disabled && this._safe(() => this.data.config.disabled!(item))) return;\r\n\r\n const val = item[this._key];\r\n\r\n if (this.data.multiple) {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.update(items => items.filter(s => s[this._key] !== val));\r\n } else {\r\n // Remove any existing partial with the same key, then add the full object\r\n this.selectedItems.update(items => [...items.filter(s => s[this._key] !== val), item]);\r\n }\r\n } else {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.set([]);\r\n } else {\r\n this.selectedItems.set([item]);\r\n this.confirm();\r\n }\r\n }\r\n }\r\n\r\n removeSelectedChip(item: Partial<T>): void {\r\n const val = item[this._key];\r\n this.selectedItems.update(items => items.filter(s => s[this._key] !== val));\r\n }\r\n\r\n // ─── Teclado (combobox / listbox) ───────────────────────────────────────────\r\n\r\n /**\r\n * Patrón combobox: el foco se queda en el buscador (se puede seguir escribiendo) y la opción\r\n * activa se marca con aria-activedescendant. Flechas y RePág/AvPág la mueven; Intro elige.\r\n */\r\n onSearchKeydown(event: KeyboardEvent): void {\r\n if (this._moveActive(event)) return;\r\n if (event.key === 'Enter') this._chooseActive(event);\r\n }\r\n\r\n /** Sin buscador, la propia lista recibe el foco: además, Inicio/Fin y Espacio. */\r\n onListKeydown(event: KeyboardEvent): void {\r\n if (this.data.showSearch) return;\r\n const count = this.optionViews().length;\r\n if (event.key === 'Home' && count) { event.preventDefault(); this._setActive(0); return; }\r\n if (event.key === 'End' && count) { event.preventDefault(); this._setActive(count - 1); return; }\r\n if (this._moveActive(event)) return;\r\n if (event.key === 'Enter' || event.key === ' ') this._chooseActive(event);\r\n }\r\n\r\n onOptionClick(view: OptionView<T>): void {\r\n this.activeIndex.set(view.index);\r\n this.toggleItem(view.item);\r\n }\r\n\r\n private _moveActive(event: KeyboardEvent): boolean {\r\n const count = this.optionViews().length;\r\n if (!count) return false;\r\n const current = this.activeIndex();\r\n let next: number;\r\n switch (event.key) {\r\n case 'ArrowDown': next = current < 0 ? 0 : Math.min(current + 1, count - 1); break;\r\n case 'ArrowUp': next = current < 0 ? 0 : Math.max(current - 1, 0); break;\r\n case 'PageDown': next = Math.min(Math.max(current, 0) + 10, count - 1); break;\r\n case 'PageUp': next = Math.max(current - 10, 0); break;\r\n default: return false;\r\n }\r\n event.preventDefault();\r\n this._setActive(next);\r\n return true;\r\n }\r\n\r\n private _chooseActive(event: KeyboardEvent): void {\r\n const view = this.optionViews()[this.activeIndex()];\r\n if (!view || view.disabled) return;\r\n event.preventDefault();\r\n this.toggleItem(view.item);\r\n }\r\n\r\n /** Activa una opción y la trae a la vista (si es de las últimas, el scroll carga la siguiente página). */\r\n private _setActive(index: number): void {\r\n this.activeIndex.set(index);\r\n queueMicrotask(() => {\r\n this._host.nativeElement\r\n .querySelector<HTMLElement>(`#${this.listId}-opt-${index}`)\r\n ?.scrollIntoView({ block: 'nearest' });\r\n });\r\n }\r\n\r\n // ─── Search ──────────────────────────────────────────────────────────────────\r\n\r\n onQueryInput(event: Event, container: HTMLElement): void {\r\n container.scrollTop = 0;\r\n // Only update the raw signal — the debounce subscription handles the rest\r\n this.query.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n clearQuery(container?: HTMLElement): void {\r\n if (container) container.scrollTop = 0;\r\n this.query.set('');\r\n // Emit on the immediate subject to bypass the debounce\r\n this._immediateQuery$.next('');\r\n }\r\n\r\n // ─── Scroll ──────────────────────────────────────────────────────────────────\r\n\r\n onScroll(container: HTMLElement): void {\r\n // Sombra bajo la cabecera al desplazar\r\n this.headerScrolled.set(container.scrollTop > 4);\r\n\r\n if (this.isLoading()) return;\r\n const { scrollTop, clientHeight, scrollHeight } = container;\r\n // Prefetch: se pide la siguiente página ~320px antes del final para que la\r\n // fila de \"cargando más\" apenas se vea (scroll infinito fluido).\r\n if (scrollTop + clientHeight + 320 >= scrollHeight && this.options().length < this.total()) {\r\n this.data.filters.update(f => ({ ...f, pageNumber: f.pageNumber + 1 }));\r\n }\r\n }\r\n\r\n /** Reintenta la carga tras un error. */\r\n retry(): void {\r\n this.resource.reload();\r\n }\r\n\r\n // ─── Select all ─────────────────────────────────────────────────────────────\r\n\r\n toggleSelectAll(): void {\r\n if (this.allSelected()) {\r\n const visibleValues = new Set(this.options().map(item => item[this._key]));\r\n this.selectedItems.update(items => items.filter(s => !visibleValues.has(s[this._key] as T[keyof T])));\r\n } else {\r\n const newItems = this.options().filter(\r\n item => !this.isSelected(item) && !(this.data.config.disabled && this._safe(() => this.data.config.disabled!(item)))\r\n );\r\n this.selectedItems.update(items => [...items, ...newItems]);\r\n }\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\n confirm(): void {\r\n this._ref.dismiss(this.selectedItems());\r\n }\r\n\r\n reset(): void {\r\n this.selectedItems.set([]);\r\n }\r\n\r\n /** Cierra sin aplicar cambios (botón X). En múltiple con cambios, pregunta antes. */\r\n close(): void {\r\n this.requestClose();\r\n }\r\n\r\n /** Cerrar desde la X, Escape o el fondo: si hay cambios sin confirmar, avisa primero. */\r\n requestClose(): void {\r\n if (this.data.multiple && this.isDirty() && !this.confirmDiscard()) {\r\n this.confirmDiscard.set(true);\r\n // El foco va a «Seguir editando»: lo seguro si se pulsa Intro sin mirar\r\n afterNextRender(\r\n () => this._host.nativeElement.querySelector<HTMLElement>('.ps-bs__discard button')?.focus(),\r\n { injector: this._injector },\r\n );\r\n return;\r\n }\r\n this._ref.dismiss(undefined);\r\n }\r\n\r\n discardChanges(): void {\r\n this._ref.dismiss(undefined);\r\n }\r\n\r\n keepEditing(): void {\r\n this.confirmDiscard.set(false);\r\n }\r\n\r\n // ─── Privado ─────────────────────────────────────────────────────────────────\r\n\r\n /** Identidad de unos filtros sin la página: misma huella = misma lista. */\r\n private _fingerprint(filters: U): string {\r\n const { pageNumber, ...rest } = filters;\r\n return JSON.stringify(rest);\r\n }\r\n\r\n /** Las funciones de config pueden fallar con objetos parciales (solo valueKey): se tratan como vacías. */\r\n private _safe<R>(fn: () => R): R | undefined {\r\n try {\r\n return fn();\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n}\r\n","<div class=\"ps-bs\">\n\n <!-- ── Handle bar (mobile) ───────────────────────────────────────────────── -->\n <div class=\"ps-bs__handle\">\n <div class=\"ps-bs__handle-bar\"></div>\n </div>\n\n <!-- ── Header (pinned: title + search only) ──────────────────────────────── -->\n <div class=\"ps-bs__header\" [class.ps-bs__header--scrolled]=\"headerScrolled()\">\n <div class=\"ps-bs__header-top\">\n <div class=\"ps-bs__title-area\">\n <span class=\"ps-bs__title\">{{ data.title }}</span>\n @if (data.multiple && selectedCount() > 0) {\n <span class=\"ps-bs__badge\">{{ selectedCount() }}</span>\n }\n </div>\n <button mat-icon-button class=\"ps-bs__close-btn\" [attr.aria-label]=\"texts().common.close\" (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <!-- Pill search -->\n @if (data.showSearch) {\n <div class=\"ps-bs__search\">\n <mat-icon class=\"ps-bs__search-icon\">search</mat-icon>\n <input\n class=\"ps-bs__search-input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [value]=\"query() ?? ''\"\n [placeholder]=\"data.searchPlaceholder\"\n [attr.aria-label]=\"data.searchPlaceholder\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeId()\"\n (input)=\"onQueryInput($event, bodyContainer)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (query()) {\n <button\n class=\"ps-bs__search-clear\"\n type=\"button\"\n [attr.aria-label]=\"texts().common.clearSearch\"\n (click)=\"clearQuery(bodyContainer); $event.stopPropagation()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n @if (searchTooShort()) {\n <div class=\"ps-bs__search-hint\" aria-live=\"polite\">{{ texts().paginatedSelect.minSearch(minSearch) }}</div>\n }\n }\n </div>\n\n <!-- ── Body (ÚNICA zona de scroll: filtros + chips + select-all + lista) ──── -->\n <div class=\"ps-bs__body\" #bodyContainer (scroll)=\"onScroll(bodyContainer)\">\n\n <!-- Extra filters projection -->\n @if (data.extraFiltersTemplate) {\n <div class=\"ps-bs__extra-filters\">\n <ng-container *ngTemplateOutlet=\"data.extraFiltersTemplate\" />\n </div>\n }\n\n <!-- Selected chips (custom lightweight chips) -->\n @if (data.multiple && selectedItems().length > 0) {\n <div class=\"ps-bs__selected-chips\">\n @for (item of selectedItems(); track item[data.config.valueKey]) {\n <div class=\"ps-bs__chip\">\n <span class=\"ps-bs__chip-label\">{{ getLabel(item) }}</span>\n <button class=\"ps-bs__chip-remove\" type=\"button\" [attr.aria-label]=\"texts().paginatedSelect.removeItem(getLabel(item))\" (click)=\"removeSelectedChip(item)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Select all (sticky top of the scroll area) -->\n @if (data.multiple && data.showSelectAll && options().length > 0) {\n <div class=\"ps-bs__select-all\" matRipple (click)=\"toggleSelectAll()\">\n <mat-checkbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (click)=\"$event.preventDefault()\"\n />\n <span class=\"ps-bs__select-all-label\">{{ data.selectAllLabel }}</span>\n </div>\n }\n\n <!-- ── Options list ──────────────────────────────────────────────────── -->\n <div\n class=\"ps-bs__list\"\n role=\"listbox\"\n [id]=\"listId\"\n [attr.aria-label]=\"data.title\"\n [attr.aria-multiselectable]=\"data.multiple || null\"\n [attr.aria-busy]=\"isLoading() || null\"\n [attr.tabindex]=\"data.showSearch ? null : 0\"\n [attr.aria-activedescendant]=\"data.showSearch ? null : activeId()\"\n (keydown)=\"onListKeydown($event)\">\n\n <!-- Skeleton loading (only for the first page) -->\n @if (isInitialLoading()) {\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\n <div class=\"ps-bs__skeleton\">\n <div class=\"ps-bs__skeleton-avatar\"></div>\n <div class=\"ps-bs__skeleton-content\">\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--title\"></div>\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--subtitle\"></div>\n </div>\n </div>\n }\n }\n\n <!-- Error state -->\n @if (hasError() && !isLoading() && options().length === 0) {\n <div class=\"ps-bs__state ps-bs__error\">\n <div class=\"ps-bs__state-icon-wrap ps-bs__error-icon-wrap\">\n <mat-icon>error_outline</mat-icon>\n </div>\n <div class=\"ps-bs__state-title\">{{ texts().paginatedSelect.errorTitle }}</div>\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.errorHint }}</div>\n <button matButton=\"tonal\" (click)=\"retry()\">\n <mat-icon>refresh</mat-icon>\n {{ texts().paginatedSelect.retry }}\n </button>\n </div>\n }\n\n <!-- Empty state -->\n @if (!hasError() && options().length === 0 && !isLoading()) {\n <div class=\"ps-bs__state ps-bs__empty\">\n <div class=\"ps-bs__state-icon-wrap\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"ps-bs__state-title\">{{ data.noResultsMessage }}</div>\n @if (query()) {\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.noResultsHint }}</div>\n <button matButton (click)=\"clearQuery(bodyContainer)\">\n {{ texts().paginatedSelect.clearSearch }}\n </button>\n }\n </div>\n }\n\n <!-- Option rows (estado precalculado en optionViews) -->\n @for (view of optionViews(); track view.key) {\n <div\n class=\"ps-bs__option\"\n [class.ps-bs__option--selected]=\"view.selected\"\n [class.ps-bs__option--disabled]=\"view.disabled\"\n [class.ps-bs__option--active]=\"view.index === activeIndex()\"\n [class.ps-bs__option--pinned]=\"view.pinned\"\n matRipple\n [matRippleDisabled]=\"view.disabled\"\n role=\"option\"\n [id]=\"view.id\"\n [attr.aria-selected]=\"view.selected\"\n [attr.aria-disabled]=\"view.disabled || null\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onOptionClick(view)\"\n >\n <!-- Avatar (al seleccionar se voltea a un check, estilo Gmail) -->\n <div\n class=\"ps-bs__option-avatar\"\n [class]=\"'ps-bs__option-avatar--tone-' + view.avatarTone\"\n [class.ps-bs__option-avatar--selected]=\"view.selected\"\n aria-hidden=\"true\">\n @if (view.selected) {\n <mat-icon class=\"ps-bs__option-avatar-check\">check</mat-icon>\n } @else if (view.avatarImage) {\n <img [src]=\"view.avatarImage\" alt=\"\" (error)=\"onAvatarError(view.item)\" loading=\"lazy\" />\n } @else if (data.config.avatarText) {\n {{ view.avatarText }}\n } @else if (data.config.avatarIcon) {\n <mat-icon>{{ data.config.avatarIcon }}</mat-icon>\n } @else {\n {{ view.avatarText }}\n }\n </div>\n\n <!-- Content -->\n <div class=\"ps-bs__option-content\">\n @if (data.optionTemplate) {\n <ng-container *ngTemplateOutlet=\"data.optionTemplate; context: { $implicit: view.item }\" />\n } @else {\n <!-- En una línea: cualquier salto entre trozos se pintaría como un espacio -->\n <span class=\"ps-bs__option-label\">@for (part of view.labelParts; track $index) {@if (part.match) {<mark class=\"ps-bs__match\">{{ part.text }}</mark>} @else {<span>{{ part.text }}</span>}}</span>\n @if (view.subtitle) {\n <span class=\"ps-bs__option-subtitle\">{{ view.subtitle }}</span>\n }\n }\n </div>\n\n <!-- Check indicator (decorativo: el estado lo da aria-selected) -->\n @if (data.multiple) {\n <mat-checkbox [checked]=\"view.selected\" [disabled]=\"view.disabled\" [tabIndex]=\"-1\" aria-hidden=\"true\" (click)=\"$event.preventDefault()\" />\n } @else if (view.selected) {\n <mat-icon class=\"ps-bs__option-check\" aria-hidden=\"true\">check_circle</mat-icon>\n }\n </div>\n }\n\n <!-- Fallo al cargar más páginas: se conservan las cargadas y se ofrece reintentar -->\n @if (hasError() && !isLoading() && options().length > 0) {\n <div class=\"ps-bs__list-end ps-bs__list-error\" role=\"alert\">\n {{ texts().paginatedSelect.errorTitle }}\n <button matButton (click)=\"retry()\">\n <mat-icon>refresh</mat-icon>\n {{ texts().paginatedSelect.retry }}\n </button>\n </div>\n }\n\n <!-- Loading more (pagination) / end of list -->\n @if (isLoadingMore()) {\n <div class=\"ps-bs__loading-more\" aria-live=\"polite\">\n <span class=\"ps-bs__loading-more-dot\"></span>\n <span class=\"ps-bs__loading-more-dot\"></span>\n <span class=\"ps-bs__loading-more-dot\"></span>\n <span class=\"ps-bs__loading-more-text\">{{ texts().paginatedSelect.loadingMore }}</span>\n </div>\n } @else if (allLoaded() && options().length > 0) {\n <div class=\"ps-bs__list-end\">{{ texts().paginatedSelect.endOfList }}</div>\n }\n </div>\n </div>\n\n <!-- ── Aviso de cambios sin confirmar (múltiple) ─────────────────────────── -->\n @if (confirmDiscard()) {\n <div class=\"ps-bs__discard\" role=\"alertdialog\" [attr.aria-label]=\"texts().paginatedSelect.discardChanges\">\n <span class=\"ps-bs__discard-text\">{{ texts().paginatedSelect.discardChanges }}</span>\n <div class=\"ps-bs__discard-actions\">\n <button matButton (click)=\"keepEditing()\">{{ texts().paginatedSelect.keepEditing }}</button>\n <button matButton=\"tonal\" (click)=\"discardChanges()\">{{ texts().paginatedSelect.discard }}</button>\n </div>\n </div>\n }\n\n <!-- ── Footer (ALWAYS VISIBLE — never scrolls) ──────────────────────────── -->\n <div class=\"ps-bs__footer\">\n <span class=\"ps-bs__footer-count\">\n @if (data.multiple) {\n {{ texts().paginatedSelect.selectedCount(selectedCount(), total()) }}\n } @else {\n {{ texts().paginatedSelect.resultsCount(total()) }}\n }\n </span>\n\n @if (data.multiple) {\n <div class=\"ps-bs__footer-actions\">\n @if (selectedCount() > 0) {\n <button matButton (click)=\"reset()\">{{ data.resetLabel }}</button>\n }\n <button matButton=\"filled\" (click)=\"confirm()\">\n {{ data.confirmLabel }}@if (isDirty() && selectedCount() > 0) { ({{ selectedCount() }})}\n </button>\n </div>\n }\n </div>\n</div>\n","import {\r\n afterRenderEffect,\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n DoCheck,\r\n ElementRef,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipGrid, MatChipsModule, MatChipEvent } from '@angular/material/chips';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInput, MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter } from '../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../models/select-config';\r\nimport { NgxTexts } from '../../i18n';\r\nimport {\r\n NgxPaginatedSelectBottomSheetComponent,\r\n NgxPaginatedSelectBottomSheetData,\r\n NgxPaginatedSelectPageCache,\r\n} from './bottom-sheet/ngx-paginated-select-bottom-sheet.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-paginated-select.component.html',\r\n styleUrl: './ngx-paginated-select.component.scss',\r\n})\r\nexport class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, DoCheck {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _bottomSheet = inject(MatBottomSheet);\r\n /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intento enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── Inputs ────────────────────────────────────────────────────────────────\r\n /** Label that floats on the form field */\r\n readonly label = input.required<string>();\r\n /** Title shown in the bottom sheet header */\r\n readonly title = input<string>('');\r\n /** Endpoint to fetch paginated data */\r\n readonly endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n /** Config for display and value binding */\r\n readonly config = input.required<PaginatedSelectConfig<T>>();\r\n /** Writable signal with the current filter state */\r\n readonly filters = input<WritableSignal<U>>(\r\n signal<U>({\r\n pageNumber: 1,\r\n pageSize: 25,\r\n query: undefined,\r\n sortBy: undefined,\r\n } as U)\r\n );\r\n /** Pre-selected items — accepts full objects OR partials with only the valueKey set */\r\n readonly selectedItems = input<Partial<T>[]>([]);\r\n /** Allow selecting multiple items */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Whether the component is disabled */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Show a clear button when items are selected */\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Controls how selected items are shown in the trigger:\r\n * - 'chips': a chip per selected item (default when multiple=true)\r\n * - 'text': a single comma-joined text line\r\n */\r\n readonly displayMode = input<'chips' | 'text'>('chips');\r\n /** Whether to show the search input inside the bottom sheet */\r\n readonly showSearch = input(true, { transform: booleanAttribute });\r\n /** Placeholder for the search input inside the bottom sheet (defaults to the library texts) */\r\n readonly searchPlaceholder = input<string>();\r\n /** Message when no results are found (defaults to the library texts) */\r\n readonly noResultsMessage = input<string>();\r\n /** Label for the confirm button (multiple mode, defaults to intl) */\r\n readonly confirmLabel = input<string>();\r\n /** Label for the reset button (multiple mode, defaults to intl) */\r\n readonly resetLabel = input<string>();\r\n /** Controls how the subscript wrapper (hint/error) reserves space */\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n /** Error message rendered inside mat-error */\r\n readonly error = input<string>('');\r\n /** Hint message rendered inside mat-hint */\r\n readonly hint = input<string>('');\r\n /** Custom template for each option row inside the bottom sheet */\r\n readonly optionTemplate = input<TemplateRef<{ $implicit: T }> | null>(null);\r\n /**\r\n * Optional template projected into the bottom sheet header (e.g. toggle filters).\r\n * Pass an `ng-template` reference from the consumer: `[extraFiltersTemplate]=\"myTpl\"`\r\n */\r\n readonly extraFiltersTemplate = input<TemplateRef<void> | null>(null);\r\n\r\n /** Maximum number of chips to display before showing \"+N more\" */\r\n readonly maxChipsDisplayed = input(5);\r\n /** Layout direction for chips in the trigger: 'row' (horizontal wrap) or 'column' (vertical stack) */\r\n readonly chipsDirection = input<'row' | 'column'>('column');\r\n /** Whether to show a \"Select all\" toggle in the bottom sheet (multiple mode) */\r\n readonly showSelectAll = input(false, { transform: booleanAttribute });\r\n /** Label for the select all toggle (defaults to the library texts) */\r\n readonly selectAllLabel = input<string>();\r\n\r\n // ─── Outputs ───────────────────────────────────────────────────────────────\r\n /** Emits the full T object (single) or T[] (multiple) when selection changes */\r\n readonly valueChange = output<Partial<T> | Partial<T>[] | undefined>();\r\n /** Emits the raw array of selected items (may be partial if never confirmed) */\r\n readonly selectionChange = output<Partial<T>[]>();\r\n\r\n // ─── Internal state ────────────────────────────────────────────────────────\r\n protected readonly _selectedItems = signal<Partial<T>[]>([]);\r\n private readonly _cvaDisabled = signal(false);\r\n protected readonly _isOpen = signal(false);\r\n\r\n /**\r\n * Control interno que gobierna el estado visual del mat-form-field.\r\n * MatInput y MatChipGrid solo reevaluan su errorState (en ngDoCheck) si\r\n * tienen un NgControl asociado; sin el, el campo nunca se pintaba en rojo\r\n * aunque el control real del formulario fuese invalido. El valor real sigue\r\n * viviendo en el CVA: este control solo refleja la etiqueta visible.\r\n */\r\n protected readonly innerControl = new FormControl<string>('');\r\n\r\n private onChange: (value: T[keyof T] | T[keyof T][] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n /** Evita re-emitir onChange cuando el cambio viene del formulario (writeValue). */\r\n private _suppressEmit = false;\r\n /** Huella de la última selección aplicada desde el input `selectedItems`. */\r\n private _lastSyncedSelection: string | null = null;\r\n /** Primera página de la última apertura: la siguiente se pinta al instante mientras recarga. */\r\n private readonly _pageCache: NgxPaginatedSelectPageCache<T> = { value: null };\r\n /** Claves ya pedidas a config.loadByKeys (no se repiten aunque fallen). */\r\n private readonly _requestedKeys = new Set<unknown>();\r\n /** Resolviendo etiquetas con config.loadByKeys. */\r\n protected readonly isResolving = signal(false);\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n protected readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\r\n\r\n /** Todas las etiquetas seleccionadas, separadas por comas (tooltip del modo texto). */\r\n protected readonly fullLabel = computed(() => this._selectedItems().map(i => this.getLabel(i)).join(', '));\r\n\r\n /** Lo que se ve en el modo texto: en múltiple, las 3 primeras y «y N más». */\r\n protected readonly selectedLabel = computed(() => {\r\n const items = this._selectedItems();\r\n if (items.length === 0) return '';\r\n if (!this.multiple()) return this.getLabel(items[0]);\r\n const shown = items.slice(0, 3).map(i => this.getLabel(i));\r\n return this.texts().paginatedSelect.summary(shown, items.length - shown.length);\r\n });\r\n\r\n protected readonly hasSelection = computed(() => this._selectedItems().length > 0);\r\n\r\n protected readonly showChips = computed(() => this.multiple() && this.displayMode() === 'chips');\r\n\r\n protected readonly displayedChips = computed(() =>\r\n this._selectedItems().slice(0, this.maxChipsDisplayed())\r\n );\r\n\r\n /**\r\n * En fila (chipsDirection=\"row\"), cuántos de los chips mostrados caben enteros en el ancho del\r\n * campo; null = sin medir. Los que no caben se ocultan y pasan a contar en el «+N», en vez de\r\n * quedar cortados a medias.\r\n */\r\n private readonly _fittingChips = signal<number | null>(null);\r\n\r\n /** Chips visibles de verdad: los de maxChipsDisplayed que caben (en fila) o todos (en columna). */\r\n protected readonly visibleChipCount = computed(() => {\r\n const shown = this.displayedChips().length;\r\n const fit = this._fittingChips();\r\n return this.chipsDirection() === 'row' && fit !== null ? Math.min(shown, fit) : shown;\r\n });\r\n\r\n protected readonly remainingChipsCount = computed(() =>\r\n Math.max(0, this._selectedItems().length - this.visibleChipCount())\r\n );\r\n\r\n /** ErrorStateMatcher que refleja el estado del control del formulario. */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`: el mat-form-field pinta\r\n * el asterisco. Signal (no método en plantilla) que se actualiza en ngDoCheck.\r\n */\r\n protected readonly isRequired = signal(false);\r\n\r\n /** Control visible según el modo (chips o texto), para recalcular su error con OnPush. */\r\n private readonly _chipGrid = viewChild(MatChipGrid);\r\n private readonly _textInput = viewChild(MatInput);\r\n\r\n // Etiquetas efectivas (override por input o valor por defecto de NgxTexts)\r\n protected readonly effectiveSearchPlaceholder = computed(() => this.searchPlaceholder() ?? this.texts().common.search);\r\n protected readonly effectiveNoResults = computed(() => this.noResultsMessage() ?? this.texts().select.noResults);\r\n protected readonly effectiveConfirmLabel = computed(() => this.confirmLabel() ?? this.texts().paginatedSelect.confirm);\r\n protected readonly effectiveResetLabel = computed(() => this.resetLabel() ?? this.texts().paginatedSelect.reset);\r\n protected readonly effectiveSelectAllLabel = computed(() => this.selectAllLabel() ?? this.texts().paginatedSelect.selectAll);\r\n\r\n constructor() {\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sync selectedItems input → estado interno (solo si el contenido cambia de verdad;\r\n // un literal `[...]` recreado en cada CD no debe borrar la selección del usuario).\r\n effect(() => {\r\n const incoming = this.selectedItems();\r\n const key = this.config().valueKey as keyof T;\r\n const fingerprint = JSON.stringify(incoming.map(item => item?.[key]));\r\n\r\n if (fingerprint === this._lastSyncedSelection)\r\n return;\r\n\r\n // La primera vez sin selectedItems no hay nada que aplicar: si se pusiera [] se perdería\r\n // el valor que writeValue ya ha escrito (el efecto corre después que el formulario)\r\n const first = this._lastSyncedSelection === null;\r\n this._lastSyncedSelection = fingerprint;\r\n if (first && incoming.length === 0)\r\n return;\r\n this._selectedItems.set(incoming);\r\n });\r\n\r\n // Si el endpoint cambia, la primera página guardada ya no vale\r\n effect(() => {\r\n this.endpoint();\r\n this._pageCache.value = null;\r\n });\r\n\r\n // Elementos que solo tienen la clave (writeValue con ids): se piden a config.loadByKeys\r\n effect(() => {\r\n const items = this._selectedItems();\r\n untracked(() => this._resolvePartials(items));\r\n });\r\n\r\n // Chips en fila: se vuelve a medir al cambiar los chips, la dirección o el ancho del campo\r\n let observed: Element | null = null;\r\n const resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(() => this._measureChips());\r\n this._destroyRef.onDestroy(() => resize?.disconnect());\r\n afterRenderEffect(() => {\r\n this.displayedChips();\r\n this.texts();\r\n if (this.chipsDirection() !== 'row' || !this.showChips()) {\r\n this._fittingChips.set(null);\r\n return;\r\n }\r\n const grid = this._host.nativeElement.querySelector('.ps-trigger__chip-grid');\r\n if (grid !== observed) {\r\n if (observed) resize?.unobserve(observed);\r\n if (grid) resize?.observe(grid);\r\n observed = grid;\r\n }\r\n this._measureChips();\r\n });\r\n\r\n // Estado interno → formulario + outputs (se omite cuando el cambio viene de writeValue).\r\n effect(() => {\r\n const items = this._selectedItems();\r\n if (this._suppressEmit) {\r\n this._suppressEmit = false;\r\n return;\r\n }\r\n untracked(() => this.emitChange(items));\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una senal:\r\n * al enviar, nada marca este componente (OnPush) para revision, asi que el\r\n * control interno no reevaluaba su errorStateMatcher y el campo no se\r\n * pintaba en rojo. Al enviarse el formulario se fuerza la revision.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n\r\n // El control interno solo refleja la etiqueta visible y el estado deshabilitado.\r\n effect(() => {\r\n const label = this.selectedLabel();\r\n if (this.innerControl.value !== label)\r\n this.innerControl.setValue(label, { emitEvent: false });\r\n });\r\n\r\n effect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this._syncFormState();\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Validadores añadidos después, resetForm que quita el «enviado»…: no avisan con eventos\r\n this._syncFormState();\r\n }\r\n\r\n /** Cuenta los chips que acaban dentro del ancho visible del grid (al menos uno). */\r\n private _measureChips(): void {\r\n if (this.chipsDirection() !== 'row') return;\r\n const grid = this._host.nativeElement.querySelector<HTMLElement>('.ps-trigger__chip-grid');\r\n if (!grid) return;\r\n const limit = grid.getBoundingClientRect().right + 0.5;\r\n const chips = Array.from(grid.querySelectorAll<HTMLElement>('.ps-trigger__chip'));\r\n const fit = chips.filter(chip => chip.getBoundingClientRect().right <= limit).length;\r\n this._fittingChips.set(Math.max(1, fit));\r\n }\r\n\r\n private _syncFormState(): void {\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n const field = this._chipGrid() ?? this._textInput();\r\n if (!field) return;\r\n const before = field.errorState;\r\n field.updateErrorState();\r\n if (field.errorState !== before) this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────────────────\r\n writeValue(value: T[keyof T] | T[keyof T][] | null): void {\r\n const key = this.config().valueKey as keyof T;\r\n const keys = this.keysFromValue(value);\r\n const currentKeys = this._selectedItems().map(i => i[key]);\r\n\r\n // Mismo conjunto de claves → no tocamos el estado (conserva objetos enriquecidos).\r\n if (this.sameKeySet(keys, currentKeys))\r\n return;\r\n\r\n this._suppressEmit = true;\r\n this.applyValueFromKeys(keys);\r\n }\r\n\r\n registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | 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._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Helpers de valor ───────────────────────────────────────────────────────\r\n private keysFromValue(value: T[keyof T] | T[keyof T][] | null): T[keyof T][] {\r\n if (value == null) return [];\r\n return Array.isArray(value) ? value : [value];\r\n }\r\n\r\n private applyValueFromKeys(keys: T[keyof T][]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se conservan los objetos completos ya conocidos para no perder las etiquetas.\r\n const known = new Map(this._selectedItems().map(i => [i[key], i] as const));\r\n this._selectedItems.set(keys.map(k => known.get(k) ?? ({ [key]: k } as Partial<T>)));\r\n }\r\n\r\n private sameKeySet(a: T[keyof T][], b: (T[keyof T] | undefined)[]): boolean {\r\n if (a.length !== b.length) return false;\r\n const set = new Set(b);\r\n return a.every(k => set.has(k));\r\n }\r\n\r\n private emitChange(items: Partial<T>[]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se descartan items sin valueKey (meterían undefined → null en el payload).\r\n const validItems = items.filter(i => i != null && i[key] != null);\r\n\r\n if (this.multiple()) {\r\n // null en vez de [] para que Validators.required marque vacío correctamente\r\n this.onChange(validItems.length > 0 ? validItems.map(i => i[key] as T[keyof T]) : null);\r\n this.valueChange.emit(validItems);\r\n } else {\r\n this.onChange((validItems[0]?.[key] as T[keyof T]) ?? null);\r\n this.valueChange.emit(validItems[0]);\r\n }\r\n this.selectionChange.emit(validItems);\r\n }\r\n\r\n /**\r\n * Safe label resolver: tries `displayedLabel(item)`, falls back to\r\n * `String(item[valueKey])` so partial objects never throw.\r\n */\r\n protected getLabel(item: Partial<T>): string {\r\n const cfg = this.config();\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n // Solo con la clave (writeValue con ids) displayedLabel daría «undefined undefined»\r\n if (!cfg.displayedLabel || Object.keys(item).length <= 1) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n /** Pide a config.loadByKeys los elementos de los que solo se conoce la clave. */\r\n private _resolvePartials(items: Partial<T>[]): void {\r\n const loadByKeys = this.config().loadByKeys;\r\n if (!loadByKeys) return;\r\n const key = this.config().valueKey as keyof T;\r\n const missing = items\r\n .filter(item => item != null && item[key] != null && Object.keys(item).length === 1)\r\n .map(item => item[key] as T[keyof T])\r\n .filter(k => !this._requestedKeys.has(k));\r\n if (missing.length === 0) return;\r\n\r\n missing.forEach(k => this._requestedKeys.add(k));\r\n this.isResolving.set(true);\r\n loadByKeys(missing)\r\n .pipe(takeUntilDestroyed(this._destroyRef))\r\n .subscribe({\r\n next: loaded => {\r\n const byKey = new Map(loaded.map(item => [item[key], item] as const));\r\n const current = this._selectedItems();\r\n if (!current.some(item => byKey.has(item[key] as T[keyof T]))) return;\r\n // Mismas claves, solo cambian las etiquetas: no es un cambio de valor para el formulario\r\n this._suppressEmit = true;\r\n this._selectedItems.set(current.map(item => byKey.get(item[key] as T[keyof T]) ?? item));\r\n },\r\n error: () => this.isResolving.set(false),\r\n complete: () => this.isResolving.set(false),\r\n });\r\n }\r\n\r\n // ─── Bottom sheet ──────────────────────────────────────────────────────────\r\n openBottomSheet(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this.isDisabled()) return;\r\n\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n this._isOpen.set(true);\r\n\r\n const filtersSignal = this.filters();\r\n filtersSignal.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n const data: NgxPaginatedSelectBottomSheetData<T, U> = {\r\n title: this.title() || this.label(),\r\n config: this.config(),\r\n endpoint: this.endpoint(),\r\n filters: filtersSignal,\r\n selectedItems: [...this._selectedItems()],\r\n multiple: this.multiple(),\r\n showSearch: this.showSearch(),\r\n searchPlaceholder: this.effectiveSearchPlaceholder(),\r\n noResultsMessage: this.effectiveNoResults(),\r\n confirmLabel: this.effectiveConfirmLabel(),\r\n resetLabel: this.effectiveResetLabel(),\r\n optionTemplate: this.optionTemplate(),\r\n extraFiltersTemplate: this.extraFiltersTemplate(),\r\n showSelectAll: this.showSelectAll(),\r\n selectAllLabel: this.effectiveSelectAllLabel(),\r\n cache: this._pageCache,\r\n };\r\n\r\n this._bottomSheet\r\n .open<NgxPaginatedSelectBottomSheetComponent<T, U>, typeof data, Partial<T>[] | undefined>(\r\n NgxPaginatedSelectBottomSheetComponent,\r\n {\r\n data,\r\n panelClass: 'ngx-paginated-select-panel',\r\n backdropClass: 'ngx-paginated-select-backdrop',\r\n autoFocus: data.showSearch ? '.ps-bs__search-input' : '.ps-bs__list',\r\n // En múltiple, Escape y el fondo pasan por el panel: avisa antes de perder cambios\r\n disableClose: data.multiple,\r\n }\r\n )\r\n .afterDismissed()\r\n .subscribe(result => {\r\n this._isOpen.set(false);\r\n if (result !== undefined) {\r\n this._selectedItems.set(result);\r\n }\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n });\r\n }\r\n\r\n /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */\r\n onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled()) return;\r\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.openBottomSheet(event);\r\n }\r\n }\r\n\r\n // ─── Chip actions ──────────────────────────────────────────────────────────\r\n // La propagación del click de la \"x\" se detiene en la plantilla para que no\r\n // burbujee al form-field y abra el bottom sheet.\r\n removeChip(item: Partial<T>, _event: MatChipEvent): void {\r\n const key = this.config().valueKey as keyof T;\r\n this._selectedItems.update(items => items.filter(i => i[key] !== item[key]));\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n\r\n clearSelection(event: Event): void {\r\n event.stopPropagation();\r\n this._selectedItems.set([]);\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","<!-- ── Chips mode (multiple + displayMode = 'chips') ─────────────────────── -->\r\n@if (showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n [class.ps-trigger--row]=\"chipsDirection() === 'row'\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ps-trigger__chip-grid\"\r\n [class.ps-trigger__chip-grid--column]=\"chipsDirection() === 'column'\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n >\r\n @for (item of displayedChips(); track item[config().valueKey]) {\r\n <mat-chip-row\r\n class=\"ps-trigger__chip\"\r\n [class.ps-trigger__chip--overflow]=\"$index >= visibleChipCount()\"\r\n [attr.aria-hidden]=\"$index >= visibleChipCount() || null\"\r\n [value]=\"item[config().valueKey]\"\r\n [disabled]=\"isDisabled()\"\r\n (removed)=\"removeChip(item, $event)\"\r\n >\r\n {{ getLabel(item) }}\r\n <button matChipRemove [disabled]=\"isDisabled()\" [attr.aria-label]=\"texts().paginatedSelect.removeItem(getLabel(item))\" (click)=\"$event.stopPropagation()\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n\r\n @if (remainingChipsCount() > 0) {\r\n <span class=\"ps-trigger__remaining\" [attr.aria-label]=\"texts().paginatedSelect.moreSelected(remainingChipsCount())\">+{{ remainingChipsCount() }}</span>\r\n }\r\n\r\n <!-- Hidden input required for mat-chip-grid; también da foco de teclado al trigger -->\r\n <input\r\n matInput\r\n [matChipInputFor]=\"chipGrid\"\r\n class=\"ps-trigger__kbd-input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [attr.aria-label]=\"label()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (isResolving()) {\r\n <mat-spinner diameter=\"18\" [attr.aria-label]=\"texts().common.loading\" />\r\n }\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().select.clear\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon aria-hidden=\"true\" [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n\r\n<!-- ── Text mode (single or multiple + displayMode = 'text') ─────────────── -->\r\n@if (!showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <input\r\n matInput\r\n class=\"ps-trigger__input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [attr.title]=\"multiple() && fullLabel() !== selectedLabel() ? fullLabel() : null\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (isResolving()) {\r\n <mat-spinner diameter=\"18\" [attr.aria-label]=\"texts().common.loading\" />\r\n }\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().select.clear\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon aria-hidden=\"true\" [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, numberAttribute } from '@angular/core';\r\nimport { SkeletonAnimation, SkeletonVariant } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst UNITLESS_NUMBER = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n/**\r\n * Convierte un tamaño a CSS: un número, o un texto que solo es un número (`height=\"56\"`\r\n * en un atributo estático), se interpreta como píxeles.\r\n */\r\nfunction toCssSize(value: string | number): string {\r\n if (typeof value === 'number') return `${value}px`;\r\n const trimmed = value.trim();\r\n return UNITLESS_NUMBER.test(trimmed) ? `${trimmed}px` : trimmed;\r\n}\r\n\r\nfunction toOptionalCssSize(value: string | number | null | undefined): string | null {\r\n return value === null || value === undefined || value === '' ? null : toCssSize(value);\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-skeleton',\r\n templateUrl: './ngx-skeleton.component.html',\r\n styleUrl: './ngx-skeleton.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'decorative() ? null : \"status\"',\r\n '[attr.aria-label]': 'decorative() ? null : resolvedAriaLabel()',\r\n '[attr.aria-busy]': 'decorative() ? null : \"true\"',\r\n '[attr.aria-hidden]': 'decorative() ? \"true\" : null',\r\n '[style.--ngx-skeleton-duration]': 'animationDuration() ?? null',\r\n },\r\n})\r\nexport class NgxSkeleton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Forma: text (barras de texto), circle, rect o rounded (rectángulo redondeado). */\r\n readonly variant = input<SkeletonVariant>('rect');\r\n\r\n /** Ancho. Cualquier valor CSS; un número se interpreta como px. Se ignora en `circle`. */\r\n readonly width = input<string, string | number>('100%', { transform: toCssSize });\r\n\r\n /** Alto. Cualquier valor CSS; un número se interpreta como px. En `circle` también es el diámetro. */\r\n readonly height = input<string, string | number>('1rem', { transform: toCssSize });\r\n\r\n /** Número de líneas. Solo aplica con `variant=\"text\"`. */\r\n readonly lines = input(1, { transform: numberAttribute });\r\n\r\n /** Separación vertical entre líneas de texto. */\r\n readonly lineSpacing = input<string, string | number>('0.5rem', { transform: toCssSize });\r\n\r\n /** Ancho de la última línea, para que el párrafo parezca real. Solo con varias líneas. */\r\n readonly lastLineWidth = input<string, string | number>('70%', { transform: toCssSize });\r\n\r\n /** Animación: shimmer (brillo que se desliza), pulse (opacidad) o none. */\r\n readonly animation = input<SkeletonAnimation>('shimmer');\r\n\r\n /**\r\n * Duración de un ciclo de animación (cualquier tiempo CSS). Por defecto 1.5s, o el valor\r\n * de la variable CSS `--ngx-skeleton-duration` si el consumidor la define.\r\n */\r\n readonly animationDuration = input<string>();\r\n\r\n /** Sustituye el border-radius que corresponde a la variante. */\r\n readonly borderRadius = input<string | null, string | number | null | undefined>(null, { transform: toOptionalCssSize });\r\n\r\n /** Etiqueta accesible. Por defecto, el texto `skeleton.loading` de la librería. */\r\n readonly ariaLabel = input<string>();\r\n\r\n /**\r\n * Oculta el skeleton a lectores de pantalla (sin role ni etiqueta). Úsalo cuando varios\r\n * skeletons forman una misma pieza: márcalos todos como decorativos y anuncia la carga\r\n * una sola vez en el contenedor (p. ej. con `aria-busy` o un skeleton sin `decorative`).\r\n */\r\n readonly decorative = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly resolvedAriaLabel = computed(() => {\r\n return this.ariaLabel() ?? this._texts().skeleton.loading;\r\n });\r\n\r\n /** Una entrada por línea a pintar (siempre al menos una). */\r\n protected readonly lineIndices = computed(() => {\r\n const count = this.variant() === 'text' ? Math.max(1, Math.floor(this.lines())) : 1;\r\n return Array.from({ length: count }, (_, i) => i);\r\n });\r\n\r\n protected readonly isMultiLine = computed(() => this.lineIndices().length > 1);\r\n\r\n /** border-radius de la variante, salvo que se indique `borderRadius`. */\r\n protected readonly computedBorderRadius = computed(() => {\r\n const override = this.borderRadius();\r\n if (override !== null) return override;\r\n\r\n switch (this.variant()) {\r\n case 'text': return '4px';\r\n case 'circle': return '50%';\r\n case 'rounded': return '12px';\r\n case 'rect':\r\n default: return '0';\r\n }\r\n });\r\n\r\n /** En `circle` el ancho es el alto, para que sea un círculo perfecto. */\r\n protected readonly computedWidth = computed(() => this.variant() === 'circle' ? this.height() : this.width());\r\n}\r\n","<div class=\"ngx-skeleton-lines\" [style.gap]=\"isMultiLine() ? lineSpacing() : null\">\n @for (i of lineIndices(); track i; let last = $last) {\n <div\n class=\"ngx-skeleton-bone\"\n [class.ngx-skeleton-shimmer]=\"animation() === 'shimmer'\"\n [class.ngx-skeleton-pulse]=\"animation() === 'pulse'\"\n [style.width]=\"isMultiLine() && last ? lastLineWidth() : computedWidth()\"\n [style.height]=\"height()\"\n [style.border-radius]=\"computedBorderRadius()\"\n ></div>\n }\n</div>\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n model,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\nimport { NgxTexts } from '../../i18n';\nimport { NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem } from '../../models/file-input-types';\nimport { fileIcon, fileKind, formatFileSize, isSameFile, matchesAccept, parseAccept } from '../shared/file-utils';\n\nlet nextId = 0;\n\n/** Entrada interna de la lista: el fichero y, si se rechazó, el motivo (el mensaje se traduce al pintarlo). */\ninterface Entry {\n item: NgxFileItem;\n code?: NgxFileErrorCode;\n}\n\n/**\n * Zona para soltar o seleccionar ficheros, con lista de ficheros y previsualización de imágenes.\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: los `File[]` válidos) o con `[(files)]`.\n */\n@Component({\n selector: 'ngx-file-input',\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-file-input.component.html',\n styleUrl: './ngx-file-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-file-input',\n '[class.ngx-fi--default]': \"variant() === 'default'\",\n '[class.ngx-fi--compact]': \"variant() === 'compact'\",\n '[class.ngx-fi--button]': \"variant() === 'button'\",\n '[class.ngx-fi--disabled]': 'isDisabled()',\n '[class.ngx-fi--dragover]': 'isDragOver()',\n '[class.ngx-fi--invalid]': 'showError()',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class NgxFileInput implements ControlValueAccessor, AfterViewInit, DoCheck {\n // Se registra como value accessor a mano para poder leer el control (obligatorio y error), como ngx-input-file\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _locale = inject(LOCALE_ID);\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n protected readonly texts = inject(NgxTexts).texts;\n\n // ── Inputs ──────────────────────────────────────────────────────────────────\n\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). `'*'` = cualquiera. */\n readonly accept = input<string | string[]>('*');\n /** Admite varios ficheros: cada selección se añade a la anterior. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamaño máximo por fichero, en bytes. `null` = sin límite. */\n readonly maxSize = input<number | null>(null);\n /** Número máximo de ficheros válidos (con `multiple`). `null` = sin límite. */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Texto principal. Por defecto, el texto `fileInput.dropLabel` de la librería. */\n readonly label = input<string>();\n /** Texto secundario (formatos, tamaños…). */\n readonly hint = input<string | null>(null);\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\n readonly error = input<string>('');\n /** Muestra la lista de ficheros (con miniatura de las imágenes). */\n readonly showPreview = input(true, { transform: booleanAttribute });\n /** `'default'` (zona grande), `'compact'` (barra horizontal) o `'button'` (solo un botón). */\n readonly variant = input<NgxFileInputVariant>('default');\n\n /** Ficheros válidos seleccionados. Admite `[(files)]` para usarlo sin formularios. */\n readonly files = model<File[]>([]);\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n\n /** Ficheros válidos añadidos en una selección o al soltar. */\n readonly filesSelected = output<NgxFileItem[]>();\n /** Fichero quitado de la lista (válido o rechazado). */\n readonly fileRemoved = output<NgxFileItem>();\n /** Un fichero rechazado (tipo, tamaño o número). */\n readonly validationError = output<NgxFileError>();\n\n // ── Estado ──────────────────────────────────────────────────────────────────\n\n protected readonly id = `ngx-fi-${nextId++}`;\n private readonly _entries = signal<Entry[]>([]);\n private readonly _cvaDisabled = signal(false);\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n protected readonly isDragOver = signal(false);\n protected readonly showDropConfirm = signal(false);\n protected readonly announcement = signal('');\n protected readonly isRequired = signal(false);\n protected readonly showError = signal(false);\n\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().fileInput.dropLabel);\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\n protected readonly describedBy = computed(() =>\n [this.hint() ? `${this.id}-hint` : '', this.showError() && this.error() ? `${this.id}-error` : ''].filter(Boolean).join(' ') || null\n );\n /** Lo que pinta la lista: icono, color, tamaño legible y mensaje de error ya traducido. */\n protected readonly views = computed(() =>\n this._entries().map(({ item, code }) => ({\n item,\n icon: fileIcon(item.file),\n kind: fileKind(item.file),\n size: formatFileSize(item.size, this._locale),\n error: code ? this._message(item.file, code) : null,\n }))\n );\n\n private _onChange: (files: File[]) => void = () => {};\n private _onTouched: () => void = () => {};\n private _controlSub?: Subscription;\n private _confirmTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n\n // [files] o [(files)] desde fuera: reconstruye la lista si no coincide con los válidos actuales\n effect(() => {\n const files = this.files();\n untracked(() => {\n const valid = this._validFiles();\n if (files.length !== valid.length || files.some((file, i) => file !== valid[i])) this._resetFrom(files);\n });\n });\n\n inject(DestroyRef).onDestroy(() => {\n this._controlSub?.unsubscribe();\n clearTimeout(this._confirmTimer);\n this._entries().forEach(({ item }) => this._revokePreview(item));\n });\n }\n\n ngAfterViewInit(): void {\n // formControlName asigna su control después de registerOnChange: aquí ya está\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n ngDoCheck(): void {\n // resetForm quita el «enviado» sin emitir evento: se recalcula en cada comprobación\n this._syncFormState();\n }\n\n // ── API pública ─────────────────────────────────────────────────────────────\n\n /** Abre el selector de ficheros del sistema (no hace nada si está deshabilitado). */\n openFilePicker(): void {\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\n }\n\n /** Quita un fichero de la lista, válido o rechazado. */\n removeFile(item: NgxFileItem): void {\n const entry = this._entries().find(e => e.item.id === item.id);\n if (!entry) return;\n this._revokePreview(item);\n this._entries.update(list => list.filter(e => e !== entry));\n this.fileRemoved.emit(item);\n this.announcement.set(this.texts().fileInput.removed(item.name));\n if (!entry.code) this._commit();\n }\n\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\n\n protected onZoneKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openFilePicker();\n }\n }\n\n protected onZoneBlur(): void {\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._addFiles(Array.from(input.files ?? []));\n input.value = '';\n }\n\n protected onDragOver(event: DragEvent): void {\n // Siempre: si no, el navegador abre el fichero al soltarlo\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\n if (!this.isDisabled()) this.isDragOver.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDragOver.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver.set(false);\n if (this.isDisabled()) return;\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (!files.length) return;\n this._addFiles(files);\n this._flashDropConfirm();\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────────────\n\n writeValue(files: File[] | null | undefined): void {\n this.files.set(Array.isArray(files) ? files : []);\n }\n\n registerOnChange(fn: (files: File[]) => void): void {\n this._onChange = fn;\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n // ── Privado ─────────────────────────────────────────────────────────────────\n\n private _validFiles(): File[] {\n return this._entries().filter(e => !e.code).map(e => e.item.file);\n }\n\n private _addFiles(incoming: File[]): void {\n const patterns = parseAccept(this.accept());\n const maxSize = this.maxSize();\n const max = this.multiple() ? this.maxFiles() : 1;\n const current = this.multiple() ? this._entries() : [];\n let validCount = current.filter(e => !e.code).length;\n const added: Entry[] = [];\n\n for (const file of this.multiple() ? incoming : incoming.slice(0, 1)) {\n // Repetidos (ya en la lista o dos veces en la misma tanda): se ignoran\n if ([...current, ...added].some(e => isSameFile(e.item.file, file))) continue;\n\n let code: NgxFileErrorCode | undefined;\n if (!matchesAccept(file, patterns)) code = 'TYPE_NOT_ALLOWED';\n else if (maxSize != null && file.size > maxSize) code = 'SIZE_EXCEEDED';\n else if (max != null && validCount >= max) code = 'MAX_FILES_EXCEEDED';\n else validCount++;\n\n added.push({ item: this._toItem(file, code), code });\n }\n if (!added.length) return;\n\n if (!this.multiple()) this._entries().forEach(({ item }) => this._revokePreview(item));\n this._entries.set([...current, ...added]);\n\n const rejected = added.filter(e => e.code);\n for (const { item, code } of rejected) this.validationError.emit({ file: item.file, code: code!, message: item.error! });\n\n const valid = added.filter(e => !e.code).map(e => e.item);\n if (valid.length) {\n this.filesSelected.emit(valid);\n this.announcement.set(this.texts().fileInput.added(valid.length));\n } else {\n this.announcement.set(rejected.map(e => `${e.item.name}: ${e.item.error}`).join('. '));\n }\n\n this._commit();\n }\n\n /** Publica los ficheros válidos: model, formulario y estado de tocado. */\n private _commit(): void {\n const files = this._validFiles();\n this.files.set(files);\n this._onChange(files);\n this._markTouched();\n }\n\n /** Lista nueva a partir de un valor externo (writeValue o [files]); los rechazados se descartan. */\n private _resetFrom(files: File[]): void {\n const previous = this._entries();\n previous.filter(e => !files.includes(e.item.file)).forEach(({ item }) => this._revokePreview(item));\n this._entries.set(files.map(file => previous.find(e => e.item.file === file && !e.code) ?? { item: this._toItem(file) }));\n }\n\n private _toItem(file: File, code?: NgxFileErrorCode): NgxFileItem {\n const item: NgxFileItem = {\n file,\n id: `${this.id}-file-${nextId++}`,\n name: file.name,\n size: file.size,\n type: file.type,\n status: code ? 'error' : 'valid',\n };\n if (code) item.error = this._message(file, code);\n // URL temporal en vez de leer la imagen entera a base64; se libera al quitarla\n else if (this._isBrowser && file.type.startsWith('image/')) item.preview = URL.createObjectURL(file);\n return item;\n }\n\n private _revokePreview(item: NgxFileItem): void {\n if (item.preview?.startsWith('blob:')) URL.revokeObjectURL(item.preview);\n }\n\n private _message(file: File, code: NgxFileErrorCode): string {\n const texts = this.texts().fileInput;\n switch (code) {\n case 'TYPE_NOT_ALLOWED': {\n // La extensión («.exe») se entiende mejor que el MIME («application/x-msdownload»)\n const dot = file.name.lastIndexOf('.');\n return texts.typeNotAllowed(dot > 0 ? file.name.slice(dot).toLowerCase() : file.type || file.name);\n }\n case 'SIZE_EXCEEDED':\n return texts.tooLarge(formatFileSize(this.maxSize() ?? 0, this._locale));\n case 'MAX_FILES_EXCEEDED':\n return texts.maxFiles(this.maxFiles() ?? 1);\n }\n }\n\n private _bindControl(control: AbstractControl): void {\n this._controlSub?.unsubscribe();\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState());\n this._syncFormState();\n }\n\n private _syncFormState(): void {\n const control = this._ngControl?.control;\n // Signals con el mismo valor no repintan: se puede llamar en cada ngDoCheck\n this.isRequired.set(control?.hasValidator(Validators.required) ?? false);\n this.showError.set(!!control && control.invalid && (control.touched || !!this._parentForm?.submitted));\n }\n\n private _markTouched(): void {\n this._onTouched();\n this._syncFormState();\n }\n\n private _flashDropConfirm(): void {\n this.showDropConfirm.set(true);\n clearTimeout(this._confirmTimer);\n this._confirmTimer = setTimeout(() => this.showDropConfirm.set(false), 450);\n }\n}\n","<!-- Input nativo oculto: lo abre la zona o el botón -->\n<input\n #nativeInput\n class=\"ngx-fi__native\"\n type=\"file\"\n hidden\n tabindex=\"-1\"\n [accept]=\"acceptAttr()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onNativeChange($event)\"\n (cancel)=\"onZoneBlur()\" />\n\n@switch (variant()) {\n @case ('button') {\n <button\n matButton=\"filled\"\n type=\"button\"\n class=\"ngx-fi__button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (blur)=\"onZoneBlur()\">\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabel() }}@if (isRequired()) {<span class=\"ngx-fi__required\" aria-hidden=\"true\">*</span>}\n </button>\n @if (hint()) {\n <span class=\"ngx-fi__hint\" [id]=\"id + '-hint'\">{{ hint() }}</span>\n }\n }\n\n @default {\n <!-- Zona de arrastre: es un botón (abre el selector) con la etiqueta como nombre accesible -->\n <div\n class=\"ngx-fi__zone\"\n [class.ngx-fi__zone--compact]=\"variant() === 'compact'\"\n role=\"button\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (keydown)=\"onZoneKeydown($event)\"\n (blur)=\"onZoneBlur()\">\n <mat-icon class=\"ngx-fi__zone-icon\" aria-hidden=\"true\">cloud_upload</mat-icon>\n\n <span class=\"ngx-fi__zone-text\">\n <span class=\"ngx-fi__label\">\n {{ resolvedLabel() }}@if (isRequired()) {<span class=\"ngx-fi__required\" aria-hidden=\"true\">*</span>}\n </span>\n @if (hint()) {\n <span class=\"ngx-fi__hint\" [id]=\"id + '-hint'\">{{ hint() }}</span>\n }\n @if (variant() === 'default') {\n <span class=\"ngx-fi__browse\">{{ texts().fileInput.browse }}</span>\n }\n </span>\n\n @if (showDropConfirm()) {\n <span class=\"ngx-fi__confirm\" aria-hidden=\"true\"><mat-icon>check_circle</mat-icon></span>\n }\n </div>\n }\n}\n\n@if (showError() && error()) {\n <span class=\"ngx-fi__error\" [id]=\"id + '-error'\">{{ error() }}</span>\n}\n\n@if (showPreview() && views().length) {\n <ul class=\"ngx-fi__list\">\n @for (view of views(); track view.item.id) {\n <li class=\"ngx-fi__item\" [class.ngx-fi__item--error]=\"view.error\">\n <span class=\"ngx-fi__thumb\" [attr.data-kind]=\"view.kind\">\n @if (view.item.preview) {\n <img [src]=\"view.item.preview\" alt=\"\" />\n } @else {\n <mat-icon aria-hidden=\"true\">{{ view.icon }}</mat-icon>\n }\n </span>\n\n <span class=\"ngx-fi__info\">\n <span class=\"ngx-fi__name\" [title]=\"view.item.name\">{{ view.item.name }}</span>\n <span class=\"ngx-fi__meta\">\n {{ view.size }}\n @if (view.error) {\n <span class=\"ngx-fi__item-error\"><mat-icon aria-hidden=\"true\">error</mat-icon>{{ view.error }}</span>\n }\n </span>\n </span>\n\n <button\n matIconButton\n type=\"button\"\n class=\"ngx-fi__remove\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"texts().fileInput.remove(view.item.name)\"\n [matTooltip]=\"texts().fileInput.remove(view.item.name)\"\n (click)=\"removeFile(view.item)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n </ul>\n}\n\n<!-- Región viva fija: añadidos, quitados y rechazados -->\n<div class=\"ngx-fi__live\" aria-live=\"polite\">{{ announcement() }}</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i5","i4","uuidv4","i1","i6","i7","i8","i9","i13"],"mappings":"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"}