Removed Warning, Adapted Pages, Started with Edit

This commit is contained in:
2026-07-03 23:39:09 +02:00
parent 9204fed54c
commit e4d392c535
24 changed files with 186 additions and 137 deletions
@@ -54,7 +54,7 @@
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery]
private string? RemoteError { get; set; }
@@ -94,6 +94,8 @@
// the login page if we get here some other way.
RedirectManager.RedirectTo("Account/Login");
}
Input ??= new InputModel();
}
private async Task OnLoginCallbackAsync()
@@ -35,7 +35,7 @@
@code {
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
private async Task OnValidSubmitAsync()
{
@@ -31,7 +31,7 @@
@* MudTextFields zwingend mit Name-Attribut für SSR *@
<MudTextField @bind-Value="Input.Username"
For="@(() => Input.Username)"
Name="Input.Username"
name="Input.Username"
Label="Username"
Variant="Variant.Outlined"
Margin="Margin.Dense"
@@ -40,7 +40,7 @@
<MudTextField @bind-Value="Input.Password"
For="@(() => Input.Password)"
Name="Input.Password"
name="Input.Password"
Label="Password"
InputType="InputType.Password"
Variant="Variant.Outlined"
@@ -75,7 +75,7 @@
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
@@ -87,6 +87,8 @@
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
}
Input ??= new InputModel();
}
public async Task LoginUser()
@@ -49,7 +49,7 @@
private ApplicationUser user = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
@@ -62,6 +62,8 @@
// Ensure the user has gone through the username & password screen first
user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ??
throw new InvalidOperationException("Unable to load two-factor authentication user.");
Input ??= new InputModel();
}
private async Task OnValidSubmitAsync()
@@ -38,7 +38,7 @@
private ApplicationUser user = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
@@ -48,6 +48,8 @@
// Ensure the user has gone through the username & password screen first
user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ??
throw new InvalidOperationException("Unable to load two-factor authentication user.");
Input ??= new InputModel();
}
private async Task OnValidSubmitAsync()
@@ -1,4 +1,4 @@
@page "/Account/Manage/ChangePassword"
@page "/Account/ChangePassword"
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@@ -9,67 +9,81 @@
@inject IdentityUserAccessor UserAccessor
@inject IdentityRedirectManager RedirectManager
@inject ILogger<ChangePassword> Logger
@inject ISnackbar Snackbar
<PageTitle>Change password</PageTitle>
<h3>Change password</h3>
<StatusMessage Message="@message" />
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.OldPassword" id="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Enter the old password" />
<label for="Input.OldPassword" class="form-label">Old password</label>
<ValidationMessage For="() => Input.OldPassword" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.NewPassword" id="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" />
<label for="Input.NewPassword" class="form-label">New password</label>
<ValidationMessage For="() => Input.NewPassword" class="text-danger" />
</div>
<div class="form-floating mb-3">
<InputText type="password" @bind-Value="Input.ConfirmPassword" id="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" />
<label for="Input.ConfirmPassword" class="form-label">Confirm password</label>
<ValidationMessage For="() => Input.ConfirmPassword" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Update password</button>
</EditForm>
</div>
</div>
<MudText Typo="Typo.h6">Change password</MudText>
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<MudTextField
T="string"
name="Input.OldPassword"
Label="OldPassword"
@bind-Value="Input.OldPassword"
For="@(() => Input.OldPassword)"
InputType="InputType.Password"
Required="true"
Variant="Variant.Outlined"
ShrinkLabel="true"/>
<MudTextField
T="string"
name="Input.NewPassword"
Label="New password"
@bind-Value="Input.NewPassword"
For="@(() => Input.NewPassword)"
InputType="InputType.Password"
Required="true"
Variant="Variant.Outlined"
ShrinkLabel="true"/>
<MudTextField
T="string"
name="Input.ConfirmPassword"
Label="Confirm password"
@bind-Value="Input.ConfirmPassword"
For="@(() => Input.ConfirmPassword)"
InputType="InputType.Password"
Required="true"
Variant="Variant.Outlined"
ShrinkLabel="true"/>
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary">Change password</MudButton>
</EditForm>
@code {
private string? message;
private ApplicationUser user = default!;
private bool hasPassword;
private ApplicationUser _user = null!;
private bool _hasPassword;
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private HttpContext HttpContext { get; set; } = null!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
user = await UserAccessor.GetRequiredUserAsync(HttpContext);
hasPassword = await UserManager.HasPasswordAsync(user);
if (!hasPassword)
_user = await UserAccessor.GetRequiredUserAsync(HttpContext);
_hasPassword = await UserManager.HasPasswordAsync(_user);
if (!_hasPassword)
{
RedirectManager.RedirectTo("Account/Manage/SetPassword");
}
Input ??= new InputModel();
}
private async Task OnValidSubmitAsync()
{
var changePasswordResult = await UserManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword);
var changePasswordResult = await UserManager.ChangePasswordAsync(_user, Input.OldPassword, Input.NewPassword);
if (!changePasswordResult.Succeeded)
{
message = $"Error: {string.Join(",", changePasswordResult.Errors.Select(error => error.Description))}";
return;
}
await SignInManager.RefreshSignInAsync(user);
await SignInManager.RefreshSignInAsync(_user);
Logger.LogInformation("User changed their password successfully.");
RedirectManager.RedirectToCurrentPageWithStatus("Your password has been changed", HttpContext);
@@ -47,13 +47,15 @@
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
Input ??= new();
user = await UserAccessor.GetRequiredUserAsync(HttpContext);
requirePassword = await UserManager.HasPasswordAsync(user);
Input ??= new InputModel();
}
private async Task OnValidSubmitAsync()
@@ -63,7 +63,7 @@
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm(FormName = "change-email")]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
@@ -72,6 +72,7 @@
isEmailConfirmed = await UserManager.IsEmailConfirmedAsync(user);
Input.NewEmail ??= email;
Input ??= new InputModel();
}
private async Task OnValidSubmitAsync()
@@ -79,7 +79,7 @@ else
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
@@ -11,27 +11,14 @@
<PageTitle>Profile</PageTitle>
<h3>Profile</h3>
<MudText Typo="Typo.h6">Profile</MudText>
<StatusMessage />
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<input type="text" value="@username" id="username" class="form-control" placeholder="Choose your username." disabled />
<label for="username" class="form-label">Username</label>
</div>
<!--<div class="form-floating mb-3">
<InputText @bind-Value="Input.PhoneNumber" id="Input.PhoneNumber" class="form-control" placeholder="Enter your phone number" />
<label for="Input.PhoneNumber" class="form-label">Phone number</label>
<ValidationMessage For="() => Input.PhoneNumber" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Save</button>-->
</EditForm>
</div>
</div>
<MudContainer Class="pa-0 ma-0">
<MudTextField Value="@username" Variant="Variant.Outlined" Label="Username"/>
</MudContainer>
@code {
private ApplicationUser user = default!;
@@ -42,7 +29,7 @@
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
@@ -45,7 +45,7 @@
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
@@ -59,7 +59,7 @@
private IEnumerable<IdentityError>? identityErrors;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
@@ -37,7 +37,7 @@
private string? message;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
private async Task OnValidSubmitAsync()
{
@@ -46,7 +46,7 @@
private IEnumerable<IdentityError>? identityErrors;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery]
private string? Code { get; set; }
@@ -1,17 +1,18 @@
@inherits LayoutComponentBase
@layout CouchLog.Components.Layout.MainLayout
<h1>Manage your account</h1>
<MudText Typo="Typo.h2">Manage your account</MudText>
<div>
<h2>Change your account settings</h2>
<hr />
<div class="row">
<div class="col-lg-3">
<ManageNavMenu />
</div>
<div class="col-lg-9">
<MudContainer MaxWidth="MaxWidth.False" Class="pa-4">
<MudText Typo="Typo.h4">Change your account settings</MudText>
<hr/>
<MudGrid>
<MudItem xs="12" md="3" lg="2">
<ManageNavMenu/>
</MudItem>
<MudItem xs="12" md="9" lg="10">
@Body
</div>
</div>
</div>
</MudItem>
</MudGrid>
</MudContainer>
@@ -3,33 +3,41 @@
@inject SignInManager<ApplicationUser> SignInManager
<ul class="nav nav-pills flex-column">
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage" Match="NavLinkMatch.All">Profile</NavLink>
</li>
<!--
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/Email">Email</NavLink>
</li>
<MudNavMenu>
<MudNavLink Href="Account/Manage"
Icon="@Icons.Material.Filled.ManageAccounts">
Manage
</MudNavLink>
<!--
<MudNavLink Href="Account/Manage/Email"
Icon="@Icons.Material.Filled.Email">
Email
</MudNavLink>
-->
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/ChangePassword">Password</NavLink>
</li>
<MudNavLink Href="Account/ChangePassword"
Icon="@Icons.Material.Filled.Password">
Password
</MudNavLink>
@if (hasExternalLogins)
{
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/ExternalLogins">External logins</NavLink>
</li>
<MudNavLink Href="Account/Manage/ExternalLogins"
Icon="@Icons.Material.Filled.Login">
External logins
</MudNavLink>
}
<!--
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/TwoFactorAuthentication">Two-factor authentication</NavLink>
</li>
<MudNavLink Href="Account/Manage/TwoFactorAuthentication"
Icon="@Icons.Material.Filled.FactCheck">
Two-factor authentication
</MudNavLink>
-->
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/PersonalData">Personal data</NavLink>
</li>
</ul>
<!--
<MudNavLink Href="Account/Manage/PersonalData"
Icon="@Icons.Material.Filled.DataObject">
Personal data
</MudNavLink>
-->
</MudNavMenu>
@code {
private bool hasExternalLogins;
@@ -17,11 +17,11 @@
Color="Color.Primary" />
</EditForm>
<MudText>Version: @_version</MudText>
@*<MudText>Version: @_version</MudText>*@
@code {
private AccountsSettings? _accountsSettings;
private readonly string _version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion?.Split('+')[0];
private AccountsSettings _accountsSettings = null!;
//private readonly string _version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion?.Split('+')[0];
protected override async Task OnInitializedAsync()
{
@@ -1,11 +1,14 @@
@using CouchLog.Data
<MudCard>
<MudPaper Elevation="0">
<MudPaper Elevation="0" Style="position: relative;">
<MudCardMedia Image="@GlobalEntity.PicturePath" Height="400" Style="object-fit: contain;"/>
<MudIconButton Icon="@Icons.Material.Rounded.Edit" Style="position: absolute; top: 8px; right: 8px; z-index: 1; background: black" Color="Color.Primary" />
</MudPaper>
<MudCardContent>
<MudText Typo="Typo.h5" Style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">@GlobalEntity.Title</MudText>
<MudTooltip Text="@GlobalEntity.Title">
<MudText Typo="Typo.h5" Style="display: block; max-width: 250px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">@GlobalEntity.Title</MudText>
</MudTooltip>
</MudCardContent>
<MudCardActions>
<MudTooltip Text="Add to shared List">
@@ -1,10 +1,9 @@
@using CouchLog.Data
@using Microsoft.EntityFrameworkCore
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Identity
@using System.ComponentModel.DataAnnotations
@inject ApplicationDbContext CouchLogDB
@inject ApplicationDbContext CouchLogDb
@inject UserManager<ApplicationUser> UserManager
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager
@@ -120,7 +119,7 @@
//Picture
private IBrowserFile? _pictureFile;
private string _pictureBase64;
private string _pictureBase64 = null!;
private string? _pictureContentType;
private string? _pictureExtension;
@@ -145,8 +144,8 @@
return;
}
_mediaTypes = await CouchLogDB.MediaType.OrderBy(t => t.Id).ToListAsync();
_genres = await CouchLogDB.Genres.OrderBy(t => t.Id).ToListAsync();
_mediaTypes = await CouchLogDb.MediaType.OrderBy(t => t.Id).ToListAsync();
_genres = await CouchLogDb.Genres.OrderBy(t => t.Id).ToListAsync();
if (_mediaTypes.Count > 0)
_selectedMediaTypeId = _mediaTypes.First().Id;
@@ -212,19 +211,19 @@
IsPrivate = _isPrivate
};
CouchLogDB.Add(entity);
await CouchLogDB.SaveChangesAsync();
CouchLogDb.Add(entity);
await CouchLogDb.SaveChangesAsync();
foreach (int genreId in _selectedGenreIds)
{
CouchLogDB.Add(new LinkTableGlobalGenre
CouchLogDb.Add(new LinkTableGlobalGenre
{
GenreId = genreId,
GlobalEntityId = entity.Id
});
}
await CouchLogDB.SaveChangesAsync();
await CouchLogDb.SaveChangesAsync();
Snackbar.Add("Global Entity created!", Severity.Success);
MudDialog.Close(DialogResult.Ok(entity));
@@ -0,0 +1,28 @@
@using CouchLog.Data
<MudDialog>
<TitleContent>
<MudText Typo="Typo.h6">Edit Global Entity</MudText>
</TitleContent>
<DialogContent>
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel" Variant="Variant.Text">Cancel</MudButton>
</DialogActions>
</MudDialog>
@code
{
[CascadingParameter] private IMudDialogInstance Dialog { get; set; } = null!;
[Parameter] public GlobalEntity GlobalEntity { get; set; } = null!;
private void Cancel()
{
Dialog.Cancel();
}
}
S
@@ -78,7 +78,7 @@
<MudGrid Spacing="6" Justify="Justify.Center">
@foreach (var globalEntity in VisibleGlobalEntities)
{
<MudItem xs="12" sm="6" md="4" lg="3" xl="2">
<MudItem xs="12" sm="6" md="4" lg="3" xl="2" Style="min-width: 0;">
<GlobalEntityCard GlobalEntity="globalEntity"
UserPrivateEntityIds="_userPrivateEntityIds"
OnAddToPrivate="AddGlobalEntityToPrivateList"
@@ -132,7 +132,7 @@
//Filter
private string? _searchString;
private bool _showFilters;
private bool _showAlreadyAddedEntities = false;
//private bool _showAlreadyAddedEntities = false;
private IEnumerable<PrivateEntity> FiltertGlobalEntities => _privateEntities.Where(entity =>
(string.IsNullOrWhiteSpace(_searchString) || entity.GlobalEntity.Title.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) //Search bar
);
+13 -14
View File
@@ -9,6 +9,8 @@
<PackAsTool>True</PackAsTool>
<Version>0.1.0-nightly.10</Version>
<Authors>Penry</Authors>
<IsPackable>false</IsPackable>
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
</PropertyGroup>
<ItemGroup>
@@ -60,26 +62,23 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.QuickGrid" Version="10.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="10.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.1" />
<PackageReference Include="Microsoft.Build" Version="18.0.2" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Features" Version="5.0.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="5.0.0" />
<PackageReference Include="Microsoft.DotNet.Scaffolding.Shared" Version="10.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.1">
<PackageReference Include="Microsoft.AspNetCore.Components.QuickGrid" Version="10.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="10.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.9" />
<PackageReference Include="Microsoft.Build" Version="18.7.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.9">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1">
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.9">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="MudBlazor" Version="9.5.0" />
<PackageReference Include="MudBlazor" Version="9.6.0" />
</ItemGroup>
<ItemGroup>
@@ -4,8 +4,7 @@ using System.Diagnostics.CodeAnalysis;
namespace CouchLog.Data
{
[method: SetsRequiredMembers]
public class GlobalEntity()
public class GlobalEntity
{
[Key]
public int Id { get; set; }