Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2e069dd
This is currently very broken.
magiccodingman Jul 24, 2026
656fc5c
double await fix
magiccodingman Jul 24, 2026
54bca09
Add .NET 10 migration build workflow
magiccodingman Jul 24, 2026
ee37edf
Run migration build for pull requests
magiccodingman Jul 24, 2026
b7fdea3
Update CI validation for .NET 10
magiccodingman Jul 24, 2026
64159d2
Capture complete .NET 10 build diagnostics
magiccodingman Jul 24, 2026
2278b01
Migrate metrics charts to MudBlazor 9
magiccodingman Jul 24, 2026
e260818
Automate the next MudBlazor migration fixes
magiccodingman Jul 24, 2026
df5c3b5
Fix MudBlazor 9 chart, dialog, and grid APIs
github-actions[bot] Jul 24, 2026
d86c43f
Run migration patches against the repair branch
magiccodingman Jul 24, 2026
aff0a36
Capture complete .NET 10 test diagnostics
magiccodingman Jul 24, 2026
081c453
Retarget TLS tests to .NET 10
magiccodingman Jul 24, 2026
00ef468
Migrate domain backup file upload to MudBlazor 9
magiccodingman Jul 24, 2026
74cbeb3
Apply remaining MudBlazor 9 component migrations
magiccodingman Jul 24, 2026
c7986e8
Add temporary compiler-driven migration script
magiccodingman Jul 24, 2026
1a6726c
Run migration fixes from a standalone script
magiccodingman Jul 24, 2026
db4d5c8
Finish MudBlazor 9 form and component migrations
github-actions[bot] Jul 24, 2026
190af2f
Update .NET 10 test host packages
magiccodingman Jul 24, 2026
19b9840
Add .NET 10 test-host diagnostics
magiccodingman Jul 24, 2026
cbc586d
Restore TLS test project explicitly
magiccodingman Jul 24, 2026
cf00904
Migrate add-ban validation to async MudForm APIs
magiccodingman Jul 24, 2026
362294c
Migrate add-user validation to async MudForm APIs
magiccodingman Jul 24, 2026
baec649
Migrate password validation to async MudForm APIs
magiccodingman Jul 24, 2026
9018aff
Migrate domain validation to async MudForm APIs
magiccodingman Jul 24, 2026
10596be
Pin patched SQLite native bundle
magiccodingman Jul 24, 2026
0b3fb9a
Finalize .NET 10 TLS validation workflow
magiccodingman Jul 24, 2026
2b4b2e0
Remove temporary migration build workflow
magiccodingman Jul 24, 2026
c36e6a5
Remove temporary migration helper script
magiccodingman Jul 24, 2026
39adf11
Document explicit TLS test restore
magiccodingman Jul 24, 2026
e42b7d1
Merge pull request #11 from magiccodingman/agent/net10-mudblazor-migr…
magiccodingman Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 18 additions & 37 deletions .github/workflows/tls-lifecycle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,13 @@ name: TLS lifecycle tests
on:
pull_request:
paths:
- "TruthGate-Web/TruthGate-Web/Configuration/**"
- "TruthGate-Web/TruthGate-Web/Services/ConfigWatchAndIssueService.cs"
- "TruthGate-Web/TruthGate-Web.Tests/**"
- "TruthGate-Web/**"
- ".github/workflows/tls-lifecycle.yml"
push:
branches:
- master
paths:
- "TruthGate-Web/TruthGate-Web/Configuration/**"
- "TruthGate-Web/TruthGate-Web/Services/ConfigWatchAndIssueService.cs"
- "TruthGate-Web/TruthGate-Web.Tests/**"
- "TruthGate-Web/**"
- ".github/workflows/tls-lifecycle.yml"

jobs:
Expand All @@ -25,37 +21,22 @@ jobs:

- uses: actions/setup-dotnet@v4
with:
dotnet-version: "9.0.x"
dotnet-version: "10.0.x"

- name: Restore
- name: Restore solution
run: dotnet restore TruthGate-IPFS.sln

# This test project is intentionally outside TruthGate-IPFS.sln, so restore it explicitly.
- name: Restore TLS tests
run: dotnet restore TruthGate-Web/TruthGate-Web.Tests/TruthGate-Web.Tests.csproj

