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; }
}