From 47bd54a9646c4093d638292b67974ad58d4471c4 Mon Sep 17 00:00:00 2001 From: Rory& Date: Mon, 11 Aug 2025 15:14:30 +0200 Subject: Room upgrade CLI, more RMU GUI work --- MatrixUtils.Web/Pages/Rooms/Create2.razor | 40 +++++-------- .../RoomCreateInitialStateOptions.razor | 65 ++++++++++++++++------ .../RoomCreateMembershipOptions.razor | 9 ++- .../RoomCreateMsc4321UpgradeOptions.razor | 19 +++++++ .../RoomCreateStateDisplay.razor | 65 ++++++++++++++++++++++ .../RoomCreateUpgradeOptions.razor | 52 +++++++++++------ 6 files changed, 188 insertions(+), 62 deletions(-) create mode 100644 MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMsc4321UpgradeOptions.razor create mode 100644 MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateStateDisplay.razor (limited to 'MatrixUtils.Web/Pages') diff --git a/MatrixUtils.Web/Pages/Rooms/Create2.razor b/MatrixUtils.Web/Pages/Rooms/Create2.razor index 19f6fbc..4a29847 100644 --- a/MatrixUtils.Web/Pages/Rooms/Create2.razor +++ b/MatrixUtils.Web/Pages/Rooms/Create2.razor @@ -1,14 +1,9 @@ @page "/Rooms/Create2" -@using System.Text.Json -@using System.Reflection -@using ArcaneLibs @using ArcaneLibs.Extensions -@using Blazored.LocalStorage @using LibMatrix -@using LibMatrix.EventTypes.Spec.State.RoomInfo @using LibMatrix.Helpers @using LibMatrix.Responses -@using MatrixUtils.Web.Classes.RoomCreationTemplates +@using LibMatrix.RoomTypes @using MatrixUtils.Web.Pages.Rooms.RoomCreateComponents @inject ILogger logger @* @* ReSharper disable once RedundantUsingDirective - Must not remove this, Rider marks this as "unused" when it's not */ *@ @@ -23,7 +18,7 @@ @if (roomBuilder is RoomUpgradeBuilder roomUpgrade) { - + } else { @* *@ @@ -49,21 +44,13 @@ @* Initial states, should remain at bottom *@ -
+ + Create room -
-
-
- RoomBuilder state - - Show null values
-
-                @roomBuilder.ToJson(ignoreNull: !ShowNullInState)
-            
-
-
} + + + @if (_matrixException is not null) {
@@ -73,13 +60,13 @@
 }
 
 @code {
-    
+
 #region State
 
     [Parameter, SupplyParameterFromQuery(Name = "previousRoomId")]
     public string? PreviousRoomId { get; set; }
-
-    private bool ShowNullInState { get; set; }
+    
+    public GenericRoom? PreviousRoom { get; set; }
 
     private bool Ready { get; set; }
 
@@ -109,7 +96,8 @@
         Homeserver = await sessionStore.GetCurrentHomeserver(navigateOnFailure: true);
         if (Homeserver is null) return;
         if (!string.IsNullOrWhiteSpace(PreviousRoomId)) {
-            roomBuilder = new RoomUpgradeBuilder(Homeserver.GetRoom(PreviousRoomId));
+            roomBuilder = new RoomUpgradeBuilder();
+            PreviousRoom = Homeserver.GetRoom(PreviousRoomId);
         }
 
         roomBuilder.ServerAcls.Allow = ["*"];
@@ -124,14 +112,14 @@
         // Presets = Presets.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
 
         // if (!Presets.ContainsKey("Default")) {
-            // Console.WriteLine($"No default room found in {Presets.Count} presets: {string.Join(", ", Presets.Keys)}");
+        // Console.WriteLine($"No default room found in {Presets.Count} presets: {string.Join(", ", Presets.Keys)}");
         // }
         // else RoomPreset = "Default";
 
         Ready = true;
         StateHasChanged();
         if (roomBuilder is RoomUpgradeBuilder roomUpgrade) {
-            await roomUpgrade.ImportAsync().ConfigureAwait(false);
+            // await roomUpgrade.ImportAsync().ConfigureAwait(false);
             StateHasChanged();
         }
     }
diff --git a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateInitialStateOptions.razor b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateInitialStateOptions.razor
index 272bd8b..99facbf 100644
--- a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateInitialStateOptions.razor
+++ b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateInitialStateOptions.razor
@@ -1,4 +1,5 @@
 @using System.Text.Json
+@using ArcaneLibs.Extensions
 @using LibMatrix
 @using LibMatrix.Helpers
 
