- Implemented Form301 component for displaying OSHA Form 301 equivalent, including employee and case information. - Created Osha component to manage OSHA recordkeeping, including tabs for 300 Log, 300A Summary, Hours & rates, and Submit to OSHA. - Added functionality for printing and downloading CSV files for OSHA submissions. - Integrated loading and error handling states for data fetching.
16 lines
746 B
TypeScript
16 lines
746 B
TypeScript
type Cell = string | number | null | undefined
|
|
|
|
/**
|
|
* RFC 4180 CSV. By default starts with a BOM so Excel opens UTF-8 correctly (`bom: false` for machine
|
|
* uploads such as OSHA's ITA). Cells a spreadsheet would treat as a formula are prefixed with an
|
|
* apostrophe (CSV injection).
|
|
*/
|
|
export function toCsv(header: string[], rows: Cell[][], { bom = true }: { bom?: boolean } = {}): string {
|
|
const cell = (value: Cell) => {
|
|
let text = value === null || value === undefined ? '' : String(value)
|
|
if (/^[=+\-@\t\r]/.test(text)) text = `'${text}`
|
|
return /[",\r\n]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text
|
|
}
|
|
return (bom ? '\uFEFF' : '') + [header, ...rows].map((row) => row.map(cell).join(',')).join('\r\n') + '\r\n'
|
|
}
|