diff --git a/dashboard/src/views/BackupSitesView.vue b/dashboard/src/views/BackupSitesView.vue index e680fd3de..3335d4241 100644 --- a/dashboard/src/views/BackupSitesView.vue +++ b/dashboard/src/views/BackupSitesView.vue @@ -5,7 +5,7 @@ const i18n = useI18n(); const t = i18n.t; import { ref, onMounted, useTemplateRef, reactive, inject } from 'vue'; -import { Button, Menu, ProgressBar, InputDialog } from '@cloudron/pankow'; +import { Button, Menu, ProgressBar, InputDialog, Spinner } from '@cloudron/pankow'; import { prettyLongDate } from '@cloudron/pankow/utils'; import Section from '../components/Section.vue'; import StateLED from '../components/StateLED.vue'; @@ -211,6 +211,28 @@ async function onCancelTask(taskId) { if (error) console.error('Failed to cancel task:', error); } +async function refreshStatusForSite(site) { + const [error, status] = await backupSitesModels.status(site.id); + if (error) return console.error(error); + + site.status.state = status?.state === 'active' ? 'success' : 'danger'; + site.status.busy = false; +} + +async function refreshTaskForSite(site) { + const [error, tasks] = await tasksModel.getByType(TASK_TYPES.TASK_FULL_BACKUP_PREFIX + site.id); + if (error) return console.error(error); + + if (tasks[0]) { + site.task = tasks[0]; + if (site.task.active) setTimeout(waitForSiteTask.bind(null, site), 2000); + } else { + site.task = null; + } + + site.taskLoaded = true; +} + async function refresh() { busy.value = true; @@ -224,22 +246,12 @@ async function refresh() { // have to make it a reactive object as we manipulate property objects const site = reactive(result); site.status = { busy: true, state: '', message: '' }; + site.task = null; + site.taskLoaded = false; - const [error, status] = await backupSitesModels.status(site.id); - if (error) console.error(error); - - site.status.state = status?.state === 'active' ? 'success' : 'danger'; - site.status.busy = false; - - const [taskError, tasks] = await tasksModel.getByType(TASK_TYPES.TASK_FULL_BACKUP_PREFIX + site.id); - if (taskError) { - console.error(error); - continue; - } - - site.task = tasks[0] || null; - - if (site.task && site.task.active) setTimeout(waitForSiteTask.bind(null, site), 2000); + // do not wait for it + refreshStatusForSite(site); + refreshTaskForSite(site); sitesWithDetails.push(site); } @@ -272,8 +284,8 @@ onMounted(async () => {
{{ $t('backup.sites.emptyPlaceholder') }}
-
- +
+
@@ -307,7 +319,11 @@ onMounted(async () => { {{ $t('backups.schedule.retentionPolicy') }}: {{ prettyBackupRetention(site.retention) }}
-
{{ $t('backup.sites.lastRun') }}: Never
+
+ {{ $t('backup.sites.lastRun') }}: + Never + ... +
{{ $t('backup.sites.lastRun') }}: {{ prettyLongDate(site.task.ts) }}
{{ $t('backup.sites.lastRun') }}: {{ prettyLongDate(site.task.ts) }}