- {/* Kanban header with refresh button and expand all */}
- {(onRefresh || collapsedColumnCount >= 3) && (
+ {/* Kanban header with expand all button */}
+ {collapsedColumnCount >= 3 && (
{/* Expand All button - appears when 3+ columns are collapsed */}
- {collapsedColumnCount >= 3 && (
-
- )}
-
-
- {onRefresh && (
-
- )}
+
)}
@@ -1488,9 +1434,6 @@ export function KanbanBoard({ tasks, onTaskClick, onNewTaskClick, onRefresh, isR
} : undefined}
onArchiveAll={status === 'done' ? handleArchiveAll : undefined}
maxParallelTasks={status === 'in_progress' ? maxParallelTasks : undefined}
- archivedCount={status === 'done' ? archivedCount : undefined}
- showArchived={status === 'done' ? showArchived : undefined}
- onToggleArchived={status === 'done' ? toggleShowArchived : undefined}
selectedTaskIds={selectedTaskIds}
onSelectAll={() => selectAllTasks(status)}
onDeselectAll={deselectAllTasks}
diff --git a/apps/frontend/src/renderer/components/ProjectTabBar.tsx b/apps/frontend/src/renderer/components/ProjectTabBar.tsx
index d76b34f463..0d85171f25 100644
--- a/apps/frontend/src/renderer/components/ProjectTabBar.tsx
+++ b/apps/frontend/src/renderer/components/ProjectTabBar.tsx
@@ -1,8 +1,9 @@
import { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
-import { Plus } from 'lucide-react';
+import { Plus, RefreshCw, Archive } from 'lucide-react';
import { cn } from '../lib/utils';
import { Button } from './ui/button';
+import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';
import { SortableProjectTab } from './SortableProjectTab';
import { UsageIndicator } from './UsageIndicator';
import { AuthStatusIndicator } from './AuthStatusIndicator';
@@ -15,8 +16,12 @@ interface ProjectTabBarProps {
onProjectClose: (projectId: string) => void;
onAddProject: () => void;
className?: string;
- // Control props for active tab
- onSettingsClick?: () => void;
+ // Kanban board controls (only displayed when Kanban view is active)
+ onRefresh?: () => void;
+ isRefreshing?: boolean;
+ showArchived?: boolean;
+ onToggleArchived?: () => void;
+ archivedCount?: number;
}
export function ProjectTabBar({
@@ -26,9 +31,13 @@ export function ProjectTabBar({
onProjectClose,
onAddProject,
className,
- onSettingsClick
+ onRefresh,
+ isRefreshing = false,
+ showArchived = false,
+ onToggleArchived,
+ archivedCount = 0
}: ProjectTabBarProps) {
- const { t } = useTranslation('common');
+ const { t } = useTranslation(['common', 'tasks']);
// Keyboard shortcuts for tab navigation
useEffect(() => {
@@ -86,11 +95,12 @@ export function ProjectTabBar({
return (
-
+ {/* Left side: Project tabs + Add Project button */}
+
{projects.map((project, index) => {
const isActiveTab = activeProjectId === project.id;
return (
@@ -105,25 +115,83 @@ export function ProjectTabBar({
e.stopPropagation();
onProjectClose(project.id);
}}
- // Pass control props only for active tab
- onSettingsClick={isActiveTab ? onSettingsClick : undefined}
/>
);
})}
+
+ {/* Add project button with tooltip - stays next to tabs */}
+
+
+
+
+
+ {t('common:projectTab.addNewProject')}
+
+
-
+ {/* Right side: Auth + Usage indicators + Refresh + Show Archived - anchored to right */}
+
-
+
+ {/* Refresh button */}
+ {onRefresh && (
+
+
+
+
+
+ {t('common:projectTab.refreshTasks')}
+
+
+ )}
+
+ {/* Show Archived button */}
+ {onToggleArchived && archivedCount > 0 && (
+
+
+
+
+
+ {showArchived ? t('common:projectTab.hideArchived') : t('common:projectTab.showArchived')}
+
+
+ )}
);
diff --git a/apps/frontend/src/renderer/components/SortableProjectTab.tsx b/apps/frontend/src/renderer/components/SortableProjectTab.tsx
index d57cf1292c..2ca360d5ef 100644
--- a/apps/frontend/src/renderer/components/SortableProjectTab.tsx
+++ b/apps/frontend/src/renderer/components/SortableProjectTab.tsx
@@ -1,7 +1,6 @@
import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import { useTranslation } from 'react-i18next';
-import { Settings2 } from 'lucide-react';
import { cn } from '../lib/utils';
import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';
import type { Project } from '../../shared/types';
@@ -13,8 +12,6 @@ interface SortableProjectTabProps {
tabIndex: number;
onSelect: () => void;
onClose: (e: React.MouseEvent) => void;
- // Optional control props for active tab
- onSettingsClick?: () => void;
}
// Detect if running on macOS for keyboard shortcut display
@@ -27,8 +24,7 @@ export function SortableProjectTab({
canClose,
tabIndex,
onSelect,
- onClose,
- onSettingsClick
+ onClose
}: SortableProjectTabProps) {
const { t } = useTranslation('common');
// Build tooltip with keyboard shortcut hint (only for tabs 1-9)
@@ -112,39 +108,6 @@ export function SortableProjectTab({
- {/* Active tab controls - settings and archive, always accessible */}
- {isActive && (
-
- {/* Settings icon - responsive sizing */}
- {onSettingsClick && (
-
-
-
-
-
- {t('projectTab.settings')}
-
-
- )}
-
- )}
-
{canClose && (
diff --git a/apps/frontend/src/shared/i18n/locales/en/common.json b/apps/frontend/src/shared/i18n/locales/en/common.json
index 6a2f1d84f2..189821e99d 100644
--- a/apps/frontend/src/shared/i18n/locales/en/common.json
+++ b/apps/frontend/src/shared/i18n/locales/en/common.json
@@ -25,7 +25,9 @@
"hideArchivedTasks": "Hide archived tasks",
"closeTab": "Close tab",
"closeTabAriaLabel": "Close tab (removes project from app)",
- "addProjectAriaLabel": "Add project"
+ "addProjectAriaLabel": "Add project",
+ "refreshTasks": "Refresh tasks",
+ "addNewProject": "Add new project"
},
"accessibility": {
"deleteFeatureAriaLabel": "Delete feature",
diff --git a/apps/frontend/src/shared/i18n/locales/fr/common.json b/apps/frontend/src/shared/i18n/locales/fr/common.json
index 113736f227..a25b2f2f24 100644
--- a/apps/frontend/src/shared/i18n/locales/fr/common.json
+++ b/apps/frontend/src/shared/i18n/locales/fr/common.json
@@ -25,7 +25,9 @@
"hideArchivedTasks": "Masquer les tâches archivées",
"closeTab": "Fermer l'onglet",
"closeTabAriaLabel": "Fermer l'onglet (retire le projet de l'application)",
- "addProjectAriaLabel": "Ajouter un projet"
+ "addProjectAriaLabel": "Ajouter un projet",
+ "refreshTasks": "Actualiser les tâches",
+ "addNewProject": "Ajouter un nouveau projet"
},
"accessibility": {
"deleteFeatureAriaLabel": "Supprimer la fonctionnalité",
diff --git a/package-lock.json b/package-lock.json
index 31ab465ad8..c9dc697958 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "auto-claude",
- "version": "2.7.6-beta.6",
+ "version": "2.7.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "auto-claude",
- "version": "2.7.6-beta.6",
+ "version": "2.7.6",
"license": "AGPL-3.0",
"workspaces": [
"apps/*",
@@ -25,7 +25,7 @@
},
"apps/frontend": {
"name": "auto-claude-ui",
- "version": "2.7.6-beta.6",
+ "version": "2.7.6",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {