import { Badge } from '@/components/ui/badge'; import { CheckCircle2, Clock, XCircle, ChevronRight } from 'lucide-react'; import { SubmissionItemWithDeps } from '@/lib/submissionItemsService'; import { cn } from '@/lib/utils'; interface DependencyTreeViewProps { items: SubmissionItemWithDeps[]; } export function DependencyTreeView({ items }: DependencyTreeViewProps) { // Build tree structure - root items (no depends_on) const rootItems = items.filter(item => !item.depends_on); const getStatusIcon = (status: string) => { switch (status) { case 'approved': return ; case 'rejected': return ; case 'pending': default: return ; } }; const getItemLabel = (item: SubmissionItemWithDeps): string => { const data = typeof item.item_data === 'object' && item.item_data !== null && !Array.isArray(item.item_data) ? item.item_data as Record : {}; const name = 'name' in data && typeof data.name === 'string' ? data.name : 'Unnamed'; const type = item.item_type.replace('_', ' '); return `${name} (${type})`; }; const renderItem = (item: SubmissionItemWithDeps, level: number = 0) => { const dependents = items.filter(i => i.depends_on === item.id); const hasChildren = dependents.length > 0; return (
0 && "ml-6 border-l-2 border-border pl-4")}>
{level > 0 && } {getStatusIcon(item.status)} {getItemLabel(item)} {item.status} {item.depends_on && ( depends on parent )}
{hasChildren && dependents.map(dep => renderItem(dep, level + 1))}
); }; if (items.length <= 1) { return null; // Don't show tree for single items } return (
Submission Items ({items.length}) Composite Submission
{rootItems.map(item => renderItem(item))}
); }