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..f8e51dc38c 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..d966e69ecd 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.RootInfoWithPath[]) { + 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 {