diff --git a/dashboard/src/components/app/Updates.vue b/dashboard/src/components/app/Updates.vue index 73bacbda3..07735c41b 100644 --- a/dashboard/src/components/app/Updates.vue +++ b/dashboard/src/components/app/Updates.vue @@ -3,16 +3,19 @@ import { ref, onMounted, useTemplateRef } from 'vue'; import { marked } from 'marked'; import { Button, Switch, Dialog, Checkbox } from '@cloudron/pankow'; +import { ISTATES } from '../../constants.js'; import SettingsItem from '../SettingsItem.vue'; import AppsModel from '../../models/AppsModel.js'; import UpdaterModel from '../../models/UpdaterModel.js'; import ProfileModel from '../../models/ProfileModel.js'; +import TasksModel from '../../models/TasksModel.js'; const props = defineProps([ 'app' ]); const appsModel = AppsModel.create(); const updaterModel = UpdaterModel.create(); const profileModel = ProfileModel.create(); +const tasksModel = TasksModel.create(); const dialog = useTemplateRef('dialog'); const update = ref(null); @@ -36,6 +39,21 @@ async function onAutoUpdatesEnabledChange(value) { autoUpdatesEnabledBusy.value = false; } +async function waitForTask(id) { + if (!id) return; + + const [error, result] = await tasksModel.get(id); + if (error) return console.error(error); + + // task done, refresh menu + if (!result.active) { + await onCheck(); + return; + } + + setTimeout(waitForTask.bind(null, id), 2000); +} + async function onCheck() { busyCheck.value = true; @@ -54,7 +72,7 @@ async function onUpdate() { busyUpdate.value = true; updateError.value = ''; - let [error] = await appsModel.update(props.app.id, update.value.manifest, skipBackup.value); + const [error, result] = await appsModel.update(props.app.id, update.value.manifest, skipBackup.value); if (error) { busyUpdate.value = false; if (error.status === 400) updateError.value = error.body ? error.body.message : 'Internal error'; @@ -65,8 +83,7 @@ async function onUpdate() { dialog.value.close(); - [error] = await appsModel.checkUpdate(props.app.id); - if (error) return console.error(error); + waitForTask(result); } function onAskUpdate() { @@ -142,7 +159,7 @@ onMounted(async () => { - + diff --git a/dashboard/src/models/AppsModel.js b/dashboard/src/models/AppsModel.js index 5fc287279..598291830 100644 --- a/dashboard/src/models/AppsModel.js +++ b/dashboard/src/models/AppsModel.js @@ -342,7 +342,7 @@ function create() { } if (result.status !== 202) return [result]; - return [null]; + return [null, result.body.taskId]; }, async backups(id) { // we fetch probably enough to avoid pagination diff --git a/dashboard/src/views/AppConfigureView.vue b/dashboard/src/views/AppConfigureView.vue index 7daad2378..228f26ae8 100644 --- a/dashboard/src/views/AppConfigureView.vue +++ b/dashboard/src/views/AppConfigureView.vue @@ -159,7 +159,7 @@ function isViewEnabled(view, errorState) { return errorState === ISTATES.PENDING_SERVICES_CHANGE; } else if (view === 'email') { return errorState === ISTATES.PENDING_SERVICES_CHANGE; - } else if (view === 'update') { + } else if (view === 'updates') { return errorState === ISTATES.PENDING_UPDATE; }