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
<tr>
@@ -8,7 +9,7 @@
{ "Important room state (before final access rules)", roomBuilder.ImportantState },
{ "Additional room state (after final access rules)", roomBuilder.InitialState },
}) {
- <details>
+ <details open>
@code
{
@@ -17,30 +18,50 @@
@* <summary>@displayName: @events.Count(x => !ImplementedStates.Contains(x.Type)) events</summary> *@
<summary>@displayName: @events.Count events</summary>
- <table>
- @* @foreach (var initialState in events.Where(x => !ImplementedStates.Contains(x.Type))) { *@
+ <LinkButton OnClick="@(() => {
+ events.Clear();
+ StateHasChanged();
+ })">Remove all
+ </LinkButton>
+ <LinkButton OnClick="@(() => {
+ events.Insert(0, new() {
+ Type = "",
+ StateKey = "",
+ RawContent = new(),
+ });
+ StateHasChanged();
+ })">Add new event
+ </LinkButton>
+ <br/>
+ @if (events.Count > 1000) {
+ <span style="color: red;">Warning: Too many initial state events! (more than 1000) - Please use the save/load feature in the state panel instead.</span>
+ }
+ else {
+ int i = 0;
@foreach (var initialState in events) {
- <tr>
- <td style="vertical-align: top;">
- @(initialState.Type):
- @if (!string.IsNullOrEmpty(initialState.StateKey)) {
- <br/>
- <span>(@initialState.StateKey)</span>
- }
-
- </td>
- <td>
- <pre>@JsonSerializer.Serialize(initialState.RawContent, new JsonSerializerOptions { WriteIndented = true })</pre>
- </td>
- </tr>
+ <div id="@(initialState.Type + "/" + initialState.StateKey)">
+ <span>Event @(++i) (@GetRemoveButton(events, initialState))</span>
+ <br/>
+ @* <FancyTextBox Multiline="true" Value="@initialState.ToJson(ignoreNull: true)" *@
+ @* ValueChanged="@(json => { *@
+ @* if (string.IsNullOrWhiteSpace(json)) *@
+ @* events.Remove(initialState); *@
+ @* else *@
+ @* events.Replace(initialState, JsonSerializer.Deserialize<StateEvent>(json)); *@
+ @* StateHasChanged(); *@
+ @* })"></FancyTextBox> *@
+ <FancyTextBoxLazyJson T="StateEvent" Value="@initialState" ValueChanged="@(evt => { events.Replace(initialState, evt); })"></FancyTextBoxLazyJson>
+ <br/>
+ </div>
}
- </table>
+ }
</details>
}
</td>
</tr>
@code {
+
[Parameter]
public required RoomBuilder roomBuilder { get; set; }
@@ -49,4 +70,14 @@
[Parameter]
public AuthenticatedHomeserverGeneric Homeserver { get; set; }
+
+ private RenderFragment GetRemoveButton(List<StateEvent> events, StateEvent initialState) {
+ return @<span>
+ <LinkButton InlineText="true" OnClick="@(() => {
+ events.Remove(initialState);
+ PageStateHasChanged();
+ })">Remove</LinkButton>
+ </span>;
+ }
+
}
\ 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 @@
<details>
<summary>@roomBuilder.Invites.Count members</summary>
<LinkButton OnClickAsync="@InviteAllSessions" InlineText="true">Invite all logged in accounts</LinkButton>
+ <br/>
@foreach (var member in roomBuilder.Invites) {
- <UserListItem _homeserver="Homeserver" UserId="@member.Key"></UserListItem>
+ <FancyTextBox Value="@member.Key" ValueChanged="@(val => roomBuilder.Invites.ChangeKey(member.Key, val))"/>
+ @* <UserListItem _homeserver="Homeserver" UserId="@member.Key"></UserListItem> *@
<span>: </span>
<FancyTextBox Value="@member.Value" ValueChanged="@(val => roomBuilder.Invites[member.Key] = val)"/>
+ <br/>
}
</details>
</td>
@@ -19,8 +22,10 @@
<td>
<details>
<summary>@roomBuilder.Bans.Count members</summary>
+ <br/>
@foreach (var member in roomBuilder.Bans) {
- <UserListItem _homeserver="Homeserver" UserId="@member.Key"></UserListItem>
+ @* <UserListItem _homeserver="Homeserver" UserId="@member.Key"></UserListItem> *@
+ <FancyTextBox Value="@member.Value" ValueChanged="@(val => roomBuilder.Bans.ChangeKey(member.Key, val))"/>
<span>: </span>
<FancyTextBox Value="@member.Value" ValueChanged="@(val => roomBuilder.Bans[member.Key] = val)"/>
}
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
+<div style="border-left: solid 1px white; padding-left: 8px; margin-left: 8px;">
+ <span>Policy list upgrade type:</span>
+ <InputSelect @bind-Value="@roomUpgrade.UpgradeOptions.Msc4321PolicyListUpgradeOptions.UpgradeType">
+ <option value="@RoomUpgradeBuilder.Msc4321PolicyListUpgradeOptions.Msc4321PolicyListUpgradeType.Move">Move policy list (copy policies)</option>
+ <option value="@RoomUpgradeBuilder.Msc4321PolicyListUpgradeOptions.Msc4321PolicyListUpgradeType.Transition">Transition policy list (new list)</option>
+ </InputSelect>
+ <br/>
+</div>
+
+@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
+<div
+ style="position: fixed; top: 56px; right: 0; width: fit-content; max-width: 25%; height: calc(100vh - 56px); overflow: auto; background-color: #2c3054; padding-right: 32px; border-left: 1px solid #ccc;">
+ <details open>
+ <summary>RoomBuilder state</summary>
+ <InputCheckbox @bind-Value="@ShowNullInState"/>
+ <span>Show null values</span><br/>
+ <LinkButton OnClickAsync="@SaveFile">Save</LinkButton>
+ <SimpleFilePicker OnFilePicked="@LoadFile"/>
+ <br/>
+ <pre>
+ @RoomBuilder.ToJson(ignoreNull: !ShowNullInState)
+ </pre>
+ </details>
+</div>
+
+@code {
+
+ [Parameter]
+ public required RoomBuilder RoomBuilder { get; set; }
+
+ [Parameter]
+ public required EventCallback<RoomBuilder> 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<JsonObject>(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<RoomUpgradeBuilder>();
+ }
+ else {
+ Console.WriteLine("Got room builder state.");
+ RoomBuilder = json.Deserialize<RoomBuilder>();
+ }
+
+ 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,33 +1,51 @@
@using LibMatrix.Helpers
+@using LibMatrix.RoomTypes
<tr>
<td>Room upgrade options</td>
<td>
- <details>
- <summary>Upgrading from @roomUpgrade.OldRoom.RoomId</summary>
- <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.InviteMembers"></InputCheckbox>
- <span>Invite members</span>
+ @* <details> *@
+ @* <summary>Upgrading from @roomUpgrade.OldRoom.RoomId</summary> *@
+ <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.InviteMembers"></InputCheckbox>
+ <span>Invite members</span>
+ <br/>
+ <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.InvitePowerlevelUsers"></InputCheckbox>
+ <span>Invite users with powerlevels</span>
+ <br/>
+ <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.MigrateBans"></InputCheckbox>
+ <span>Copy bans (do not use with moderation bots!)</span>
+ <br/>
+ <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.MigrateEmptyStateEvents"></InputCheckbox>
+ <span>Include empty state events</span>
+ <br/>
+ <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.UpgradeUnstableValues"></InputCheckbox>
+ <span>Update unstable namespaced values to spec versions (experimental)</span>
+ <br/>
+ @if (roomUpgrade.Type == "support.feline.policy.lists.msc.v1") {
+ <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.Msc4321PolicyListUpgradeOptions.Enable"></InputCheckbox>
+ <span>Enable MSC4321 support</span>
<br/>
- <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.InvitePowerlevelUsers"></InputCheckbox>
- <span>Invite users with powerlevels</span>
- <br/>
- <InputCheckbox @bind-Value="@roomUpgrade.UpgradeOptions.MigrateBans"></InputCheckbox>
- <span>Copy bans (do not use with moderation bots!)</span>
- <br/>
- <LinkButton OnClickAsync="@(async () => {
- await roomUpgrade.ImportAsync();
- PageStateHasChanged();
- })">Apply
- </LinkButton>
- </details>
+ @if (roomUpgrade.UpgradeOptions.Msc4321PolicyListUpgradeOptions.Enable) {
+ <RoomCreateMsc4321UpgradeOptions roomUpgrade="@roomUpgrade" PageStateHasChanged="@PageStateHasChanged"/>
+ }
+ }
+ <LinkButton OnClickAsync="@(async () => {
+ await roomUpgrade.ImportAsync(OldRoom);
+ PageStateHasChanged();
+ })">Apply
+ </LinkButton>
+ @* </details> *@
</td>
</tr>
@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; }
}
\ No newline at end of file
|