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')}
{/* 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}
);
}