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