diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json index 886e46a41..cdeefad54 100644 --- a/dashboard/public/translation/en.json +++ b/dashboard/public/translation/en.json @@ -1570,7 +1570,8 @@ "backup": { "target": { "label": "Backup Site", - "size": "Size" + "size": "Size", + "fileCount": "Files" }, "sites": { "title": "Backup Sites", diff --git a/dashboard/public/translation/pt.json b/dashboard/public/translation/pt.json index 8e0c2e240..4084786f6 100644 --- a/dashboard/public/translation/pt.json +++ b/dashboard/public/translation/pt.json @@ -15,7 +15,8 @@ "nosso": "Iniciar sessão com conta dedicada", "email": "Iniciar sessão com endereço de correio eletrónico", "openid": "Iniciar a sessão com Couldron OpenID" - } + }, + "noMatchesPlaceholder": "Sem aplicações correspondentes" }, "main": { "displayName": "Nome a exibir", @@ -39,7 +40,8 @@ "username": "Nome de Utilizador", "actions": "Ações", "table": { - "date": "Data" + "date": "Data", + "version": "Versão" }, "action": { "reboot": "Reiniciar", @@ -84,10 +86,11 @@ "groups": "Grupos", "configuredForCloudronEmail": "Esta aplicação está pré-configurada para ser utilizada com o E-mail do Cloudron.", "cloudflarePortWarning": "O proxy do Cloudflare deve estar desativado para o domínio da aplicação para que possa aceder a esta porta", - "portReadOnly": "apenas de leitura" + "portReadOnly": "apenas de leitura", + "ephemeralPortWarning": "Utilizar portas efémeras pode causar conflitos imprevisíveis." }, "title": "Loja de Aplicações", - "searchPlaceholder": "Procure por alternativas, tais como Github, Dropbox, Slack, Trello, …", + "searchPlaceholder": "Procure por alternativas, tais como Github, Dropbox, Slack, Trello…", "unstable": "Instável", "appNotFoundDialog": { "description": "Não existe nenhuma aplicação {{ appId }} com a versão {{ version }}.", @@ -193,8 +196,11 @@ "url": "URL do Servidor", "description": "Todas as consultas de LDAP tem de ser autenticadas com este segredo e o utilizador {{ userDN }} de DN" }, - "description": "O servidor LDAP pode ser utilizado pelas aplicações externas para autenticação.", - "cloudflarePortWarning": "O proxy de Cloudflare deve estar desativado no domínio do painel para aceder ao servidor LDAP" + "description": "O servidor LDAP permite que as aplicações externas autentiquem os utilizadores na diretoria de utilizadores do Cloudron.", + "cloudflarePortWarning": "O proxy de Cloudflare deve estar desativado no domínio do painel para aceder ao servidor LDAP", + "enable": "Ativar Servidor LDAP", + "title": "Servidor LDAP", + "enabled": "Ativar Servidor LDAP" }, "users": { "superadminTooltip": "Este utilizador é um super administrador", @@ -208,13 +214,16 @@ "usermanagerTooltip": "Este utilizador pode gerir os grupos e os outros utilizadores", "inactiveTooltip": "Utilizador está inativo", "externalLdapTooltip": "Da diretoria LDAP externa", - "resetPasswordTooltip": "Redefinir Palavra-passe" + "resetPasswordTooltip": "Redefinir Palavra-passe", + "noMatchesPlaceholder": "Nenhum utilizador correspondente", + "emptyPlaceholder": "Sem Utilizadores" }, "groups": { "emptyPlaceholder": "Sem Grupos", "name": "Nome", "users": "Utilizadores", - "externalLdapTooltip": "Da diretoria LDAP externa" + "externalLdapTooltip": "Da diretoria LDAP externa", + "noMatchesPlaceholder": "Nenhum grupo correspondente" }, "user": { "fullName": "Nome Completo", @@ -324,7 +333,7 @@ "invitationNotification": { "body": "Mensagem enviada para {{ email }}" }, - "title": "Utilizadores e Grupos" + "title": "Utilizadores" }, "login": { "2faToken": "Código 2FA", @@ -503,10 +512,10 @@ "contents": "Conteúdos", "version": "Versão", "noApps": "Sem Aplicações", - "appCount": "{{ appCount }} aplicações", + "appCount": "Aplicações: {{ appCount }}", "backupNow": "Copiar Agora", "tooltipPreservedBackup": "Esta cópia de segurança será preservada", - "title": "Listagem", + "title": "Cópias de Segurança do Sistema", "noBackups": "Sem Cópias de Segurança", "tooltipDownloadBackupConfig": "Transferir Configuração", "cleanupBackups": "Limpeza das Cópias de Segurança" @@ -516,7 +525,7 @@ "id": "Id.", "date": "Data", "version": "Versão", - "list": "Referencia as cópias de segurança de {{ appCount }} aplicações" + "list": "Referencia as cópias de segurança de {{ appCount }} aplicação(ões)" } }, "passwordReset": { diff --git a/dashboard/src/components/SystemBackupList.vue b/dashboard/src/components/SystemBackupList.vue index 125fba852..81e0a5120 100644 --- a/dashboard/src/components/SystemBackupList.vue +++ b/dashboard/src/components/SystemBackupList.vue @@ -56,6 +56,25 @@ const columns = { actions: {} }; +const backupContentTableColumns = { + label: { + label: t('backups.listing.contents'), + sort: true, + }, + fileCount: { + label: t('backup.target.fileCount'), + sort(a, b, A, B) { + return A.stats?.upload?.fileCount - B.stats?.upload?.fileCount; + }, + }, + size: { + label: t('backup.target.size'), + sort(a, b, A , B) { + return A.stats?.upload?.size - B.stats?.upload?.size; + }, + } +}; + const actionMenuModel = ref([]); const actionMenuElement = useTemplateRef('actionMenuElement'); function onActionMenu(backup, event) { @@ -183,10 +202,13 @@ async function onDownloadConfig(backup) { // backups info dialog const infoDialog = useTemplateRef('infoDialog'); +const infoDialogBusy = ref(true); const infoBackup = ref({ contents: [] }); async function onInfo(backup) { infoBackup.value = backup; infoBackup.value.contents = []; + infoDialogBusy.value = true; + infoDialog.value.open(); // amend detailed app info @@ -221,6 +243,8 @@ async function onInfo(backup) { } infoBackup.value.contents.push(content); } + + infoDialogBusy.value = false; } // edit backups dialog @@ -316,16 +340,26 @@ defineExpose({ refresh });