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 () => {
+
+