diff --git a/src/components/settings/SettingsMacrosTabExpert.vue b/src/components/settings/SettingsMacrosTabExpert.vue index 82a6132c67..e9e72caf60 100644 --- a/src/components/settings/SettingsMacrosTabExpert.vue +++ b/src/components/settings/SettingsMacrosTabExpert.vue @@ -517,17 +517,26 @@ export default class SettingsMacrosTabExpert extends Mixins(BaseMixin, ThemeMixi }) } + get macroListLoaded() { + return this.klipperReadyForGui + } + + findMacro(macroname: string) { + return this.allMacros.find((m: PrinterStateMacro) => m.name.toLowerCase() === macroname.toLowerCase()) + } + existsMacro(macroname: string) { - return ( - this.allMacros.findIndex((m: PrinterStateMacro) => m.name.toLowerCase() === macroname.toLowerCase()) !== -1 - ) + if (!this.macroListLoaded) return true + + return this.findMacro(macroname) !== undefined } getMacroDescription(macroname: string) { - const macro = this.allMacros.find((m: PrinterStateMacro) => m.name.toLowerCase() === macroname.toLowerCase()) - if (!macro) return this.$t('Settings.MacrosTab.DeletedMacro') + const macro = this.findMacro(macroname) + if (macro) return macro.description ?? null + if (!this.macroListLoaded) return null - return macro?.description ?? null + return this.$t('Settings.MacrosTab.DeletedMacro') } updateMacrogroupOption(option: string, newVal: boolean | string) { diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index e60323527e..9377fce363 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -81,6 +81,7 @@ interface DashboardColumn { }) export default class PageDashboard extends Mixins(DashboardMixin) { dragHandle = '.panel-header-icon' + dragGroup = 'dashboard-panels' dragging = false resizeObserver: ResizeObserver | null = null @@ -120,10 +121,6 @@ export default class PageDashboard extends Mixins(DashboardMixin) { return output } - get dragGroup() { - return `dashboard-${this.viewport}` - } - extractPanelName(name: string) { return name.split('_')[0] + '-panel' } @@ -176,10 +173,8 @@ export default class PageDashboard extends Mixins(DashboardMixin) { outline-color: var(--v-primary-base); background-color: rgba(125, 125, 125, 0.06); } - - diff --git a/src/store/gui/getters.ts b/src/store/gui/getters.ts index e03d097160..25eb1b9dee 100644 --- a/src/store/gui/getters.ts +++ b/src/store/gui/getters.ts @@ -158,7 +158,6 @@ export const getters: GetterTree = { return panels.filter((element) => allPossiblePanels.includes(element.name)) }, - // return the unfiltered layout, to save it back without losing hidden or unavailable panels getStoredPanels: (state) => (viewport: string, column: number) => { const layoutName = (column ? `${viewport}Layout${column}` : `${viewport}Layout`) as keyof GuiStateDashboard const panels = state.dashboard[layoutName] as GuiStateLayoutoption[] diff --git a/tests/components/settings/settingsMacrosTabExpert.spec.ts b/tests/components/settings/settingsMacrosTabExpert.spec.ts index 8a05a5ad5a..420bd74c6f 100644 --- a/tests/components/settings/settingsMacrosTabExpert.spec.ts +++ b/tests/components/settings/settingsMacrosTabExpert.spec.ts @@ -7,6 +7,7 @@ type ComponentOptions = { macros?: Partial[] group?: Partial search?: string | null + klipperReady?: boolean } interface MacrosTabExpert { @@ -15,6 +16,7 @@ interface MacrosTabExpert { allMacros: PrinterStateMacro[] filteredMacros: PrinterStateMacro[] availableMacros: PrinterStateMacro[] + macroListLoaded: boolean existsMacro(macroname: string): boolean getMacroDescription(macroname: string): string | null } @@ -22,10 +24,19 @@ interface MacrosTabExpert { const MacrosTabExpertClass = SettingsMacrosTabExpert as unknown as new () => MacrosTabExpert const createComponent = (options: ComponentOptions = {}) => { + const klipperReady = options.klipperReady ?? true + const component = new MacrosTabExpertClass() Object.defineProperty(component, '$store', { value: { + state: { + socket: { isConnected: klipperReady }, + server: { + klippy_connected: klipperReady, + klippy_state: klipperReady ? 'ready' : 'shutdown', + }, + }, getters: { 'printer/getMacros': options.macros ?? [], 'gui/macros/getMacrogroup': () => options.group, @@ -139,5 +150,19 @@ describe('SettingsMacrosTabExpert', () => { expect(component.getMacroDescription('START_PRINT')).toBeNull() }) + + it('does not report macros as deleted while klipper is not ready', () => { + const component = createComponent({ macros: [], klipperReady: false }) + + expect(component.existsMacro('START_PRINT')).toBe(true) + expect(component.getMacroDescription('START_PRINT')).toBeNull() + }) + + it('reports a macro as deleted once klipper is ready with a genuinely empty macro list', () => { + const component = createComponent({ macros: [], klipperReady: true }) + + expect(component.existsMacro('START_PRINT')).toBe(false) + expect(component.getMacroDescription('START_PRINT')).toBe('Settings.MacrosTab.DeletedMacro') + }) }) })