41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import { clsx, type ClassValue } from 'clsx';
|
|
import { twMerge } from 'tailwind-merge';
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|
|
|
|
/**
|
|
* Fecha de HOY en horario local (YYYY-MM-DD).
|
|
* No usar `new Date().toISOString().split('T')[0]`: convierte a UTC y, en la
|
|
* zona de la clínica (Tijuana, UTC-7/-8), a partir de las 16/17 h devuelve el
|
|
* día siguiente, con lo que los módulos mostraban "sin datos del día".
|
|
*/
|
|
export function todayLocal(d: Date = new Date()): string {
|
|
const y = d.getFullYear();
|
|
const m = String(d.getMonth() + 1).padStart(2, '0');
|
|
const day = String(d.getDate()).padStart(2, '0');
|
|
return `${y}-${m}-${day}`;
|
|
}
|
|
|
|
type CsvCell = string | number | boolean | null | undefined;
|
|
|
|
/**
|
|
* Descarga un CSV (UTF-8 con BOM para que Excel respete acentos).
|
|
* Cada fila es un arreglo de celdas; se escapan comillas automáticamente.
|
|
*/
|
|
export function downloadCsv(filename: string, rows: CsvCell[][]) {
|
|
const csv = rows
|
|
.map((row) => row.map((cell) => `"${String(cell ?? '').replace(/"/g, '""')}"`).join(','))
|
|
.join('\r\n');
|
|
const blob = new Blob(['\uFEFF' + csv], { type: 'text/csv;charset=utf-8;' });
|
|
const url = URL.createObjectURL(blob);
|
|
const link = document.createElement('a');
|
|
link.href = url;
|
|
link.download = filename;
|
|
document.body.appendChild(link);
|
|
link.click();
|
|
document.body.removeChild(link);
|
|
URL.revokeObjectURL(url);
|
|
}
|