20 Commits

Author SHA1 Message Date
Penry c5e24cd4c3 V0.1.3 (#81)
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 1m21s
Build Docker Linux ARM64 Release / build-docker-linux-arm64-release (push) Successful in 14s
Reviewed-on: #81
2026-07-09 00:28:18 +02:00
Penry 5fcc42a99f V0.1.2 (#80)
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 1m47s
Build Docker Linux ARM64 Release / build-docker-linux-arm64-release (push) Successful in 14s
Reviewed-on: #80
2026-07-09 00:02:14 +02:00
Penry 9204fed54c fix: #72 fixed that the height of the PrivateEntityCard.razor changes when don't having all dropdown menues (#74)
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 1m25s
Build Docker Linux ARM64 Release / build-docker-linux-arm64-release (push) Successful in 25s
Reviewed-on: #74
2026-06-12 20:48:42 +02:00
Penry 406d0f5652 fix: #60 fixed that the Global or Private Entity Card Title chnages height of the Card (#73)
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 2m54s
Reviewed-on: #73
2026-06-12 20:05:05 +02:00
Penry 9cd651bdfe Fixed GlobalEntity Problems and removed Season and Episode on Movie Entitys (#70)
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 1m22s
Reviewed-on: #70
Fixed Issue #63
Fixed Issue #68
Fixed Issue #69
2026-06-07 22:02:10 +02:00
Penry 96336fd637 Fixed Workflow Syntax (#67)
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 38s
Reviewed-on: #67
2026-06-07 21:21:30 +02:00
Penry e7d1b4b524 Merge pull request 'Adapted Nightly and Release Workflow' (#66) from Test-Branch into main
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Failing after 8s
Reviewed-on: #66
2026-06-07 21:16:31 +02:00
Penry a4d7269f8f Adapted Release Workflow 2026-06-07 21:15:46 +02:00
Penry c7d741d15b Adpated Workflow for Nightly Build 2026-06-07 21:14:02 +02:00
Penry 6d2a6c5925 Added fetch depth
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Failing after 8s
2026-06-07 20:41:31 +02:00
Penry 9ccb929553 Added Tags fetching
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Failing after 8s
2026-06-07 20:34:28 +02:00
Penry 5e086c0598 Fixed Syntax
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Failing after 8s
2026-06-07 20:32:46 +02:00
Penry a7c86289b3 Adpated Workflow for working only on those Branches
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Failing after 7s
2026-06-07 20:31:29 +02:00
Penry b2e851d765 Adpated Workflow for Running every Time 2026-06-07 20:30:32 +02:00
Penry 1a1d7dec7c Test 2026-06-07 20:29:44 +02:00
Penry 103da6abe8 Test Commit 2026-06-07 20:27:03 +02:00
Penry 5f2fdbac87 Merge pull request 'Test Commit 2' (#65) from penry-patch-2 into main
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 38s
Reviewed-on: #65
2026-06-07 20:16:52 +02:00
Penry e0ceb7d314 Test Commit 2 2026-06-07 20:16:46 +02:00
Penry 8df80eba3b Merge pull request 'Test Commit' (#64) from penry-patch-1 into main
Build Docker Linux ARM64 / build-docker-linux-arm64 (push) Successful in 38s
Reviewed-on: #64
2026-06-07 20:16:25 +02:00
Penry 77875110f0 Test Commit 2026-06-07 20:16:18 +02:00
29 changed files with 655 additions and 263 deletions
@@ -24,13 +24,6 @@ jobs:
echo "VERSION=$VERSION" >> $GITHUB_ENV echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "REPO_LC=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV echo "REPO_LC=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
- name: Login to own image registry
uses: docker/login-action@v3
with:
registry: gitea.penry.de
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Setup .NET10 - name: Setup .NET10
uses: actions/setup-dotnet@v3 uses: actions/setup-dotnet@v3
with: with:
@@ -42,8 +35,16 @@ jobs:
-t gitea.penry.de/${{ env.REPO_LC }}:${{ env.VERSION }} \ -t gitea.penry.de/${{ env.REPO_LC }}:${{ env.VERSION }} \
-t gitea.penry.de/${{ env.REPO_LC }}:latest \ -t gitea.penry.de/${{ env.REPO_LC }}:latest \
--label "org.opencontainers.image.source=https://gitea.penry.de/${{ github.repository }}" \ --label "org.opencontainers.image.source=https://gitea.penry.de/${{ github.repository }}" \
--build-arg VERSION=${{ env.VERSION }} \
. .
- name: Login to own image registry
uses: docker/login-action@v3
with:
registry: gitea.penry.de
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Push Images - name: Push Images
run: | run: |
docker push gitea.penry.de/${{ env.REPO_LC }}:${{ env.VERSION }} docker push gitea.penry.de/${{ env.REPO_LC }}:${{ env.VERSION }}
+11 -36
View File
@@ -14,6 +14,8 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Docker Buildx - name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@@ -28,62 +30,35 @@ jobs:
- name: Build version - name: Build version
shell: bash shell: bash
run: | run: |
set -euo pipefail LAST_TAG=$(git describe --tags --abbrev=0)
git fetch --force --tags origin
git fetch --force origin main:refs/remotes/origin/main
LAST_TAG=$(git for-each-ref \
--sort=-creatordate \
--format='%(refname:strip=2)' \
refs/tags/v* \
| head -n 1)
if [[ -z "${LAST_TAG:-}" ]]; then if [[ -z "${LAST_TAG:-}" ]]; then
echo "No tag found" echo "No tag found"
exit 1 exit 1
fi fi
LAST_COMMIT=$(git rev-list -n 1 "$LAST_TAG") COMMIT_COUNT=$(git rev-list $LAST_TAG..HEAD --count)
DISTANCE=$(git rev-list --count --first-parent "${LAST_COMMIT}..origin/main")
BASE_VERSION="${LAST_TAG#v}" if [[ "$LAST_TAG" == *-* ]]; then
TEMP_LAST_TAG="${LAST_TAG%-*}"
if [[ "$BASE_VERSION" == *-* ]]; then VERSION="${TEMP_LAST_TAG}-nightly.${COMMIT_COUNT}"
VERSION="${BASE_VERSION}.${DISTANCE}"
else else
VERSION="${BASE_VERSION}-nightly.${DISTANCE}" VERSION="${LAST_TAG}-nightly.${COMMIT_COUNT}"
fi fi
echo "LAST_TAG=$LAST_TAG" >> "$GITHUB_ENV" echo "LAST_TAG=$LAST_TAG" >> "$GITHUB_ENV"
echo "LAST_COMMIT=$LAST_COMMIT" >> "$GITHUB_ENV" echo "COMMIT_COUNT=$COMMIT_COUNT" >> "$GITHUB_ENV"
echo "DISTANCE=$DISTANCE" >> "$GITHUB_ENV"
echo "VERSION=$VERSION" >> "$GITHUB_ENV" echo "VERSION=$VERSION" >> "$GITHUB_ENV"
echo "Last tag: $LAST_TAG" echo "Last tag: $LAST_TAG"
echo "Last tag commit: $LAST_COMMIT" echo "Commit count: $COMMIT_COUNT"
echo "Distance to origin/main: $DISTANCE"
echo "Final version: $VERSION" echo "Final version: $VERSION"
- name: Set .NET version variables
shell: bash
run: |
set -euo pipefail
SEMVER="${VERSION}"
BASE_NUMERIC=$(echo "$SEMVER" | sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
BUILD_NO=$(echo "$SEMVER" | grep -oE '[0-9]+$' || echo "0")
echo "PACKAGE_VERSION=$SEMVER" >> "$GITHUB_ENV"
echo "ASSEMBLY_VERSION=${BASE_NUMERIC}.0" >> "$GITHUB_ENV"
echo "FILE_VERSION=${BASE_NUMERIC}.${BUILD_NO}" >> "$GITHUB_ENV"
echo "INFORMATIONAL_VERSION=$SEMVER" >> "$GITHUB_ENV"
- name: Build Linux ARM64 Docker Image - name: Build Linux ARM64 Docker Image
run: | run: |
docker build \ docker build \
-t gitea.penry.de/${{ env.REPO_LC }}:nightly \ -t gitea.penry.de/${{ env.REPO_LC }}:nightly \
--build-arg VERSION=${{ env.PACKAGE_VERSION }} \ --build-arg VERSION=${{ env.VERSION }} \
. .
- name: Login to own image registry - name: Login to own image registry
@@ -54,7 +54,7 @@
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
private string? RemoteError { get; set; } private string? RemoteError { get; set; }
@@ -94,6 +94,8 @@
// the login page if we get here some other way. // the login page if we get here some other way.
RedirectManager.RedirectTo("Account/Login"); RedirectManager.RedirectTo("Account/Login");
} }
Input ??= new InputModel();
} }
private async Task OnLoginCallbackAsync() private async Task OnLoginCallbackAsync()
@@ -35,7 +35,7 @@
@code { @code {
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
private async Task OnValidSubmitAsync() private async Task OnValidSubmitAsync()
{ {
@@ -31,7 +31,7 @@
@* MudTextFields zwingend mit Name-Attribut für SSR *@ @* MudTextFields zwingend mit Name-Attribut für SSR *@
<MudTextField @bind-Value="Input.Username" <MudTextField @bind-Value="Input.Username"
For="@(() => Input.Username)" For="@(() => Input.Username)"
Name="Input.Username" name="Input.Username"
Label="Username" Label="Username"
Variant="Variant.Outlined" Variant="Variant.Outlined"
Margin="Margin.Dense" Margin="Margin.Dense"
@@ -40,7 +40,7 @@
<MudTextField @bind-Value="Input.Password" <MudTextField @bind-Value="Input.Password"
For="@(() => Input.Password)" For="@(() => Input.Password)"
Name="Input.Password" name="Input.Password"
Label="Password" Label="Password"
InputType="InputType.Password" InputType="InputType.Password"
Variant="Variant.Outlined" Variant="Variant.Outlined"
@@ -75,7 +75,7 @@
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
private string? ReturnUrl { get; set; } private string? ReturnUrl { get; set; }
@@ -87,6 +87,8 @@
// Clear the existing external cookie to ensure a clean login process // Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
} }
Input ??= new InputModel();
} }
public async Task LoginUser() public async Task LoginUser()
@@ -49,7 +49,7 @@
private ApplicationUser user = default!; private ApplicationUser user = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
private string? ReturnUrl { get; set; } private string? ReturnUrl { get; set; }
@@ -62,6 +62,8 @@
// Ensure the user has gone through the username & password screen first // Ensure the user has gone through the username & password screen first
user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ?? user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ??
throw new InvalidOperationException("Unable to load two-factor authentication user."); throw new InvalidOperationException("Unable to load two-factor authentication user.");
Input ??= new InputModel();
} }
private async Task OnValidSubmitAsync() private async Task OnValidSubmitAsync()
@@ -38,7 +38,7 @@
private ApplicationUser user = default!; private ApplicationUser user = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
private string? ReturnUrl { get; set; } private string? ReturnUrl { get; set; }
@@ -48,6 +48,8 @@
// Ensure the user has gone through the username & password screen first // Ensure the user has gone through the username & password screen first
user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ?? user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ??
throw new InvalidOperationException("Unable to load two-factor authentication user."); throw new InvalidOperationException("Unable to load two-factor authentication user.");
Input ??= new InputModel();
} }
private async Task OnValidSubmitAsync() private async Task OnValidSubmitAsync()
@@ -1,4 +1,4 @@
@page "/Account/Manage/ChangePassword" @page "/Account/ChangePassword"
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@@ -9,67 +9,81 @@
@inject IdentityUserAccessor UserAccessor @inject IdentityUserAccessor UserAccessor
@inject IdentityRedirectManager RedirectManager @inject IdentityRedirectManager RedirectManager
@inject ILogger<ChangePassword> Logger @inject ILogger<ChangePassword> Logger
@inject ISnackbar Snackbar
<PageTitle>Change password</PageTitle> <PageTitle>Change password</PageTitle>
<h3>Change password</h3> <MudText Typo="Typo.h6">Change password</MudText>
<StatusMessage Message="@message" />
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post"> <EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" /> <MudTextField
<div class="form-floating mb-3"> T="string"
<InputText type="password" @bind-Value="Input.OldPassword" id="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Enter the old password" /> name="Input.OldPassword"
<label for="Input.OldPassword" class="form-label">Old password</label> Label="OldPassword"
<ValidationMessage For="() => Input.OldPassword" class="text-danger" /> @bind-Value="Input.OldPassword"
</div> For="@(() => Input.OldPassword)"
<div class="form-floating mb-3"> InputType="InputType.Password"
<InputText type="password" @bind-Value="Input.NewPassword" id="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" /> Required="true"
<label for="Input.NewPassword" class="form-label">New password</label> Variant="Variant.Outlined"
<ValidationMessage For="() => Input.NewPassword" class="text-danger" /> ShrinkLabel="true"/>
</div>
<div class="form-floating mb-3"> <MudTextField
<InputText type="password" @bind-Value="Input.ConfirmPassword" id="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" /> T="string"
<label for="Input.ConfirmPassword" class="form-label">Confirm password</label> name="Input.NewPassword"
<ValidationMessage For="() => Input.ConfirmPassword" class="text-danger" /> Label="New password"
</div> @bind-Value="Input.NewPassword"
<button type="submit" class="w-100 btn btn-lg btn-primary">Update password</button> 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> </EditForm>
</div>
</div>
@code { @code {
private string? message; private ApplicationUser _user = null!;
private ApplicationUser user = default!; private bool _hasPassword;
private bool hasPassword;
[CascadingParameter] [CascadingParameter]
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = null!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
user = await UserAccessor.GetRequiredUserAsync(HttpContext); _user = await UserAccessor.GetRequiredUserAsync(HttpContext);
hasPassword = await UserManager.HasPasswordAsync(user); _hasPassword = await UserManager.HasPasswordAsync(_user);
if (!hasPassword) if (!_hasPassword)
{ {
RedirectManager.RedirectTo("Account/Manage/SetPassword"); RedirectManager.RedirectTo("Account/Manage/SetPassword");
} }
Input ??= new InputModel();
} }
private async Task OnValidSubmitAsync() 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) if (!changePasswordResult.Succeeded)
{ {
message = $"Error: {string.Join(",", changePasswordResult.Errors.Select(error => error.Description))}";
return; return;
} }
await SignInManager.RefreshSignInAsync(user); await SignInManager.RefreshSignInAsync(_user);
Logger.LogInformation("User changed their password successfully."); Logger.LogInformation("User changed their password successfully.");
RedirectManager.RedirectToCurrentPageWithStatus("Your password has been changed", HttpContext); RedirectManager.RedirectToCurrentPageWithStatus("Your password has been changed", HttpContext);
@@ -47,13 +47,15 @@
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Input ??= new(); Input ??= new();
user = await UserAccessor.GetRequiredUserAsync(HttpContext); user = await UserAccessor.GetRequiredUserAsync(HttpContext);
requirePassword = await UserManager.HasPasswordAsync(user); requirePassword = await UserManager.HasPasswordAsync(user);
Input ??= new InputModel();
} }
private async Task OnValidSubmitAsync() private async Task OnValidSubmitAsync()
@@ -63,7 +63,7 @@
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm(FormName = "change-email")] [SupplyParameterFromForm(FormName = "change-email")]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@@ -72,6 +72,7 @@
isEmailConfirmed = await UserManager.IsEmailConfirmedAsync(user); isEmailConfirmed = await UserManager.IsEmailConfirmedAsync(user);
Input.NewEmail ??= email; Input.NewEmail ??= email;
Input ??= new InputModel();
} }
private async Task OnValidSubmitAsync() private async Task OnValidSubmitAsync()
@@ -79,7 +79,7 @@ else
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@@ -11,27 +11,14 @@
<PageTitle>Profile</PageTitle> <PageTitle>Profile</PageTitle>
<h3>Profile</h3> <MudText Typo="Typo.h6">Profile</MudText>
<StatusMessage /> <StatusMessage />
<div class="row"> <MudContainer Class="pa-0 ma-0">
<div class="col-xl-6"> <MudTextField Value="@username" Variant="Variant.Outlined" Label="Username"/>
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post"> </MudContainer>
<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>
@code { @code {
private ApplicationUser user = default!; private ApplicationUser user = default!;
@@ -42,7 +29,7 @@
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@@ -45,7 +45,7 @@
private HttpContext HttpContext { get; set; } = default!; private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@@ -59,7 +59,7 @@
private IEnumerable<IdentityError>? identityErrors; private IEnumerable<IdentityError>? identityErrors;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
private string? ReturnUrl { get; set; } private string? ReturnUrl { get; set; }
@@ -37,7 +37,7 @@
private string? message; private string? message;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
private async Task OnValidSubmitAsync() private async Task OnValidSubmitAsync()
{ {
@@ -46,7 +46,7 @@
private IEnumerable<IdentityError>? identityErrors; private IEnumerable<IdentityError>? identityErrors;
[SupplyParameterFromForm] [SupplyParameterFromForm]
private InputModel Input { get; set; } = new(); private InputModel Input { get; set; } = null!;
[SupplyParameterFromQuery] [SupplyParameterFromQuery]
private string? Code { get; set; } private string? Code { get; set; }
@@ -1,17 +1,18 @@
@inherits LayoutComponentBase @inherits LayoutComponentBase
@layout CouchLog.Components.Layout.MainLayout @layout CouchLog.Components.Layout.MainLayout
<h1>Manage your account</h1> <MudText Typo="Typo.h2">Manage your account</MudText>
<div> <MudContainer MaxWidth="MaxWidth.False" Class="pa-4">
<h2>Change your account settings</h2> <MudText Typo="Typo.h4">Change your account settings</MudText>
<hr/> <hr/>
<div class="row"> <MudGrid>
<div class="col-lg-3"> <MudItem xs="12" md="3" lg="2">
<ManageNavMenu/> <ManageNavMenu/>
</div> </MudItem>
<div class="col-lg-9">
<MudItem xs="12" md="9" lg="10">
@Body @Body
</div> </MudItem>
</div> </MudGrid>
</div> </MudContainer>
@@ -3,33 +3,41 @@
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
<ul class="nav nav-pills flex-column"> <MudNavMenu>
<li class="nav-item"> <MudNavLink Href="Account/Manage"
<NavLink class="nav-link" href="Account/Manage" Match="NavLinkMatch.All">Profile</NavLink> Icon="@Icons.Material.Filled.ManageAccounts">
</li> Manage
</MudNavLink>
<!-- <!--
<li class="nav-item"> <MudNavLink Href="Account/Manage/Email"
<NavLink class="nav-link" href="Account/Manage/Email">Email</NavLink> Icon="@Icons.Material.Filled.Email">
</li> Email
</MudNavLink>
--> -->
<li class="nav-item"> <MudNavLink Href="Account/ChangePassword"
<NavLink class="nav-link" href="Account/Manage/ChangePassword">Password</NavLink> Icon="@Icons.Material.Filled.Password">
</li> Password
</MudNavLink>
@if (hasExternalLogins) @if (hasExternalLogins)
{ {
<li class="nav-item"> <MudNavLink Href="Account/Manage/ExternalLogins"
<NavLink class="nav-link" href="Account/Manage/ExternalLogins">External logins</NavLink> Icon="@Icons.Material.Filled.Login">
</li> External logins
</MudNavLink>
} }
<!-- <!--
<li class="nav-item"> <MudNavLink Href="Account/Manage/TwoFactorAuthentication"
<NavLink class="nav-link" href="Account/Manage/TwoFactorAuthentication">Two-factor authentication</NavLink> Icon="@Icons.Material.Filled.FactCheck">
</li> Two-factor authentication
</MudNavLink>
--> -->
<li class="nav-item"> <!--
<NavLink class="nav-link" href="Account/Manage/PersonalData">Personal data</NavLink> <MudNavLink Href="Account/Manage/PersonalData"
</li> Icon="@Icons.Material.Filled.DataObject">
</ul> Personal data
</MudNavLink>
-->
</MudNavMenu>
@code { @code {
private bool hasExternalLogins; private bool hasExternalLogins;
@@ -17,11 +17,11 @@
Color="Color.Primary" /> Color="Color.Primary" />
</EditForm> </EditForm>
<MudText>Version: @_version</MudText> @*<MudText>Version: @_version</MudText>*@
@code { @code {
private AccountsSettings? _accountsSettings; private AccountsSettings _accountsSettings = null!;
private readonly string _version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion?.Split('+')[0]; //private readonly string _version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion?.Split('+')[0];
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@@ -1,11 +1,16 @@
@using CouchLog.Data @using CouchLog.Data
<MudCard> <MudCard>
<MudPaper Elevation="0"> <MudPaper Elevation="0" Style="position: relative;" @onmouseenter="@(() => _showEditOverlay = true)" @onmouseleave="@(() => _showEditOverlay = false)">
<MudCardMedia Image="@GlobalEntity.PicturePath" Height="400" Style="object-fit: contain;"/> <MudCardMedia Image="@($"{GlobalEntity.PicturePath}?v={DateTime.Now.Ticks}")" Height="400" Style="object-fit: contain;"/>
<MudOverlay Visible="@_showEditOverlay" DarkBackground="true" Absolute="true">
<MudIconButton Icon="@Icons.Material.Rounded.Edit" Color="Color.Primary" OnClick="@(()=> OnEdit.InvokeAsync(GlobalEntity))" />
</MudOverlay>
</MudPaper> </MudPaper>
<MudCardContent> <MudCardContent>
<MudText Typo="Typo.h5">@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> </MudCardContent>
<MudCardActions> <MudCardActions>
<MudTooltip Text="Add to shared List"> <MudTooltip Text="Add to shared List">
@@ -34,4 +39,7 @@
[Parameter] public EventCallback<GlobalEntity> OnAddToPrivate { get; set; } [Parameter] public EventCallback<GlobalEntity> OnAddToPrivate { get; set; }
[Parameter] public EventCallback<GlobalEntity> OnAddToShared { get; set; } [Parameter] public EventCallback<GlobalEntity> OnAddToShared { get; set; }
[Parameter] public EventCallback<GlobalEntity> OnEdit { get; set; }
private bool _showEditOverlay;
} }
@@ -1,10 +1,9 @@
@using CouchLog.Data @using CouchLog.Data
@using Microsoft.EntityFrameworkCore @using Microsoft.EntityFrameworkCore
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@inject ApplicationDbContext CouchLogDB @inject ApplicationDbContext CouchLogDb
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject AuthenticationStateProvider AuthenticationStateProvider @inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@@ -23,10 +22,10 @@
</TitleContent> </TitleContent>
<DialogContent> <DialogContent>
<EditForm EditContext="_editContext" OnSubmit="HandleSubmit"> <EditForm EditContext="_editContext" OnSubmit="HandleSubmit" id="New-Global-Entity-Form">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<MudStack Row="true" Spacing="3" AlignItems="AlignItems.Start" Style="min-height: 400px;"> <MudStack Row="true" Spacing="3" AlignItems="AlignItems.Start" Style="min-height: 400px;" Breakpoint="Breakpoint.SmAndDown">
<!--<editor-fold desc="Picture-Upload">--> <!--<editor-fold desc="Picture-Upload">-->
<MudPaper Class="pa-0" Elevation="0" Width="280px" MinWidth="280px"> <MudPaper Class="pa-0" Elevation="0" Width="280px" MinWidth="280px">
@if (!string.IsNullOrWhiteSpace(_imagePreview)) @if (!string.IsNullOrWhiteSpace(_imagePreview))
@@ -44,13 +43,12 @@
Accept="image/*" Accept="image/*"
InputClass="null" InputClass="null"
Class="mud-file-upload-dragarea"> Class="mud-file-upload-dragarea">
<SelectedTemplate Context="SelectedTemplateContext"/> <SelectedTemplate Context="selectedTemplateContext"/>
</MudFileUpload> </MudFileUpload>
} }
</MudPaper> </MudPaper>
<!--</editor-fold>--> <!--</editor-fold>-->
<MudPaper Class="flex-grow-1" Elevation="0" MinWidth="200px">
<MudPaper Class="flex-grow-1" Elevation="0">
<MudStack Spacing="3"> <MudStack Spacing="3">
<MudTextField @bind-Value="_form.Title" <MudTextField @bind-Value="_form.Title"
@@ -79,7 +77,15 @@
} }
</MudSelect> </MudSelect>
<MudCheckBox @bind-Value="_isPrivate" Label="Is Private" Color="Color.Primary" /> <MudCheckBox @bind-Value="_isPrivate" Label="Is Private" Color="Color.Primary" />
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Success" Disabled="_isSaving" Class="mt-3"> </MudStack>
</MudPaper>
</MudStack>
</EditForm>
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel" Variant="Variant.Filled" Color="Color.Error" Disabled="_isSaving" Class="mt-3">Cancel</MudButton>
<MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Success" Disabled="_isSaving" Class="mt-3" form="New-Global-Entity-Form">
@if (_isSaving) @if (_isSaving)
{ {
<MudProgressCircular Indeterminate="true" Size="Size.Small" Class="mr-2"/> <MudProgressCircular Indeterminate="true" Size="Size.Small" Class="mr-2"/>
@@ -90,14 +96,6 @@
<span>Create Global Entity</span> <span>Create Global Entity</span>
} }
</MudButton> </MudButton>
</MudStack>
</MudPaper>
</MudStack>
</EditForm>
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel" Variant="Variant.Text" Disabled="_isSaving">Cancel</MudButton>
</DialogActions> </DialogActions>
</MudDialog> </MudDialog>
@@ -120,6 +118,9 @@
//Picture //Picture
private IBrowserFile? _pictureFile; private IBrowserFile? _pictureFile;
private string _pictureBase64 = null!;
private string? _pictureContentType;
private string? _pictureExtension;
private class GlobalEntityFormModel private class GlobalEntityFormModel
{ {
@@ -142,8 +143,8 @@
return; return;
} }
_mediaTypes = await CouchLogDB.MediaType.OrderBy(t => t.Id).ToListAsync(); _mediaTypes = await CouchLogDb.MediaType.OrderBy(t => t.Id).ToListAsync();
_genres = await CouchLogDB.Genres.OrderBy(t => t.Id).ToListAsync(); _genres = await CouchLogDb.Genres.OrderBy(t => t.Id).ToListAsync();
if (_mediaTypes.Count > 0) if (_mediaTypes.Count > 0)
_selectedMediaTypeId = _mediaTypes.First().Id; _selectedMediaTypeId = _mediaTypes.First().Id;
@@ -165,8 +166,11 @@
using var ms = new MemoryStream(); using var ms = new MemoryStream();
await stream.CopyToAsync(ms); await stream.CopyToAsync(ms);
var base64 = Convert.ToBase64String(ms.ToArray()); _pictureContentType = _pictureFile.ContentType;
_imagePreview = $"data:{_pictureFile.ContentType};base64,{base64}"; _pictureExtension = Path.GetExtension(_pictureFile.Name);
_pictureBase64 = Convert.ToBase64String(ms.ToArray());
_imagePreview = $"data:{_pictureFile.ContentType};base64,{_pictureBase64}";
} }
private void Cancel() => MudDialog.Cancel(); private void Cancel() => MudDialog.Cancel();
@@ -191,13 +195,10 @@
try try
{ {
string fileName = $"{Guid.NewGuid()}{Path.GetExtension(_pictureFile.Name)}"; string fileName = $"{Guid.NewGuid()}{_pictureExtension}";
string picturePath = Path.Combine("wwwroot", "Pictures", fileName); string picturePath = Path.Combine("wwwroot", "Pictures", fileName);
await using (var fs = File.Create(picturePath)) await File.WriteAllBytesAsync(picturePath, Convert.FromBase64String(_pictureBase64));
{
await _pictureFile.OpenReadStream(maxAllowedSize: 10_000_000).CopyToAsync(fs);
}
var entity = new GlobalEntity var entity = new GlobalEntity
{ {
@@ -209,19 +210,19 @@
IsPrivate = _isPrivate IsPrivate = _isPrivate
}; };
CouchLogDB.Add(entity); CouchLogDb.Add(entity);
await CouchLogDB.SaveChangesAsync(); await CouchLogDb.SaveChangesAsync();
foreach (int genreId in _selectedGenreIds) foreach (int genreId in _selectedGenreIds)
{ {
CouchLogDB.Add(new LinkTableGlobalGenre CouchLogDb.Add(new LinkTableGlobalGenre
{ {
GenreId = genreId, GenreId = genreId,
GlobalEntityId = entity.Id GlobalEntityId = entity.Id
}); });
} }
await CouchLogDB.SaveChangesAsync(); await CouchLogDb.SaveChangesAsync();
Snackbar.Add("Global Entity created!", Severity.Success); Snackbar.Add("Global Entity created!", Severity.Success);
MudDialog.Close(DialogResult.Ok(entity)); MudDialog.Close(DialogResult.Ok(entity));
File diff suppressed because one or more lines are too long
@@ -78,11 +78,12 @@
<MudGrid Spacing="6" Justify="Justify.Center"> <MudGrid Spacing="6" Justify="Justify.Center">
@foreach (var globalEntity in VisibleGlobalEntities) @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" <GlobalEntityCard GlobalEntity="globalEntity"
UserPrivateEntityIds="_userPrivateEntityIds" UserPrivateEntityIds="_userPrivateEntityIds"
OnAddToPrivate="AddGlobalEntityToPrivateList" OnAddToPrivate="AddGlobalEntityToPrivateList"
OnAddToShared="AddGlobalEntityToSharedList"/> OnAddToShared="AddGlobalEntityToSharedList"
OnEdit="OpenEditGlobalEntityDialog"/>
</MudItem> </MudItem>
} }
</MudGrid> </MudGrid>
@@ -151,7 +152,7 @@
private async Task OnNewEntity(GlobalEntity entity) private async Task OnNewEntity(GlobalEntity entity)
{ {
_globalEntities.Add(entity); _globalEntities.Insert(0, entity);
await RefreshPage(); await RefreshPage();
} }
@@ -166,6 +167,44 @@
} }
} }
private async Task OpenEditGlobalEntityDialog(GlobalEntity globalEntity)
{
var parameters = new DialogParameters<EditGlobalEntityDialog>
{
{ x => x.GlobalEntity, globalEntity },
{ x => x.AppUser, _appUser}
};
var dialog = await DialogService.ShowAsync<EditGlobalEntityDialog>("Edit Global Entity", parameters);
var result = await dialog.Result;
if (!result!.Canceled && result.Data is ValueTuple<GlobalEntity, bool> data)
{
if (data.Item2)
{
CouchLogDb.GlobalEntities.Remove(data.Item1);
await CouchLogDb.SaveChangesAsync();
_globalEntities.RemoveAll(x => x.Id == data.Item1.Id);
if (_currentPage > TotalPages)
_currentPage = Math.Max(1, TotalPages);
StateHasChanged();
}
if (!data.Item2)
{
int index = _globalEntities.FindIndex(x => x.Id == data.Item1.Id);
if (index >= 0)
{
_globalEntities[index] = data.Item1;
}
StateHasChanged();
}
}
}
public async Task AddGlobalEntityToPrivateList(GlobalEntity globalEntity) public async Task AddGlobalEntityToPrivateList(GlobalEntity globalEntity)
{ {
if(_appUser is null) { Snackbar.Add("Not logged in!", Severity.Error); return;} if(_appUser is null) { Snackbar.Add("Not logged in!", Severity.Error); return;}
@@ -6,7 +6,7 @@
<!--<editor-fold desc="Poster-Image">--> <!--<editor-fold desc="Poster-Image">-->
<MudItem xs="4"> <MudItem xs="4">
<MudImage <MudImage
Src="@PrivateEntity.GlobalEntity.PicturePath" Src="@($"{PrivateEntity.GlobalEntity.PicturePath}?v={DateTime.Now.Ticks}")"
Alt="" Alt=""
ObjectFit="ObjectFit.Cover" ObjectFit="ObjectFit.Cover"
Style="width: 100%; height: 100%; min-height: 180px; border-radius: 4px 0 0 4px;" /> Style="width: 100%; height: 100%; min-height: 180px; border-radius: 4px 0 0 4px;" />
@@ -17,7 +17,9 @@
<MudStack Class="pa-3" Spacing="2"> <MudStack Class="pa-3" Spacing="2">
<!--<editor-fold desc="Options">--> <!--<editor-fold desc="Options">-->
<MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween"> <MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween">
<MudText Typo="Typo.h6">@PrivateEntity.GlobalEntity.Title</MudText> <MudTooltip Text="@PrivateEntity.GlobalEntity.Title">
<MudText Typo="Typo.h6" Style="display: block; max-width: 250px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">@PrivateEntity.GlobalEntity.Title</MudText>
</MudTooltip>
<MudMenu Icon="@Icons.Material.Filled.MoreVert" Color="Color.Default" Dense="true"> <MudMenu Icon="@Icons.Material.Filled.MoreVert" Color="Color.Default" Dense="true">
<MudMenuItem>Edit</MudMenuItem> <MudMenuItem>Edit</MudMenuItem>
<MudMenuItem OnClick="@(() => OnRemove.InvokeAsync())">Remove</MudMenuItem> <MudMenuItem OnClick="@(() => OnRemove.InvokeAsync())">Remove</MudMenuItem>
@@ -40,6 +42,8 @@
</MudSelect> </MudSelect>
<!--</editor-fold>--> <!--</editor-fold>-->
<!-- @if (PrivateEntity.GlobalEntity.MediaType.Name == "Series" || PrivateEntity.GlobalEntity.MediaType.Name == "Anime") -->
<!--{-->
<!--<editor-fold desc="Dropdown-Season">--> <!--<editor-fold desc="Dropdown-Season">-->
<MudSelect <MudSelect
T="int?" T="int?"
@@ -47,7 +51,8 @@
ValueChanged="@(newSeason => OnSeasonChange.InvokeAsync(newSeason))" ValueChanged="@(newSeason => OnSeasonChange.InvokeAsync(newSeason))"
Dense="true" Dense="true"
Variant="Variant.Outlined" Variant="Variant.Outlined"
Label=""> Label=""
Class="@(PrivateEntity.GlobalEntity.MediaType.Name == "Series" ? "" : "invisible")">
@{ @{
int? currentSeason = PrivateEntity.Season ?? 1; int? currentSeason = PrivateEntity.Season ?? 1;
int? startOffsetSeason = currentSeason > 1 ? -1 : 0; int? startOffsetSeason = currentSeason > 1 ? -1 : 0;
@@ -67,7 +72,8 @@
ValueChanged="@(newEpisode => OnEpisodeChange.InvokeAsync(newEpisode))" ValueChanged="@(newEpisode => OnEpisodeChange.InvokeAsync(newEpisode))"
Dense="true" Dense="true"
Variant="Variant.Outlined" Variant="Variant.Outlined"
Label=""> Label=""
Class="@(PrivateEntity.GlobalEntity.MediaType.Name == "Series" ? "" : "invisible")">
@{ @{
int? currentEpisode = PrivateEntity.Episode ?? 1; int? currentEpisode = PrivateEntity.Episode ?? 1;
int? startOffsetEpisode = currentEpisode > 1 ? -1 : 0; int? startOffsetEpisode = currentEpisode > 1 ? -1 : 0;
@@ -79,6 +85,7 @@
} }
</MudSelect> </MudSelect>
<!--</editor-fold>--> <!--</editor-fold>-->
<!--}-->
<!--<editor-fold desc="Details Button">--> <!--<editor-fold desc="Details Button">-->
<MudStack Row="true" Justify="Justify.FlexEnd"> <MudStack Row="true" Justify="Justify.FlexEnd">
@@ -132,7 +132,7 @@
//Filter //Filter
private string? _searchString; private string? _searchString;
private bool _showFilters; private bool _showFilters;
private bool _showAlreadyAddedEntities = false; //private bool _showAlreadyAddedEntities = false;
private IEnumerable<PrivateEntity> FiltertGlobalEntities => _privateEntities.Where(entity => private IEnumerable<PrivateEntity> FiltertGlobalEntities => _privateEntities.Where(entity =>
(string.IsNullOrWhiteSpace(_searchString) || entity.GlobalEntity.Title.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) //Search bar (string.IsNullOrWhiteSpace(_searchString) || entity.GlobalEntity.Title.Contains(_searchString, StringComparison.OrdinalIgnoreCase)) //Search bar
); );
+13 -14
View File
@@ -9,6 +9,8 @@
<PackAsTool>True</PackAsTool> <PackAsTool>True</PackAsTool>
<Version>0.1.0-nightly.10</Version> <Version>0.1.0-nightly.10</Version>
<Authors>Penry</Authors> <Authors>Penry</Authors>
<IsPackable>false</IsPackable>
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -60,26 +62,23 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.QuickGrid" Version="10.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Components.QuickGrid" Version="10.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="10.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="10.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.9" />
<PackageReference Include="Microsoft.Build" Version="18.0.2" /> <PackageReference Include="Microsoft.Build" Version="18.7.1" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Features" Version="5.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.9" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="5.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.9">
<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">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.9">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="MudBlazor" Version="9.5.0" /> <PackageReference Include="MudBlazor" Version="9.6.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -4,8 +4,7 @@ using System.Diagnostics.CodeAnalysis;
namespace CouchLog.Data namespace CouchLog.Data
{ {
[method: SetsRequiredMembers] public class GlobalEntity
public class GlobalEntity()
{ {
[Key] [Key]
public int Id { get; set; } public int Id { get; set; }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 KiB

+2
View File
@@ -6,3 +6,5 @@
There are two options: There are two options:
- latest: Is the latest release Version - latest: Is the latest release Version
- nightly: Is the latest commit on the main branch - nightly: Is the latest commit on the main branch
Test-Commit