- Refactored theme imports in `preferences.ts` and `ThemeSelector.tsx` to use centralized `theme-config`. - Added new CSS variables for special cards in `globals.css` to improve theme consistency. - Enhanced `Header` and `TaskCard` components with theme dropdown functionality for better user experience. - Updated `ThemeProvider` to support cycling through dark themes, improving theme selection flexibility. - Cleaned up unused imports and streamlined component structures for better maintainability.
88 lines
3.6 KiB
TypeScript
88 lines
3.6 KiB
TypeScript
'use client';
|
|
|
|
import { Task } from '@/lib/types';
|
|
import { Card } from '@/components/ui/Card';
|
|
import { TaskCard } from '@/components/ui';
|
|
import { useTasksContext } from '@/contexts/TasksContext';
|
|
import Link from 'next/link';
|
|
|
|
interface RecentTasksProps {
|
|
tasks: Task[];
|
|
}
|
|
|
|
export function RecentTasks({ tasks }: RecentTasksProps) {
|
|
const { tags: availableTags } = useTasksContext();
|
|
|
|
// Prendre les 5 tâches les plus récentes (créées ou modifiées)
|
|
const recentTasks = tasks
|
|
.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())
|
|
.slice(0, 5);
|
|
|
|
|
|
return (
|
|
<Card className="p-6 mt-8">
|
|
<div className="flex items-center justify-between mb-4">
|
|
<h3 className="text-lg font-semibold">Tâches Récentes</h3>
|
|
<Link href="/kanban">
|
|
<button className="text-sm text-[var(--primary)] hover:underline">
|
|
Voir toutes
|
|
</button>
|
|
</Link>
|
|
</div>
|
|
|
|
{recentTasks.length === 0 ? (
|
|
<div className="text-center py-8 text-[var(--muted-foreground)]">
|
|
<svg className="w-12 h-12 mx-auto mb-3 opacity-50" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v10a2 2 0 002 2h8a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
|
|
</svg>
|
|
<p>Aucune tâche disponible</p>
|
|
<p className="text-sm">Créez votre première tâche pour commencer</p>
|
|
</div>
|
|
) : (
|
|
<div className="space-y-3">
|
|
{recentTasks.map((task) => (
|
|
<div key={task.id} className="relative group">
|
|
<TaskCard
|
|
variant="detailed"
|
|
source={task.source || 'manual'}
|
|
title={task.title}
|
|
description={task.description}
|
|
status={task.status}
|
|
priority={task.priority as 'low' | 'medium' | 'high' | 'urgent'}
|
|
tags={task.tags || []}
|
|
dueDate={task.dueDate}
|
|
completedAt={task.completedAt}
|
|
jiraKey={task.jiraKey}
|
|
jiraProject={task.jiraProject}
|
|
jiraType={task.jiraType}
|
|
tfsPullRequestId={task.tfsPullRequestId}
|
|
tfsProject={task.tfsProject}
|
|
tfsRepository={task.tfsRepository}
|
|
availableTags={availableTags}
|
|
fontSize="small"
|
|
onTitleClick={() => {
|
|
// Navigation vers le kanban avec la tâche sélectionnée
|
|
window.location.href = `/kanban?taskId=${task.id}`;
|
|
}}
|
|
/>
|
|
|
|
{/* Overlay avec lien vers le kanban */}
|
|
<Link
|
|
href={`/kanban?taskId=${task.id}`}
|
|
className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-200 bg-[var(--primary)]/5 rounded-lg flex items-center justify-center"
|
|
title="Ouvrir dans le Kanban"
|
|
>
|
|
<div className="bg-[var(--primary)]/20 backdrop-blur-sm rounded-full p-2 border border-[var(--primary)]/30">
|
|
<svg className="w-4 h-4 text-[var(--primary)]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
|
|
</svg>
|
|
</div>
|
|
</Link>
|
|
</div>
|
|
))}
|
|
</div>
|
|
)}
|
|
</Card>
|
|
);
|
|
}
|