@@ -8,7 +9,7 @@
                           { "Important room state (before final access rules)", roomBuilder.ImportantState },
                           { "Additional room state (after final access rules)", roomBuilder.InitialState },
                       }) {
-            
+
@code { @@ -17,30 +18,50 @@ @* @displayName: @events.Count(x => !ImplementedStates.Contains(x.Type)) events *@ @displayName: @events.Count events - - @* @foreach (var initialState in events.Where(x => !ImplementedStates.Contains(x.Type))) { *@ + Remove all + + Add new event + +
+ @if (events.Count > 1000) { + Warning: Too many initial state events! (more than 1000) - Please use the save/load feature in the state panel instead. + } + else { + int i = 0; @foreach (var initialState in events) { - - - - +
+ Event @(++i) (@GetRemoveButton(events, initialState)) +
+ @* *@ + +
+
} -
- @(initialState.Type): - @if (!string.IsNullOrEmpty(initialState.StateKey)) { -
- (@initialState.StateKey) - } - -
-
@JsonSerializer.Serialize(initialState.RawContent, new JsonSerializerOptions { WriteIndented = true })
-
+ }
} @code { + [Parameter] public required RoomBuilder roomBuilder { get; set; } @@ -49,4 +70,14 @@ [Parameter] public AuthenticatedHomeserverGeneric Homeserver { get; set; } + + private RenderFragment GetRemoveButton(List events, StateEvent initialState) { + return @ + Remove + ; + } + } \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMembershipOptions.razor b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMembershipOptions.razor index 5170d2d..6e300d4 100644 --- a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMembershipOptions.razor +++ b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMembershipOptions.razor @@ -6,10 +6,13 @@
@roomBuilder.Invites.Count members Invite all logged in accounts +
@foreach (var member in roomBuilder.Invites) { - + + @* *@ : +
}
@@ -19,8 +22,10 @@
@roomBuilder.Bans.Count members +
@foreach (var member in roomBuilder.Bans) { - + @* *@ + : } diff --git a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMsc4321UpgradeOptions.razor b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMsc4321UpgradeOptions.razor new file mode 100644 index 0000000..94e9638 --- /dev/null +++ b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateMsc4321UpgradeOptions.razor @@ -0,0 +1,19 @@ +@using LibMatrix.Helpers +
+ Policy list upgrade type: + + + + +
+
+ +@code { + + [Parameter] + public required RoomUpgradeBuilder roomUpgrade { get; set; } + + [Parameter] + public required Action PageStateHasChanged { get; set; } + +} \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateStateDisplay.razor b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateStateDisplay.razor new file mode 100644 index 0000000..eb373ba --- /dev/null +++ b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateStateDisplay.razor @@ -0,0 +1,65 @@ +@using System.Text.Json +@using System.Text.Json.Nodes +@using ArcaneLibs.Blazor.Components.Services +@using ArcaneLibs.Extensions +@using LibMatrix.Helpers +@inject BlazorSaveFileService SaveFileService +
+
+ RoomBuilder state + + Show null values
+ Save + +
+
+                @RoomBuilder.ToJson(ignoreNull: !ShowNullInState)
+            
+
+
+ +@code { + + [Parameter] + public required RoomBuilder RoomBuilder { get; set; } + + [Parameter] + public required EventCallback RoomBuilderChanged { get; set; } + + [Parameter] + public required Action PageStateHasChanged { get; set; } + + private bool ShowNullInState { get; set; } + + private async Task SaveFile() { + Console.WriteLine("Saving room builder state to file..."); + await SaveFileService.SaveFileAsync("room-builder.json", RoomBuilder.ToJson(), "application/json"); + } + + private async Task LoadFile(InputFileChangeEventArgs e) { + if (!RoomBuilderChanged.HasDelegate) throw new InvalidOperationException("RoomBuilderChanged must have a delegate."); + if (e.FileCount == 0) return; + Console.WriteLine("Loading room builder state from file..."); + var stream = e.File.OpenReadStream(4 * 1024 * 1024 * 1024L); + var json = await JsonSerializer.DeserializeAsync(stream); + if (json is null) { + Console.WriteLine("Failed to deserialize JSON from file."); + return; + } + + if (json.ContainsKey(nameof(RoomUpgradeBuilder.UpgradeOptions))) { + Console.WriteLine("Got room upgrade builder state."); + RoomBuilder = json.Deserialize(); + } + else { + Console.WriteLine("Got room builder state."); + RoomBuilder = json.Deserialize(); + } + + await RoomBuilderChanged.InvokeAsync(RoomBuilder); + PageStateHasChanged(); + Console.WriteLine("Room builder state loaded from file."); + } + +} \ No newline at end of file diff --git a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateUpgradeOptions.razor b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateUpgradeOptions.razor index 3e8c3dd..d4c4bfe 100644 --- a/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateUpgradeOptions.razor +++ b/MatrixUtils.Web/Pages/Rooms/RoomCreateComponents/RoomCreateUpgradeOptions.razor @@ -1,32 +1,50 @@ @using LibMatrix.Helpers +@using LibMatrix.RoomTypes Room upgrade options -
- Upgrading from @roomUpgrade.OldRoom.RoomId - - Invite members + @*
*@ + @* Upgrading from @roomUpgrade.OldRoom.RoomId *@ + + Invite members +
+ + Invite users with powerlevels +
+ + Copy bans (do not use with moderation bots!) +
+ + Include empty state events +
+ + Update unstable namespaced values to spec versions (experimental) +
+ @if (roomUpgrade.Type == "support.feline.policy.lists.msc.v1") { + + Enable MSC4321 support
- - Invite users with powerlevels -
- - Copy bans (do not use with moderation bots!) -
- Apply - -
+ @if (roomUpgrade.UpgradeOptions.Msc4321PolicyListUpgradeOptions.Enable) { + + } + } + Apply + + @*
*@ @code { [Parameter] - public required RoomUpgradeBuilder roomUpgrade { get; set; } + public required GenericRoom OldRoom { get; set; } + [Parameter] + public required RoomUpgradeBuilder roomUpgrade { get; set; } + [Parameter] public required Action PageStateHasChanged { get; set; } -- cgit 1.5.1