Merge branch 'master' of https://github.com/meteyou/mainsail into LanguageChange

# Conflicts:
#	src/components/panels/ControlPanel.vue
#	src/components/panels/MoonrakerFailedComponentsPanel.vue
#	src/components/panels/Settings/ControlPanel.vue
#	src/components/panels/Settings/UpdatePanel.vue
#	src/components/panels/StatusPanel.vue
This commit is contained in:
winbin
2021-03-22 09:43:36 +08:00
19 changed files with 179 additions and 120 deletions

View File

@@ -36,9 +36,17 @@
<v-list-item class="minHeight36"> <v-list-item class="minHeight36">
<v-checkbox v-model="useCross" class="mt-0" hide-details :label="$t('Panels.ControlPanel.AlternateControls')"></v-checkbox> <v-checkbox v-model="useCross" class="mt-0" hide-details :label="$t('Panels.ControlPanel.AlternateControls')"></v-checkbox>
</v-list-item> </v-list-item>
<v-list-item class="minHeight36" v-if="useCross"> <template v-if="useCross">
<v-list-item class="minHeight36">
<v-checkbox v-model="reverseX" class="mt-0" hide-details :label="$t('Panels.ControlPanel.InvertX')"></v-checkbox>
</v-list-item>
<v-list-item class="minHeight36">
<v-checkbox v-model="reverseY" class="mt-0" hide-details :label="$t('Panels.ControlPanel.InvertY')"></v-checkbox>
</v-list-item>
<v-list-item class="minHeight36">
<v-checkbox v-model="reverseZ" class="mt-0" hide-details :label="$t('Panels.ControlPanel.InvertZ')"></v-checkbox> <v-checkbox v-model="reverseZ" class="mt-0" hide-details :label="$t('Panels.ControlPanel.InvertZ')"></v-checkbox>
</v-list-item> </v-list-item>
</template>
</v-list> </v-list>
</v-menu> </v-menu>
</v-toolbar> </v-toolbar>
@@ -51,7 +59,7 @@
<v-col cols="3"> <v-col cols="3">
<v-btn class="btnMinWidthAuto fill-width" <v-btn class="btnMinWidthAuto fill-width"
:disabled="selectedCrossStep === null || selectedCrossStep === undefined" :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
@click="doSendMove('Y+'+stepsReversed[selectedCrossStep], feedrateXY)" @click="doSendMove('Y'+(reverseY ? '-' : '+')+stepsReversed[selectedCrossStep], feedrateXY)"
> >
<v-icon>mdi-chevron-up</v-icon> <v-icon>mdi-chevron-up</v-icon>
</v-btn> </v-btn>
@@ -70,7 +78,7 @@
<v-col cols="3" class="p-rel"> <v-col cols="3" class="p-rel">
<v-btn class="btnMinWidthAuto fill-width p-abs" style="top: -50%; width: calc(100% - 8px);" <v-btn class="btnMinWidthAuto fill-width p-abs" style="top: -50%; width: calc(100% - 8px);"
:disabled="selectedCrossStep === null || selectedCrossStep === undefined" :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
@click="doSendMove('X-'+stepsReversed[selectedCrossStep], feedrateXY)" @click="doSendMove('X'+(!reverseX ? '-' : '+')+stepsReversed[selectedCrossStep], feedrateXY)"
> >
<v-icon>mdi-chevron-left</v-icon> <v-icon>mdi-chevron-left</v-icon>
</v-btn> </v-btn>
@@ -78,7 +86,7 @@
<v-col cols="3"> <v-col cols="3">
<v-btn class="btnMinWidthAuto fill-width" <v-btn class="btnMinWidthAuto fill-width"
:disabled="selectedCrossStep === null || selectedCrossStep === undefined" :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
@click="doSendMove('Y-'+stepsReversed[selectedCrossStep], feedrateXY)" @click="doSendMove('Y'+(!reverseY ? '-' : '+')+stepsReversed[selectedCrossStep], feedrateXY)"
> >
<v-icon>mdi-chevron-down</v-icon> <v-icon>mdi-chevron-down</v-icon>
</v-btn> </v-btn>
@@ -86,7 +94,7 @@
<v-col cols="3" class="p-rel"> <v-col cols="3" class="p-rel">
<v-btn class="btnMinWidthAuto fill-width p-abs" style="top: -50%; width: calc(100% - 8px);" <v-btn class="btnMinWidthAuto fill-width p-abs" style="top: -50%; width: calc(100% - 8px);"
:disabled="selectedCrossStep === null || selectedCrossStep === undefined" :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
@click="doSendMove('X+'+stepsReversed[selectedCrossStep], feedrateXY)" @click="doSendMove('X'+(reverseX ? '-' : '+')+stepsReversed[selectedCrossStep], feedrateXY)"
> >
<v-icon>mdi-chevron-right</v-icon> <v-icon>mdi-chevron-right</v-icon>
</v-btn> </v-btn>
@@ -94,7 +102,7 @@
<v-col cols="3"> <v-col cols="3">
<v-btn class="btnMinWidthAuto fill-width" <v-btn class="btnMinWidthAuto fill-width"
:disabled="selectedCrossStep === null || selectedCrossStep === undefined" :disabled="selectedCrossStep === null || selectedCrossStep === undefined"
@click="doSendMove('Z'+(reverseZ ? '+' : '-')+stepsReversed[selectedCrossStep], feedrateZ)" @click="doSendMove('Z'+(!reverseZ ? '-' : '+')+stepsReversed[selectedCrossStep], feedrateZ)"
> >
<v-icon>mdi-chevron-down</v-icon> <v-icon>mdi-chevron-down</v-icon>
</v-btn> </v-btn>
@@ -316,6 +324,22 @@
'printer/getMacros', 'printer/getMacros',
'printer/getExtrudePossible', 'printer/getExtrudePossible',
]), ]),
reverseX: {
get() {
return this.$store.state.gui.dashboard.control.reverseX;
},
set(reverseX) {
return this.$store.dispatch('gui/setSettings', { dashboard: { control: { reverseX } } })
}
},
reverseY: {
get() {
return this.$store.state.gui.dashboard.control.reverseZ;
},
set(reverseY) {
return this.$store.dispatch('gui/setSettings', { dashboard: { control: { reverseY } } })
}
},
reverseZ: { reverseZ: {
get() { get() {
return this.$store.state.gui.dashboard.control.reverseZ; return this.$store.state.gui.dashboard.control.reverseZ;

View File

@@ -4,7 +4,7 @@
<v-toolbar flat dense color="orange darken-2"> <v-toolbar flat dense color="orange darken-2">
<v-toolbar-title> <v-toolbar-title>
<span class="subheading"> <span class="subheading">
<v-icon class="mdi mdi-alert-circle" left></v-icon>{{ $t("Panels.MoonrakerFailedPluginsPanel.MoonrakerFailedPlugins") }} <v-icon class="mdi mdi-alert-circle" left></v-icon>{{ $t("Panels.MoonrakerFailedPluginsPanel.MoonrakerFailedComponents") }}
</span> </span>
</v-toolbar-title> </v-toolbar-title>
</v-toolbar> </v-toolbar>
@@ -14,7 +14,7 @@
<p class="orange--text">{{ $t("Panels.MoonrakerFailedPluginsPanel.MoonrakerErrorInfo") }}</p> <p class="orange--text">{{ $t("Panels.MoonrakerFailedPluginsPanel.MoonrakerErrorInfo") }}</p>
<p class="mb-2 orange--text">{{ $t("Panels.MoonrakerFailedPluginsPanel.FollowingPluginHasAnError") }}</p> <p class="mb-2 orange--text">{{ $t("Panels.MoonrakerFailedPluginsPanel.FollowingPluginHasAnError") }}</p>
<ul class="mt-0 pt-0"> <ul class="mt-0 pt-0">
<li v-for="plugin in failedPlugins" v-bind:key="plugin" class="orange--text"><code>{{ plugin }}</code></li> <li v-for="component in failedComponents" v-bind:key="component" class="orange--text"><code>{{ component }}</code></li>
</ul> </ul>
</v-flex> </v-flex>
</v-layout> </v-layout>
@@ -35,7 +35,7 @@
}), }),
computed: { computed: {
...mapState({ ...mapState({
failedPlugins: state => state.server.failed_plugins, failedComponents: state => state.server.failed_components,
hostname: state => state.socket.hostname, hostname: state => state.socket.hostname,
port: state => state.socket.port, port: state => state.socket.port,
}), }),

View File

@@ -70,6 +70,8 @@
</v-row> </v-row>
<v-row> <v-row>
<v-col class="pt-0"> <v-col class="pt-0">
<v-switch v-model="reverseX" :label="$t('Settings.ControlPanel.ReverseXMovement')" hide-details="auto" class="mt-0"></v-switch>
<v-switch v-model="reverseY" :label="$t('Settings.ControlPanel.ReverseYMovement')" hide-details="auto" class="mt-0"></v-switch>
<v-switch v-model="reverseZ" :label="$t('Settings.ControlPanel.ReverseZMovement')" hide-details="auto" class="mt-0"></v-switch> <v-switch v-model="reverseZ" :label="$t('Settings.ControlPanel.ReverseZMovement')" hide-details="auto" class="mt-0"></v-switch>
</v-col> </v-col>
</v-row> </v-row>
@@ -180,6 +182,22 @@
} }
}, },
computed: { computed: {
reverseX: {
get() {
return this.$store.state.gui.dashboard.control.reverseZ;
},
set(reverseX) {
return this.$store.dispatch('gui/setSettings', { dashboard: { control: { reverseX } } })
}
},
reverseY: {
get() {
return this.$store.state.gui.dashboard.control.reverseZ;
},
set(reverseY) {
return this.$store.dispatch('gui/setSettings', { dashboard: { control: { reverseY } } })
}
},
reverseZ: { reverseZ: {
get() { get() {
return this.$store.state.gui.dashboard.control.reverseZ; return this.$store.state.gui.dashboard.control.reverseZ;

View File

@@ -80,24 +80,17 @@
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn small class="minwidth-0" color="grey darken-3" @click="commitsOverlay.bool = false"><v-icon small>mdi-close-thick</v-icon></v-btn> <v-btn small class="minwidth-0" color="grey darken-3" @click="commitsOverlay.bool = false"><v-icon small>mdi-close-thick</v-icon></v-btn>
</v-toolbar> </v-toolbar>
<v-card-text class="py-5" v-if="commitsOverlay.loading"> <v-card-text class="py-0" style="max-height: 400px; overflow-y: scroll;">
<v-row class="pt-0">
<v-col>
<v-progress-linear color="primary" indeterminate></v-progress-linear>
</v-col>
</v-row>
</v-card-text>
<v-card-text class="py-0" v-if="!commitsOverlay.loading" style="max-height: 400px; overflow-y: scroll;">
<v-row> <v-row>
<v-col class="pt-3 pl-0"> <v-col class="pt-3 pl-0">
<v-timeline class="updateManager" align-top dense > <v-timeline class="updateManager" align-top dense >
<v-timeline-item color="primary" small v-for="commit of commitsOverlay.outputs" v-bind:key="commit.sha"> <v-timeline-item color="primary" small v-for="commit of commitsOverlay.commits" v-bind:key="commit.sha">
<v-row class="pt-0"> <v-row class="pt-0">
<v-col> <v-col>
<a class="font-weight-bold white--text" :href="commit.url" target="_blank">{{ commit.title }}</a><br /> <a class="font-weight-bold white--text" :href="'https://github.com/'+commitsOverlay.owner+'/'+commitsOverlay.modul+'/commit/'+commit.sha" target="_blank">{{ commit.subject }}</a><br />
<p v-if="commit.message" class="mb-0" v-html="commit.message.replace(/(?:\r\n|\r|\n)/g, '<br />')"></p> <p v-if="commit.message" class="mb-0" v-html="convertCommitMessage(commit.message)"></p>
<div class="caption"> <div class="caption">
<strong>{{ commit.author }}</strong> {{ $t('Settings.UpdatePanel.CommittedAt') }} {{ commit.date.toLocaleString() }} <strong>{{ commit.author }}</strong> {{ $t('Settings.UpdatePanel.CommittedAt') }} {{ new Date(commit.date * 1000).toLocaleString() }}
</div> </div>
</v-col> </v-col>
</v-row> </v-row>
@@ -114,7 +107,6 @@
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import semver from 'semver' import semver from 'semver'
import axios from 'axios'
export default { export default {
components: { components: {
@@ -124,9 +116,9 @@
return { return {
commitsOverlay: { commitsOverlay: {
bool: false, bool: false,
loading: false, owner: "",
response: [], modul: "",
outputs: [], commits: [],
} }
} }
}, },
@@ -264,12 +256,8 @@
}, },
getVersionClickable(object) { getVersionClickable(object) {
return ( return (
'branch' in object && 'commits_behind' in object &&
object.branch === "master" && object.commits_behind.length
'current_hash' in object &&
'remote_hash' in object &&
object.current_hash !== object.remote_hash &&
'owner' in object
) )
}, },
updateModule(key) { updateModule(key) {
@@ -281,58 +269,36 @@
}, },
openCommitsOverlay(key, object) { openCommitsOverlay(key, object) {
if ( if (
['klipper', 'moonraker'].includes(key) && 'commits_behind' in object &&
this.getVersionClickable(object) && 'owner' in object &&
'owner' in object object.commits_behind.length
) { ) {
this.commitsOverlay.owner = object.owner
this.commitsOverlay.modul = key
this.commitsOverlay.commits = object.commits_behind
this.commitsOverlay.bool = true this.commitsOverlay.bool = true
this.commitsOverlay.loading = true
const apiUrl = "https://api.github.com/repos/"+object.owner+"/"+key+"/commits"
if (apiUrl) {
axios
.get(apiUrl)
.then(response => {
this.commitsOverlay.response = response
this.commitsOverlay.outputs.splice(0, this.commitsOverlay.outputs.length)
const index = response.data.findIndex(commit => commit.sha === object.current_hash)
if (index !== -1) {
this.commitsOverlay.response = response.data.splice(0, index).sort((a,b) => {
const dataA = new Date(a.commit.author.date)
const dataB = new Date(b.commit.author.date)
return dataB - dataA
})
this.commitsOverlay.response.forEach(commit => {
const date = new Date(commit.commit.author.date)
const author = commit.commit.author.name
const firstIndex = commit.commit.message.indexOf('\n\n')
let lastIndex = commit.commit.message.lastIndexOf('\n\n')
if (firstIndex === lastIndex && commit.commit.message.lastIndexOf('\r') > firstIndex) {
lastIndex = commit.commit.message.lastIndexOf('\r')
}
this.commitsOverlay.outputs.push({
sha: commit.sha,
date: date,
author: author,
url: commit.html_url,
title: commit.commit.message.substr(0, firstIndex),
message: (firstIndex+2 < lastIndex-2) ? commit.commit.message.substr(firstIndex+2, lastIndex-firstIndex-2) : "",
firstIndex: firstIndex,
lastIndex: lastIndex,
})
})
}
this.commitsOverlay.loading = false
})
}
} }
}, },
convertCommitMessage(message) {
const lastIndex = message.lastIndexOf('Signed-off-by:')
if (lastIndex !== -1) {
message = message.substr(0, lastIndex)
}
message = this.trimEndLineBreak(message)
message.replace(/(?:\r\n|\r|\n)/g, '<br />')
return message
},
trimEndLineBreak(message) {
if (['\n', '\r'].includes(message.substr(-1))) {
message = message.substr(0, message.length - 2)
this.trimEndLineBreak(message)
}
return message
}
} }
} }
</script> </script>

View File

@@ -182,7 +182,16 @@
</v-col> </v-col>
<v-col class="equal-width py-0"> <v-col class="equal-width py-0">
<v-row><v-col class="pa-0"><strong>{{ $t("Panels.StatusPanel.Layer") }}</strong></v-col></v-row> <v-row><v-col class="pa-0"><strong>{{ $t("Panels.StatusPanel.Layer") }}</strong></v-col></v-row>
<v-row><v-col class="pa-0 text-no-wrap">{{ current_layer }} of {{ max_layers }}</v-col></v-row> <v-row>
<v-col class="pa-0 text-no-wrap">
<v-tooltip top>
<template v-slot:activator="{ on, attrs }">
<span v-bind="attrs" v-on="on">{{ current_layer }} of {{ max_layers }}</span>
</template>
<span v-if="'object_height' in current_file && current_file.object_height > 0">{{ $t("Panels.StatusPanel.ObjectHeight") }} {{ current_file.object_height }}mm</span>
</v-tooltip>
</v-col>
</v-row>
</v-col> </v-col>
<v-col class="equal-width py-0"> <v-col class="equal-width py-0">
<v-row><v-col class="pa-0"><strong>{{ $t("Panels.StatusPanel.ETA") }}</strong></v-col></v-row> <v-row><v-col class="pa-0"><strong>{{ $t("Panels.StatusPanel.ETA") }}</strong></v-col></v-row>

View File

@@ -3,7 +3,7 @@ import Vue from 'vue'
import StatusPanel from './StatusPanel.vue' import StatusPanel from './StatusPanel.vue'
import KlippyStatePanel from './KlippyStatePanel.vue' import KlippyStatePanel from './KlippyStatePanel.vue'
import MinSettingsPanel from './MinSettingsPanel.vue' import MinSettingsPanel from './MinSettingsPanel.vue'
import MoonrakerFailedPluginsPanel from './MoonrakerFailedPluginsPanel.vue' import MoonrakerFailedComponentsPanel from './MoonrakerFailedComponentsPanel.vue'
import ToolsPanel from './ToolsPanel.vue' import ToolsPanel from './ToolsPanel.vue'
import ControlPanel from "./ControlPanel"; import ControlPanel from "./ControlPanel";
import ZOffsetPanel from "./ZOffsetPanel"; import ZOffsetPanel from "./ZOffsetPanel";
@@ -16,7 +16,7 @@ import PowerControlPanel from "./PowerControlPanel.vue";
Vue.component('status-panel', StatusPanel); Vue.component('status-panel', StatusPanel);
Vue.component('klippy-state-panel', KlippyStatePanel); Vue.component('klippy-state-panel', KlippyStatePanel);
Vue.component('min-settings-panel', MinSettingsPanel); Vue.component('min-settings-panel', MinSettingsPanel);
Vue.component('moonraker-failed-plugins-panel', MoonrakerFailedPluginsPanel); Vue.component('moonraker-failed-components-panel', MoonrakerFailedComponentsPanel);
Vue.component('tools-panel', ToolsPanel); Vue.component('tools-panel', ToolsPanel);
Vue.component('control-panel', ControlPanel); Vue.component('control-panel', ControlPanel);
Vue.component('zoffset-panel', ZOffsetPanel); Vue.component('zoffset-panel', ZOffsetPanel);

View File

@@ -106,6 +106,8 @@
"Controls": "Controls", "Controls": "Controls",
"SetupControls": "Setup Controls", "SetupControls": "Setup Controls",
"AlternateControls": "Alternate controls", "AlternateControls": "Alternate controls",
"InvertX": "Invert X",
"InvertY": "Invert Y",
"InvertZ": "Invert Z", "InvertZ": "Invert Z",
"ALL": "ALL", "ALL": "ALL",
"QGL": "QGL", "QGL": "QGL",
@@ -155,7 +157,8 @@
}, },
"MoonrakerFailedPluginsPanel": { "MoonrakerFailedPluginsPanel": {
"MoonrakerFailedPlugins": "Moonraker Failed Plugins", "MoonrakerFailedPlugins": "Moonraker Failed Plugins",
"MoonrakerErrorInfo": "An error was detected while loading the moonraker plugins. Please check the logfile and fix the issue.", "MoonrakerFailedComponents": "Moonraker Failed Components",
"MoonrakerErrorInfo": "An error was detected while loading the moonraker components. Please check the logfile and fix the issue.",
"FollowingPluginHasAnError": "Following plugin has an error:", "FollowingPluginHasAnError": "Following plugin has an error:",
"DownloadLog": "Download Log" "DownloadLog": "Download Log"
}, },
@@ -180,6 +183,7 @@
"Total": "Total", "Total": "Total",
"Speed": "Speed", "Speed": "Speed",
"Layer": "Layer", "Layer": "Layer",
"ObjectHeight": "Object Height:",
"ETA": "ETA", "ETA": "ETA",
"File": "File", "File": "File",
"Slicer": "Slicer" "Slicer": "Slicer"
@@ -252,6 +256,8 @@
"SpeedXY": "Speed XY", "SpeedXY": "Speed XY",
"SpeedZ": "Speed Z", "SpeedZ": "Speed Z",
"MoveDistancesInMm": "Move distances in mm", "MoveDistancesInMm": "Move distances in mm",
"ReverseXMovement": "Reverse X movement",
"ReverseYMovement": "Reverse Y movement",
"ReverseZMovement": "Reverse Z movement", "ReverseZMovement": "Reverse Z movement",
"MoveDistancesXYInMm": "Move distances XY in mm", "MoveDistancesXYInMm": "Move distances XY in mm",
"MoveDistancesZInMm": "Move distances Z in mm", "MoveDistancesZInMm": "Move distances Z in mm",

