Files
cloudron-box/dashboard/src/components/app/Email.vue
T
2025-03-04 18:20:42 +01:00

191 lines
6.9 KiB
Vue

<script setup>
const props = defineProps([ 'app' ]);
import { Button, Radiobutton, InputGroup, FormGroup, TextInput, SingleSelect } from 'pankow';
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);
const sendmailError = ref('');
const sendmailSupportsDisplayName = ref(false);
const sendmailOptional = ref(false);
const sendmailMailboxName = ref('');
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
};
if (data.enable) {
data.mailboxName = sendmailMailboxName.value;
data.mailboxDomain = sendmailDomain.value;
data.mailboxDisplayName = sendmailDisplayName.value;
}
const [error] = await appsModel.configure(props.app.id, 'mailbox', data);
if (error) {
sendmailError.value = error.body ? error.body.message : 'Internal error';
sendmailBusy.value = false;
return console.error(error);
}
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);
domains.value = result.map(d => {
return {
id: d.domain,
label: `@${d.domain}`,
domain: d.domain
};
});
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;
});
</script>
<template>
<div>
<div v-if="hasSendmail">
<FormGroup>
<label>{{ $t('app.email.from.title') }} <sup><a href="https://docs.cloudron.io/apps/#mail-from-address" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></label>
<Radiobutton v-if="sendmailOptional" v-model="enableMailbox" :value="1" :label="$t('app.email.from.enable')"/>
<div style="margin-bottom: 18px;" :style="{ 'padding-left': sendmailOptional ? '20px' : '0' }">
<p v-html="$t('app.email.from.enableDescription', { domain: app.domain, domainConfigLink: ('/#/email/' + app.domain) })"></p>
<form @submit.prevent="onSendmailSubmit()" autocomplete="off">
<fieldset :disabled="enableMailbox === 0 || sendmailBusy || app.error || app.taskId">
<input type="submit" style="display: none;" :disabled="!sendmailMailboxName"/>
<FormGroup>
<div class="has-error" v-if="sendmailError">{{ sendmailError }}</div>
<div style="display: flex; gap: 10px;">
<TextInput v-if="sendmailSupportsDisplayName" v-model="sendmailDisplayName" :placeholder="$t('app.email.from.displayName')"/>
<InputGroup>
<TextInput v-model="sendmailMailboxName" :placeholder="$t('app.email.from.mailboxPlaceholder')"/>
<SingleSelect v-model="sendmailDomain" :disabled="!enableMailbox" :options="domains" option-key="id"/>
</InputGroup>
</div>
</FormGroup>
</fieldset>
</form>
</div>
<Radiobutton v-if="sendmailOptional" v-model="enableMailbox" :value="0" :label="$t('app.email.from.disable')"/>
<p v-if="sendmailOptional" style="padding-left: 20px;">{{ $t('app.email.from.disableDescription') }}</p>
</FormGroup>
<br/>
<Button @click="onSendmailSubmit()" :loading="sendmailBusy" :disabled="sendmailBusy || app.error || app.taskId" v-tooltip="app.error ? 'App is in error state' : (app.taskId ? 'App is busy' : '')">{{ $t('app.email.from.saveAction') }}</Button>
</div>
<hr v-if="hasSendmail && hasRecvmail"/>
<div v-if="hasRecvmail">
<FormGroup>
<label>{{ $t('app.email.inbox.title') }} <sup><a href="https://docs.cloudron.io/apps/#inbox" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></label>
<Radiobutton v-model="recvmailEnable" :value="1" :label="$t('app.email.inbox.enable')"/>
<div style="margin-bottom: 18px; padding-left: 20px">
<p v-html="$t('app.email.inbox.enableDescription', { domain: app.domain, domainConfigLink: ('/#/email/' + app.domain) })"></p>
<FormGroup>
<div class="has-error" v-if="recvmailError">{{ recvmailError }}</div>
<SingleSelect v-model="recvmailMailbox" :disabled="!recvmailEnable" :options="mailboxes" option-key="id"/>
</FormGroup>
</div>
<Radiobutton v-model="recvmailEnable" :value="0" :label="$t('app.email.inbox.disable')"/>
<p style="padding-left: 20px;">{{ $t('app.email.inbox.disableDescription') }}</p>
</FormGroup>
<br/>
<Button @click="onRecvmailSubmit()" :disabled="recvmailBusy || app.error || app.taskId" :loading="recvmailBusy" v-tooltip="app.error ? 'App is in error state' : (app.taskId ? 'App is busy' : '')">{{ $t('app.email.from.saveAction') }}</Button>
</div>
</div>
</template>