feat(workspace): 添加今日日报侧栏组件

This commit is contained in:
Script Generator
2026-06-26 14:58:32 +08:00
parent 6b965429ce
commit 17dd4afada

View File

@@ -0,0 +1,70 @@
'use client';
import { CalendarDays, ClipboardList, Clock3 } from 'lucide-react';
import type { WorkspaceDailyReport } from '@/lib/workspace-daily-report';
import { formatWorkHours, formatWorkHoursShort } from '@/lib/work-hours';
interface Props {
report: WorkspaceDailyReport;
}
export function DailyReportPanel({ report }: Props) {
return (
<aside className="w-80 shrink-0 border-l border-[var(--line)] bg-[var(--bg-card)] flex flex-col">
<div className="flex h-14 items-center justify-between border-b border-[var(--line)] px-4">
<div>
<h2 className="text-[14px] font-semibold text-[var(--ink)]"></h2>
<div className="mt-0.5 flex items-center gap-1 text-[11px] text-[var(--ink-muted)]">
<CalendarDays className="h-3 w-3" />
<span>{report.date}</span>
</div>
</div>
</div>
<div className="grid grid-cols-2 gap-2 border-b border-[var(--line)] p-3">
<div className="rounded-lg border border-[var(--line)] bg-[var(--bg)] p-2">
<div className="flex items-center gap-1 text-[10px] text-[var(--ink-muted)]">
<Clock3 className="h-3 w-3" />
<span></span>
</div>
<p className="mt-1 text-[16px] font-semibold text-[var(--ink)]">{formatWorkHours(report.totalHours)}</p>
</div>
<div className="rounded-lg border border-[var(--line)] bg-[var(--bg)] p-2">
<div className="flex items-center gap-1 text-[10px] text-[var(--ink-muted)]">
<ClipboardList className="h-3 w-3" />
<span></span>
</div>
<p className="mt-1 text-[16px] font-semibold text-[var(--ink)]">{report.totalCount} </p>
</div>
</div>
<div className="flex-1 overflow-y-auto p-3">
{report.items.length === 0 ? (
<div className="rounded-lg border border-dashed border-[var(--line)] bg-[var(--bg)] p-4 text-center">
<p className="text-[13px] font-medium text-[var(--ink)]"></p>
<p className="mt-1 text-[11px] leading-5 text-[var(--ink-muted)]"></p>
</div>
) : (
<div className="space-y-2">
{report.items.map((item) => (
<div key={item.id} className="rounded-lg border border-[var(--line)] bg-[var(--bg)] p-3">
<div className="flex items-start justify-between gap-2">
<p className="min-w-0 flex-1 text-[12px] font-medium leading-5 text-[var(--ink)]">{item.workContent}</p>
<span className="shrink-0 rounded bg-[var(--accent-soft)] px-1.5 py-0.5 text-[10px] font-medium text-[var(--accent)]">
{formatWorkHoursShort(item.hours)}
</span>
</div>
<p className="mt-2 truncate text-[11px] text-[var(--ink-soft)]">{item.taskTitle}</p>
{(item.productName || item.projectName || item.versionName) && (
<p className="mt-1 truncate text-[10px] text-[var(--ink-muted)]">
{[item.productName, item.projectName, item.versionName].filter(Boolean).join(' / ')}
</p>
)}
</div>
))}
</div>
)}
</div>
</aside>
);
}