diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json
index aa10f5ad5..317bc3b5e 100644
--- a/dashboard/package-lock.json
+++ b/dashboard/package-lock.json
@@ -6,7 +6,7 @@
"packages": {
"": {
"dependencies": {
- "@cloudron/pankow": "^3.7.0",
+ "@cloudron/pankow": "^4.0.0",
"@fontsource/inter": "^5.2.8",
"@fortawesome/fontawesome-free": "^7.1.0",
"@vitejs/plugin-vue": "^6.0.4",
@@ -92,13 +92,13 @@
}
},
"node_modules/@cloudron/pankow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@cloudron/pankow/-/pankow-3.7.0.tgz",
- "integrity": "sha512-HIa2xAJdHNttie6DRADPKfxhlx91VZ+AU7YFe6Tc3zlx6cI6aTCyb+uow+w2XYUlllU9g6EkR1dGrPgVhM2ViQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@cloudron/pankow/-/pankow-4.0.0.tgz",
+ "integrity": "sha512-3jRSI8sb0QpaJ3bWNvPLj5+P/p0grEglcvPwgaCVmYJk3EhVXNfVtuVFZPY7cecxqBfGf6e6tqsUCu/3W/DGxQ==",
"license": "ISC",
"dependencies": {
"@fontsource/inter": "^5.2.8",
- "@fortawesome/fontawesome-free": "^7.1.0",
+ "@fortawesome/fontawesome-free": "^7.2.0",
"filesize": "^11.0.13",
"monaco-editor": "^0.55.1",
"online-3d-viewer": "^0.18.0"
@@ -663,9 +663,9 @@
}
},
"node_modules/@fortawesome/fontawesome-free": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz",
- "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz",
+ "integrity": "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==",
"license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
"engines": {
"node": ">=6"
@@ -3277,12 +3277,12 @@
}
},
"@cloudron/pankow": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@cloudron/pankow/-/pankow-3.7.0.tgz",
- "integrity": "sha512-HIa2xAJdHNttie6DRADPKfxhlx91VZ+AU7YFe6Tc3zlx6cI6aTCyb+uow+w2XYUlllU9g6EkR1dGrPgVhM2ViQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@cloudron/pankow/-/pankow-4.0.0.tgz",
+ "integrity": "sha512-3jRSI8sb0QpaJ3bWNvPLj5+P/p0grEglcvPwgaCVmYJk3EhVXNfVtuVFZPY7cecxqBfGf6e6tqsUCu/3W/DGxQ==",
"requires": {
"@fontsource/inter": "^5.2.8",
- "@fortawesome/fontawesome-free": "^7.1.0",
+ "@fortawesome/fontawesome-free": "^7.2.0",
"filesize": "^11.0.13",
"monaco-editor": "^0.55.1",
"online-3d-viewer": "^0.18.0"
@@ -3531,9 +3531,9 @@
"integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg=="
},
"@fortawesome/fontawesome-free": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz",
- "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA=="
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz",
+ "integrity": "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg=="
},
"@humanfs/core": {
"version": "0.19.1",
diff --git a/dashboard/package.json b/dashboard/package.json
index c9df03b19..51594946c 100644
--- a/dashboard/package.json
+++ b/dashboard/package.json
@@ -7,7 +7,7 @@
},
"type": "module",
"dependencies": {
- "@cloudron/pankow": "^3.7.0",
+ "@cloudron/pankow": "^4.0.0",
"@fontsource/inter": "^5.2.8",
"@fortawesome/fontawesome-free": "^7.1.0",
"@vitejs/plugin-vue": "^6.0.4",
diff --git a/dashboard/src/components/ApiTokens.vue b/dashboard/src/components/ApiTokens.vue
index 8b6abd9ee..e25e2684a 100644
--- a/dashboard/src/components/ApiTokens.vue
+++ b/dashboard/src/components/ApiTokens.vue
@@ -185,19 +185,19 @@ onMounted(async () => {
-
+
{{ prettyLongDate(apiToken.lastUsedTime) }}
{{ $t('profile.apiTokens.neverUsed') }}
-
+
{{ $t('profile.apiTokens.readwrite') }}
{{ $t('profile.apiTokens.readonly') }}
-
+
{{ apiToken.allowedIpRanges }}
{{ '*' }}
-
+
diff --git a/dashboard/src/components/AppPasswords.vue b/dashboard/src/components/AppPasswords.vue
index 523c2abbe..335e1635e 100644
--- a/dashboard/src/components/AppPasswords.vue
+++ b/dashboard/src/components/AppPasswords.vue
@@ -243,14 +243,14 @@ onMounted(async () => {
- {{ password.name }}
- {{ password.label }}
- {{ prettyLongDate(password.creationTime) }}
-
+ {{ password.name }}
+ {{ password.label }}
+ {{ prettyLongDate(password.creationTime) }}
+
-
{{ prettyLongDate(password.expiresAt) }}
-
+
diff --git a/dashboard/src/components/BackupInfoDialog.vue b/dashboard/src/components/BackupInfoDialog.vue
index d0395f5c7..541aecca6 100644
--- a/dashboard/src/components/BackupInfoDialog.vue
+++ b/dashboard/src/components/BackupInfoDialog.vue
@@ -147,17 +147,17 @@ defineExpose({
-
+
{{ content.label }}
{{ content.label || content.fqdn }}
{{ content.id }}
-
+
{{ content.stats.upload.fileCount }}
-
-
+
{{ prettyFileSize(content.stats.upload.size) }}
-
diff --git a/dashboard/src/components/DockerRegistries.vue b/dashboard/src/components/DockerRegistries.vue
index 7a5438d18..fca579185 100644
--- a/dashboard/src/components/DockerRegistries.vue
+++ b/dashboard/src/components/DockerRegistries.vue
@@ -104,7 +104,7 @@ onMounted(async () => {
-
+
diff --git a/dashboard/src/components/SystemBackupList.vue b/dashboard/src/components/SystemBackupList.vue
index b89a11596..750c8b253 100644
--- a/dashboard/src/components/SystemBackupList.vue
+++ b/dashboard/src/components/SystemBackupList.vue
@@ -272,7 +272,7 @@ defineExpose({ refresh });
-
+
{{ prettyLongDate(backup.creationTime) }}
{{ backup.label }}
@@ -280,18 +280,18 @@ defineExpose({ refresh });
-
+
{{ $t('backups.listing.appCount', { appCount: backup.appCount }) }}
{{ $t('backups.listing.noApps') }}
-
+
{{ prettyFileSize(backup.stats.aggregatedUpload.size) }} | {{ backup.stats.aggregatedUpload.fileCount }} file(s)
- {{ backup.site.name }}
+ {{ backup.site.name }}
-
+
diff --git a/dashboard/src/components/app/Backups.vue b/dashboard/src/components/app/Backups.vue
index 302067225..589cd4d1d 100644
--- a/dashboard/src/components/app/Backups.vue
+++ b/dashboard/src/components/app/Backups.vue
@@ -61,6 +61,8 @@ const columns = ref({
}
});
+const accessLevel = props.app.accessLevel;
+
function createActionMenu(backup) {
return [{
icon: 'fa-solid fa-info',
@@ -69,27 +71,27 @@ function createActionMenu(backup) {
}, {
icon: 'fa-solid fa-pencil-alt',
label: t('main.action.edit'),
- visible: props.app.accessLevel === 'admin',
+ visible: accessLevel === 'admin',
action: onEdit.bind(null, backup),
}, {
separator: true,
}, {
icon: 'fa-solid fa-download',
label: t('app.backups.backups.downloadBackupTooltip'),
- visible: backup.site.format === 'tgz' && props.app.accessLevel === 'admin',
+ visible: backup.site.format === 'tgz' && accessLevel === 'admin',
href: getDownloadLink(backup),
}, {
icon: 'fa-solid fa-file-alt',
label: t('app.backups.backups.downloadConfigTooltip'),
- visible: props.app.accessLevel === 'admin',
+ visible: accessLevel === 'admin',
action: onDownloadConfig.bind(null, backup),
}, {
separator: true,
- visible: props.app.accessLevel === 'admin',
+ visible: accessLevel === 'admin',
}, {
icon: 'fa-solid fa-clone',
label: t('app.backups.backups.cloneTooltip'),
- visible: props.app.accessLevel === 'admin',
+ visible: accessLevel === 'admin',
action: onClone.bind(null, backup),
}, {
icon: 'fa-solid fa-history',
@@ -102,7 +104,7 @@ function createActionMenu(backup) {
}, {
icon: 'fa-solid fa-key',
label: backup.integrityCheckTaskId ? t('backups.stopIntegrity') : t('backups.checkIntegrity'),
- visible: props.app.accessLevel === 'admin',
+ visible: accessLevel === 'admin',
action: backup.integrityCheckTaskId ? onStopIntegrityCheck.bind(null, backup) : onStartIntegrityCheck.bind(null, backup),
}];
}
@@ -431,29 +433,29 @@ onUnmounted(() => {
-
+
- {{ prettyLongDate(backup.creationTime) }}
- {{ backup.label }}
-
+ {{ prettyLongDate(item.creationTime) }}
+ {{ item.label }}
+
-
- {{ backup.site.name }}
+
+ {{ item.site.name }}
-
- {{ prettyFileSize(backup.stats.upload.size) }} - {{ backup.stats.upload.fileCount }} file(s)
+
+ {{ prettyFileSize(item.stats.upload.size) }} - {{ item.stats.upload.fileCount }} file(s)
-
-
-
diff --git a/dashboard/src/views/AppArchiveView.vue b/dashboard/src/views/AppArchiveView.vue
index ebb1347bd..eb7aa7515 100644
--- a/dashboard/src/views/AppArchiveView.vue
+++ b/dashboard/src/views/AppArchiveView.vue
@@ -125,20 +125,20 @@ onMounted(async () => {
-
+
- {{ archive.appConfig ? archive.appConfig.fqdn : '-' }}
+ {{ archive.appConfig ? archive.appConfig.fqdn : '-' }}
-
+
{{ archive.manifest.title }}
- {{ prettyLongDate(archive.creationTime) }}
+ {{ prettyLongDate(archive.creationTime) }}
-
+
diff --git a/dashboard/src/views/AppsView.vue b/dashboard/src/views/AppsView.vue
index 10b91605c..0349dcae9 100644
--- a/dashboard/src/views/AppsView.vue
+++ b/dashboard/src/views/AppsView.vue
@@ -359,35 +359,35 @@ onDeactivated(() => {
-
+
-
+
{{ app.label || app.subdomain || app.fqdn }}
-
+
{{ app.manifest.title }}
-
+
{{ app.fqdn }}
-
+
{{ AppsModel.installationStateLabel(app) }}
-
+
-
+
@@ -395,7 +395,7 @@ onDeactivated(() => {
-
+
diff --git a/dashboard/src/views/DomainsView.vue b/dashboard/src/views/DomainsView.vue
index 3d2727b7c..2aafaeeaf 100644
--- a/dashboard/src/views/DomainsView.vue
+++ b/dashboard/src/views/DomainsView.vue
@@ -151,10 +151,10 @@ onMounted(async () => {
-
+
{{ DomainsModel.prettyProviderName(domain.provider) }}
-
+
diff --git a/dashboard/src/views/EmailMailboxesView.vue b/dashboard/src/views/EmailMailboxesView.vue
index dffc8d5db..dadabccd8 100644
--- a/dashboard/src/views/EmailMailboxesView.vue
+++ b/dashboard/src/views/EmailMailboxesView.vue
@@ -266,17 +266,17 @@ onMounted(async () => {
- {{ mailbox.aliases.map(a => a.name + '@' + a.domain).join(' ') }}
-
+ {{ mailbox.aliases.map(a => a.name + '@' + a.domain).join(' ') }}
+
{{ prettyDecimalSize(cachedMailboxUsage[mailbox.fullName].diskSize) || '-' }}
{{ $t('main.loadingPlaceholder') }} ...
-
+
{{ prettyDecimalSize(mailbox.storageQuota) }}
-
-
+
diff --git a/dashboard/src/views/EmailMailinglistsView.vue b/dashboard/src/views/EmailMailinglistsView.vue
index 047e42b15..713cecf0b 100644
--- a/dashboard/src/views/EmailMailinglistsView.vue
+++ b/dashboard/src/views/EmailMailinglistsView.vue
@@ -170,13 +170,13 @@ onMounted(async () => {
-
+
-
+
{{ mailinglist.members.length }}
-
+
diff --git a/dashboard/src/views/GroupsView.vue b/dashboard/src/views/GroupsView.vue
index 35fdd4db8..acdaf5af0 100644
--- a/dashboard/src/views/GroupsView.vue
+++ b/dashboard/src/views/GroupsView.vue
@@ -164,11 +164,11 @@ onMounted(async () => {
-
+
{{ group.name }}
- {{ groupMembers(group) }}
-
+ {{ groupMembers(group) }}
+
diff --git a/dashboard/src/views/OpenIdView.vue b/dashboard/src/views/OpenIdView.vue
index 60d083e62..2ce1f11a4 100644
--- a/dashboard/src/views/OpenIdView.vue
+++ b/dashboard/src/views/OpenIdView.vue
@@ -246,7 +246,7 @@ onMounted(async () => {
-
+
diff --git a/dashboard/src/views/ServicesView.vue b/dashboard/src/views/ServicesView.vue
index 3789d073e..5f48b478a 100644
--- a/dashboard/src/views/ServicesView.vue
+++ b/dashboard/src/views/ServicesView.vue
@@ -264,18 +264,18 @@ onUnmounted(() => {
-
+
-
+
{{ prettyBinarySize(service.memoryUsed) }} / {{ prettyBinarySize(service.memoryLimit) }} ({{ service.memoryPercent }}%)
-
+
{{ prettyBinarySize(service.memoryLimit) }}
-
+
diff --git a/dashboard/src/views/UsersView.vue b/dashboard/src/views/UsersView.vue
index 66104604d..bd4558e78 100644
--- a/dashboard/src/views/UsersView.vue
+++ b/dashboard/src/views/UsersView.vue
@@ -294,11 +294,11 @@ onMounted(async () => {
-
+
-
+
{{ user.displayName }}
{{ user.username }}
{{ user.email }}
@@ -306,21 +306,17 @@ onMounted(async () => {
-
+
{{ user.groupIds.map(gid => groupsById[gid] ? groupsById[gid].name : gid).join(' ') }}
-
+
-
+
-
-
-
-
diff --git a/dashboard/src/views/VolumesView.vue b/dashboard/src/views/VolumesView.vue
index 0f342886c..f9038e929 100644
--- a/dashboard/src/views/VolumesView.vue
+++ b/dashboard/src/views/VolumesView.vue
@@ -325,19 +325,19 @@ onMounted(async () =>{
-
+
{{ volume.hostPath }}
{{ volume.mountOptions.diskPath }}
{{ volume.mountOptions.host + '/' + volume.mountOptions.remoteDir }}
{{ volume.mountOptions.host + volume.mountOptions.remoteDir }}
-
+
-
+