Skip to content

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