From 5fe6757f8a41bd6ae23f8b0c63ceff9b01f90e74 Mon Sep 17 00:00:00 2001 From: Johannes Zellner Date: Sat, 1 Mar 2025 20:59:16 +0100 Subject: [PATCH] Add app configure recvmail ui --- dashboard/src/components/app/Email.vue | 82 +++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/dashboard/src/components/app/Email.vue b/dashboard/src/components/app/Email.vue index e223c276a..c517c472c 100644 --- a/dashboard/src/components/app/Email.vue +++ b/dashboard/src/components/app/Email.vue @@ -6,11 +6,15 @@ import { Button, Radiobutton, InputGroup, FormGroup, TextInput, SingleSelect } f import { ref, onMounted } from 'vue'; import AppsModel from '../../models/AppsModel.js'; import DomainsModel from '../../models/DomainsModel.js'; +import MailboxesModel from '../../models/MailboxesModel.js'; const appsModel = AppsModel.create(); const domainsModel = DomainsModel.create(); +const mailboxesModel = MailboxesModel.create(); const domains = ref([]); +const mailboxes = ref([]); + const hasRecvmail = ref(false); const hasSendmail = ref(false); const sendmailBusy = ref(false); @@ -22,10 +26,16 @@ const sendmailDisplayName = ref(''); const sendmailDomain = ref(''); const enableMailbox = ref(0); +const recvmailBusy = ref(false); +const recvmailError = ref(''); +const recvmailEnable = ref(0); +const recvmailMailbox = ref({}); + async function onSendmailSubmit() { if (!sendmailMailboxName.value) return; sendmailBusy.value = true; + sendmailError.value = ''; const data = { enable: !!enableMailbox.value @@ -47,6 +57,29 @@ async function onSendmailSubmit() { sendmailBusy.value = false; } +async function onRecvmailSubmit() { + recvmailBusy.value = true; + recvmailError.value = ''; + + const data = { + enable: !!recvmailEnable.value + }; + + if (data.enable) { + data.inboxName = recvmailMailbox.value.split('@')[0]; + data.inboxDomain = recvmailMailbox.value.split('@')[1]; + } + + const [error] = await appsModel.configure(props.app.id, 'inbox', data); + if (error) { + recvmailError.value = error.body ? error.body.message : 'Internal error'; + recvmailBusy.value = false; + return console.error(error); + } + + recvmailBusy.value = false; +} + onMounted(async () => { const [error, result] = await domainsModel.list(); if (error) return console.error(error); @@ -54,18 +87,38 @@ onMounted(async () => { domains.value = result.map(d => { return { id: d.domain, - label: d.domain + label: d.domain, + domain: d.domain }; }); - hasRecvmail.value = props.app.manifest?.addons?.recvmail; - hasSendmail.value = props.app.manifest?.addons?.sendmail; sendmailSupportsDisplayName.value = props.app.manifest?.addons?.sendmail?.supportsDisplayName; sendmailOptional.value = props.app.manifest?.addons?.sendmail?.optional; sendmailMailboxName.value = props.app.mailboxName || ''; sendmailDisplayName.value = props.app.mailboxDisplayName || ''; sendmailDomain.value = props.app.mailboxDomain || props.app.domain; enableMailbox.value = props.app.enableMailbox ? 1 : 0; + + let tmp = []; + for (const d of domains.value) { + const [error, result] = await mailboxesModel.list(d.domain); + if (error) return console.error(error); + tmp = tmp.concat(result); + } + + mailboxes.value = tmp.map(m => { + return { + id: m.name + '@' + m.domain, + label: m.name + '@' + m.domain, + }; + }); + + recvmailEnable.value = props.app.enableInbox ? 1 : 0; + recvmailMailbox.value = props.app.inboxName ? props.app.inboxName + '@' + props.app.inboxDomain : ''; + + // do this last to avoid ui flicker + hasRecvmail.value = props.app.manifest?.addons?.recvmail; + hasSendmail.value = props.app.manifest?.addons?.sendmail; }); @@ -109,5 +162,28 @@ onMounted(async () => {
+ +
+ + + + +
+

+ + +
{{ recvmailError }}
+ +
+
+ + +

{{ $t('app.email.inbox.disableDescription') }}

+
+ +
+ + +