diff --git a/src/components/CommandHelpModal.vue b/src/components/console/CommandHelpModal.vue similarity index 55% rename from src/components/CommandHelpModal.vue rename to src/components/console/CommandHelpModal.vue index b7712c16f..98fa921af 100644 --- a/src/components/CommandHelpModal.vue +++ b/src/components/console/CommandHelpModal.vue @@ -33,42 +33,24 @@ + dense /> - + - - - - - - - {{ cmd.command }} - - - {{ cmd.description }} - - - - - - + + + @@ -77,15 +59,15 @@ diff --git a/src/components/console/CommandHelpModalEntry.vue b/src/components/console/CommandHelpModalEntry.vue new file mode 100644 index 000000000..ceb00aa35 --- /dev/null +++ b/src/components/console/CommandHelpModalEntry.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/console/ConsoleTable.vue b/src/components/console/ConsoleTable.vue index 284d5570d..917976c59 100644 --- a/src/components/console/ConsoleTable.vue +++ b/src/components/console/ConsoleTable.vue @@ -13,7 +13,7 @@ :key="index" class="consoleTableRow" :event="event" - @command-click="commandClick"> + @command-click="commandClick" /> diff --git a/src/components/inputs/ConsoleTextarea.vue b/src/components/inputs/ConsoleTextarea.vue index 8663a9286..604772121 100644 --- a/src/components/inputs/ConsoleTextarea.vue +++ b/src/components/inputs/ConsoleTextarea.vue @@ -100,8 +100,8 @@ export default class ConsoleTextarea extends Mixins(BaseMixin, ConsoleMixin) { const lastNewlineIndex = beforeCursor.lastIndexOf('\n') const currentLine = beforeCursor.substring(lastNewlineIndex + 1) - const currentLineLowerCase = currentLine.toLowerCase() - const commands = this.helplist.filter((element) => element.commandLow.startsWith(currentLineLowerCase)) + const currentLineUpperCase = currentLine.toUpperCase() + const commands = this.helplist.filter((element) => element.command.startsWith(currentLineUpperCase)) if (commands.length === 0) return @@ -116,8 +116,7 @@ export default class ConsoleTextarea extends Mixins(BaseMixin, ConsoleMixin) { let output = '' commands.forEach( - (command) => - (output += `${command.command}: ${command.description}
`) + (command) => (output += `${command.command}: ${command.help}
`) ) this.$store.dispatch('server/addEvent', { message: output, type: 'autocomplete' }) diff --git a/src/components/mixins/console.ts b/src/components/mixins/console.ts index 1709f6e89..e337bb658 100644 --- a/src/components/mixins/console.ts +++ b/src/components/mixins/console.ts @@ -1,12 +1,18 @@ import Vue from 'vue' import Component from 'vue-class-component' -import { CommandHelp } from '@/store/printer/types' import { GuiConsoleStateFilter } from '@/store/gui/console/types' @Component export default class ConsoleMixin extends Vue { - get helplist(): CommandHelp[] { - return this.$store.state.printer.helplist ?? [] + get helplist() { + const commands: { [key: string]: { help?: string } } = this.$store.state.printer.gcode?.commands ?? {} + const helplist: { command: string; help: string }[] = [] + + for (const [key, values] of Object.entries(commands)) { + helplist.push({ command: key, help: values.help ?? '' }) + } + + return helplist } get consoleDirection() { diff --git a/src/components/panels/MiniconsolePanel.vue b/src/components/panels/MiniconsolePanel.vue index 98c6499d7..93178fad7 100644 --- a/src/components/panels/MiniconsolePanel.vue +++ b/src/components/panels/MiniconsolePanel.vue @@ -91,7 +91,7 @@ import BaseMixin from '@/components/mixins/base' import ConsoleTable from '@/components/console/ConsoleTable.vue' import Panel from '@/components/ui/Panel.vue' import { mdiCog, mdiConsoleLine, mdiTrashCan } from '@mdi/js' -import CommandHelpModal from '@/components/CommandHelpModal.vue' +import CommandHelpModal from '@/components/console/CommandHelpModal.vue' import ConsoleMixin from '@/components/mixins/console' import ConsoleTextarea from '@/components/inputs/ConsoleTextarea.vue' diff --git a/src/locales/en.json b/src/locales/en.json index d12f4e76e..36717a632 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -164,6 +164,7 @@ "Empty": "Empty", "HideTemperatures": "Hide temperatures", "HideTimelapse": "Hide Timelapse", + "Search": "Search", "SendCode": "Send code...", "SetupConsole": "Setup Console" }, diff --git a/src/pages/Console.vue b/src/pages/Console.vue index a9ca31d6d..a567ac320 100644 --- a/src/pages/Console.vue +++ b/src/pages/Console.vue @@ -83,7 +83,7 @@ import { Component, Mixins, Ref, Watch } from 'vue-property-decorator' import BaseMixin from '@/components/mixins/base' import ConsoleTable from '@/components/console/ConsoleTable.vue' -import CommandHelpModal from '@/components/CommandHelpModal.vue' +import CommandHelpModal from '@/components/console/CommandHelpModal.vue' import { mdiCog, mdiTrashCan } from '@mdi/js' import ConsoleMixin from '@/components/mixins/console' import ConsoleTextarea from '@/components/inputs/ConsoleTextarea.vue' diff --git a/src/plugins/webSocketClient.ts b/src/plugins/webSocketClient.ts index e1618eac5..8f423b8dc 100644 --- a/src/plugins/webSocketClient.ts +++ b/src/plugins/webSocketClient.ts @@ -179,7 +179,7 @@ export class WebSocketClient { ) } - async emitAndWait(method: string, params: Params, options: emitOptions = {}): Promise { + async emitAndWait(method: string, params: Params | undefined = undefined, options: emitOptions = {}): Promise { return new Promise((resolve, reject) => { if (this.instance?.readyState !== WebSocket.OPEN) reject() diff --git a/src/store/printer/actions.ts b/src/store/printer/actions.ts index 646953616..eea47a360 100644 --- a/src/store/printer/actions.ts +++ b/src/store/printer/actions.ts @@ -16,14 +16,13 @@ export const actions: ActionTree = { dispatch('socket/addInitModule', 'printer/info', { root: true }) dispatch('socket/addInitModule', 'printer/initSubscripts', { root: true }) - dispatch('socket/addInitModule', 'printer/initHelpList', { root: true }) dispatch('socket/addInitModule', 'printer/initTempHistory', { root: true }) dispatch('socket/addInitModule', 'server/gcode_store', { root: true }) Vue.$socket.emit('printer.info', {}, { action: 'printer/getInfo' }) - Vue.$socket.emit('printer.objects.list', {}, { action: 'printer/initSubscripts' }) - Vue.$socket.emit('printer.gcode.help', {}, { action: 'printer/initHelpList' }) Vue.$socket.emit('server.gcode_store', {}, { action: 'server/getGcodeStore' }) + + dispatch('initSubscripts') }, getInfo({ commit, dispatch }, payload) { @@ -46,7 +45,9 @@ export const actions: ActionTree = { dispatch('socket/removeInitModule', 'printer/info', { root: true }) }, - initSubscripts({ dispatch }, payload) { + async initSubscripts({ dispatch }) { + const payload = await Vue.$socket.emitAndWait('printer.objects.list') + let subscripts = {} const blocklist = ['menu'] @@ -56,31 +57,25 @@ export const actions: ActionTree = { if (!blocklist.includes(nameSplit[0])) subscripts = { ...subscripts, [key]: null } }) - if (Object.keys(subscripts).length > 0) - Vue.$socket.emit('printer.objects.subscribe', { objects: subscripts }, { action: 'printer/getInitData' }) - else - Vue.$socket.emit( - 'server.temperature_store', - { include_monitors: true }, - { action: 'printer/tempHistory/init' } - ) + if (Object.keys(subscripts).length > 0) { + const result = await Vue.$socket.emitAndWait('printer.objects.subscribe', { objects: subscripts }, {}) - dispatch('socket/removeInitModule', 'printer/initSubscripts', { root: true }) - }, + // reset screws_tilt_adjust if it exists + if ('screws_tilt_adjust' in result.status) { + result.status.screws_tilt_adjust.error = false + result.status.screws_tilt_adjust.results = {} + } - getInitData({ dispatch }, payload) { - if ('screws_tilt_adjust' in payload.status) { - payload.status.screws_tilt_adjust.error = false - payload.status.screws_tilt_adjust.results = {} - } + dispatch('getData', result) - dispatch('getData', payload) + setTimeout(() => { + dispatch('initExtruderCanExtrude') + }, 200) + } Vue.$socket.emit('server.temperature_store', { include_monitors: true }, { action: 'printer/tempHistory/init' }) - setTimeout(() => { - dispatch('initExtruderCanExtrude') - }, 200) + dispatch('socket/removeInitModule', 'printer/initSubscripts', { root: true }) }, getData({ commit, dispatch, state }, payload) { @@ -135,7 +130,13 @@ export const actions: ActionTree = { commit('setData', payload) }, - initExtruderCanExtrude({ state }) { + async initGcodes({ commit }) { + const gcodes = await Vue.$socket.emitAndWait('printer.objects.query', { objects: { gcode: ['commands'] } }, {}) + + commit('setData', gcodes.status) + }, + + async initExtruderCanExtrude({ dispatch, state }) { const extruderList: string[] = Object.keys(state).filter((name) => name.startsWith('extruder')) const reInitList: { [key: string]: string[] } = {} @@ -143,13 +144,8 @@ export const actions: ActionTree = { reInitList[extruderName] = ['can_extrude'] }) - Vue.$socket.emit('printer.objects.query', { objects: reInitList }, { action: 'printer/getData' }) - }, - - initHelpList({ commit, dispatch }, payload) { - commit('setHelplist', payload) - - dispatch('socket/removeInitModule', 'printer/initHelpList', { root: true }) + const result = await Vue.$socket.emitAndWait('printer.objects.query', { objects: reInitList }, {}) + dispatch('getData', result.status) }, getEndstopStatus({ commit }, payload) { @@ -165,9 +161,10 @@ export const actions: ActionTree = { if (payload.toLowerCase().trim() === 'm112') { Vue.$socket.emit('printer.emergency_stop', {}, { loading: 'sendGcode' }) - } else { - Vue.$socket.emit('printer.gcode.script', { script: payload }, { loading: 'sendGcode' }) + return } + + Vue.$socket.emit('printer.gcode.script', { script: payload }, { loading: 'sendGcode' }) }, clearScrewsTiltAdjust({ commit }) { diff --git a/src/store/printer/mutations.ts b/src/store/printer/mutations.ts index 77a1b0232..19e3100d4 100644 --- a/src/store/printer/mutations.ts +++ b/src/store/printer/mutations.ts @@ -2,7 +2,6 @@ import Vue from 'vue' import { getDefaultState } from './index' import { MutationTree } from 'vuex' import { PrinterState } from '@/store/printer/types' -import { setDataDeep } from '@/plugins/helpers' export const mutations: MutationTree = { reset(state) { @@ -20,7 +19,20 @@ export const mutations: MutationTree = { }, setData(state, payload) { - setDataDeep(state, payload) + Object.keys(payload).forEach((key) => { + const value = payload[key] + + if (typeof value !== 'object' || value === null || !(key in state)) { + Vue.set(state, key, value) + return + } + + if (typeof value === 'object') { + Object.keys(value).forEach((subkey) => { + Vue.set(state[key], subkey, value[subkey]) + }) + } + }) }, setBedMeshProfiles(state, payload) { @@ -29,20 +41,6 @@ export const mutations: MutationTree = { } }, - setHelplist(state, payload) { - const helplist = [] - - for (const [command, description] of Object.entries(payload)) { - helplist.push({ - commandLow: command.toLowerCase(), - command: command, - description: description, - }) - } - - Vue.set(state, 'helplist', helplist) - }, - clearCurrentFile(state) { Vue.set(state, 'current_file', {}) }, diff --git a/src/store/printer/types.ts b/src/store/printer/types.ts index 6b08e5410..6ebc84717 100644 --- a/src/store/printer/types.ts +++ b/src/store/printer/types.ts @@ -6,21 +6,9 @@ export interface VTextareaType extends HTMLInputElement { } } -export interface CommandHelp { - command: string - commandLow: string - description?: string | Record -} - -export interface ConsoleCommandHelp { - command: CommandHelp | null - original: string -} - export interface PrinterState { // eslint-disable-next-line [key: string]: any - helplist?: CommandHelp[] tempHistory?: PrinterTempHistoryState } diff --git a/src/store/server/actions.ts b/src/store/server/actions.ts index a32a32a2b..a1423fd2a 100644 --- a/src/store/server/actions.ts +++ b/src/store/server/actions.ts @@ -170,6 +170,7 @@ export const actions: ActionTree = { dispatch('stopKlippyConnectedInterval') commit('setKlippyConnected') + dispatch('printer/initGcodes', null, { root: true }) dispatch('checkKlippyState', { state: payload.klippy_state, state_message: null }) },