diff --git a/dashboard/src/components/CatchAllSettingsItem.vue b/dashboard/src/components/CatchAllSettingsItem.vue new file mode 100644 index 000000000..491df5899 --- /dev/null +++ b/dashboard/src/components/CatchAllSettingsItem.vue @@ -0,0 +1,81 @@ + + + diff --git a/dashboard/src/models/MailModel.js b/dashboard/src/models/MailModel.js index c8acc250a..cef785054 100644 --- a/dashboard/src/models/MailModel.js +++ b/dashboard/src/models/MailModel.js @@ -39,6 +39,39 @@ function create() { if (result.status !== 200) return [result]; return [null, result.body.count]; }, + async listMailboxes(domain, search = '', page = 1, per_page = 1000) { + let result; + try { + result = await fetcher.get(`${API_ORIGIN}/api/v1/mail/${domain}/mailboxes`, { search, page, per_page, access_token: accessToken }); + } catch (e) { + return [e]; + } + + if (result.status !== 200) return [result]; + return [null, result.body.mailboxes]; + }, + async getMailbox(domain, mailboxName) { + let result; + try { + result = await fetcher.get(`${API_ORIGIN}/api/v1/mail/${domain}/mailboxes/${mailboxName}`, { access_token: accessToken }); + } catch (e) { + return [e]; + } + + if (result.status !== 200) return [result]; + return [null, result.body.mailbox]; + }, + async setCatchallAddresses(domain, addresses) { + let result; + try { + result = await fetcher.post(`${API_ORIGIN}/api/v1/mail/${domain}/catch_all`, { addresses }, { access_token: accessToken }); + } catch (e) { + return [e]; + } + + if (result.status !== 202) return [result]; + return [null]; + }, async setEnabled(domain, enabled) { let result; try { diff --git a/dashboard/src/views/EmailDomainView.vue b/dashboard/src/views/EmailDomainView.vue index a28c9d09b..4ad90d5b8 100644 --- a/dashboard/src/views/EmailDomainView.vue +++ b/dashboard/src/views/EmailDomainView.vue @@ -8,6 +8,7 @@ import { ref, onMounted, useTemplateRef } from 'vue'; import { Button, TableView, Checkbox, InputDialog, Dialog, FormGroup, TextInput, InputGroup, Switch, ButtonGroup, SingleSelect } from 'pankow'; import Section from '../components/Section.vue'; import SettingsItem from '../components/SettingsItem.vue'; +import CatchAllSettingsItem from '../components/CatchAllSettingsItem.vue'; import DomainsModel from '../models/DomainsModel.js'; import MailModel from '../models/MailModel.js'; import ProfileModel from '../models/ProfileModel.js'; @@ -38,7 +39,6 @@ async function onAskIncomingToggle(value) { const yes = await inputDialog.value.confirm({ title: t('email.disableEmailDialog.title', { domain: domain.value }), message: t('email.disableEmailDialog.description', { domain: domain.value }), - modal: true, confirmStyle: 'danger', confirmLabel: t('email.disableEmailDialog.disableAction'), rejectLabel: t('main.dialog.cancel'), @@ -117,6 +117,7 @@ onMounted(async () => { :reject-label="enableIncomeBusy ? '' : $t('main.dialog.cancel')" reject-style="secondary" @confirm="onEnableIncoming()" + @reject="incomingEnabled = false" >

@@ -149,6 +150,8 @@ onMounted(async () => { + +