import { ElementRef, OnDestroy, TemplateRef } from '@angular/core'; import { TsiColumnDefDirective } from '../../../directivas/tables/tsi-column-def.directive'; import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { SelectedRow } from '../../../models/selected-row'; import { CellRender, CellRendered } from '../../../models/cell-rendered'; import { TableData } from '../../../models/table-data.model'; import * as i0 from "@angular/core"; /** * Tabla con virtual scroll nativo + COLUMNAS FIJADAS (pinned) en el scroll horizontal. * Duplicada de table-ultimate; agrega soporte para `pinned` en la definición de columna. * * PINNED: * - `pinned: true` → fija la columna a la DERECHA (default) * - `pinned: 'right'` → fija la columna a la derecha * - `pinned: 'left'` → fija la columna a la izquierda * - Las columnas fijadas se reordenan: left al inicio, right al final. * - Si la columna fijada no define `width`, se le asigna 120px (el offset necesita ancho fijo). * - Las columnas utilitarias (details/checkbox/actions) se fijan a la izquierda automáticamente * solo cuando existe al menos una columna con pinned 'left'. * * @Input columns - Array de columnas con la misma forma que table-simple (+ pinned) * @Input rows - Array completo de datos * @Input rowHeight - Alto fijo de cada fila en px. Si es 0 (default) se resuelve por variante: 42 modern, 30 standard * @Input buffer - Filas extra renderizadas fuera del viewport (default: 10) * @Input altoContainer - Alto fijo del contenedor en px (default: 400). Se ignora si se usa altoContenedor. * @Input altoContenedor - Offset desde el top del viewport en px. Activa height: clamp(minAlto, calc(100vh - offset), 100vh). * @Input minAlto - Altura mínima en px cuando se usa altoContenedor (default: 200) * @Input footerRows - Filas del footer (totales, resumen, etc.) * @Input identifier - Campos que forman la clave para selectedRow * @Input withFiltro - Muestra input de búsqueda local * @Input withDetails - Muestra detalles expandibles por fila * @Input withCheckbox - Muestra checkbox para selección de filas * @Input withTotal - Muestra fila de totales en el footer */ /** Datos de fijado de una columna, resueltos para el template */ export interface PinInfo { side: 'left' | 'right'; /** offset acumulado para style.left (solo side left) */ left: number | null; /** offset acumulado para style.right (solo side right) */ right: number | null; /** true si es la celda del borde interno del grupo (donde va la sombra) */ edge: boolean; /** ancho efectivo de la columna fijada */ width: number; } export declare class TableUltimatePinnedComponent implements OnDestroy { scrollContainer: import("@angular/core").Signal>; customActions: import("@angular/core").Signal>; columnDefs: import("@angular/core").Signal; columnDefMap: import("@angular/core").Signal>>; private formateador; rows: import("@angular/core").InputSignal; columns: import("@angular/core").InputSignal; footerRows: import("@angular/core").InputSignal; rowHeight: import("@angular/core").InputSignal; buffer: import("@angular/core").InputSignal; altoContainer: import("@angular/core").InputSignal; altoContenedor: import("@angular/core").InputSignal; minAlto: import("@angular/core").InputSignal; identifier: import("@angular/core").InputSignal; withFiltro: import("@angular/core").InputSignal; withDetails: import("@angular/core").InputSignal; withCheckbox: import("@angular/core").InputSignal; withTotal: import("@angular/core").InputSignal; withHeight: import("@angular/core").InputSignal; withAttachment: import("@angular/core").InputSignal; variante: import("@angular/core").InputSignal<"modern" | "standard">; rendered: import("@angular/core").InputSignal; dragOverRowId: import("@angular/core").WritableSignal; titleTabla: import("@angular/core").InputSignal; activeMobileMode: import("@angular/core").InputSignal; isLoadingResponsive: import("@angular/core").WritableSignal; isMobile: import("@angular/core").WritableSignal; contentFilter: import("@angular/core").Signal>; rowEvent: import("@angular/core").OutputEmitterRef; selectedRow: import("@angular/core").ModelSignal; rowClassFn: import("@angular/core").InputSignal<(row: any) => string | string[] | Record>; rowDisabledFn: import("@angular/core").InputSignal<(row: any) => boolean>; selectItems: import("@angular/core").ModelSignal[]>; rowFormat: import("@angular/core").Signal; busqueda: import("@angular/core").ModelSignal; scrollTop: import("@angular/core").WritableSignal; containerHeight: import("@angular/core").WritableSignal; sortField: import("@angular/core").WritableSignal; sortDir: import("@angular/core").WritableSignal<"none" | "desc" | "asc">; expandedRows: import("@angular/core").WritableSignal; classTotales: import("@angular/core").InputSignal; /** Valor aplicado como [style.height] en el template */ heightStyle: import("@angular/core").Signal; rowFilter: import("@angular/core").Signal; rowH: import("@angular/core").Signal; totalHeight: import("@angular/core").Signal; startIndex: import("@angular/core").Signal; endIndex: import("@angular/core").Signal; visibleRows: import("@angular/core").Signal; /** Espacio en blanco antes de las filas renderizadas */ paddingTop: import("@angular/core").Signal; /** Espacio en blanco después de las filas renderizadas */ paddingBottom: import("@angular/core").Signal; private scrollEffect; private resizeObserver?; private resizeEffect; ngOnDestroy(): void; onScroll(event: Event): void; selectRow(row: any, idList: string): void; isSelected(row: any, idList: string): boolean; textoDigitado(): void; toggleSort(field: string): void; /** Ancho por defecto de una columna fijada que no define width (el offset necesita ancho fijo) */ private readonly PINNED_DEFAULT_WIDTH; /** Anchos fijos de las columnas utilitarias cuando participan del pinning izquierdo */ readonly UTIL_W: { details: number; checkbox: number; actions: number; }; /** Posición horizontal del scroll (para las sombras de las columnas fijadas) */ scrollLeft: import("@angular/core").WritableSignal; maxScrollLeft: import("@angular/core").WritableSignal; private syncScrollX; /** Lado al que se fija una columna. `pinned: true` = derecha (default) */ pinnedSide(col: TableData): 'left' | 'right' | null; private pinnedWidth; hasLeftPinned: import("@angular/core").Signal; hasRightPinned: import("@angular/core").Signal; /** Ancho total de las columnas utilitarias fijadas (base del offset de las pinned left) */ utilCheckboxLeft: import("@angular/core").Signal; utilActionsLeft: import("@angular/core").Signal; private utilTotalWidth; /** Mapa fieldname → PinInfo con los offsets acumulados de cada columna fijada */ pinInfo: import("@angular/core").Signal>; /** PinInfo de una columna, o undefined si no está fijada */ pin(col: TableData): PinInfo | undefined; /** Ancho a forzar en la celda: el declarado, o el default si está fijada */ colWidth(col: TableData): number | null; /** Sombra izquierda: hay columnas fijadas left y se scrolleó */ hasShadowLeft: import("@angular/core").Signal; /** Sombra derecha: hay columnas fijadas right y queda contenido oculto a la derecha */ hasShadowRight: import("@angular/core").Signal; concatenarValue(obj: any, fields: string[]): string; getHighlight(text: any, fieldname: string): string; private filtraItem; private scrollToSelected; /** Índice real en rowFilter de una fila visible (para isSelected) */ realIndex(visibleIdx: number): number; /** Mostrar columnas para realizar el filtro */ filtrarColumnas: import("@angular/core").Signal<{ [caption: string]: boolean; }>; toggleFiltros(event: Event): void; /** MOSTRAR/ORDENAR COLUMNAS DE LA TABLA (engranaje del header) */ /** orden y visibilidad elegidos por el usuario, por fieldname — sembrado siempre desde columns() */ private columnState; /** Reconstruye el estado cada vez que cambia columns() (columns() es la única fuente de verdad) */ private columnStateEffect; private buildColumnState; /** Columnas configurables (permitidas por diseño), en el orden elegido por el usuario. * El caption es solo presentación: sin caption la columna igual se configura y renderiza (identidad = fieldname). */ columnasConfigurables: import("@angular/core").Signal; /** Columnas que realmente se pintan: configurables y marcadas como visibles. * Las fijadas se reordenan: left al inicio, right al final (una pinned en medio no tiene sentido visual). */ columnasRenderizadas: import("@angular/core").Signal; isColumnVisible(fieldname: string): boolean; toggleColumnVisible(fieldname: string, event: Event): void; onColumnDrop(event: CdkDragDrop): void; guardarConfiguracionColumnas(): void; /** Descarta los cambios sin guardar (drags/toggles) y vuelve al orden/visibilidad de columns() */ restablecerConfiguracionColumnas(): void; validaVisibilidad(value: boolean): boolean; /** CELL RENDER */ resolveCell(col: string, row: any): CellRender | null; getRowClass(row: any): { [key: string]: boolean; }; getPosition(col: TableData): string; toggleExpandRow(idRow: string): void; getTotals(fieldname: string): string; getColspanBeforeTotals(): number; allCheck(event: Event): void; isCheckboxDisabled(row: any): boolean; checkAll(checked: boolean): void; validaAllCheck(): boolean; isItemSelected(id: string): boolean; toogleItem(idList: string, event: Event): void; onDoubleClick(row: any): void; onRightClick(event: MouseEvent, row: any): void; onResize(event: any): void; private mobileEffect; onDragOver(event: DragEvent, idList: any): void; onDragLeave(): void; onDrop(event: DragEvent, row: any): void; getRows: () => any[]; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }