Save Document Form (components/Editor/save-document-form.tsx)¶
Overview¶
A modal form component that handles document saving functionality, featuring input fields for document metadata, status selection, and session storage integration.
Features¶
- Modal dialog interface
- Document name input
- Optional client field
- Status selection dropdown
- Form validation
- Session storage integration
- Responsive design
- Animated button states
- Form state management
Implementation¶
Props Interface¶
interface SaveDocumentFormProps {
handleExportChange: (value: boolean) => void;
handleIsOpen: (value: boolean) => void;
}
State Management¶
const [isOpen, setIsOpen] = useState(false);
const [documentName, setDocumentName] = useState('');
const [clientName, setClientName] = useState('');
const [status, setStatus] = useState('');
Form Handling¶
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
sessionStorage.setItem('inputtedDocumentName', documentName);
sessionStorage.setItem('inputtedClientName', clientName);
sessionStorage.setItem('inputtedStatus', status);
handleExportChange(true);
setIsOpen(false);
};
Component Structure¶
<Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild>
<Button className="save-button">
<Save className="mr-2 h-4 w-4" />
Save
</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Save Document</DialogTitle>
</DialogHeader>
<form onSubmit={handleSubmit} className="space-y-4">
{/* Document Name Input */}
<div className="space-y-2">
<Label htmlFor="documentName">Document Name</Label>
<Input
id="documentName"
value={documentName}
onChange={(e) => setDocumentName(e.target.value)}
required
/>
</div>
{/* Client Name Input */}
<div className="space-y-2">
<Label htmlFor="client">Client (Optional)</Label>
<Input
id="client"
value={clientName}
onChange={(e) => setClientName(e.target.value)}
/>
</div>
{/* Status Selection */}
<div className="space-y-2">
<Label htmlFor="status">Status</Label>
<Select value={status} onValueChange={setStatus}>
<SelectTrigger id="status">
<SelectValue placeholder="Select status" />
</SelectTrigger>
<SelectContent>
<SelectItem value="in_progress">In Progress</SelectItem>
<SelectItem value="completed">Completed</SelectItem>
</SelectContent>
</Select>
</div>
<Button type="submit">Save Document</Button>
</form>
</DialogContent>
</Dialog>
Styling¶
- Uses shadcn/ui components
- Implements responsive design
- Features hover animations
- Includes button shadows
- Maintains consistent spacing
- Supports dark/light modes
- Uses custom color scheme
Dependencies¶
import { useState } from 'react'
import { useSession } from 'next-auth/react'
import { Save } from 'lucide-react'
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Select } from "@/components/ui/select"
import { Dialog } from "@/components/ui/dialog"
Components Using This¶
Storage Integration¶
- Uses session storage for form data
- Stores document name
- Preserves client information
- Maintains status selection
- Enables form recovery
Form Fields¶
- Document Name (required)
- Client Name (optional)
- Status Selection
- In Progress
- Completed
Notes¶
- Implements form validation
- Handles modal state
- Uses Next.js authentication
- Features clean UI design
- Supports keyboard navigation
- Includes error handling
- Maintains form state
- Provides visual feedback