"use client"; import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { ChevronDownIcon, ChevronUpIcon, PlusIcon, TrashIcon, CopyIcon, ArrowUpIcon, ArrowDownIcon } from "@/components/icons"; import { FormField } from "./FormField"; interface DynamicArrayProps { items: T[]; onItemsChange: (items: T[]) => void; renderItem: (item: T, index: number, onUpdate: (item: T) => void, onDelete: () => void) => React.ReactNode; addItemLabel?: string; emptyStateMessage?: string; allowReorder?: boolean; allowDuplicate?: boolean; maxItems?: number; className?: string; } export function DynamicArray({ items, onItemsChange, renderItem, addItemLabel = "Add Item", emptyStateMessage = "No items added yet", allowReorder = true, allowDuplicate = true, maxItems, className = "", }: DynamicArrayProps) { const [expandedItems, setExpandedItems] = useState>(new Set()); const addItem = () => { if (maxItems && items.length >= maxItems) return; const newItem = {} as T; onItemsChange([...items, newItem]); }; const updateItem = (index: number, updatedItem: T) => { const newItems = [...items]; newItems[index] = updatedItem; onItemsChange(newItems); }; const deleteItem = (index: number) => { const newItems = items.filter((_, i) => i !== index); onItemsChange(newItems); }; const duplicateItem = (index: number) => { if (maxItems && items.length >= maxItems) return; const duplicatedItem = { ...items[index] }; const newItems = [...items]; newItems.splice(index + 1, 0, duplicatedItem); onItemsChange(newItems); }; const moveItem = (index: number, direction: 'up' | 'down') => { const newItems = [...items]; const targetIndex = direction === 'up' ? index - 1 : index + 1; if (targetIndex < 0 || targetIndex >= items.length) return; [newItems[index], newItems[targetIndex]] = [newItems[targetIndex], newItems[index]]; onItemsChange(newItems); }; const toggleExpanded = (index: number) => { const newExpanded = new Set(expandedItems); if (newExpanded.has(index)) { newExpanded.delete(index); } else { newExpanded.add(index); } setExpandedItems(newExpanded); }; return (

Items ({items.length})

{items.length === 0 ? (

{emptyStateMessage}

) : (
{items.map((item, index) => (
Item {index + 1}
{allowReorder && ( <> )} {allowDuplicate && ( )}
{renderItem(item, index, (updatedItem) => updateItem(index, updatedItem), () => deleteItem(index))}
))}
)}
); }