feat: remaining frontend views (groups/calls/sms/sync) + messageout media fields
Backend (Part A): - MessageOut: add file_th_url, file_hd_url, duration, transcription_text, md5 (room_id + sender_head_url already existed) so the chat timeline can render image thumbnails, voice duration/transcription, and avatars from a single response. - PhoneCallOut: add record_file so the Calls view can offer recording playback. - SmsOut: add content (full body) so the SMS detail dialog shows the whole text. - Tests: red->green for each new field (media fields default None + populated, record_file round-trip, content round-trip). Suite 267 -> 271. Frontend (Part B): - api/index.ts: wrappers getGroups/getGroupMembers/getCalls/getSms/getSyncStatus + Group/GroupMember/PhoneCall/Sms/SyncState/SyncRun/SyncStatus types in types.ts (mirror the *Out pydantic schemas). - views/GroupList.vue (/groups): table + channel filter + pagination; row click opens the group timeline. - views/CallList.vue (/calls): table + call-type filter (phone_call/voice_call/ all); "播放录音" action opens an el-dialog with <audio controls>. - views/SmsList.vue (/sms): table; row click opens a detail dialog with the full content. - views/SyncStatus.vue (/sync): two tables (states + recent_runs) with a manual refresh; run status color-coded. - ChatTimeline.vue: reused for both 1:1 DM (talkerId) and group (roomId) by branching the query; group title + per-member sender already handled by MessageBubble. - router: add /groups /calls /sms /sync + /group/:channel/:ownerId/:roomId. - layouts/MainLayout.vue: replace the single 客户列表 button with an el-menu (客户 / 群 / 通话 / 短信 / 同步); org tree kept on the left. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -114,6 +114,14 @@ class MessageOut(BaseModel):
|
||||
type_raw: int | None = None
|
||||
text: str | None = None
|
||||
file_url: str | None = None
|
||||
# Image thumbnails / originals + voice duration / transcription so the
|
||||
# timeline can render media without a second round-trip. All optional — the
|
||||
# underlying columns (see Message model) are nullable.
|
||||
file_th_url: str | None = None
|
||||
file_hd_url: str | None = None
|
||||
duration: int | None = None
|
||||
transcription_text: str | None = None
|
||||
md5: str | None = None
|
||||
sender_name: str | None = None
|
||||
sender_head_url: str | None = None
|
||||
timestamp: int | None = None
|
||||
@@ -162,6 +170,9 @@ class PhoneCallOut(BaseModel):
|
||||
user_id_name: str | None = None
|
||||
call_number: str | None = None
|
||||
sim_phone: str | None = None
|
||||
# OSS URL of the call recording — surfaced so the Calls view can offer a
|
||||
# "播放录音" action when present.
|
||||
record_file: str | None = None
|
||||
|
||||
|
||||
class SmsOut(BaseModel):
|
||||
@@ -172,6 +183,9 @@ class SmsOut(BaseModel):
|
||||
sms_id: str
|
||||
customer_phone: str | None = None
|
||||
content_preview: str | None = None
|
||||
# Full SMS body (the table stores it in ``content``); included so the SMS
|
||||
# view can show the whole message in a detail dialog without a second call.
|
||||
content: str | None = None
|
||||
sender: str | None = None
|
||||
direction: int | None = None
|
||||
user_id: str | None = None
|
||||
|
||||
Reference in New Issue
Block a user