View File

@@ -106,6 +106,8 @@
"Controls": "控制台", "Controls": "控制台",
"SetupControls": "设置控件", "SetupControls": "设置控件",
"AlternateControls": "备用控件", "AlternateControls": "备用控件",
"InvertX": "反转 X",
"InvertY": "反转 Y",
"InvertZ": "反转 Z", "InvertZ": "反转 Z",
"ALL": "全部", "ALL": "全部",
"QGL": "QGL", "QGL": "QGL",
@@ -155,7 +157,8 @@
}, },
"MoonrakerFailedPluginsPanel": { "MoonrakerFailedPluginsPanel": {
"MoonrakerFailedPlugins": "Moonraker 失败的插件", "MoonrakerFailedPlugins": "Moonraker 失败的插件",
"MoonrakerErrorInfo": "加载moonraker插件时检测到一个错误. 请检查日志文件并修复这个问题.", "MoonrakerFailedComponents": "Moonraker 失败的组件",
"MoonrakerErrorInfo": "加载moonraker组件时检测到一个错误. 请检查日志文件并修复这个问题.",
"FollowingPluginHasAnError": "以下插件有一个错误:", "FollowingPluginHasAnError": "以下插件有一个错误:",
"DownloadLog": "下载日志" "DownloadLog": "下载日志"
}, },
@@ -180,6 +183,7 @@
"Total": "总计", "Total": "总计",
"Speed": "速度", "Speed": "速度",
"Layer": "层", "Layer": "层",
"ObjectHeight": "对象高度:",
"ETA": "ETA", "ETA": "ETA",
"File": "文件", "File": "文件",
"Slicer": "切片" "Slicer": "切片"

