From 505f01f8dc14c7c600f2c85f1b58fcf98fc26703 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Wed, 12 Aug 2026 14:28:53 +0000
Subject: [PATCH] feat: add high density UI components for email detail
---
frontend/src/components/EmailDetail.tsx | 77 ++++++++++++++++++++++++-
frontend/src/lib/email-threading.ts | 25 ++++++++
2 files changed, 101 insertions(+), 1 deletion(-)
diff --git a/frontend/src/components/EmailDetail.tsx b/frontend/src/components/EmailDetail.tsx
index 35263d783..4c4ebe298 100644
--- a/frontend/src/components/EmailDetail.tsx
+++ b/frontend/src/components/EmailDetail.tsx
@@ -8,7 +8,7 @@ import { Checkbox } from "@/components/ui/checkbox";
import { Button } from "@/components/ui/button";
import { Textarea } from "@/components/ui/textarea";
import { Input } from "@/components/ui/input";
-import { Loader2, MessagesSquare } from "lucide-react";
+import { Loader2, MessagesSquare, Paperclip, Calendar } from "lucide-react";
import { DecisionPointCard } from "@/components/DecisionPointCard";
import { SourceDrawer } from "@/components/SourceDrawer";
import {
@@ -631,6 +631,21 @@ export function EmailDetail({ emailId, actionCommand = null }: { emailId: number
답장 주소: {safeReplyTo}
+ {email.participants && email.participants.length > 0 && (
+
+
+ {email.participants.slice(0, 5).map((p, i) => (
+
+ {p.name.charAt(0).toUpperCase()}
+
+ ))}
+
+ {email.participants.length > 5 && (
+
+{email.participants.length - 5}
+ )}
+
참석자 {email.participants.length}명
+
+ )}
@@ -649,6 +664,66 @@ export function EmailDetail({ emailId, actionCommand = null }: { emailId: number
+ {email.attachments && email.attachments.length > 0 && (
+
+
+ 첨부 파일
+
+
+ {email.attachments.map((file) => (
+
+
+
+ {file.filename}
+ {Math.round(file.size / 1024)} KB
+
+
+ ))}
+
+
+ )}
+
+ {email.meeting_proposal && (
+
+
+ 회의 제안
+
+
+
+
{email.meeting_proposal.title}
+
+ {email.meeting_proposal.date} {email.meeting_proposal.time}
+ {email.meeting_proposal.duration && (
+ <>
+
+ {email.meeting_proposal.duration}
+ >
+ )}
+ {email.meeting_proposal.location && (
+ <>
+
+ {email.meeting_proposal.location}
+ >
+ )}
+
+
+
+
+
+
+
+
+
+ )}
+
✦}
diff --git a/frontend/src/lib/email-threading.ts b/frontend/src/lib/email-threading.ts
index c9172cb9b..fcd731fdc 100644
--- a/frontend/src/lib/email-threading.ts
+++ b/frontend/src/lib/email-threading.ts
@@ -1,3 +1,25 @@
+export interface AttachmentData {
+ id: string;
+ filename: string;
+ size: number;
+ url: string;
+}
+
+export interface ParticipantData {
+ name: string;
+ email: string;
+ avatar_url?: string;
+}
+
+export interface MeetingProposalData {
+ id: string;
+ title: string;
+ date: string;
+ time: string;
+ location?: string;
+ duration?: string;
+}
+
export interface ThreadEmailData {
id: number;
subject: string | null;
@@ -9,6 +31,9 @@ export interface ThreadEmailData {
message_id?: string | null;
in_reply_to?: string | null;
references?: string | null;
+ participants?: ParticipantData[];
+ attachments?: AttachmentData[];
+ meeting_proposal?: MeetingProposalData;
}
export interface ReplyPayload {