From 339dda6455e4d66e0c59b139c267e5ea6351e30d Mon Sep 17 00:00:00 2001 From: Stefan Dej Date: Sat, 26 Dec 2020 21:15:37 +0100 Subject: [PATCH] feature: update manager for klipper, moonraker, mainsail & os packages Signed-off-by: Stefan Dej --- src/App.vue | 29 ++- .../panels/Settings/UpdatePanel.vue | 205 ++++++++++++++++-- src/pages/settings/interface.vue | 1 - src/pages/settings/machine.vue | 8 +- src/store/mutations.js | 2 +- src/store/printer/mutations.js | 3 +- src/store/server/actions.js | 21 +- src/store/server/index.js | 4 +- src/store/server/updateManager/actions.js | 9 + src/store/server/updateManager/getters.js | 3 + src/store/server/updateManager/index.js | 27 +++ src/store/server/updateManager/mutations.js | 26 +++ src/store/socket/actions.js | 11 +- 13 files changed, 310 insertions(+), 39 deletions(-) create mode 100644 src/store/server/updateManager/actions.js create mode 100644 src/store/server/updateManager/getters.js create mode 100644 src/store/server/updateManager/index.js create mode 100644 src/store/server/updateManager/mutations.js diff --git a/src/App.vue b/src/App.vue index 2e8b55db..227abb08 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,6 +9,12 @@ #page-container { max-width: 1400px; } + + #sidebarVersions { + position: absolute; + left: 0; + bottom: 0; + } @@ -118,7 +131,6 @@ export default { ...mapState({ isConnected: state => state.socket.isConnected, hostname: state => state.printer.hostname, - version: state => state.printer.software_version, klippy_state: state => state.server.klippy_state, printer_state: state => state.printer.print_stats.state, loadings: state => state.socket.loadings, @@ -130,6 +142,11 @@ export default { boolNaviWebcam: state => state.gui.webcam.bool, config: state => state.printer.configfile.config, save_config_pending: state => state.printer.configfile.save_config_pending, + + klipperVersion: state => state.printer.software_version, + + updateStatus: state => state.server.updateManager.updateResponse.complete, + updateMessage: state => state.server.updateManager.updateResponse.message, }), ...mapGetters([ 'getTitle', diff --git a/src/components/panels/Settings/UpdatePanel.vue b/src/components/panels/Settings/UpdatePanel.vue index 5c3dda6b..91c28033 100644 --- a/src/components/panels/Settings/UpdatePanel.vue +++ b/src/components/panels/Settings/UpdatePanel.vue @@ -1,24 +1,99 @@ \ No newline at end of file diff --git a/src/pages/settings/interface.vue b/src/pages/settings/interface.vue index b2f1e2fc..3b091e46 100644 --- a/src/pages/settings/interface.vue +++ b/src/pages/settings/interface.vue @@ -3,7 +3,6 @@ - diff --git a/src/pages/settings/machine.vue b/src/pages/settings/machine.vue index 14ff5d85..ed48dd3c 100644 --- a/src/pages/settings/machine.vue +++ b/src/pages/settings/machine.vue @@ -21,7 +21,8 @@ - + + @@ -41,6 +42,11 @@ ...mapState({ klippy_state: state => state.server.klippy_state, }), + updateManager:{ + get() { + return this.$store.state.server.plugins.includes('update_manager') + } + } }, created() { diff --git a/src/store/mutations.js b/src/store/mutations.js index 098bbd28..a50975a7 100644 --- a/src/store/mutations.js +++ b/src/store/mutations.js @@ -1,6 +1,6 @@ export default { reportError(state, payload) { - window.console.log(payload) + window.console.error(payload) }, void() { diff --git a/src/store/printer/mutations.js b/src/store/printer/mutations.js index 7d4a2512..2ac94dc2 100644 --- a/src/store/printer/mutations.js +++ b/src/store/printer/mutations.js @@ -3,10 +3,11 @@ import { getDefaultState } from './index' export default { reset(state) { - window.console.log("printer/reset"); Object.assign(state, getDefaultState()) this.dispatch('socket/clearLoadings', null, { root: true }) + if (this.state.server.plugins.includes("update_manager")) + Vue.prototype.$socket.sendObj('machine.update.status', { refresh: false }, 'server/updateManager/getStatus') }, setData(state, payload) { diff --git a/src/store/server/actions.js b/src/store/server/actions.js index 2a03e7d4..e5c25b30 100644 --- a/src/store/server/actions.js +++ b/src/store/server/actions.js @@ -5,27 +5,34 @@ export default { commit('reset') }, - init({ dispatch }) { + init({ dispatch, state }) { Vue.prototype.$socket.sendObj('server.info', {}, 'server/getInfo') Vue.prototype.$socket.sendObj('server.gcode_store', {}, 'server/getGcodeStore') Vue.prototype.$socket.sendObj('server.files.get_directory', { path: 'config' }, 'files/getDirectory') Vue.prototype.$socket.sendObj('server.files.get_directory', { path: 'config_examples' }, 'files/getDirectory') + if (state.plugins.length > 0 && state.plugins.includes("update_manager")) + Vue.prototype.$socket.sendObj('machine.update.status', { refresh: false }, 'server/updateManager/getStatus') + dispatch('printer/init', null, { root: true }) }, getInfo({ commit, state }, payload) { - if ( - payload.plugins.includes("power") !== false && - state.plugins.length === 0 - ) Vue.prototype.$socket.sendObj('machine.device_power.devices', {}, 'server/power/getDevices'); + + if (state.plugins.length === 0) { + if (payload.plugins.includes("power") !== false) + Vue.prototype.$socket.sendObj('machine.device_power.devices', {}, 'server/power/getDevices') + + if (payload.plugins.includes("update_manager") !== false) + Vue.prototype.$socket.sendObj('machine.update.status', {}, 'server/updateManager/getStatus') + } commit('setData', payload) if (!payload.klippy_connected) { setTimeout(function(){ - Vue.prototype.$socket.sendObj('server.info', {}, 'server/getInfo'); - }, 1000); + Vue.prototype.$socket.sendObj('server.info', {}, 'server/getInfo') + }, 1000) } }, diff --git a/src/store/server/index.js b/src/store/server/index.js index 1ca79a82..faea8bcf 100644 --- a/src/store/server/index.js +++ b/src/store/server/index.js @@ -4,6 +4,7 @@ import getters from './getters' // import modules import power from './power' +import updateManager from './updateManager' // create getDefaultState export function getDefaultState() { @@ -26,6 +27,7 @@ export default { actions, mutations, modules: { - power + power, + updateManager, } } \ No newline at end of file diff --git a/src/store/server/updateManager/actions.js b/src/store/server/updateManager/actions.js new file mode 100644 index 00000000..9bb9d214 --- /dev/null +++ b/src/store/server/updateManager/actions.js @@ -0,0 +1,9 @@ +export default { + reset({ commit }) { + commit('reset') + }, + + getStatus({ commit }, payload) { + commit('setStatus', payload) + }, +} \ No newline at end of file diff --git a/src/store/server/updateManager/getters.js b/src/store/server/updateManager/getters.js new file mode 100644 index 00000000..5c933b16 --- /dev/null +++ b/src/store/server/updateManager/getters.js @@ -0,0 +1,3 @@ +export default { + +} \ No newline at end of file diff --git a/src/store/server/updateManager/index.js b/src/store/server/updateManager/index.js new file mode 100644 index 00000000..7ca8a3af --- /dev/null +++ b/src/store/server/updateManager/index.js @@ -0,0 +1,27 @@ +import actions from './actions' +import mutations from './mutations' +import getters from './getters' + +export function getDefaultState() { + return { + moonraker: {}, + klipper: {}, + client: {}, + updateResponse: { + application: "", + complete: true, + message: "", + } + } +} + +// initial state +const state = getDefaultState() + +export default { + namespaced: true, + state, + getters, + actions, + mutations +} \ No newline at end of file diff --git a/src/store/server/updateManager/mutations.js b/src/store/server/updateManager/mutations.js new file mode 100644 index 00000000..3aff3207 --- /dev/null +++ b/src/store/server/updateManager/mutations.js @@ -0,0 +1,26 @@ +import { getDefaultState } from './index' +import Vue from "vue"; + +export default { + reset(state) { + Object.assign(state, getDefaultState()) + }, + + setStatus(state, payload) { + if ('version_info' in payload) { + Object.entries(payload.version_info).forEach(([key, value]) => { + Vue.set(state, key, value) + }) + } + + if ('busy' in payload && payload.busy === false) { + Vue.set(state.updateResponse, 'complete', true) + } + }, + + setUpdateResponse(state, payload) { + Vue.set(state, 'updateResponse', payload) + + if (payload.application === "client" && payload.complete) window.location.reload(true) + } +} \ No newline at end of file diff --git a/src/store/socket/actions.js b/src/store/socket/actions.js index e6735954..ad1cf163 100644 --- a/src/store/socket/actions.js +++ b/src/store/socket/actions.js @@ -70,6 +70,10 @@ export default { commit('server/power/setStatus', payload.params[0], { root: true }) break + case 'notify_update_response': + commit('server/updateManager/setUpdateResponse', payload.params[0], { root: true }) + break + default: if (payload.result !== "ok") { if ( @@ -88,5 +92,10 @@ export default { clearLoadings({ commit }) { commit('clearLoadings') - } + }, + + reportDebug({ commit }, payload) { + window.console.log(payload) + commit('void', {}, { root: true }) + }, } \ No newline at end of file