diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json
index 616ee34e6..072c7ead7 100644
--- a/dashboard/public/translation/en.json
+++ b/dashboard/public/translation/en.json
@@ -63,7 +63,10 @@
"action": {
"reboot": "Reboot",
"logs": "Logs",
- "showLogs": "Show Logs"
+ "showLogs": "Show Logs",
+ "delete": "Delete",
+ "remove": "Remove",
+ "edit": "Edit"
},
"clipboard": {
"copied": "Copied to clipboard",
diff --git a/dashboard/public/translation/pt.json b/dashboard/public/translation/pt.json
index 7d624b93b..29e70735f 100644
--- a/dashboard/public/translation/pt.json
+++ b/dashboard/public/translation/pt.json
@@ -708,7 +708,8 @@
"schedule": "Agendar",
"retentionPolicy": "Política de Retenção",
"title": "Agendar e Retenção",
- "configure": "Configurar"
+ "configure": "Configurar",
+ "description": "Uma cópia de segurança completa do sistema é criada com base no 'Agendamento' especificado no Fuso Horário do Sistema. As cópias de segurança antigas são removidas com base na 'Política de Retenção'."
},
"backupEdit": {
"remotePath": "Remover Caminho",
diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json
index 510514f4a..e6ae26214 100644
--- a/dashboard/public/translation/ru.json
+++ b/dashboard/public/translation/ru.json
@@ -950,7 +950,7 @@
"configureBackupStorage": {
"noopNote": "Этот параметр полностью отключает функцию резервного копирования и восстановления. Используйте её только в тестовых целях. Предварительно убедитесь, что Вы настроили альтернативные способы резервного копирования на Вашем сервере.",
"formatChangeNote": "Резервные копии, хранящиеся в старом хранилище, должны быть удалены вручную.",
- "encryptionPassword": "Пароль шифрования (необязательно)",
+ "encryptionPassword": "Пароль шифрования",
"title": "Настроить хранилище резервных копий",
"provider": "Поставщик хранилища",
"mountPoint": "Точка монтирования",
@@ -997,7 +997,9 @@
"chown": "Удалённая файловая система поддерживает chown",
"encryptedFilenames": "Зашифрованные имена файлов",
"encryptFilenames": "Шифровать имена файлов",
- "preserveAttributesLabel": "Сохранить атрибуты файла"
+ "preserveAttributesLabel": "Сохранить атрибуты файла",
+ "name": "Имя",
+ "encryptionHint": "Подсказка пароля шифрования"
},
"title": "Резервные копии",
"logs": {
@@ -1022,7 +1024,7 @@
},
"backupEdit": {
"title": "Редактировать резервную копию",
- "label": "Имя",
+ "label": "Метка",
"preserved": {
"description": "Хранить резервную копию, игнорируя политику хранения",
"tooltip": "Также будет сохранена почта и {{ appsLength } резервных копий."
@@ -2061,5 +2063,10 @@
"settings": {
"title": "Настройки"
}
+ },
+ "archives": {
+ "listing": {
+ "placeholder": "Нет архивных приложений"
+ }
}
}
diff --git a/dashboard/src/views/DomainsView.vue b/dashboard/src/views/DomainsView.vue
index 3201bd9f9..a9342a783 100644
--- a/dashboard/src/views/DomainsView.vue
+++ b/dashboard/src/views/DomainsView.vue
@@ -83,13 +83,13 @@ function onActionMenu(domain, event) {
action: () => wellKnownDialog.value.open(domain),
}, {
icon: 'fa-solid fa-pencil-alt',
- label: t('domains.tooltipEdit'),
+ label: t('main.action.edit'),
action: onEdit.bind(null, domain),
}, {
separator: true,
}, {
icon: 'fa-solid fa-trash-alt',
- label: t('domains.tooltipRemove'),
+ label: t('main.action.remove'),
disabled: domain.domain.value === dashboardDomain.value,
action: onRemove.bind(null, domain),
}];
diff --git a/dashboard/src/views/EmailMailboxesView.vue b/dashboard/src/views/EmailMailboxesView.vue
index 8fb7beba0..3c8043aba 100644
--- a/dashboard/src/views/EmailMailboxesView.vue
+++ b/dashboard/src/views/EmailMailboxesView.vue
@@ -5,7 +5,7 @@ const i18n = useI18n();
const t = i18n.t;
import { ref, onMounted, useTemplateRef, inject, computed } from 'vue';
-import { Button, TableView, Dialog, Checkbox, TextInput } from '@cloudron/pankow';
+import { Button, TableView, Dialog, Checkbox, TextInput, Menu } from '@cloudron/pankow';
import { prettyDecimalSize } from '@cloudron/pankow/utils';
import { eachLimit } from 'async';
import Section from '../components/Section.vue';
@@ -50,6 +50,24 @@ const columns = {
actions: {}
};
+const actionMenuModel = ref([]);
+const actionMenuElement = useTemplateRef('actionMenuElement');
+function onActionMenu(mailbox, event) {
+ actionMenuModel.value = [{
+ icon: 'fa-solid fa-pencil-alt',
+ label: t('main.action.edit'),
+ action: onAddOrEdit.bind(null, mailbox),
+ }, {
+ separator: true,
+ }, {
+ icon: 'fa-solid fa-trash-alt',
+ label: t('main.action.remove'),
+ action: onRemove.bind(null, mailbox),
+ }];
+
+ actionMenuElement.value.open(event, event.currentTarget);
+}
+
const busy = ref(true);
const mailboxes = ref([]);
const domains = ref([]);
@@ -184,6 +202,7 @@ onMounted(async () => {
+