From 6ee4ea16624e875eeabbaff4c8c4aff34af8ad54 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 7 Apr 2025 17:18:16 +0200 Subject: [PATCH] More improvements --- docker-compose.yml | 1 + frontend/package.json | 5 + frontend/src/api/webmail.js | 10 + frontend/src/components/tools/HtmlEditor.vue | 160 +++++++ .../components/webmail/ComposeEmailForm.vue | 205 +++++++++ frontend/src/components/webmail/EmailList.vue | 2 +- .../src/layouts/webmail/WebmailLayout.vue | 13 + frontend/src/router/index.js | 16 + .../src/views/webmail/ComposeEmailView.vue | 7 + frontend/src/views/webmail/EmailView.vue | 58 ++- frontend/src/views/webmail/ReplyEmailView.vue | 22 + frontend/yarn.lock | 428 +++++++++++++++++- modoboa/webmail/lib/imapemail.py | 64 +-- modoboa/webmail/lib/imaputils.py | 1 + modoboa/webmail/lib/sendmail.py | 173 +++++-- modoboa/webmail/serializers.py | 23 + modoboa/webmail/viewsets.py | 45 +- 17 files changed, 1159 insertions(+), 74 deletions(-) create mode 100644 frontend/src/components/tools/HtmlEditor.vue create mode 100644 frontend/src/components/webmail/ComposeEmailForm.vue create mode 100644 frontend/src/views/webmail/ComposeEmailView.vue create mode 100644 frontend/src/views/webmail/ReplyEmailView.vue diff --git a/docker-compose.yml b/docker-compose.yml index fb8d92ff7..66c79a7d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,6 +29,7 @@ services: - 8000:8000 env_file: - test_project/oidc_key + - test_project/envfile environment: DB: "SQLITE" DEBUG: "True" diff --git a/frontend/package.json b/frontend/package.json index ca4a9b004..12ae00c34 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,6 +22,11 @@ "@fullcalendar/vue3": "^6.1.15", "@github/webauthn-json": "^2.1.1", "@mdi/font": "^7.3.67", + "@tiptap/extension-highlight": "^2.11.7", + "@tiptap/extension-text-align": "^2.11.7", + "@tiptap/pm": "^2.11.7", + "@tiptap/starter-kit": "^2.11.7", + "@tiptap/vue-3": "^2.11.7", "apexcharts": "^3.50.0", "axios": "^1.8.2", "core-js": "^3.37.1", diff --git a/frontend/src/api/webmail.js b/frontend/src/api/webmail.js index 769bfe045..6c625129f 100644 --- a/frontend/src/api/webmail.js +++ b/frontend/src/api/webmail.js @@ -23,6 +23,13 @@ export default { } return repository.get(`/webmail/emails/content/`, { params }) }, + getEmailSource(mailbox, mailid) { + const params = { + mailbox, + mailid, + } + return repository.get(`/webmail/emails/source/`, { params }) + }, getEmailAttachment(mailbox, mailid, partnum) { const params = { mailbox, @@ -63,4 +70,7 @@ export default { } return repository.post('/webmail/emails/flag/', body) }, + sendEmail(body) { + return repository.post('/webmail/emails/send/', body) + }, } diff --git a/frontend/src/components/tools/HtmlEditor.vue b/frontend/src/components/tools/HtmlEditor.vue new file mode 100644 index 000000000..abd89fa31 --- /dev/null +++ b/frontend/src/components/tools/HtmlEditor.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/frontend/src/components/webmail/ComposeEmailForm.vue b/frontend/src/components/webmail/ComposeEmailForm.vue new file mode 100644 index 000000000..323ff80a7 --- /dev/null +++ b/frontend/src/components/webmail/ComposeEmailForm.vue @@ -0,0 +1,205 @@ + + + diff --git a/frontend/src/components/webmail/EmailList.vue b/frontend/src/components/webmail/EmailList.vue index cb618daed..b36672bad 100644 --- a/frontend/src/components/webmail/EmailList.vue +++ b/frontend/src/components/webmail/EmailList.vue @@ -30,7 +30,7 @@ > +
+ +
{ userMailboxes.value = resp.data }) + +const openComposeForm = () => { + router.push({ name: 'ComposeEmailView' }) +} diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index dc1ba3761..1e3029ee1 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -339,6 +339,22 @@ const routes = [ requiresAuth: true, }, }, + { + path: 'compose', + name: 'ComposeEmailView', + component: () => import('@/views/webmail/ComposeEmailView.vue'), + meta: { + requiresAuth: true, + }, + }, + { + path: 'reply', + name: 'ReplyEmailView', + component: () => import('@/views/webmail/ReplyEmailView.vue'), + meta: { + requiresAuth: true, + }, + }, ], }, ], diff --git a/frontend/src/views/webmail/ComposeEmailView.vue b/frontend/src/views/webmail/ComposeEmailView.vue new file mode 100644 index 000000000..fc6372490 --- /dev/null +++ b/frontend/src/views/webmail/ComposeEmailView.vue @@ -0,0 +1,7 @@ + + + diff --git a/frontend/src/views/webmail/EmailView.vue b/frontend/src/views/webmail/EmailView.vue index 9db2d7978..ba759b0fd 100644 --- a/frontend/src/views/webmail/EmailView.vue +++ b/frontend/src/views/webmail/EmailView.vue @@ -7,15 +7,20 @@ color="primary" variant="tonal" prepend-icon="mdi-reply" - append-icon="mdi-chevron-down" + @click="replyToEmail" > {{ $gettext('Reply') }} - - - - - - +
- + + @@ -100,6 +109,20 @@