View File

@@ -2,7 +2,7 @@
<v-row> <v-row>
<v-col class="col-sm-12 col-md-5"> <v-col class="col-sm-12 col-md-5">
<min-settings-panel v-if="klippy_state === 'ready' && existsPrinterConfig"></min-settings-panel> <min-settings-panel v-if="klippy_state === 'ready' && existsPrinterConfig"></min-settings-panel>
<moonraker-failed-plugins-panel v-if="moonrakerFailedPlugins.length"></moonraker-failed-plugins-panel> <moonraker-failed-components-panel v-if="moonrakerFailedComponents.length"></moonraker-failed-components-panel>
<klippy-state-panel v-if="socket_connected && klippy_state !== 'ready'"></klippy-state-panel> <klippy-state-panel v-if="socket_connected && klippy_state !== 'ready'"></klippy-state-panel>
<status-panel v-if="klippy_state === 'ready'"></status-panel> <status-panel v-if="klippy_state === 'ready'"></status-panel>
<webcam-panel class="mt-6" v-if="showDashboardWebcam"></webcam-panel> <webcam-panel class="mt-6" v-if="showDashboardWebcam"></webcam-panel>
@@ -31,7 +31,7 @@
socket_connected: state => state.socket.isConnected, socket_connected: state => state.socket.isConnected,
klippy_connected: state => state.server.klippy_connected, klippy_connected: state => state.server.klippy_connected,
klippy_state: state => state.server.klippy_state, klippy_state: state => state.server.klippy_state,
moonrakerFailedPlugins: state => state.server.failed_plugins, moonrakerFailedComponents: state => state.server.failed_components,
showDashboardWebcam: state => state.gui.dashboard.boolWebcam, showDashboardWebcam: state => state.gui.dashboard.boolWebcam,
showDashboardConsole: state => state.gui.dashboard.boolConsole, showDashboardConsole: state => state.gui.dashboard.boolConsole,

