From b30efe6a6cce40a438f5de2d2b7b83c08278818a Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 30 Apr 2025 17:09:26 +0200 Subject: [PATCH] New webmail features. --- .gitignore | 3 + docker-compose.yml | 1 + frontend/src/api/webmail.js | 45 ++++ frontend/src/components/tools/HtmlEditor.vue | 5 +- .../components/webmail/AttachmentsDialog.vue | 96 +++++++++ .../src/components/webmail/BodyEditor.vue | 47 +++++ .../components/webmail/ComposeEmailForm.vue | 143 +++++++++++-- .../src/components/webmail/ContactCard.vue | 69 ++++++ frontend/src/components/webmail/EmailList.vue | 117 +++++++---- .../src/components/webmail/MailboxForm.vue | 126 +++++++++++ .../src/components/webmail/MailboxList.vue | 54 +++-- .../src/layouts/webmail/WebmailLayout.vue | 196 +++++++++++++++--- frontend/src/router/index.js | 8 + frontend/src/views/webmail/EmailView.vue | 94 +++++++-- .../src/views/webmail/ForwardEmailView.vue | 22 ++ frontend/src/views/webmail/ReplyEmailView.vue | 26 ++- modoboa/lib/redis.py | 21 ++ modoboa/policyd/handlers.py | 4 +- modoboa/policyd/tests.py | 4 +- modoboa/policyd/utils.py | 21 +- modoboa/webmail/lib/__init__.py | 4 - modoboa/webmail/lib/attachments.py | 102 ++++++--- modoboa/webmail/lib/imapemail.py | 99 ++++----- modoboa/webmail/lib/imaputils.py | 4 +- modoboa/webmail/lib/sendmail.py | 31 ++- modoboa/webmail/serializers.py | 52 ++++- modoboa/webmail/urls.py | 5 + modoboa/webmail/viewsets.py | 174 +++++++++++++++- 28 files changed, 1321 insertions(+), 252 deletions(-) create mode 100644 frontend/src/components/webmail/AttachmentsDialog.vue create mode 100644 frontend/src/components/webmail/BodyEditor.vue create mode 100644 frontend/src/components/webmail/ContactCard.vue create mode 100644 frontend/src/components/webmail/MailboxForm.vue create mode 100644 frontend/src/views/webmail/ForwardEmailView.vue create mode 100644 modoboa/lib/redis.py diff --git a/.gitignore b/.gitignore index cb42ae62f..c3df1e740 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,6 @@ modoboa.kdev4 test_project/cert.crt test_project/cert.key test_project/envfile + +# Docker +docker/collections diff --git a/docker-compose.yml b/docker-compose.yml index 66c79a7d4..287d7ef01 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,6 +108,7 @@ services: dockerfile: docker/Dockerfile.radicale.dev volumes: - ./docker/radicale_config:/etc/radicale + - ./docker/collections:/collections policyd: container_name: modoboa_policyd diff --git a/frontend/src/api/webmail.js b/frontend/src/api/webmail.js index 6c625129f..1aaf56849 100644 --- a/frontend/src/api/webmail.js +++ b/frontend/src/api/webmail.js @@ -8,6 +8,26 @@ export default { } return repository.get('/webmail/mailboxes/', { params }) }, + getUserMailboxQuota(mailbox) { + const params = { mailbox } + return repository.get('/webmail/mailboxes/quota/', { params }) + }, + createUserMailbox(body) { + return repository.post('/webmail/mailboxes/', body) + }, + renameUserMailbox(body) { + return repository.post('/webmail/mailboxes/rename/', body) + }, + compressUserMailbox(body) { + return repository.post('/webmail/mailboxes/compress/', body) + }, + deleteUserMailbox(body) { + return repository.post('/webmail/mailboxes/delete/', body) + }, + emptyUserMailbox(mailbox) { + const body = { name: mailbox } + return repository.post('/webmail/mailboxes/empty/', body) + }, getMailboxEmails(mailbox, options) { const params = { mailbox, @@ -73,4 +93,29 @@ export default { sendEmail(body) { return repository.post('/webmail/emails/send/', body) }, + createComposeSession() { + return repository.post('/webmail/compose-sessions/') + }, + getAllowedSenders() { + return repository.get('/webmail/compose-sessions/allowed_senders/') + }, + getUploadedAttachments(sessionUid) { + return repository.get( + `/webmail/compose-sessions/${sessionUid}/attachments/` + ) + }, + uploadAttachment(sessionUid, body) { + return repository.post( + `/webmail/compose-sessions/${sessionUid}/attachments/`, + body, + { + headers: { 'Content-Type': 'multipart/form-data' }, + } + ) + }, + removeAttachment(sessionUid, name) { + return repository.delete( + `/webmail/compose-sessions/${sessionUid}/attachments/${name}/` + ) + }, } diff --git a/frontend/src/components/tools/HtmlEditor.vue b/frontend/src/components/tools/HtmlEditor.vue index abd89fa31..79070f5fd 100644 --- a/frontend/src/components/tools/HtmlEditor.vue +++ b/frontend/src/components/tools/HtmlEditor.vue @@ -1,6 +1,7 @@ @@ -143,6 +144,7 @@ watch(