From 055b31bbfd839006f7fa575ab6cf231af8070adf Mon Sep 17 00:00:00 2001 From: AhmedHassan Date: Mon, 23 Feb 2026 04:06:33 +0200 Subject: [PATCH 1/3] feat: add unarchive button for archived tasks Add an "Unarchive" button on archived task cards so users can restore them directly. Includes the unarchiveTasks store action, ArchiveRestore icon, and i18n keys for both English and French. Co-Authored-By: Claude Opus 4.6 --- .../src/renderer/components/TaskCard.tsx | 35 +++++++++++++++++-- .../src/renderer/stores/task-store.ts | 30 ++++++++++++++++ .../src/shared/i18n/locales/en/tasks.json | 2 ++ .../src/shared/i18n/locales/fr/tasks.json | 2 ++ 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/renderer/components/TaskCard.tsx b/apps/frontend/src/renderer/components/TaskCard.tsx index 837b7df58f..6881267b0d 100644 --- a/apps/frontend/src/renderer/components/TaskCard.tsx +++ b/apps/frontend/src/renderer/components/TaskCard.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useRef, memo, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { Play, Square, Clock, Zap, Target, Shield, Gauge, Palette, FileCode, Bug, Wrench, Loader2, AlertTriangle, RotateCcw, Archive, GitPullRequest, MoreVertical } from 'lucide-react'; +import { Play, Square, Clock, Zap, Target, Shield, Gauge, Palette, FileCode, Bug, Wrench, Loader2, AlertTriangle, RotateCcw, Archive, ArchiveRestore, GitPullRequest, MoreVertical } from 'lucide-react'; import { Card, CardContent } from './ui/card'; import { Badge } from './ui/badge'; import { Button } from './ui/button'; @@ -31,7 +31,7 @@ import { JSON_ERROR_PREFIX, JSON_ERROR_TITLE_SUFFIX } from '../../shared/constants'; -import { stopTask, checkTaskRunning, recoverStuckTask, isIncompleteHumanReview, archiveTasks, hasRecentActivity, startTaskOrQueue } from '../stores/task-store'; +import { stopTask, checkTaskRunning, recoverStuckTask, isIncompleteHumanReview, archiveTasks, unarchiveTasks, hasRecentActivity, startTaskOrQueue } from '../stores/task-store'; import { useToast } from '../hooks/use-toast'; import type { Task, TaskCategory, ReviewReason, TaskStatus } from '../../shared/types'; @@ -265,6 +265,14 @@ export const TaskCard = memo(function TaskCard({ } }; + const handleUnarchive = async (e: React.MouseEvent) => { + e.stopPropagation(); + const result = await unarchiveTasks(task.projectId, [task.id]); + if (!result.success) { + console.error('[TaskCard] Failed to unarchive task:', task.id, result.error); + } + }; + const handleViewPR = (e: React.MouseEvent) => { e.stopPropagation(); if (task.metadata?.prUrl && window.electronAPI?.openExternal) { @@ -571,7 +579,17 @@ export const TaskCard = memo(function TaskCard({ )} - {!task.metadata?.archivedAt && ( + {task.metadata?.archivedAt ? ( + + ) : ( ) : task.status === 'done' && !task.metadata?.archivedAt ? (