Logout: - It navigated to "authenticatio/logout", a misspelled route. - The correct template route, authentication/logout, would throw anyway. Its RemoteAuthenticatorView casts the AuthenticationStateProvider to the OIDC template's service, and the app registers TokenAuthStateProvider instead. - It now signs out through TokenAuthStateProvider.LogoutAsync, as the code commented out in the page intended, and returns home. LoginDisplay's sign-out goes through it as well. - This also drops the obsolete SignOutSessionStateManager, the build's last warning. The IndexedDB schema never declared the ClientLogs store that IStorage.AddLog writes to, so every client log write failed inside its try/catch. Version 2 adds the store, keyed by the Id AddLog assigns. DInputBase.NameAttribute renders no name instead of name="" when the form maps no field names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
46 lines
2.0 KiB
C#
46 lines
2.0 KiB
C#
using System.Globalization;
|
|
|
|
using Microsoft.AspNetCore.Components;
|
|
using Microsoft.AspNetCore.Components.Forms;
|
|
|
|
namespace decePubClient.Components.Daisy;
|
|
|
|
/// <summary>
|
|
/// Base of the daisyUI form fields. It is Blazor's <see cref="InputBase{TValue}"/>, so <c>@bind-Value</c> and
|
|
/// EditForm validation work as with InputText; it also works outside an EditForm, as long as the value is bound.
|
|
/// A consumer's <c>class</c> stays in AdditionalAttributes, and <see cref="InputBase{TValue}.CssClass"/> adds the
|
|
/// EditContext's valid/invalid/modified markers to it.
|
|
/// </summary>
|
|
public abstract class DInputBase<TValue> : InputBase<TValue>
|
|
{
|
|
/// <summary>Whether the bound field currently has validation messages.</summary>
|
|
protected bool IsInvalid => EditContext != null && EditContext.GetValidationMessages(FieldIdentifier).Any();
|
|
|
|
/// <summary>The attributes for the inner input element, without class (that goes on the styled element).</summary>
|
|
protected IReadOnlyDictionary<string, object> InputAttributes =>
|
|
AdditionalAttributes?.Where(a => a.Key != "class").ToDictionary(a => a.Key, a => a.Value);
|
|
|
|
/// <summary>
|
|
/// The name attribute, or null so none is rendered. InputBase.NameAttributeValue is "" outside a form that maps
|
|
/// field names, which would group every radio and checkbox on the page.
|
|
/// </summary>
|
|
protected string NameAttribute => string.IsNullOrEmpty(NameAttributeValue) ? null : NameAttributeValue;
|
|
|
|
protected static string Cx(params string[] classes) => DCx.Join(classes);
|
|
|
|
protected override string FormatValueAsString(TValue value) =>
|
|
BindConverter.FormatValue(value, CultureInfo.InvariantCulture)?.ToString();
|
|
|
|
protected override bool TryParseValueFromString(string value, out TValue result, out string validationErrorMessage)
|
|
{
|
|
if (BindConverter.TryConvertTo(value, CultureInfo.InvariantCulture, out result))
|
|
{
|
|
validationErrorMessage = null;
|
|
return true;
|
|
}
|
|
|
|
validationErrorMessage = $"The {DisplayName ?? FieldIdentifier.FieldName} field is not valid.";
|
|
return false;
|
|
}
|
|
}
|