diff --git a/auto-claude-ui/src/renderer/App.tsx b/auto-claude-ui/src/renderer/App.tsx index 60968df9..4a586030 100644 --- a/auto-claude-ui/src/renderer/App.tsx +++ b/auto-claude-ui/src/renderer/App.tsx @@ -85,6 +85,7 @@ export function App() { const [settingsInitialProjectSection, setSettingsInitialProjectSection] = useState(undefined); const [activeView, setActiveView] = useState('kanban'); const [isOnboardingWizardOpen, setIsOnboardingWizardOpen] = useState(false); + const [isRefreshingTasks, setIsRefreshingTasks] = useState(false); // Initialize dialog state const [showInitDialog, setShowInitDialog] = useState(false); @@ -373,6 +374,17 @@ export function App() { setSelectedTask(task); }; + const handleRefreshTasks = async () => { + const currentProjectId = activeProjectId || selectedProjectId; + if (!currentProjectId) return; + setIsRefreshingTasks(true); + try { + await loadTasks(currentProjectId); + } finally { + setIsRefreshingTasks(false); + } + }; + const handleCloseTaskDetail = () => { setSelectedTask(null); }; @@ -626,6 +638,8 @@ export function App() { tasks={tasks} onTaskClick={handleTaskClick} onNewTaskClick={() => setIsNewTaskDialogOpen(true)} + onRefresh={handleRefreshTasks} + isRefreshing={isRefreshingTasks} /> )} {/* TerminalGrid is always mounted but hidden when not active to preserve terminal state */} diff --git a/auto-claude-ui/src/renderer/components/KanbanBoard.tsx b/auto-claude-ui/src/renderer/components/KanbanBoard.tsx index 2a905c6b..b05d0344 100644 --- a/auto-claude-ui/src/renderer/components/KanbanBoard.tsx +++ b/auto-claude-ui/src/renderer/components/KanbanBoard.tsx @@ -17,7 +17,7 @@ import { sortableKeyboardCoordinates, verticalListSortingStrategy } from '@dnd-kit/sortable'; -import { Plus, Inbox, Loader2, Eye, CheckCircle2, Archive } from 'lucide-react'; +import { Plus, Inbox, Loader2, Eye, CheckCircle2, Archive, RefreshCw } from 'lucide-react'; import { ScrollArea } from './ui/scroll-area'; import { Button } from './ui/button'; import { Checkbox } from './ui/checkbox'; @@ -33,6 +33,8 @@ interface KanbanBoardProps { tasks: Task[]; onTaskClick: (task: Task) => void; onNewTaskClick?: () => void; + onRefresh?: () => void; + isRefreshing?: boolean; } interface DroppableColumnProps { @@ -209,7 +211,7 @@ function DroppableColumn({ status, tasks, onTaskClick, isOver, onAddClick, onArc ); } -export function KanbanBoard({ tasks, onTaskClick, onNewTaskClick }: KanbanBoardProps) { +export function KanbanBoard({ tasks, onTaskClick, onNewTaskClick, onRefresh, isRefreshing }: KanbanBoardProps) { const [activeTask, setActiveTask] = useState(null); const [overColumnId, setOverColumnId] = useState(null); const [showArchived, setShowArchived] = useState(false); @@ -337,8 +339,22 @@ export function KanbanBoard({ tasks, onTaskClick, onNewTaskClick }: KanbanBoardP return (
{/* Kanban header with filters */} -
+
+ {onRefresh && ( + + )} +
+