mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-03-20 08:33:52 +01:00
Add .oxfmtignore to skip generated bindings and wasm-pack output. Add npm format script, update DEVELOPMENT.md for Vite+ toolchain, and format all non-generated files with oxfmt. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import classNames from "classnames";
|
|
import Papa from "papaparse";
|
|
import { useMemo } from "react";
|
|
import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from "../core/Table";
|
|
|
|
interface Props {
|
|
text: string | null;
|
|
className?: string;
|
|
}
|
|
|
|
export function CsvViewer({ text, className }: Props) {
|
|
return (
|
|
<div className="overflow-auto h-full">
|
|
<CsvViewerInner text={text} className={className} />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export function CsvViewerInner({ text, className }: { text: string | null; className?: string }) {
|
|
const parsed = useMemo(() => {
|
|
if (text == null) return null;
|
|
return Papa.parse<Record<string, string>>(text, { header: true, skipEmptyLines: true });
|
|
}, [text]);
|
|
|
|
if (parsed === null) return null;
|
|
|
|
return (
|
|
<div className="overflow-auto h-full">
|
|
<Table className={classNames(className, "text-sm")}>
|
|
<TableHead>
|
|
<TableRow>
|
|
{parsed.meta.fields?.map((field) => (
|
|
<TableHeaderCell key={field}>{field}</TableHeaderCell>
|
|
))}
|
|
</TableRow>
|
|
</TableHead>
|
|
<TableBody>
|
|
{parsed.data.map((row, i) => (
|
|
// oxlint-disable-next-line react/no-array-index-key
|
|
<TableRow key={i}>
|
|
{parsed.meta.fields?.map((key) => (
|
|
<TableCell key={key}>{row[key] ?? ""}</TableCell>
|
|
))}
|
|
</TableRow>
|
|
))}
|
|
</TableBody>
|
|
</Table>
|
|
</div>
|
|
);
|
|
}
|