// ======================================== // QueueActions Component // ======================================== // Queue operations with direct action buttons (no dropdown menu) import { useState } from 'react'; import { useIntl } from 'react-intl'; import { Play, Pause, Trash2, Merge, GitBranch, Loader2 } from 'lucide-react'; import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogAction, AlertDialogCancel, } from '@/components/ui/AlertDialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/Dialog'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { Checkbox } from '@/components/ui/Checkbox'; import { cn } from '@/lib/utils'; import type { IssueQueue, QueueItem } from '@/lib/api'; // ========== Types ========== export interface QueueActionsProps { queue: IssueQueue; queueId?: string; isActive?: boolean; onActivate?: (queueId: string) => void; onDeactivate?: () => void; onDelete?: (queueId: string) => void; onMerge?: (sourceId: string, targetId: string) => void; onSplit?: (sourceQueueId: string, itemIds: string[]) => void; isActivating?: boolean; isDeactivating?: boolean; isDeleting?: boolean; isMerging?: boolean; isSplitting?: boolean; } // ========== Component ========== export function QueueActions({ queue, queueId: queueIdProp, isActive = false, onActivate, onDeactivate, onDelete, onMerge, onSplit, isActivating = false, isDeactivating = false, isDeleting = false, isMerging = false, isSplitting = false, }: QueueActionsProps) { const { formatMessage } = useIntl(); const [isDeleteOpen, setIsDeleteOpen] = useState(false); const [isMergeOpen, setIsMergeOpen] = useState(false); const [isSplitOpen, setIsSplitOpen] = useState(false); const [mergeTargetId, setMergeTargetId] = useState(''); const [selectedItemIds, setSelectedItemIds] = useState([]); const queueId = queueIdProp; // Get all items from grouped_items for split dialog const allItems: QueueItem[] = Object.values(queue.grouped_items || {}).flat(); const handleDelete = () => { if (!queueId) return; onDelete?.(queueId); setIsDeleteOpen(false); }; const handleMerge = () => { if (mergeTargetId.trim()) { if (!queueId) return; onMerge?.(queueId, mergeTargetId.trim()); setIsMergeOpen(false); setMergeTargetId(''); } }; const handleSplit = () => { if (selectedItemIds.length > 0 && selectedItemIds.length < allItems.length) { if (!queueId) return; onSplit?.(queueId, selectedItemIds); setIsSplitOpen(false); setSelectedItemIds([]); } }; const toggleItemSelection = (itemId: string) => { setSelectedItemIds(prev => prev.includes(itemId) ? prev.filter(id => id !== itemId) : [...prev, itemId] ); }; const selectAll = () => { setSelectedItemIds(allItems.map(item => item.item_id)); }; const clearAll = () => { setSelectedItemIds([]); }; // Calculate item count const totalItems = (queue.tasks?.length || 0) + (queue.solutions?.length || 0); const canSplit = totalItems > 1; return ( <> {/* Direct action buttons */}
{/* Activate/Deactivate button */} {!isActive && onActivate && ( )} {isActive && onDeactivate && ( )} {/* Merge button */} {/* Split button - only show if more than 1 item */} {canSplit && ( )} {/* Delete button */}
{/* Delete Confirmation Dialog */} {formatMessage({ id: 'issues.queue.deleteDialog.title' })} {formatMessage({ id: 'issues.queue.deleteDialog.description' })} {formatMessage({ id: 'common.actions.cancel' })} {isDeleting ? ( <> {formatMessage({ id: 'common.actions.deleting' })} ) : ( formatMessage({ id: 'issues.queue.actions.delete' }) )} {/* Merge Dialog */} {formatMessage({ id: 'issues.queue.mergeDialog.title' })}
setMergeTargetId(e.target.value)} placeholder={formatMessage({ id: 'issues.queue.mergeDialog.targetQueuePlaceholder' })} className="mt-1" />
{/* Split Dialog */} {formatMessage({ id: 'issues.queue.splitDialog.title' })}
{/* Selection info */}
{formatMessage({ id: 'issues.queue.splitDialog.selected' }, { count: selectedItemIds.length, total: allItems.length })}
{/* Items list with checkboxes */}
{allItems.map((item) => { const isSelected = selectedItemIds.includes(item.item_id); return (
toggleItemSelection(item.item_id)} > toggleItemSelection(item.item_id)} /> {item.item_id} {formatMessage({ id: `issues.queue.status.${item.status}` })}
); })}
{/* Validation message */} {selectedItemIds.length === 0 && (

{formatMessage({ id: 'issues.queue.splitDialog.noSelection' })}

)} {selectedItemIds.length >= allItems.length && (

{formatMessage({ id: 'issues.queue.splitDialog.cannotSplitAll' })}

)}
); } export default QueueActions;