From 5710151c0bce7f693696e586f057633d4bb70c4c Mon Sep 17 00:00:00 2001 From: ttipo Date: Tue, 27 Oct 2026 19:23:22 +0900 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=C2=B7=EC=84=9C=EB=AA=85=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=C2=B7=EB=B0=9B=EB=8A=94=20=EC=82=AC=EB=9E=8C=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=99=84=EC=84=B1=20=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 쓰기 화면 자동 저장(3초 멈춤 · 30초 · 10초 간격 · 한 번에 하나)과 상태 글, 저장할 때마다 주소를 ?draft= 로 맞춰 새로고침해도 이어 쓴다. MAIL_008 · PUT 404 는 막지 않고 새 저장본으로 남긴다 - 찾지 못한 첨부가 남았거나 본문이 한도를 넘는 동안은 저장하지 않고, 실을 수 없는 첨부가 든 남의 저장본은 원본을 지우지 않는다 - 휴지통은 휴지통으로 옮기기(PATCH)와 되돌리기 — 이미 휴지통에 있는 메일을 DELETE 로 영구 삭제하지 않게 - 설정 › 메일 › 서명: 서식 · 그림(크기 줄) · 미리 보기 · 넣을 메일, 저장하지 않고 떠나면 묻는다 - 받는 사람 자동 완성: 사내 · 최근 묶음, 초성 검색(조합 중 글자 포함), 완전한 주소는 미리 고르지 않는다 - 본문에 그림으로 보인 첨부(isInline)는 읽기 화면의 첨부 목록에서 빼고 전달에는 붙인다 Co-Authored-By: Claude Opus 5.5 --- .../feedback/LeaveConfirmDialog.vue | 68 ++ .../src/components/feedback/ModalDialog.vue | 2 +- .../src/components/feedback/ToastHost.vue | 36 +- frontend/src/components/mail/ComposeAlert.vue | 42 + .../components/mail/ComposeDraftStatus.vue | 135 ++ .../src/components/mail/ComposeFooter.vue | 136 +++ .../src/components/mail/ComposeHeader.vue | 99 ++ .../components/mail/ComposeLeaveDialog.vue | 43 +- .../src/components/mail/MessageList.spec.ts | 90 ++ frontend/src/components/mail/MessageList.vue | 3 + .../src/components/mail/MessageListItem.vue | 37 +- .../src/components/mail/MessageReader.spec.ts | 46 + .../src/components/mail/MessageReader.vue | 7 +- .../src/components/mail/MessageTable.spec.ts | 31 + frontend/src/components/mail/MessageTable.vue | 48 +- .../components/mail/RecipientField.spec.ts | 284 ++++- .../src/components/mail/RecipientField.vue | 173 ++- .../mail/RecipientSuggestionList.vue | 217 ++++ .../components/mail/editor/EditorLinkForm.vue | 5 +- .../components/mail/editor/MailEditor.spec.ts | 66 + .../src/components/mail/editor/MailEditor.vue | 56 +- .../mail/editor/mail-editor-handle.ts | 25 +- .../components/mail/editor/mail-extensions.ts | 12 +- .../components/mail/editor/mail-serialize.ts | 8 +- .../mail/editor/signature-image.spec.ts | 84 ++ .../components/mail/editor/signature-image.ts | 104 ++ .../mail/editor/signature/SignatureEditor.vue | 398 ++++++ .../mail/editor/signature/SignatureForm.vue | 465 +++++++ .../editor/signature/SignaturePreview.vue | 232 ++++ .../editor/signature/SignatureToolbar.vue | 296 +++++ .../editor/signature/signature-extensions.ts | 68 ++ .../mail/recipient-suggestion-ids.ts | 14 + frontend/src/components/shell/AppRail.spec.ts | 10 +- frontend/src/composables/useApi.spec.ts | 4 + .../composables/useAttachmentUploads.spec.ts | 54 + .../src/composables/useAttachmentUploads.ts | 43 + frontend/src/composables/useClock.ts | 29 + .../src/composables/useComposeDraftLink.ts | 119 ++ .../src/composables/useDraftSaving.spec.ts | 447 +++++++ frontend/src/composables/useDraftSaving.ts | 352 ++++++ frontend/src/composables/useDraftTrash.ts | 65 + frontend/src/composables/useLeaveConfirm.ts | 50 +- frontend/src/composables/useMail.ts | 81 +- .../useRecipientSuggestions.spec.ts | 145 +++ .../composables/useRecipientSuggestions.ts | 127 ++ .../src/pages/mail/ComposePage.drafts.spec.ts | 1081 +++++++++++++++++ frontend/src/pages/mail/ComposePage.spec.ts | 93 +- frontend/src/pages/mail/ComposePage.vue | 792 ++++++++---- frontend/src/pages/mail/MailLayout.vue | 3 + .../pages/settings/MailSignaturePage.spec.ts | 460 +++++++ .../src/pages/settings/MailSignaturePage.vue | 122 ++ .../src/pages/settings/SettingsLayout.vue | 93 ++ frontend/src/router/index.ts | 15 + frontend/src/shared/constants/app-modules.ts | 2 +- frontend/src/shared/constants/icons.ts | 6 + .../src/shared/constants/mail-signature.ts | 101 ++ frontend/src/shared/constants/mail.ts | 55 +- frontend/src/shared/types/mail.ts | 103 +- frontend/src/shared/utils/compose-changes.ts | 7 +- frontend/src/shared/utils/format.spec.ts | 14 + frontend/src/shared/utils/format.ts | 24 + .../src/shared/utils/keyboard-shortcut.ts | 11 + frontend/src/shared/utils/mail-address.ts | 5 + .../src/shared/utils/mail-attachment.spec.ts | 14 + frontend/src/shared/utils/mail-attachment.ts | 9 + .../src/shared/utils/mail-forward.spec.ts | 19 +- frontend/src/shared/utils/mail-forward.ts | 22 +- frontend/src/shared/utils/mail-quote.spec.ts | 6 + frontend/src/shared/utils/mail-quote.ts | 9 +- frontend/src/shared/utils/mail-reply.spec.ts | 6 + frontend/src/shared/utils/mail-reply.ts | 7 +- .../src/shared/utils/mail-signature.spec.ts | 89 ++ frontend/src/shared/utils/mail-signature.ts | 102 ++ .../shared/utils/outgoing-html-rules.spec.ts | 38 +- .../src/shared/utils/outgoing-html-rules.ts | 64 + .../src/shared/utils/recipient-match.spec.ts | 120 ++ frontend/src/shared/utils/recipient-match.ts | 214 ++++ .../src/stores/mail-signature.store.spec.ts | 72 ++ frontend/src/stores/mail-signature.store.ts | 85 ++ frontend/src/stores/mail.store.spec.ts | 45 + frontend/src/stores/mail.store.ts | 61 +- frontend/src/stores/toast.store.spec.ts | 84 ++ frontend/src/stores/toast.store.ts | 65 +- frontend/src/styles/base.css | 29 + frontend/src/styles/tokens.css | 9 +- frontend/src/test-utils/manual-clock.ts | 63 + .../src/test-utils/outgoing-style-samples.ts | 53 + frontend/src/test-utils/router.ts | 7 + 88 files changed, 8717 insertions(+), 418 deletions(-) create mode 100644 frontend/src/components/feedback/LeaveConfirmDialog.vue create mode 100644 frontend/src/components/mail/ComposeAlert.vue create mode 100644 frontend/src/components/mail/ComposeDraftStatus.vue create mode 100644 frontend/src/components/mail/ComposeFooter.vue create mode 100644 frontend/src/components/mail/ComposeHeader.vue create mode 100644 frontend/src/components/mail/MessageList.spec.ts create mode 100644 frontend/src/components/mail/RecipientSuggestionList.vue create mode 100644 frontend/src/components/mail/editor/signature-image.spec.ts create mode 100644 frontend/src/components/mail/editor/signature-image.ts create mode 100644 frontend/src/components/mail/editor/signature/SignatureEditor.vue create mode 100644 frontend/src/components/mail/editor/signature/SignatureForm.vue create mode 100644 frontend/src/components/mail/editor/signature/SignaturePreview.vue create mode 100644 frontend/src/components/mail/editor/signature/SignatureToolbar.vue create mode 100644 frontend/src/components/mail/editor/signature/signature-extensions.ts create mode 100644 frontend/src/components/mail/recipient-suggestion-ids.ts create mode 100644 frontend/src/composables/useClock.ts create mode 100644 frontend/src/composables/useComposeDraftLink.ts create mode 100644 frontend/src/composables/useDraftSaving.spec.ts create mode 100644 frontend/src/composables/useDraftSaving.ts create mode 100644 frontend/src/composables/useDraftTrash.ts create mode 100644 frontend/src/composables/useRecipientSuggestions.spec.ts create mode 100644 frontend/src/composables/useRecipientSuggestions.ts create mode 100644 frontend/src/pages/mail/ComposePage.drafts.spec.ts create mode 100644 frontend/src/pages/settings/MailSignaturePage.spec.ts create mode 100644 frontend/src/pages/settings/MailSignaturePage.vue create mode 100644 frontend/src/pages/settings/SettingsLayout.vue create mode 100644 frontend/src/shared/constants/mail-signature.ts create mode 100644 frontend/src/shared/utils/mail-signature.spec.ts create mode 100644 frontend/src/shared/utils/mail-signature.ts create mode 100644 frontend/src/shared/utils/recipient-match.spec.ts create mode 100644 frontend/src/shared/utils/recipient-match.ts create mode 100644 frontend/src/stores/mail-signature.store.spec.ts create mode 100644 frontend/src/stores/mail-signature.store.ts create mode 100644 frontend/src/stores/toast.store.spec.ts create mode 100644 frontend/src/test-utils/manual-clock.ts diff --git a/frontend/src/components/feedback/LeaveConfirmDialog.vue b/frontend/src/components/feedback/LeaveConfirmDialog.vue new file mode 100644 index 0000000..f0d5e99 --- /dev/null +++ b/frontend/src/components/feedback/LeaveConfirmDialog.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/src/components/feedback/ModalDialog.vue b/frontend/src/components/feedback/ModalDialog.vue index b7be5d4..608d72d 100644 --- a/frontend/src/components/feedback/ModalDialog.vue +++ b/frontend/src/components/feedback/ModalDialog.vue @@ -1,6 +1,6 @@