View File

@@ -34,7 +34,11 @@
}), }),
updateManager:{ updateManager:{
get() { get() {
//reverse compatibility
if ('plugins' in this.$store.state.server)
return this.$store.state.server.plugins.includes('update_manager') return this.$store.state.server.plugins.includes('update_manager')
return this.$store.state.server.components.includes('update_manager')
} }
} }
}, },

View File

@@ -76,9 +76,9 @@ export default {
}, },
getImage: state => { getImage: state => {
if ( /*if (
'gui' in state.data && 'gui' in state.data &&
'webcam' in state.data.gui.webcam && 'webcam' in state.data.gui &&
'url' in state.data.gui.webcam && 'url' in state.data.gui.webcam &&
state.data.gui.webcam.url !== "" && state.data.gui.webcam.url !== "" &&
'bool' in state.data.gui.webcam && 'bool' in state.data.gui.webcam &&
@@ -88,13 +88,22 @@ export default {
state.data.gui.dashboard.boolWebcam state.data.gui.dashboard.boolWebcam
) { ) {
return state.data.gui.webcam.url return state.data.gui.webcam.url
} else if ( } else*/
if (
state.current_file && state.current_file &&
"filename" in state.current_file &&
"thumbnails" in state.current_file && "thumbnails" in state.current_file &&
state.current_file.thumbnails.find((element) => element.width === 400 && element.height === 300) state.current_file.thumbnails.length
) { ) {
return 'data:image/gif;base64,'+state.current_file.thumbnails.find((element) => element.width === 400 && element.height === 300).data const indexLastDir = state.current_file.filename.lastIndexOf('/')
} else return "/img/sidebar-background.png" const dir = (indexLastDir !== -1) ? state.current_file.filename.substr(0, indexLastDir) : ""
const thumbnail = state.current_file.thumbnails.find(thumb => thumb.width >= 300 && thumb.width <= 400)
if (thumbnail && 'relative_path' in thumbnail) return "//"+state.socket.hostname+":"+state.socket.port+'/server/files/gcodes/'+dir+'/'+thumbnail.relative_path
}
return "/img/sidebar-background.png"
}, },
getLogo: state => { getLogo: state => {

View File

@@ -10,6 +10,7 @@ export default {
element.filename !== undefined && ( element.filename !== undefined && (
element.filename === 'sidebar-logo.svg' || element.filename === 'sidebar-logo.svg' ||
element.filename === 'sidebar-logo.jpg' || element.filename === 'sidebar-logo.jpg' ||
element.filename === 'sidebar-logo.jpeg' ||
element.filename === 'sidebar-logo.png' || element.filename === 'sidebar-logo.png' ||
element.filename === 'sidebar-logo.gif' element.filename === 'sidebar-logo.gif'
) )
@@ -25,6 +26,7 @@ export default {
let file = configDir.find(element => let file = configDir.find(element =>
element.filename !== undefined && ( element.filename !== undefined && (
element.filename === 'sidebar-background.jpg' || element.filename === 'sidebar-background.jpg' ||
element.filename === 'sidebar-background.jpeg' ||
element.filename === 'sidebar-background.png' || element.filename === 'sidebar-background.png' ||
element.filename === 'sidebar-background.gif' element.filename === 'sidebar-background.gif'
) )
@@ -40,6 +42,7 @@ export default {
let file = configDir.find(element => let file = configDir.find(element =>
element.filename !== undefined && ( element.filename !== undefined && (
element.filename === 'main-background.jpg' || element.filename === 'main-background.jpg' ||
element.filename === 'main-background.jpeg' ||
element.filename === 'main-background.png' || element.filename === 'main-background.png' ||
element.filename === 'main-background.gif' element.filename === 'main-background.gif'
) )

View File

@@ -23,6 +23,8 @@ export function getDefaultState() {
stepsZ: [ 25, 1, 0.1 ], stepsZ: [ 25, 1, 0.1 ],
stepsAll: [0.1, 1, 10, 25, 50, 100], stepsAll: [0.1, 1, 10, 25, 50, 100],
selectedCrossStep: null, selectedCrossStep: null,
reverseX: false,
reverseY: false,
reverseZ: false, reverseZ: false,
useCross: false useCross: false
}, },

View File

@@ -8,9 +8,6 @@ export default {
init() { init() {
Vue.prototype.$socket.sendObj('printer.info', {}, 'printer/getInfo') Vue.prototype.$socket.sendObj('printer.info', {}, 'printer/getInfo')
// only available with klipper is ready
//Vue.prototype.$socket.sendObj('server.files.get_directory', { path: 'gcodes' }, 'files/getDirectory')
}, },
getInfo({ commit }, payload) { getInfo({ commit }, payload) {

View File

@@ -241,12 +241,12 @@ export default {
if (nameSplit[0].toLowerCase() === "output_pin") { if (nameSplit[0].toLowerCase() === "output_pin") {
controllable = true controllable = true
pwm = false pwm = false
if ('settings' in state.configfile && key in state.configfile.settings) { if ('settings' in state.configfile && key.toLowerCase() in state.configfile.settings) {
if ('pwm' in state.configfile.settings[key]) if ('pwm' in state.configfile.settings[key.toLowerCase()])
pwm = state.configfile.settings[key].pwm pwm = state.configfile.settings[key.toLowerCase()].pwm
if ('scale' in state.configfile.settings[key]) if ('scale' in state.configfile.settings[key.toLowerCase()])
scale = state.configfile.settings[key].scale scale = state.configfile.settings[key.toLowerCase()].scale
} }
} }
@@ -262,12 +262,12 @@ export default {
config: state.configfile.settings[key] config: state.configfile.settings[key]
} }
if ('settings' in state.configfile && key in state.configfile.settings) { if ('settings' in state.configfile && key.toLowerCase() in state.configfile.settings) {
if ('off_below' in state.configfile.settings[key]) if ('off_below' in state.configfile.settings[key.toLowerCase()])
tmp['off_below'] = state.configfile.settings[key].off_below tmp['off_below'] = state.configfile.settings[key.toLowerCase()].off_below
if ('max_power' in state.configfile.settings[key]) if ('max_power' in state.configfile.settings[key.toLowerCase()])
tmp['max_power'] = state.configfile.settings[key].max_power tmp['max_power'] = state.configfile.settings[key.toLowerCase()].max_power
} }
output.push(tmp) output.push(tmp)

View File

@@ -16,7 +16,7 @@ export default {
} }
this.dispatch('socket/clearLoadings', null, { root: true }) this.dispatch('socket/clearLoadings', null, { root: true })
if (this.state.server.plugins.includes("update_manager")) if (this.state.server.components.includes("update_manager"))
Vue.prototype.$socket.sendObj('machine.update.status', { refresh: false }, 'server/updateManager/getStatus') Vue.prototype.$socket.sendObj('machine.update.status', { refresh: false }, 'server/updateManager/getStatus')
}, },

View File

@@ -27,10 +27,15 @@ export default {
]) ])
} }
} else { } else {
if (
dataset.data.length &&
dataset.data[dataset.data.length-1][0] < payload.time
) {
dataset.data.push([ dataset.data.push([
payload.time, payload.time,
Math.round(payload.value * multi * 100)/100 Math.round(payload.value * multi * 100)/100
]) ])
}
let i let i
const timeOld = new Date().getTime() - (1000 * payload.maxHistory) const timeOld = new Date().getTime() - (1000 * payload.maxHistory)
@@ -74,10 +79,18 @@ export default {
element.name === payload.name+'_target' || element.name === payload.name+'_target' ||
element.name === payload.name+'_power' element.name === payload.name+'_power'
) )
) element.lineStyle.color = payload.value ) {
element.lineStyle.color = payload.value
if ('emphasis' in element && 'lineStyle' in element.emphasis)
element.emphasis.lineStyle.color = payload.value
}
if (element.name === payload.name+'_target' && 'areaStyle' in element) { if (element.name === payload.name+'_target' && 'areaStyle' in element) {
element.areaStyle.color = payload.value element.areaStyle.color = payload.value
if ('emphasis' in element && 'areaStyle' in element.emphasis)
element.emphasis.areaStyle.color = payload.value
} }
}) })
}, },