- name: Test
id: test
shell: bash
run: |
set +e
dotnet test \
TruthGate-Web/TruthGate-Web.Tests/TruthGate-Web.Tests.csproj \
--no-restore \
--configuration Release \
--logger "console;verbosity=normal" \
> tls-test-output.log 2>&1
status=$?
echo "status=$status" >> "$GITHUB_OUTPUT"
exit 0

- name: Upload test diagnostics
if: always()
uses: actions/upload-artifact@v4
with:
name: tls-test-output
path: tls-test-output.log
if-no-files-found: error

- name: Report failure
if: steps.test.outputs.status != '0'
shell: bash
run: |
echo "TLS lifecycle tests failed. Download the tls-test-output artifact for the complete compiler/test diagnostics."
exit 1
- name: Build solution
run: dotnet build TruthGate-IPFS.sln --no-restore --configuration Release

- name: Test TLS lifecycle
run: >-
dotnet test
TruthGate-Web/TruthGate-Web.Tests/TruthGate-Web.Tests.csproj
--no-restore
--configuration Release
--logger "console;verbosity=normal"
2 changes: 1 addition & 1 deletion Publish.CLI/Publish.CLI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand Down
22 changes: 14 additions & 8 deletions Test.TruthGate/Test.TruthGate.csproj
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.8">
<PackageReference Include="coverlet.collector" Version="10.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
Expand Down
34 changes: 18 additions & 16 deletions TruthGate-Web/TruthGate-Web.Client/Cache.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,35 @@ public static class Cache
{
public static MudTheme CustomTheme = new()
{
PaletteLight = new()
PaletteLight = new PaletteLight
{
Primary = "#2D2A5A", // Deep Indigo
Secondary = "#00E3C0", // Electric Mint
Primary = "#2D2A5A",
Secondary = "#00E3C0",
Black = "#110e2d",
AppbarText = "#424242",
AppbarBackground = "rgba(255,255,255,0.8)",
DrawerBackground = "#ffffff",
GrayLight = "#e8e8e8",
GrayLighter = "#f9f9f9",
},
PaletteDark = new()

PaletteDark = new PaletteDark
{
Primary = "#00E3C0", // Electric Mint now the star
Primary = "#00E3C0",
PrimaryContrastText = "#000000",
Secondary = "#3C3970", // Softer indigo accent (less oppressive than deep indigo)
Background = "#1E1F22", // Discord-ish near-black with a whisper of warmth
Surface = "#2B2D31", // Elevated panels (matches Discord card tone)
DrawerBackground = "#232428", // Sidebar tone
AppbarBackground = "#1B1C1F", // Slightly darker than background for separation
AppbarText = "#E0E0E0", // Soft but high-contrast
TextPrimary = "#FFFFFF", // True white for legibility
TextSecondary = "#A3A6AA", // Muted gray
ActionDefault = "#00E3C0", // Same as primary for cohesion
Divider = "#383A40" // Subtle panel separators
Secondary = "#3C3970",
Background = "#1E1F22",
Surface = "#2B2D31",
DrawerBackground = "#232428",
AppbarBackground = "#1B1C1F",
AppbarText = "#E0E0E0",
TextPrimary = "#FFFFFF",
TextSecondary = "#A3A6AA",
ActionDefault = "#00E3C0",
Divider = "#383A40"
},

LayoutProperties = new LayoutProperties()
};
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
Expand All @@ -12,8 +12,8 @@

<ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.3" />
<PackageReference Include="MudBlazor" Version="8.11.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.10" />
<PackageReference Include="MudBlazor" Version="9.7.0" />
</ItemGroup>

<ItemGroup>
Expand Down
8 changes: 4 additions & 4 deletions TruthGate-Web/TruthGate-Web.Tests/TruthGate-Web.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
4 changes: 2 additions & 2 deletions TruthGate-Web/TruthGate-Web/Components/Pages/Pinned.razor
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@
MaxWidth = MaxWidth.Medium
};
var parameters = new DialogParameters<AddPinnedItemDialog>();
var dialog = Dialogs.Show<AddPinnedItemDialog>("Add Pinned Item", parameters, options);
var dialog = await Dialogs.ShowAsync<AddPinnedItemDialog>("Add Pinned Item", parameters, options);
var result = await dialog.Result;

