unzip frontend

This commit is contained in:
2025-08-16 14:41:12 +02:00
parent b60af66732
commit 598774bca6
87 changed files with 9676 additions and 0 deletions
+200
View File
@@ -0,0 +1,200 @@
"use client"
import type React from "react"
import { useState } from "react"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Textarea } from "@/components/ui/textarea"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog"
import type { Client } from "@/types/business"
interface ClientFormProps {
client?: Client
open: boolean
onOpenChange: (open: boolean) => void
onSubmit: (client: Omit<Client, "id">) => void
}
const paymentTerms = ["Net 15", "Net 30", "Net 45", "Net 60", "COD", "Prepaid", "Custom"]
export function ClientForm({ client, open, onOpenChange, onSubmit }: ClientFormProps) {
const [formData, setFormData] = useState({
name: client?.name || "",
email: client?.email || "",
phone: client?.phone || "",
address: client?.address || "",
creditLimit: client?.creditLimit || 0,
paymentTerms: client?.paymentTerms || "Net 30",
notes: client?.notes || "",
contactPerson: client?.contactPerson || "",
businessType: client?.businessType || "",
})
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault()
onSubmit({
...formData,
outstandingAmount: client?.outstandingAmount || 0,
})
onOpenChange(false)
// Reset form if it's a new client
if (!client) {
setFormData({
name: "",
email: "",
phone: "",
address: "",
creditLimit: 0,
paymentTerms: "Net 30",
notes: "",
contactPerson: "",
businessType: "",
})
}
}
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="sm:max-w-[600px] max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle>{client ? "Edit Client" : "Add New Client"}</DialogTitle>
<DialogDescription>
{client ? "Update client information" : "Enter the details for the new client"}
</DialogDescription>
</DialogHeader>
<form onSubmit={handleSubmit} className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2">
<Label htmlFor="name">Business Name *</Label>
<Input
id="name"
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
placeholder="Enter business name"
required
/>
</div>
<div className="space-y-2">
<Label htmlFor="contactPerson">Contact Person</Label>
<Input
id="contactPerson"
value={formData.contactPerson}
onChange={(e) => setFormData({ ...formData, contactPerson: e.target.value })}
placeholder="Primary contact name"
/>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2">
<Label htmlFor="email">Email</Label>
<Input
id="email"
type="email"
value={formData.email}
onChange={(e) => setFormData({ ...formData, email: e.target.value })}
placeholder="client@example.com"
/>
</div>
<div className="space-y-2">
<Label htmlFor="phone">Phone</Label>
<Input
id="phone"
value={formData.phone}
onChange={(e) => setFormData({ ...formData, phone: e.target.value })}
placeholder="(555) 123-4567"
/>
</div>
</div>
<div className="space-y-2">
<Label htmlFor="address">Address</Label>
<Textarea
id="address"
value={formData.address}
onChange={(e) => setFormData({ ...formData, address: e.target.value })}
placeholder="Business address"
rows={2}
/>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2">
<Label htmlFor="businessType">Business Type</Label>
<Input
id="businessType"
value={formData.businessType}
onChange={(e) => setFormData({ ...formData, businessType: e.target.value })}
placeholder="e.g., Retail, Electronics Store"
/>
</div>
<div className="space-y-2">
<Label htmlFor="paymentTerms">Payment Terms</Label>
<Select
value={formData.paymentTerms}
onValueChange={(value) => setFormData({ ...formData, paymentTerms: value })}
>
<SelectTrigger>
<SelectValue placeholder="Select payment terms" />
</SelectTrigger>
<SelectContent>
{paymentTerms.map((term) => (
<SelectItem key={term} value={term}>
{term}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
<div className="space-y-2">
<Label htmlFor="creditLimit">Credit Limit ($)</Label>
<Input
id="creditLimit"
type="number"
min="0"
step="100"
value={formData.creditLimit}
onChange={(e) => setFormData({ ...formData, creditLimit: Number.parseFloat(e.target.value) || 0 })}
placeholder="0"
/>
<p className="text-xs text-muted-foreground">Maximum amount this client can owe at any time</p>
</div>
<div className="space-y-2">
<Label htmlFor="notes">Notes</Label>
<Textarea
id="notes"
value={formData.notes}
onChange={(e) => setFormData({ ...formData, notes: e.target.value })}
placeholder="Additional notes about this client"
rows={3}
/>
</div>
<DialogFooter>
<Button type="button" variant="outline" onClick={() => onOpenChange(false)}>
Cancel
</Button>
<Button type="submit">{client ? "Update Client" : "Add Client"}</Button>
</DialogFooter>
</form>
</DialogContent>
</Dialog>
)
}