From b024b3c93923402532802701f4605be0a3dbd709 Mon Sep 17 00:00:00 2001 From: Pedro Lamas Date: Tue, 16 Jun 2026 23:54:14 +0100 Subject: [PATCH 1/2] feat: adds support for Moonraker file roots details Signed-off-by: Pedro Lamas --- src/api/socketActions.ts | 11 +++++++++++ src/globals.ts | 1 + src/store/files/actions.ts | 4 ++++ src/store/files/getters.ts | 4 ++++ src/store/files/mutations.ts | 4 ++++ src/store/files/state.ts | 1 + src/store/files/types.ts | 3 ++- src/typings/moonraker.file_manager.d.ts | 7 +++++++ 8 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/api/socketActions.ts b/src/api/socketActions.ts index 054a602a54..ebdfdb16c0 100644 --- a/src/api/socketActions.ts +++ b/src/api/socketActions.ts @@ -738,6 +738,17 @@ export const SocketActions = { ) }, + serverFilesRoots (options?: NotifyOptions) { + return baseEmit( + 'server.files.roots', + { + dispatch: 'files/onServerFilesRoots', + wait: Waits.onFileSystemRoots, + ...options + } + ) + }, + serverFilesList (root: string, options?: NotifyOptions) { return baseEmit( 'server.files.list', diff --git a/src/globals.ts b/src/globals.ts index fb11599eea..920d0e5a50 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -624,6 +624,7 @@ export const Waits = Object.freeze({ onExtruderChange: 'onExtruderChange', onLoadLanguage: 'onLoadLanguage', onFileSystem: 'onFileSystem', + onFileSystemRoots: 'onFileSystemRoots', onJobQueue: 'onJobQueue', onTimelapseSaveFrame: 'onTimelapseSaveFrame', onManualProbe: 'onManualProbe', diff --git a/src/store/files/actions.ts b/src/store/files/actions.ts index 7da6ad0624..b5ee9e2335 100644 --- a/src/store/files/actions.ts +++ b/src/store/files/actions.ts @@ -44,6 +44,10 @@ export const actions = { commit('setServerFilesGetDirectory', { path, content: { files, dirs: filteredDirs } }) }, + async onServerFilesRoots ({ commit }, payload: Moonraker.Files.RootsResponse) { + commit('setServerFilesRoots', payload) + }, + async onServerFilesListRoot ({ commit }, payload: ObjectWithRequest) { const { root } = payload.__request__.params ?? {} diff --git a/src/store/files/getters.ts b/src/store/files/getters.ts index 4f254c4591..3ddebbd23b 100644 --- a/src/store/files/getters.ts +++ b/src/store/files/getters.ts @@ -227,6 +227,10 @@ export const getters = { return state.currentPaths[root] ?? '' }, + getRootDetails: (state) => (root: string): Moonraker.Files.RootInfoWithPath | undefined => { + return state.roots?.find(rootInfo => rootInfo.name === root) + }, + getDiskUsage: (state) => (root: string): AppDiskUsage | undefined => { const diskUsage = state.diskUsage[root] diff --git a/src/store/files/mutations.ts b/src/store/files/mutations.ts index e3b7757d5e..d2454c577e 100644 --- a/src/store/files/mutations.ts +++ b/src/store/files/mutations.ts @@ -31,6 +31,10 @@ export const mutations = { Vue.set(state.pathContent, path, content) }, + setServerFilesRoots (state, payload: Moonraker.Files.RootsResponse) { + state.roots = payload + }, + setServerFilesListRoot (state, payload: { root: string, files: Moonraker.Files.RootFile[] }) { const { root, files } = payload diff --git a/src/store/files/state.ts b/src/store/files/state.ts index b8e7af95aa..1b3aad005a 100644 --- a/src/store/files/state.ts +++ b/src/store/files/state.ts @@ -4,6 +4,7 @@ export const defaultState = (): FilesState => { return { uploads: [], download: null, + roots: null, currentPaths: {}, diskUsage: {}, rootFiles: {}, diff --git a/src/store/files/types.ts b/src/store/files/types.ts index 67753f52e3..8d14c3a63d 100644 --- a/src/store/files/types.ts +++ b/src/store/files/types.ts @@ -6,7 +6,8 @@ export type { AppFileMeta } export interface FilesState { uploads: FileUpload[]; download: FileDownload | null; - currentPaths: Record; + roots: Moonraker.Files.RootInfoWithPath[] | null; + currentPaths: Record; diskUsage: Record; rootFiles: Record; pathContent: Record; diff --git a/src/typings/moonraker.file_manager.d.ts b/src/typings/moonraker.file_manager.d.ts index 9d00888011..8a0c7b69ee 100644 --- a/src/typings/moonraker.file_manager.d.ts +++ b/src/typings/moonraker.file_manager.d.ts @@ -1,4 +1,7 @@ declare namespace Moonraker.Files { + export interface RootsResponse extends Array { + } + export interface ListRootResponse extends Array { } @@ -39,6 +42,10 @@ declare namespace Moonraker.Files { permissions?: Moonraker.Files.FilePermissions; } + export interface RootInfoWithPath extends RootInfo { + path: string; + } + export type FilePermissions = '' | 'r' | 'rw' export interface File { From 178cb2f788c6de2037f1c8fd5b1f94374d9fe88b Mon Sep 17 00:00:00 2001 From: Pedro Lamas Date: Wed, 17 Jun 2026 00:11:15 +0100 Subject: [PATCH 2/2] fix: strip __request__ from stored file roots Spread the response array before persisting so the non-enumerable __request__ metadata is not kept on state.roots, matching the onServerFilesListRoot convention. Co-Authored-By: Claude Opus 4.8 Signed-off-by: Pedro Lamas --- src/store/files/actions.ts | 2 +- src/store/files/mutations.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/files/actions.ts b/src/store/files/actions.ts index b5ee9e2335..f8e51dc38c 100644 --- a/src/store/files/actions.ts +++ b/src/store/files/actions.ts @@ -45,7 +45,7 @@ export const actions = { }, async onServerFilesRoots ({ commit }, payload: Moonraker.Files.RootsResponse) { - commit('setServerFilesRoots', payload) + commit('setServerFilesRoots', [...payload]) }, async onServerFilesListRoot ({ commit }, payload: ObjectWithRequest) { diff --git a/src/store/files/mutations.ts b/src/store/files/mutations.ts index d2454c577e..d966e69ecd 100644 --- a/src/store/files/mutations.ts +++ b/src/store/files/mutations.ts @@ -31,7 +31,7 @@ export const mutations = { Vue.set(state.pathContent, path, content) }, - setServerFilesRoots (state, payload: Moonraker.Files.RootsResponse) { + setServerFilesRoots (state, payload: Moonraker.Files.RootInfoWithPath[]) { state.roots = payload },