if (result.Canceled || result.Data is not AddPinnedItemDialog.AddPinnedResult r) return;
Expand Down Expand Up @@ -331,7 +331,7 @@
{
{ x => x.Message, $"Unpin and delete '{(row.Name ?? row.Cid)}'?" }
};
var dialog = Dialogs.Show<ConfirmDeleteDialog>("Confirm Delete", parameters);
var dialog = await Dialogs.ShowAsync<ConfirmDeleteDialog>("Confirm Delete", parameters);
var result = await dialog.Result;
if (result.Canceled || result.Data is not bool ok || !ok) return;

Expand Down
6 changes: 3 additions & 3 deletions TruthGate-Web/TruthGate-Web/Components/Pages/PinnedIpns.razor
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@
{ x => x.ManagedRoot, ManagedRoot },
{ x => x.IsEdit, false }
};
var dlg = Dialogs.Show<AddOrEditIpnsDialog>("Add IPNS", parameters,
var dlg = await Dialogs.ShowAsync<AddOrEditIpnsDialog>("Add IPNS", parameters,
new DialogOptions { FullWidth = true, MaxWidth = MaxWidth.Medium, CloseButton = true });
var res = await dlg.Result;
if (res.Canceled || res.Data is not AddOrEditIpnsDialog.IpnsResult r) return;
Expand Down Expand Up @@ -317,7 +317,7 @@
{ x => x.InitialKeepOldCidPinned, row.KeepOld }
};

var dlg = Dialogs.Show<AddOrEditIpnsDialog>($"Edit IPNS - {row.Name}", parameters,
var dlg = await Dialogs.ShowAsync<AddOrEditIpnsDialog>($"Edit IPNS - {row.Name}", parameters,
new DialogOptions { FullWidth = true, MaxWidth = MaxWidth.Medium, CloseButton = true });
var res = await dlg.Result;
if (res.Canceled || res.Data is not AddOrEditIpnsDialog.IpnsResult r) return;
Expand Down Expand Up @@ -348,7 +348,7 @@
{
{ x => x.Message, $"Remove IPNS '{row.Name}' from tracking? (Pinned versions stay.)" }
};
var dlg = Dialogs.Show<ConfirmDeleteDialog>("Confirm Remove", confirmParams);
var dlg = await Dialogs.ShowAsync<ConfirmDeleteDialog>("Confirm Remove", confirmParams);
var res = await dlg.Result;
if (res.Canceled || res.Data is not bool ok || !ok) return;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@page "/keys"
@page "/keys"
@using TruthGate_Web.Components.Pages.Settings.Shared
@using TruthGate_Web.Models
@using TruthGate_Web.Utils
Expand Down Expand Up @@ -71,10 +71,10 @@
{ x => x.ExistingNames, _keys.Select(k => k.Name).ToList() }
};

var dialog = Dialogs.Show<AddApiKeyDialog>("Add API Key", p, new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true });
var dialog = await Dialogs.ShowAsync<AddApiKeyDialog>("Add API Key", p, new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true });
var result = await dialog.Result;

if (result.Canceled || result.Data is not AddApiKeyDialog.AddApiKeyResult r) return;
if (result is null || result.Canceled || result.Data is not AddApiKeyDialog.AddApiKeyResult r) return;

// Final uniqueness check (server-side)
if (_keys.Any(k => string.Equals(k.Name, r.Name, StringComparison.OrdinalIgnoreCase)))
Expand Down Expand Up @@ -103,10 +103,10 @@
{ x => x.Message, $"Delete API key '{key.Name}'?" }
};

var dialog = Dialogs.Show<ConfirmDeleteDialog>("Confirm Delete", p);
var dialog = await Dialogs.ShowAsync<ConfirmDeleteDialog>("Confirm Delete", p);
var result = await dialog.Result;

if (result.Canceled || result.Data is not bool yes || !yes) return;
if (result is null || result.Canceled || result.Data is not bool yes || !yes) return;

