From 907287021f222411b6a4aeee6834c92a07abed40 Mon Sep 17 00:00:00 2001 From: ttipo Date: Tue, 10 Nov 2026 11:44:42 +0900 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=EC=A3=BC=EC=86=8C=EB=A1=9D?= =?UTF-8?q?=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=C2=B7=20=EB=82=B4?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EA=B8=B0=20=C2=B7=20=EC=97=AC=EB=9F=AC=20?= =?UTF-8?q?=EC=84=9C=EB=AA=85=EA=B3=BC=20=EC=84=9C=EB=AA=85=20=EB=B0=94?= =?UTF-8?q?=EA=BE=B8=EA=B8=B0=20=C2=B7=20=EB=B6=80=EC=9E=AC=EC=A4=91=20?= =?UTF-8?q?=EC=84=9C=EC=8B=9D=20=C2=B7=20=ED=9C=B4=EB=8C=80=ED=8F=B0=20?= =?UTF-8?q?=EB=B0=94=EA=BE=B8=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메일 16단계(개인 설정)의 화면이다(보드 Contacts16 · Signature16 · Settings16). - 주소록: 브라우저가 vCard · CSV · 엑셀(.xlsx)을 읽어 미리 보기(파일은 서버로 가지 않는다 — 새 의존성 없이 DecompressionStream · DOMParser), 네이버 · Google · Outlook 머리를 알아보고 칸 없는 정보는 메모 끝에, 묶음(100명 · 값 8,000 · 700KB)으로 넣고 ✕까지 남는 결과 알림의 [되돌리기], 내보내기 창. - 서명: 왼쪽 목록 · 오른쪽 편집 · 메일에 넣을 서명 둘, 쓰기 화면 [서명 ▾]로 서명 자리만 바꾸기 (앱과 같은 경계 — 앞 빈 줄을 지켜 임시 저장 · 이어 쓰기에서도 찾는다). - 부재중: 내용 편집기(서식이 있을 때만 서식 본문) · 회사 밖에서 온 메일 응답 셋 · 미리 보기 전환. - 2단계 인증: [휴대폰 바꾸기] 두 걸음 창(비밀은 창 안에만). Co-Authored-By: Claude Opus 5.5 --- .../contacts/ContactExportDialog.vue | 368 +++++++++ .../contacts/ContactImportDialog.vue | 450 ++++++++++ .../contacts/ContactImportGroupFields.vue | 262 ++++++ .../contacts/ContactImportInfoField.vue | 129 +++ .../contacts/ContactImportPicker.vue | 228 +++++ .../contacts/ContactImportSummary.vue | 378 +++++++++ .../components/contacts/ContactsDialogs.vue | 13 +- .../src/components/contacts/ContactsList.vue | 136 ++- .../src/components/contacts/contacts-ui.ts | 6 +- .../src/components/feedback/ToastHost.vue | 20 +- .../src/components/mail/ComposeFooter.vue | 3 + .../components/mail/ComposeSignatureMenu.vue | 237 ++++++ .../src/components/mail/editor/EditorMenu.vue | 7 + .../src/components/mail/editor/MailEditor.vue | 45 +- .../mail/editor/mail-editor-handle.ts | 12 + .../components/mail/editor/mail-extensions.ts | 3 + .../mail/editor/mail-signature-block.spec.ts | 266 ++++++ .../mail/editor/mail-signature-block.ts | 269 ++++++ .../signature/SignatureDefaultsField.vue | 155 ++++ .../signature/SignatureDeleteDialog.vue | 70 ++ .../editor/signature/SignatureEditor.spec.ts | 99 +++ .../mail/editor/signature/SignatureEditor.vue | 134 ++- .../mail/editor/signature/SignatureEmpty.vue | 94 +++ .../mail/editor/signature/SignatureForm.vue | 377 +++++---- .../mail/editor/signature/SignatureList.vue | 214 +++++ .../editor/signature/SignaturePreview.vue | 16 +- .../editor/signature/SignatureSettings.vue | 328 ++++++++ .../editor/signature/SignatureToolbar.vue | 24 +- .../editor/signature/signature-extensions.ts | 15 +- .../settings/TwoFactorEnrollmentScan.vue | 24 +- .../settings/TwoFactorReplaceDialog.vue | 589 +++++++++++++ .../settings/TwoFactorReplaceSteps.vue | 90 ++ .../settings/VacationExternalFields.vue | 151 ++++ .../src/components/settings/VacationForm.vue | 220 ++++- .../settings/VacationMessageFields.vue | 176 +++- .../components/settings/VacationPreview.vue | 138 +++- .../src/components/shell/AppShell.spec.ts | 15 +- .../src/composables/useAccountSecurity.ts | 40 +- frontend/src/composables/useContactImport.ts | 430 ++++++++++ frontend/src/composables/useContacts.ts | 64 +- .../src/composables/useContactsDialogs.ts | 11 + frontend/src/composables/useMail.ts | 52 +- frontend/src/composables/useMailSignatures.ts | 133 +++ frontend/src/composables/useToast.ts | 24 +- .../pages/contacts/ContactsTransfer.spec.ts | 780 ++++++++++++++++++ .../src/pages/mail/ComposePage.drafts.spec.ts | 316 ++++++- frontend/src/pages/mail/ComposePage.vue | 121 ++- frontend/src/pages/mail/MailLayout.vue | 4 +- .../AccountTwoFactorPage.replace.spec.ts | 618 ++++++++++++++ .../settings/AccountTwoFactorPage.spec.ts | 19 +- .../pages/settings/AccountTwoFactorPage.vue | 94 ++- .../pages/settings/MailSignaturePage.spec.ts | 682 ++++++++++----- .../src/pages/settings/MailSignaturePage.vue | 24 +- .../pages/settings/MailVacationPage.spec.ts | 554 ++++++++++++- .../src/pages/settings/MailVacationPage.vue | 27 +- .../src/shared/constants/account-security.ts | 46 +- frontend/src/shared/constants/contacts.ts | 203 ++++- frontend/src/shared/constants/icons.ts | 6 + .../src/shared/constants/mail-signature.ts | 119 ++- .../src/shared/constants/mail-vacation.ts | 53 +- .../shared/constants/session-restriction.ts | 7 +- frontend/src/shared/types/account-security.ts | 19 + frontend/src/shared/types/contacts.ts | 54 +- frontend/src/shared/types/mail-signature.ts | 42 + frontend/src/shared/types/mail.ts | 53 +- .../utils/contact-import/batches.spec.ts | 97 +++ .../shared/utils/contact-import/batches.ts | 79 ++ .../shared/utils/contact-import/csv.spec.ts | 77 ++ .../src/shared/utils/contact-import/csv.ts | 92 +++ .../utils/contact-import/read-file.spec.ts | 95 +++ .../shared/utils/contact-import/read-file.ts | 99 +++ .../utils/contact-import/records.spec.ts | 341 ++++++++ .../shared/utils/contact-import/records.ts | 508 ++++++++++++ .../shared/utils/contact-import/table.spec.ts | 290 +++++++ .../src/shared/utils/contact-import/table.ts | 406 +++++++++ .../src/shared/utils/contact-import/text.ts | 43 + .../src/shared/utils/contact-import/types.ts | 71 ++ .../utils/contact-import/values.spec.ts | 147 ++++ .../src/shared/utils/contact-import/values.ts | 216 +++++ .../shared/utils/contact-import/vcard.spec.ts | 233 ++++++ .../src/shared/utils/contact-import/vcard.ts | 430 ++++++++++ .../shared/utils/contact-import/xlsx.spec.ts | 107 +++ .../src/shared/utils/contact-import/xlsx.ts | 185 +++++ .../src/shared/utils/contact-import/zip.ts | 167 ++++ frontend/src/shared/utils/mail-forward.ts | 6 +- frontend/src/shared/utils/mail-quote.ts | 11 +- frontend/src/shared/utils/mail-reply.ts | 6 +- .../src/shared/utils/mail-signature.spec.ts | 88 +- frontend/src/shared/utils/mail-signature.ts | 79 +- .../src/shared/utils/mail-vacation.spec.ts | 239 +++++- frontend/src/shared/utils/mail-vacation.ts | 224 ++++- .../src/stores/contact-import.store.spec.ts | 71 ++ frontend/src/stores/contact-import.store.ts | 38 + frontend/src/stores/contacts.store.ts | 13 + .../src/stores/mail-signature.store.spec.ts | 233 +++++- frontend/src/stores/mail-signature.store.ts | 271 +++++- .../src/stores/mail-vacation.store.spec.ts | 39 +- frontend/src/stores/mail-vacation.store.ts | 2 +- frontend/src/stores/toast.store.spec.ts | 63 ++ frontend/src/stores/toast.store.ts | 32 +- frontend/src/test-utils/euc-kr.ts | 35 + frontend/src/test-utils/zip.ts | 173 ++++ 102 files changed, 14738 insertions(+), 924 deletions(-) create mode 100644 frontend/src/components/contacts/ContactExportDialog.vue create mode 100644 frontend/src/components/contacts/ContactImportDialog.vue create mode 100644 frontend/src/components/contacts/ContactImportGroupFields.vue create mode 100644 frontend/src/components/contacts/ContactImportInfoField.vue create mode 100644 frontend/src/components/contacts/ContactImportPicker.vue create mode 100644 frontend/src/components/contacts/ContactImportSummary.vue create mode 100644 frontend/src/components/mail/ComposeSignatureMenu.vue create mode 100644 frontend/src/components/mail/editor/mail-signature-block.spec.ts create mode 100644 frontend/src/components/mail/editor/mail-signature-block.ts create mode 100644 frontend/src/components/mail/editor/signature/SignatureDefaultsField.vue create mode 100644 frontend/src/components/mail/editor/signature/SignatureDeleteDialog.vue create mode 100644 frontend/src/components/mail/editor/signature/SignatureEditor.spec.ts create mode 100644 frontend/src/components/mail/editor/signature/SignatureEmpty.vue create mode 100644 frontend/src/components/mail/editor/signature/SignatureList.vue create mode 100644 frontend/src/components/mail/editor/signature/SignatureSettings.vue create mode 100644 frontend/src/components/settings/TwoFactorReplaceDialog.vue create mode 100644 frontend/src/components/settings/TwoFactorReplaceSteps.vue create mode 100644 frontend/src/components/settings/VacationExternalFields.vue create mode 100644 frontend/src/composables/useContactImport.ts create mode 100644 frontend/src/composables/useMailSignatures.ts create mode 100644 frontend/src/pages/contacts/ContactsTransfer.spec.ts create mode 100644 frontend/src/pages/settings/AccountTwoFactorPage.replace.spec.ts create mode 100644 frontend/src/shared/types/mail-signature.ts create mode 100644 frontend/src/shared/utils/contact-import/batches.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/batches.ts create mode 100644 frontend/src/shared/utils/contact-import/csv.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/csv.ts create mode 100644 frontend/src/shared/utils/contact-import/read-file.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/read-file.ts create mode 100644 frontend/src/shared/utils/contact-import/records.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/records.ts create mode 100644 frontend/src/shared/utils/contact-import/table.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/table.ts create mode 100644 frontend/src/shared/utils/contact-import/text.ts create mode 100644 frontend/src/shared/utils/contact-import/types.ts create mode 100644 frontend/src/shared/utils/contact-import/values.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/values.ts create mode 100644 frontend/src/shared/utils/contact-import/vcard.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/vcard.ts create mode 100644 frontend/src/shared/utils/contact-import/xlsx.spec.ts create mode 100644 frontend/src/shared/utils/contact-import/xlsx.ts create mode 100644 frontend/src/shared/utils/contact-import/zip.ts create mode 100644 frontend/src/stores/contact-import.store.spec.ts create mode 100644 frontend/src/stores/contact-import.store.ts create mode 100644 frontend/src/test-utils/euc-kr.ts create mode 100644 frontend/src/test-utils/zip.ts diff --git a/frontend/src/components/contacts/ContactExportDialog.vue b/frontend/src/components/contacts/ContactExportDialog.vue new file mode 100644 index 0000000..9533678 --- /dev/null +++ b/frontend/src/components/contacts/ContactExportDialog.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/frontend/src/components/contacts/ContactImportDialog.vue b/frontend/src/components/contacts/ContactImportDialog.vue new file mode 100644 index 0000000..73041df --- /dev/null +++ b/frontend/src/components/contacts/ContactImportDialog.vue @@ -0,0 +1,450 @@ + + + + + diff --git a/frontend/src/components/contacts/ContactImportGroupFields.vue b/frontend/src/components/contacts/ContactImportGroupFields.vue new file mode 100644 index 0000000..4930ddb --- /dev/null +++ b/frontend/src/components/contacts/ContactImportGroupFields.vue @@ -0,0 +1,262 @@ + + + + + diff --git a/frontend/src/components/contacts/ContactImportInfoField.vue b/frontend/src/components/contacts/ContactImportInfoField.vue new file mode 100644 index 0000000..4127105 --- /dev/null +++ b/frontend/src/components/contacts/ContactImportInfoField.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/frontend/src/components/contacts/ContactImportPicker.vue b/frontend/src/components/contacts/ContactImportPicker.vue new file mode 100644 index 0000000..4503d43 --- /dev/null +++ b/frontend/src/components/contacts/ContactImportPicker.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/frontend/src/components/contacts/ContactImportSummary.vue b/frontend/src/components/contacts/ContactImportSummary.vue new file mode 100644 index 0000000..fd77ce6 --- /dev/null +++ b/frontend/src/components/contacts/ContactImportSummary.vue @@ -0,0 +1,378 @@ + + + + + diff --git a/frontend/src/components/contacts/ContactsDialogs.vue b/frontend/src/components/contacts/ContactsDialogs.vue index 937a168..7a310ad 100644 --- a/frontend/src/components/contacts/ContactsDialogs.vue +++ b/frontend/src/components/contacts/ContactsDialogs.vue @@ -1,13 +1,16 @@