import type { SchemaField } from '../types'; /** * Metadatos de columna de un widget de tabla. * * La tabla no se deriva del resultado SQL. Ese es el origen del problema que * se corrige: hoy los encabezados son el nombre crudo de la columna de base de * datos — `STOCK_ACTUAL`, `DIAS_SIN_ENTRADA` — así que el widget habla el idioma * del esquema y no el del gerente que lo lee. * * Se declaran en `config_schema.columns`. */ export type ColumnType = 'text' | 'number' | 'currency' | 'percent' | 'date' | 'badge'; export interface TableColumn { /** Nombre real del campo en el resultado. */ key: string; /** Lo que ve el usuario. Obligatorio en columnas declaradas. */ label: string; type: ColumnType; /** Por defecto: `right` para number/currency/percent. */ align?: 'left' | 'right'; /** Peso relativo del ancho, no píxeles. */ width?: number; /** Una sola por tabla: la que identifica la fila. */ primary?: boolean; /** Contra qué campo se compara para el énfasis semántico. */ compare?: { against: string; direction: 'below' | 'above'; }; /** Se oculta en el widget compacto y reaparece al ampliar. */ hideOnCompact?: boolean; /** Si la columna se dedujo del dato en vez de declararse. */ derived?: boolean; } /** * Convierte `STOCK_ACTUAL` en `Stock actual`. * * Es un último recurso, no la solución. Funciona hasta que aparece * `NIT_TERCERO_FACT`, que no hay heurística que arregle. Existe porque los widgets * ya sembrados no declaran columnas y no pueden quedarse mostrando el esquema en * pantalla; los nuevos deben declarar su `label` en el Widget Builder. */ export declare function humanizeKey(key: string): string; /** * Deduce el tipo de una columna a partir de su nombre y de una muestra de valores. * * El DATO manda sobre el NOMBRE, y ese orden es el arreglo. Antes se miraba primero el * nombre por substring, así que `DIAS_SIN_ENTRADA` casaba con `dia`, se tipaba como fecha y la * celda pintaba «1 ene 1970» para un conteo de días — en el widget que se llama «Stock * crítico», y justo en la columna que el ejemplo de este archivo cita. * * Un valor numérico no es una fecha se llame como se llame el campo. El nombre solo decide * cuando el dato no es concluyente. */ export declare function inferColumnType(key: string, sampleValues: unknown[]): ColumnType; /** Alineación por defecto: los números a la derecha, para poder comparar magnitudes. */ export declare function defaultAlign(type: ColumnType): 'left' | 'right'; /** * Las columnas de una tabla, resueltas en tres capas de prioridad. * * ``` * 1. config_schema.columns lo que declara el widget — manda siempre * 2. schema.fields lo que declara el ENDPOINT en su envelope * 3. deducción del dato último recurso: humanizar el nombre del campo * ``` * * La capa 2 es la que resuelve el problema de verdad, y estaba ahí sin usarse. * El envelope estándar ya trae `label`, `type` y `format` por campo — el endpoint de * stock crítico declara "Existencia", "Mínimo" y "Días sin entrada" — pero la tabla * los ignoraba y pintaba el nombre crudo de la columna de base de datos. * * Consumirlos tiene dos ventajas sobre sembrar `config_schema` en cada host: las * etiquetas viven junto a la consulta que las produce, y funciona para cualquier * host que devuelva el envelope, sin configurar nada. * * `visibleColumns` del Widget Builder se sigue respetando como filtro y orden, para * no cambiarle la tabla a nadie que ya la haya configurado. */ export declare function resolveTableColumns(declared: TableColumn[] | undefined, rows: Record[], visibleColumns?: string[], schemaFields?: SchemaField[]): TableColumn[]; /** * Si una celda cumple la condición que da nombre al widget. * * Una tabla llamada "Stock crítico" tiene que mostrar QUÉ está crítico: hoy un `3` * contra un mínimo de `10` se ve igual que cualquier otro número. */ export declare function meetsCompare(column: TableColumn, row: Record): boolean; /** * Etiquetas de un valor booleano, ya traducidas por quien tiene el hook. * * `formatCellValue` es una función pura y no puede llamar a `useDashboardTranslation`, así que * las recibe. Antes devolvía `'Sí'`/`'No'` cableados en español, y una tabla con una columna * booleana los mostraba tal cual en un host en inglés. */ export interface CellLabels { yes: string; no: string; } /** El texto de una celda, según el tipo declarado de su columna. */ export declare function formatCellValue(value: unknown, type: ColumnType, currency: string | null, labels?: CellLabels): string; //# sourceMappingURL=tableColumns.d.ts.map