await ConfigSvc.UpdateAsync(cfg =>
{
Expand Down
20 changes: 10 additions & 10 deletions TruthGate-Web/TruthGate-Web/Components/Pages/Settings/Domains.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@page "/domains"
@page "/domains"
@using System.Globalization
@using System.Text.RegularExpressions
@using MudBlazor
Expand Down Expand Up @@ -47,7 +47,7 @@
@context.Domain
@if (!string.IsNullOrWhiteSpace(context.RedirectUrl))
{
<MudText Typo="Typo.caption" Class="truncate-text" Title="@context.RedirectUrl">
<MudText Typo="Typo.caption" Class="truncate-text" title="@context.RedirectUrl">
@{
var u = context.RedirectUrl ?? string.Empty;
}
Expand All @@ -60,7 +60,7 @@

<MudStack Row="true" Spacing="1" Class="mt-1">
<MudTooltip Text="@($"{GetLabel(context)}.{_wildcardHost}")">
<MudChip T="string" Color="Color.Primary" Variant="Variant.Outlined" StartIcon="@Icons.Material.Filled.Link">
<MudChip T="string" Color="Color.Primary" Variant="Variant.Outlined" Icon="@Icons.Material.Filled.Link">
@($"{GetIpnsHost(context, useShort: true)}")
</MudChip>
</MudTooltip>
Expand Down Expand Up @@ -88,7 +88,7 @@
@context.IpnsKeyName
</MudChip> *@
<MudTooltip Text="@context.IpnsPeerId">
<MudChip T="string" Color="Color.Primary" Variant="Variant.Outlined" StartIcon="@Icons.Material.Filled.Fingerprint">
<MudChip T="string" Color="Color.Primary" Variant="Variant.Outlined" Icon="@Icons.Material.Filled.Fingerprint">
IPNS: @Short(context.IpnsPeerId)
</MudChip>
</MudTooltip>
Expand Down Expand Up @@ -168,7 +168,7 @@
private async Task PublishDomain(EdgeDomain d)
{
var parms = new DialogParameters<PublishDialog> { { x => x.Domain, d.Domain } };
var dlg = Dialogs.Show<PublishDialog>($"Publish: {d.Domain}", parms,
var dlg = await Dialogs.ShowAsync<PublishDialog>($"Publish: {d.Domain}", parms,
new DialogOptions { FullWidth = true, MaxWidth = MaxWidth.Large, CloseButton = true });

await dlg.Result;
Expand Down Expand Up @@ -225,15 +225,15 @@
private async Task ImportDomain()
{
var parms = new DialogParameters<ImportDomainDialog>();
var dlg = Dialogs.Show<ImportDomainDialog>("Import Domain Backup", parms,
var dlg = await Dialogs.ShowAsync<ImportDomainDialog>("Import Domain Backup", parms,
new DialogOptions { FullWidth = true, MaxWidth = MaxWidth.Medium, CloseButton = true });
await dlg.Result;
}

private async Task<string?> PromptAsync(string title, string message)
{
var p = new DialogParameters<SimplePromptDialog> { { x => x.Message, message } };
var dlg = Dialogs.Show<SimplePromptDialog>(title, p);
var dlg = await Dialogs.ShowAsync<SimplePromptDialog>(title, p);
var res = await dlg.Result;
return res.Canceled ? null : (res.Data as string);
}
Expand Down Expand Up @@ -271,7 +271,7 @@
=> string.IsNullOrWhiteSpace(s) || s.Length <= head + tail + 1 ? s : $"{s[..head]}…{s[^tail..]}";
private async Task AddDomain()
{
var dialog = Dialogs.Show<AddOrEditDomainDialog>("Add Domain");
var dialog = await Dialogs.ShowAsync<AddOrEditDomainDialog>("Add Domain");
var result = await dialog.Result;

if (result.Canceled || result.Data is not AddOrEditDomainDialog.DomainResult r) return;
Expand Down Expand Up @@ -316,7 +316,7 @@
{ x => x.IsEdit, true }
};

var dialog = Dialogs.Show<AddOrEditDomainDialog>($"Edit Domain: {domain.Domain}", parameters);
var dialog = await Dialogs.ShowAsync<AddOrEditDomainDialog>($"Edit Domain: {domain.Domain}", parameters);
var result = await dialog.Result;

if (result.Canceled || result.Data is not AddOrEditDomainDialog.DomainResult r) return;
Expand Down Expand Up @@ -359,7 +359,7 @@
{ x => x.Message, $"Delete domain '{domain.Domain}'?\n\nThis will remove its config entry, IPNS key, pins, and MFS folders." }
};

var dialog = Dialogs.Show<ConfirmDeleteDialog>("Confirm Delete", parameters);
var dialog = await Dialogs.ShowAsync<ConfirmDeleteDialog>("Confirm Delete", parameters);
var result = await dialog.Result;
if (result.Canceled || result.Data is not bool confirmed || !confirmed) return;

Expand Down
Loading
Loading