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