diff --git a/Iceshrimp.Frontend/Components/DriveEntry.razor b/Iceshrimp.Frontend/Components/DriveEntry.razor index c23b0362..9ac2055a 100644 --- a/Iceshrimp.Frontend/Components/DriveEntry.razor +++ b/Iceshrimp.Frontend/Components/DriveEntry.razor @@ -76,6 +76,9 @@ @Loc["Set alt text"] + + @Loc["Move"] + @Loc["Delete"] @@ -95,6 +98,9 @@ @Loc["Rename"] + + @Loc["Move"] + @@ -108,6 +114,8 @@ private ElementReference FileButton { get; set; } private ElementReference FolderButton { get; set; } + [Parameter, EditorRequired] public required List FolderList { get; set; } + private void SelectFile() => FileMenu.Toggle(FileButton); private async Task RenameFile() @@ -157,6 +165,27 @@ } } + private async Task MoveFile() + { + // TODO: Move this to a proper prompt dialog once we have that + var folderId = await Js.InvokeAsync("prompt", "Move to folder by ID: " + string.Join(", ", FolderList.Select(p => $"{p.Name} ({p.Id})")) + " or blank for root"); + if (folderId == null) return; + + try + { + var res = await Api.Drive.UpdateFileParentAsync(File!.Id, string.IsNullOrWhiteSpace(folderId) ? null : folderId.Trim()); + if (res != null) + { + File = null; + StateHasChanged(); + } + } + catch (ApiException e) + { + await Js.InvokeVoidAsync("alert", e.Response.Message); + } + } + private void OpenFile() => Js.InvokeVoidAsync("open", File!.Url, "_blank"); private void CopyFileLink() => Js.InvokeVoidAsync("navigator.clipboard.writeText", File!.Url); @@ -191,6 +220,29 @@ await Js.InvokeVoidAsync("alert", e.Response.Message); } } - + + private async Task MoveFolder() + { + if (Folder is not { Id: not null, Name: not null }) return; + + // TODO: Move this to a proper prompt dialog once we have that + var folderId = await Js.InvokeAsync("prompt", "Move to folder by ID: " + string.Join(", ", FolderList.FindAll(p => p.Id != Folder.Id).Select(p => $"{p.Name} ({p.Id})")) + " or blank for root"); + if (folderId == null) return; + + try + { + var res = await Api.Drive.UpdateFolderParentAsync(Folder.Id, string.IsNullOrWhiteSpace(folderId) ? null : folderId.Trim()); + if (res != null) + { + Folder = null; + StateHasChanged(); + } + } + catch (ApiException e) + { + await Js.InvokeVoidAsync("alert", e.Response.Message); + } + } + private void OpenFolder() => Nav.NavigateTo($"/drive/{Folder!.Id}"); } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs b/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs index a3905830..b87c25f4 100644 --- a/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs +++ b/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs @@ -22,6 +22,9 @@ internal class DriveControllerModel(ApiClient api) public Task DeleteFileAsync(string id) => api.CallNullableAsync(HttpMethod.Delete, $"/drive/{id}"); + public Task UpdateFileParentAsync(string id, string? folderId) => + api.CallNullableAsync(HttpMethod.Post, $"/drive/{id}/move", data: new DriveMoveRequest { FolderId = folderId }); + public Task CreateFolderAsync(DriveFolderRequest request) => api.CallNullableAsync(HttpMethod.Post, $"/drive/folder", data: request); @@ -33,4 +36,7 @@ internal class DriveControllerModel(ApiClient api) public Task DeleteFolderAsync(string id) => api.CallNullableAsync(HttpMethod.Delete, $"/drive/folder/{id}"); + + public Task UpdateFolderParentAsync(string id, string? folderId) => + api.CallNullableAsync(HttpMethod.Post, $"/drive/folder/{id}/move", data: new DriveMoveRequest { FolderId = folderId }); } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Pages/DrivePage.razor b/Iceshrimp.Frontend/Pages/DrivePage.razor index b1b205cf..3b85e74e 100644 --- a/Iceshrimp.Frontend/Pages/DrivePage.razor +++ b/Iceshrimp.Frontend/Pages/DrivePage.razor @@ -56,13 +56,13 @@ @foreach (var el in Folder.Folders) {
  • - +
  • } @foreach (var el in Folder.Files) {
  • - +
  • } diff --git a/Iceshrimp.Shared/Schemas/Web/DriveMoveRequest.cs b/Iceshrimp.Shared/Schemas/Web/DriveMoveRequest.cs index 09715a8b..328135fc 100644 --- a/Iceshrimp.Shared/Schemas/Web/DriveMoveRequest.cs +++ b/Iceshrimp.Shared/Schemas/Web/DriveMoveRequest.cs @@ -1,6 +1,6 @@ namespace Iceshrimp.Shared.Schemas.Web; -public class DriveMoveRequest(string? folderId) +public class DriveMoveRequest { - public required string? FolderId { get; set; } = folderId; + public required string? FolderId { get; set; } }