diff --git a/Moonlight/Features/FileManager/FileManagerFeature.cs b/Moonlight/Features/FileManager/FileManagerFeature.cs index 107c30d3..395fe1d3 100644 --- a/Moonlight/Features/FileManager/FileManagerFeature.cs +++ b/Moonlight/Features/FileManager/FileManagerFeature.cs @@ -52,9 +52,11 @@ public class FileManagerFeature : MoonlightFeature // Register default file manager actions in plugin service var pluginService = context.Application.Services.GetRequiredService(); - await pluginService.RegisterImplementation(new RenameFileManagerAction()); - await pluginService.RegisterImplementation(new DownloadFileManagerAction()); - await pluginService.RegisterImplementation(new DeleteFileManagerAction()); + await pluginService.RegisterImplementation(new RenameAction()); + await pluginService.RegisterImplementation(new DownloadAction()); + await pluginService.RegisterImplementation(new DeleteAction()); + + await pluginService.RegisterImplementation(new DeleteSelectionAction()); } public override async Task OnSessionInitialized(SessionInitContext context) diff --git a/Moonlight/Features/FileManager/Implementations/DeleteFileManagerAction.cs b/Moonlight/Features/FileManager/Implementations/DeleteAction.cs similarity index 93% rename from Moonlight/Features/FileManager/Implementations/DeleteFileManagerAction.cs rename to Moonlight/Features/FileManager/Implementations/DeleteAction.cs index 5660a0ce..fc32cf91 100644 --- a/Moonlight/Features/FileManager/Implementations/DeleteFileManagerAction.cs +++ b/Moonlight/Features/FileManager/Implementations/DeleteAction.cs @@ -5,7 +5,7 @@ using Moonlight.Features.FileManager.UI.NewFileManager; namespace Moonlight.Features.FileManager.Implementations; -public class DeleteFileManagerAction : IFileManagerAction +public class DeleteAction : IFileManagerAction { public string Name => "Delete"; public string Icon => "bxs-trash"; diff --git a/Moonlight/Features/FileManager/Implementations/DeleteSelectionAction.cs b/Moonlight/Features/FileManager/Implementations/DeleteSelectionAction.cs new file mode 100644 index 00000000..f330e4cc --- /dev/null +++ b/Moonlight/Features/FileManager/Implementations/DeleteSelectionAction.cs @@ -0,0 +1,34 @@ +using MoonCoreUI.Services; +using Moonlight.Features.FileManager.Interfaces; +using Moonlight.Features.FileManager.Models.Abstractions.FileAccess; +using Moonlight.Features.FileManager.UI.NewFileManager; + +namespace Moonlight.Features.FileManager.Implementations; + +public class DeleteSelectionAction : IFileManagerSelectionAction +{ + public string Name => "Delete"; + public string Color => "danger"; + + public async Task Execute(BaseFileAccess access, FileView view, FileEntry[] entries, IServiceProvider provider) + { + var alertService = provider.GetRequiredService(); + var toastService = provider.GetRequiredService(); + + if(!await alertService.YesNo($"Do you really want to delete {entries.Length} item(s)?")) + return; + + await toastService.CreateProgress("fileManagerSelectionDelete", "Deleting items"); + + foreach (var entry in entries) + { + await toastService.ModifyProgress("fileManagerSelectionDelete", $"Deleting '{entry.Name}'"); + + await access.Delete(entry); + } + + await toastService.RemoveProgress("fileManagerSelectionDelete"); + + await toastService.Success($"Successfully deleted selection"); + } +} \ No newline at end of file diff --git a/Moonlight/Features/FileManager/Implementations/DownloadFileManagerAction.cs b/Moonlight/Features/FileManager/Implementations/DownloadAction.cs similarity index 96% rename from Moonlight/Features/FileManager/Implementations/DownloadFileManagerAction.cs rename to Moonlight/Features/FileManager/Implementations/DownloadAction.cs index 5083b279..6ebc597b 100644 --- a/Moonlight/Features/FileManager/Implementations/DownloadFileManagerAction.cs +++ b/Moonlight/Features/FileManager/Implementations/DownloadAction.cs @@ -8,7 +8,7 @@ using Moonlight.Features.FileManager.UI.NewFileManager; namespace Moonlight.Features.FileManager.Implementations; -public class DownloadFileManagerAction : IFileManagerAction +public class DownloadAction : IFileManagerAction { public string Name => "Download"; public string Icon => "bxs-cloud-download"; diff --git a/Moonlight/Features/FileManager/Implementations/RenameFileManagerAction.cs b/Moonlight/Features/FileManager/Implementations/RenameAction.cs similarity index 94% rename from Moonlight/Features/FileManager/Implementations/RenameFileManagerAction.cs rename to Moonlight/Features/FileManager/Implementations/RenameAction.cs index dc220370..56dda462 100644 --- a/Moonlight/Features/FileManager/Implementations/RenameFileManagerAction.cs +++ b/Moonlight/Features/FileManager/Implementations/RenameAction.cs @@ -5,7 +5,7 @@ using Moonlight.Features.FileManager.UI.NewFileManager; namespace Moonlight.Features.FileManager.Implementations; -public class RenameFileManagerAction : IFileManagerAction +public class RenameAction : IFileManagerAction { public string Name => "Rename"; public string Icon => "bxs-rename"; diff --git a/Moonlight/Features/FileManager/Interfaces/IFileManagerSelectionAction.cs b/Moonlight/Features/FileManager/Interfaces/IFileManagerSelectionAction.cs new file mode 100644 index 00000000..a018dcf1 --- /dev/null +++ b/Moonlight/Features/FileManager/Interfaces/IFileManagerSelectionAction.cs @@ -0,0 +1,12 @@ +using Moonlight.Features.FileManager.Models.Abstractions.FileAccess; +using Moonlight.Features.FileManager.UI.NewFileManager; + +namespace Moonlight.Features.FileManager.Interfaces; + +public interface IFileManagerSelectionAction +{ + public string Name { get; } + public string Color { get; } + + public Task Execute(BaseFileAccess access, FileView view, FileEntry[] entries, IServiceProvider provider); +} \ No newline at end of file diff --git a/Moonlight/Features/FileManager/UI/NewFileManager/FileManager.razor b/Moonlight/Features/FileManager/UI/NewFileManager/FileManager.razor index da385a7b..12a6d33b 100644 --- a/Moonlight/Features/FileManager/UI/NewFileManager/FileManager.razor +++ b/Moonlight/Features/FileManager/UI/NewFileManager/FileManager.razor @@ -45,30 +45,42 @@
- - - - - - + @if (View != null && View.Selection.Any()) + { + foreach (var action in SelectionActions) + { + var cssClass = $"btn btn-{action.Color} mx-2"; + + + } + } + else + { + + + + + + + }
@@ -86,6 +98,7 @@ else FileAccess="FileAccess" OnEntryClicked="OnEntryClicked" OnNavigateUpClicked="OnNavigateUpClicked" + OnSelectionChanged="OnSelectionChanged" EnableContextMenu="true"> @foreach (var action in Actions) @@ -138,6 +151,7 @@ else private string Path = "/"; private IFileManagerAction[] Actions; + private IFileManagerSelectionAction[] SelectionActions; // Editor private FileEditor Editor; @@ -156,8 +170,12 @@ else private Timer? UploadTokenTimer; - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { + // Load plugin ui and options + Actions = await PluginService.GetImplementations(); + SelectionActions = await PluginService.GetImplementations(); + OnFolderClicked = async entry => { await MoveAccess.ChangeDirectory(entry.Name); @@ -175,9 +193,6 @@ else if (!firstRender) return; - // Load plugin ui and options - Actions = await PluginService.GetImplementations(); - // Setup upload url update timer UploadTokenTimer = new(async _ => @@ -233,6 +248,16 @@ else await action.Execute(FileAccess, View, entry, ServiceProvider); } + private async Task InvokeSelectionAction(IFileManagerSelectionAction action) + { + await action.Execute(FileAccess, View, View.Selection, ServiceProvider); + + // Refresh resets the selection + await View.Refresh(); + } + + private async Task OnSelectionChanged(FileEntry[] _) => await InvokeAsync(StateHasChanged); + #region Navigation & Refreshing private async Task OnNavigateUpClicked()