diff --git a/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx b/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx index 6d3df186..08fe9001 100644 --- a/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx +++ b/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx @@ -1,4 +1,6 @@ -import { CheckCircle2, Circle, ExternalLink, Play, TrendingUp } from 'lucide-react'; +import { useState } from 'react'; +import { CheckCircle2, ChevronDown, ChevronUp, Circle, ExternalLink, Play, TrendingUp } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; import { TaskOutcomeBadge } from './TaskOutcomeBadge'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; @@ -7,6 +9,8 @@ import { Progress } from '../ui/progress'; import { ROADMAP_PRIORITY_COLORS } from '../../../shared/constants'; import type { PhaseCardProps } from './types'; +const INITIAL_VISIBLE_COUNT = 5; + export function PhaseCard({ phase, features, @@ -15,8 +19,13 @@ export function PhaseCard({ onConvertToSpec, onGoToTask, }: PhaseCardProps) { + const { t } = useTranslation('common'); + const [isExpanded, setIsExpanded] = useState(false); const completedCount = features.filter((f) => f.status === 'done').length; const progress = features.length > 0 ? (completedCount / features.length) * 100 : 0; + const visibleFeatures = isExpanded ? features : features.slice(0, INITIAL_VISIBLE_COUNT); + const hiddenCount = features.length - INITIAL_VISIBLE_COUNT; + const hasMoreFeatures = hiddenCount > 0; return ( @@ -87,13 +96,16 @@ export function PhaseCard({

Features ({features.length})

- {features.slice(0, 5).map((feature) => ( + {visibleFeatures.map((feature) => (
onFeatureSelect(feature)} + className="flex items-center justify-between p-2 rounded-md bg-muted/50 hover:bg-muted transition-colors" > -
+
+ {feature.taskOutcome ? ( @@ -140,10 +152,26 @@ export function PhaseCard({ )}
))} - {features.length > 5 && ( -
- +{features.length - 5} more features -
+ {hasMoreFeatures && ( + )}
diff --git a/apps/frontend/src/shared/i18n/locales/en/common.json b/apps/frontend/src/shared/i18n/locales/en/common.json index 09ce619f..8078a129 100644 --- a/apps/frontend/src/shared/i18n/locales/en/common.json +++ b/apps/frontend/src/shared/i18n/locales/en/common.json @@ -599,7 +599,10 @@ "roadmap": { "taskCompleted": "Completed", "taskDeleted": "Deleted", - "taskArchived": "Archived" + "taskArchived": "Archived", + "showMoreFeatures": "Show {{count}} more feature", + "showMoreFeatures_plural": "Show {{count}} more features", + "showLessFeatures": "Show less" }, "roadmapGeneration": { "progress": "Progress", diff --git a/apps/frontend/src/shared/i18n/locales/fr/common.json b/apps/frontend/src/shared/i18n/locales/fr/common.json index 1996b551..d2c452b7 100644 --- a/apps/frontend/src/shared/i18n/locales/fr/common.json +++ b/apps/frontend/src/shared/i18n/locales/fr/common.json @@ -599,7 +599,10 @@ "roadmap": { "taskCompleted": "Terminé", "taskDeleted": "Supprimé", - "taskArchived": "Archivé" + "taskArchived": "Archivé", + "showMoreFeatures": "Afficher {{count}} fonctionnalité supplémentaire", + "showMoreFeatures_plural": "Afficher {{count}} fonctionnalités supplémentaires", + "showLessFeatures": "Afficher moins" }, "roadmapGeneration": { "progress": "Progression",