mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 17:51:12 -05:00
116 lines
4.4 KiB
TypeScript
116 lines
4.4 KiB
TypeScript
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog';
|
|
import { Button } from '@/components/ui/button';
|
|
import { Badge } from '@/components/ui/badge';
|
|
import { Edit, CheckCircle, XCircle, Clock } from 'lucide-react';
|
|
import type { SubmissionItemWithDeps } from '@/lib/submissionItemsService';
|
|
|
|
interface ItemSelectorDialogProps {
|
|
items: SubmissionItemWithDeps[];
|
|
open: boolean;
|
|
onOpenChange: (open: boolean) => void;
|
|
onSelectItem: (item: SubmissionItemWithDeps) => void;
|
|
onBulkEdit?: () => void;
|
|
}
|
|
|
|
export function ItemSelectorDialog({
|
|
items,
|
|
open,
|
|
onOpenChange,
|
|
onSelectItem,
|
|
onBulkEdit
|
|
}: ItemSelectorDialogProps) {
|
|
const getStatusIcon = (status: string) => {
|
|
switch (status) {
|
|
case 'approved':
|
|
return <CheckCircle className="h-4 w-4 text-green-600" />;
|
|
case 'rejected':
|
|
return <XCircle className="h-4 w-4 text-red-600" />;
|
|
default:
|
|
return <Clock className="h-4 w-4 text-yellow-600" />;
|
|
}
|
|
};
|
|
|
|
const getStatusColor = (status: string) => {
|
|
switch (status) {
|
|
case 'approved':
|
|
return 'bg-green-100 text-green-800 border-green-200';
|
|
case 'rejected':
|
|
return 'bg-red-100 text-red-800 border-red-200';
|
|
case 'pending':
|
|
return 'bg-yellow-100 text-yellow-800 border-yellow-200';
|
|
default:
|
|
return 'bg-gray-100 text-gray-800 border-gray-200';
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
<DialogContent className="max-w-2xl max-h-[80vh] overflow-y-auto">
|
|
<DialogHeader>
|
|
<DialogTitle className="flex items-center gap-2">
|
|
<Edit className="w-5 h-5" />
|
|
Select Item to Edit
|
|
</DialogTitle>
|
|
<DialogDescription>
|
|
This submission contains {items.length} items. Choose which one to edit, or edit all at once.
|
|
</DialogDescription>
|
|
</DialogHeader>
|
|
|
|
<div className="space-y-3 mt-4">
|
|
{/* Bulk Edit Option */}
|
|
{onBulkEdit && items.length > 1 && (
|
|
<Button
|
|
variant="outline"
|
|
className="w-full justify-start h-auto py-4 border-2 border-primary/20 hover:border-primary/40"
|
|
onClick={onBulkEdit}
|
|
>
|
|
<Edit className="mr-3 h-5 w-5 text-primary" />
|
|
<div className="flex flex-col items-start">
|
|
<span className="font-semibold">Edit All Items ({items.length})</span>
|
|
<span className="text-xs text-muted-foreground">Use tabbed interface to edit multiple items</span>
|
|
</div>
|
|
</Button>
|
|
)}
|
|
|
|
{/* Individual Items */}
|
|
{items.map((item) => (
|
|
<Button
|
|
key={item.id}
|
|
variant="outline"
|
|
className="w-full justify-start h-auto py-4 hover:bg-accent"
|
|
onClick={() => onSelectItem(item)}
|
|
>
|
|
<div className="flex items-center justify-between w-full">
|
|
<div className="flex items-center gap-3">
|
|
<Edit className="h-4 w-4 text-muted-foreground flex-shrink-0" />
|
|
<div className="flex flex-col items-start">
|
|
<span className="font-medium capitalize">
|
|
{item.item_type.replace('_', ' ')}
|
|
</span>
|
|
{typeof item.item_data === 'object' && item.item_data !== null && !Array.isArray(item.item_data) && 'name' in item.item_data && (
|
|
<span className="text-sm text-muted-foreground">
|
|
{String((item.item_data as Record<string, unknown>).name)}
|
|
</span>
|
|
)}
|
|
{item.dependencies && item.dependencies.length > 0 && (
|
|
<span className="text-xs text-muted-foreground mt-1">
|
|
Depends on {item.dependencies.length} item(s)
|
|
</span>
|
|
)}
|
|
</div>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
{getStatusIcon(item.status)}
|
|
<Badge variant="outline" className={getStatusColor(item.status)}>
|
|
{item.status}
|
|
</Badge>
|
|
</div>
|
|
</div>
|
|
</Button>
|
|
))}
|
|
</div>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
}
|