Add optional export filename, tests for post-implement features

Add optional filename field to export dialog with automatic .json
extension handling. Extract resolveFilename() for testability. Add
tests for includeHistory flag, bundleToJson, and filename resolution.
Add export format compatibility note to CLAUDE.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-03-27 15:42:50 +01:00
parent 209df13c32
commit f4355a8675
6 changed files with 105 additions and 8 deletions

View File

@@ -2,10 +2,11 @@ import { Check, ClipboardCopy, Download, X } from "lucide-react";
import { useCallback, useState } from "react";
import { Button } from "./ui/button.js";
import { Dialog } from "./ui/dialog.js";
import { Input } from "./ui/input.js";
interface ExportMethodDialogProps {
open: boolean;
onDownload: (includeHistory: boolean) => void;
onDownload: (includeHistory: boolean, filename: string) => void;
onCopyToClipboard: (includeHistory: boolean) => void;
onClose: () => void;
}
@@ -17,10 +18,12 @@ export function ExportMethodDialog({
onClose,
}: Readonly<ExportMethodDialogProps>) {
const [includeHistory, setIncludeHistory] = useState(false);
const [filename, setFilename] = useState("");
const [copied, setCopied] = useState(false);
const handleClose = useCallback(() => {
setIncludeHistory(false);
setFilename("");
setCopied(false);
onClose();
}, [onClose]);
@@ -39,6 +42,14 @@ export function ExportMethodDialog({
<X className="h-4 w-4" />
</Button>
</div>
<div className="mb-3">
<Input
type="text"
value={filename}
onChange={(e) => setFilename(e.target.value)}
placeholder="Filename (optional)"
/>
</div>
<label className="mb-4 flex items-center gap-2 text-sm">
<input
type="checkbox"
@@ -53,7 +64,7 @@ export function ExportMethodDialog({
type="button"
className="flex items-center gap-3 rounded-lg border border-border px-4 py-3 text-left text-foreground text-sm hover:bg-hover-neutral-bg"
onClick={() => {
onDownload(includeHistory);
onDownload(includeHistory, filename);
handleClose();
}}
>