View File

@@ -47,11 +47,15 @@ export default {
}, },
getInfo({ commit, state, rootState }, payload) { getInfo({ commit, state, rootState }, payload) {
if (state.plugins.length === 0) { if (state.components.length === 0) {
if (payload.plugins.includes("power") !== false) //reverse compatibility
let components = ('components' in payload) ? payload.components : []
if (components.length === 0 && 'plugins' in payload) components = payload.plugins
if (components.includes("power") !== false)
Vue.prototype.$socket.sendObj('machine.device_power.devices', {}, 'server/power/getDevices') Vue.prototype.$socket.sendObj('machine.device_power.devices', {}, 'server/power/getDevices')
if (payload.plugins.includes("update_manager") !== false) if (components.includes("update_manager") !== false)
Vue.prototype.$socket.sendObj('machine.update.status', {}, 'server/updateManager/getStatus') Vue.prototype.$socket.sendObj('machine.update.status', {}, 'server/updateManager/getStatus')
} }

View File

@@ -12,8 +12,8 @@ export function getDefaultState() {
klippy_connected: false, klippy_connected: false,
klippy_state: "", klippy_state: "",
klippy_message: "", klippy_message: "",
plugins: [], components: [],
failed_plugins: [], failed_components: [],
registered_directories: [], registered_directories: [],
events: [], events: [],
config: {}, config: {},