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')
+ })
})
})