import type { PBLIssueboard, PBLIssue } from '@/lib/pbl/types'; import { useI18n } from '@/lib/hooks/use-i18n'; interface IssueboardPanelProps { readonly issueboard: PBLIssueboard; } export function IssueboardPanel({ issueboard }: IssueboardPanelProps) { const { t } = useI18n(); const sortedIssues = [...issueboard.issues].sort((a, b) => a.index - b.index); const doneCount = sortedIssues.filter((i) => i.is_done).length; const totalCount = sortedIssues.length; const progressPercent = totalCount > 0 ? Math.round((doneCount / totalCount) * 100) : 0; return (
{/* Header */}

{t('pbl.issueboard.title')}

{doneCount}/{totalCount}
{/* Issue List */}
{sortedIssues.map((issue) => ( ))} {sortedIssues.length === 0 && (

{t('pbl.issueboard.noIssues')}

)}
); } function IssueCard({ issue }: { issue: PBLIssue }) { const { t } = useI18n(); const statusColor = issue.is_done ? 'border-green-500/50 bg-green-50 dark:bg-green-950/20' : issue.is_active ? 'border-primary bg-primary/5' : 'border-muted'; const statusLabel = issue.is_done ? t('pbl.issueboard.statusDone') : issue.is_active ? t('pbl.issueboard.statusActive') : t('pbl.issueboard.statusPending'); const statusBadgeColor = issue.is_done ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400' : issue.is_active ? 'bg-primary/10 text-primary' : 'bg-muted text-muted-foreground'; return (

{issue.title}

{statusLabel}

{issue.description}

{issue.person_in_charge}
); }