Compare commits
20 Commits
v0.1.0-beta
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c5e24cd4c3 | |||
| 5fcc42a99f | |||
| 9204fed54c | |||
| 406d0f5652 | |||
| 9cd651bdfe | |||
| 96336fd637 | |||
| e7d1b4b524 | |||
| a4d7269f8f | |||
| c7d741d15b | |||
| 6d2a6c5925 | |||
| 9ccb929553 | |||
| 5e086c0598 | |||
| a7c86289b3 | |||
| b2e851d765 | |||
| 1a1d7dec7c | |||
| 103da6abe8 | |||
| 5f2fdbac87 | |||
| e0ceb7d314 | |||
| 8df80eba3b | |||
| 77875110f0 |
@@ -24,13 +24,6 @@ jobs:
|
||||
echo "VERSION=$VERSION" >> $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
|
||||
uses: actions/setup-dotnet@v3
|
||||
with:
|
||||
@@ -42,8 +35,16 @@ jobs:
|
||||
-t gitea.penry.de/${{ env.REPO_LC }}:${{ env.VERSION }} \
|
||||
-t gitea.penry.de/${{ env.REPO_LC }}:latest \
|
||||
--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
|
||||
run: |
|
||||
docker push gitea.penry.de/${{ env.REPO_LC }}:${{ env.VERSION }}
|
||||
|
||||
@@ -14,6 +14,8 @@ jobs:
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
@@ -28,62 +30,35 @@ jobs:
|
||||
- name: Build version
|
||||
shell: bash
|
||||
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
|
||||
if [[ -z "${LAST_TAG:-}" ]]; then
|
||||
echo "No tag found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LAST_TAG=$(git for-each-ref \
|
||||
--sort=-creatordate \
|
||||
--format='%(refname:strip=2)' \
|
||||
refs/tags/v* \
|
||||
| head -n 1)
|
||||
COMMIT_COUNT=$(git rev-list $LAST_TAG..HEAD --count)
|
||||
|
||||
if [[ -z "${LAST_TAG:-}" ]]; then
|
||||
echo "No tag found"
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$LAST_TAG" == *-* ]]; then
|
||||
TEMP_LAST_TAG="${LAST_TAG%-*}"
|
||||
VERSION="${TEMP_LAST_TAG}-nightly.${COMMIT_COUNT}"
|
||||
else
|
||||
VERSION="${LAST_TAG}-nightly.${COMMIT_COUNT}"
|
||||
fi
|
||||
|
||||
LAST_COMMIT=$(git rev-list -n 1 "$LAST_TAG")
|
||||
DISTANCE=$(git rev-list --count --first-parent "${LAST_COMMIT}..origin/main")
|
||||
echo "LAST_TAG=$LAST_TAG" >> "$GITHUB_ENV"
|
||||
echo "COMMIT_COUNT=$COMMIT_COUNT" >> "$GITHUB_ENV"
|
||||
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
|
||||
|
||||
BASE_VERSION="${LAST_TAG#v}"
|
||||
|
||||
if [[ "$BASE_VERSION" == *-* ]]; then
|
||||
VERSION="${BASE_VERSION}.${DISTANCE}"
|
||||
else
|
||||
VERSION="${BASE_VERSION}-nightly.${DISTANCE}"
|
||||
fi
|
||||
|
||||
echo "LAST_TAG=$LAST_TAG" >> "$GITHUB_ENV"
|
||||
echo "LAST_COMMIT=$LAST_COMMIT" >> "$GITHUB_ENV"
|
||||
echo "DISTANCE=$DISTANCE" >> "$GITHUB_ENV"
|
||||
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
|
||||
|
||||
echo "Last tag: $LAST_TAG"
|
||||
echo "Last tag commit: $LAST_COMMIT"
|
||||
echo "Distance to origin/main: $DISTANCE"
|
||||
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"
|
||||
echo "Last tag: $LAST_TAG"
|
||||
echo "Commit count: $COMMIT_COUNT"
|
||||
echo "Final version: $VERSION"
|
||||
|
||||
- name: Build Linux ARM64 Docker Image
|
||||
run: |
|
||||
docker build \
|
||||
-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
|
||||
|
||||
@@ -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>
|
||||
<MudNavMenu>
|
||||
<MudNavLink Href="Account/Manage"
|
||||
Icon="@Icons.Material.Filled.ManageAccounts">
|
||||
Manage
|
||||
</MudNavLink>
|
||||
<!--
|
||||
<li class="nav-item">
|
||||
<NavLink class="nav-link" href="Account/Manage/Email">Email</NavLink>
|
||||
</li>
|
||||
<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,16 @@
|
||||
@using CouchLog.Data
|
||||
|
||||
<MudCard>
|
||||
<MudPaper Elevation="0">
|
||||
<MudCardMedia Image="@GlobalEntity.PicturePath" Height="400" Style="object-fit: contain;"/>
|
||||
<MudPaper Elevation="0" Style="position: relative;" @onmouseenter="@(() => _showEditOverlay = true)" @onmouseleave="@(() => _showEditOverlay = false)">
|
||||
<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>
|
||||
<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>
|
||||
<MudCardActions>
|
||||
<MudTooltip Text="Add to shared List">
|
||||
@@ -34,4 +39,7 @@
|
||||
|
||||
[Parameter] public EventCallback<GlobalEntity> OnAddToPrivate { 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 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
|
||||
@@ -23,10 +22,10 @@
|
||||
</TitleContent>
|
||||
|
||||
<DialogContent>
|
||||
<EditForm EditContext="_editContext" OnSubmit="HandleSubmit">
|
||||
<EditForm EditContext="_editContext" OnSubmit="HandleSubmit" id="New-Global-Entity-Form">
|
||||
<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">-->
|
||||
<MudPaper Class="pa-0" Elevation="0" Width="280px" MinWidth="280px">
|
||||
@if (!string.IsNullOrWhiteSpace(_imagePreview))
|
||||
@@ -44,13 +43,12 @@
|
||||
Accept="image/*"
|
||||
InputClass="null"
|
||||
Class="mud-file-upload-dragarea">
|
||||
<SelectedTemplate Context="SelectedTemplateContext"/>
|
||||
<SelectedTemplate Context="selectedTemplateContext"/>
|
||||
</MudFileUpload>
|
||||
}
|
||||
</MudPaper>
|
||||
<!--</editor-fold>-->
|
||||
|
||||
<MudPaper Class="flex-grow-1" Elevation="0">
|
||||
<MudPaper Class="flex-grow-1" Elevation="0" MinWidth="200px">
|
||||
<MudStack Spacing="3">
|
||||
|
||||
<MudTextField @bind-Value="_form.Title"
|
||||
@@ -79,17 +77,6 @@
|
||||
}
|
||||
</MudSelect>
|
||||
<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">
|
||||
@if (_isSaving)
|
||||
{
|
||||
<MudProgressCircular Indeterminate="true" Size="Size.Small" Class="mr-2" />
|
||||
<span>Saving...</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>Create Global Entity</span>
|
||||
}
|
||||
</MudButton>
|
||||
</MudStack>
|
||||
</MudPaper>
|
||||
</MudStack>
|
||||
@@ -97,7 +84,18 @@
|
||||
</DialogContent>
|
||||
|
||||
<DialogActions>
|
||||
<MudButton OnClick="Cancel" Variant="Variant.Text" Disabled="_isSaving">Cancel</MudButton>
|
||||
<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)
|
||||
{
|
||||
<MudProgressCircular Indeterminate="true" Size="Size.Small" Class="mr-2"/>
|
||||
<span>Saving...</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>Create Global Entity</span>
|
||||
}
|
||||
</MudButton>
|
||||
</DialogActions>
|
||||
</MudDialog>
|
||||
|
||||
@@ -120,6 +118,9 @@
|
||||
|
||||
//Picture
|
||||
private IBrowserFile? _pictureFile;
|
||||
private string _pictureBase64 = null!;
|
||||
private string? _pictureContentType;
|
||||
private string? _pictureExtension;
|
||||
|
||||
private class GlobalEntityFormModel
|
||||
{
|
||||
@@ -142,8 +143,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;
|
||||
@@ -165,8 +166,11 @@
|
||||
using var ms = new MemoryStream();
|
||||
await stream.CopyToAsync(ms);
|
||||
|
||||
var base64 = Convert.ToBase64String(ms.ToArray());
|
||||
_imagePreview = $"data:{_pictureFile.ContentType};base64,{base64}";
|
||||
_pictureContentType = _pictureFile.ContentType;
|
||||
_pictureExtension = Path.GetExtension(_pictureFile.Name);
|
||||
|
||||
_pictureBase64 = Convert.ToBase64String(ms.ToArray());
|
||||
_imagePreview = $"data:{_pictureFile.ContentType};base64,{_pictureBase64}";
|
||||
}
|
||||
|
||||
private void Cancel() => MudDialog.Cancel();
|
||||
@@ -191,13 +195,10 @@
|
||||
|
||||
try
|
||||
{
|
||||
string fileName = $"{Guid.NewGuid()}{Path.GetExtension(_pictureFile.Name)}";
|
||||
string fileName = $"{Guid.NewGuid()}{_pictureExtension}";
|
||||
string picturePath = Path.Combine("wwwroot", "Pictures", fileName);
|
||||
|
||||
await using (var fs = File.Create(picturePath))
|
||||
{
|
||||
await _pictureFile.OpenReadStream(maxAllowedSize: 10_000_000).CopyToAsync(fs);
|
||||
}
|
||||
await File.WriteAllBytesAsync(picturePath, Convert.FromBase64String(_pictureBase64));
|
||||
|
||||
var entity = new GlobalEntity
|
||||
{
|
||||
@@ -209,19 +210,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));
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -78,11 +78,12 @@
|
||||
<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"
|
||||
OnAddToShared="AddGlobalEntityToSharedList"/>
|
||||
OnAddToShared="AddGlobalEntityToSharedList"
|
||||
OnEdit="OpenEditGlobalEntityDialog"/>
|
||||
</MudItem>
|
||||
}
|
||||
</MudGrid>
|
||||
@@ -151,7 +152,7 @@
|
||||
|
||||
private async Task OnNewEntity(GlobalEntity entity)
|
||||
{
|
||||
_globalEntities.Add(entity);
|
||||
_globalEntities.Insert(0, entity);
|
||||
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)
|
||||
{
|
||||
if(_appUser is null) { Snackbar.Add("Not logged in!", Severity.Error); return;}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!--<editor-fold desc="Poster-Image">-->
|
||||
<MudItem xs="4">
|
||||
<MudImage
|
||||
Src="@PrivateEntity.GlobalEntity.PicturePath"
|
||||
Src="@($"{PrivateEntity.GlobalEntity.PicturePath}?v={DateTime.Now.Ticks}")"
|
||||
Alt=""
|
||||
ObjectFit="ObjectFit.Cover"
|
||||
Style="width: 100%; height: 100%; min-height: 180px; border-radius: 4px 0 0 4px;" />
|
||||
@@ -17,7 +17,9 @@
|
||||
<MudStack Class="pa-3" Spacing="2">
|
||||
<!--<editor-fold desc="Options">-->
|
||||
<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">
|
||||
<MudMenuItem>Edit</MudMenuItem>
|
||||
<MudMenuItem OnClick="@(() => OnRemove.InvokeAsync())">Remove</MudMenuItem>
|
||||
@@ -40,45 +42,50 @@
|
||||
</MudSelect>
|
||||
<!--</editor-fold>-->
|
||||
|
||||
<!--<editor-fold desc="Dropdown-Season">-->
|
||||
<MudSelect
|
||||
T="int?"
|
||||
Value="PrivateEntity.Season"
|
||||
ValueChanged="@(newSeason => OnSeasonChange.InvokeAsync(newSeason))"
|
||||
Dense="true"
|
||||
Variant="Variant.Outlined"
|
||||
Label="">
|
||||
@{
|
||||
int? currentSeason = PrivateEntity.Season ?? 1;
|
||||
int? startOffsetSeason = currentSeason > 1 ? -1 : 0;
|
||||
}
|
||||
@for (int? i = startOffsetSeason; i <= 5; i++)
|
||||
{
|
||||
int? season = currentSeason + i;
|
||||
<MudSelectItem Value="@season">Staffel @season</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<!--</editor-fold>-->
|
||||
<!-- @if (PrivateEntity.GlobalEntity.MediaType.Name == "Series" || PrivateEntity.GlobalEntity.MediaType.Name == "Anime") -->
|
||||
<!--{-->
|
||||
<!--<editor-fold desc="Dropdown-Season">-->
|
||||
<MudSelect
|
||||
T="int?"
|
||||
Value="PrivateEntity.Season"
|
||||
ValueChanged="@(newSeason => OnSeasonChange.InvokeAsync(newSeason))"
|
||||
Dense="true"
|
||||
Variant="Variant.Outlined"
|
||||
Label=""
|
||||
Class="@(PrivateEntity.GlobalEntity.MediaType.Name == "Series" ? "" : "invisible")">
|
||||
@{
|
||||
int? currentSeason = PrivateEntity.Season ?? 1;
|
||||
int? startOffsetSeason = currentSeason > 1 ? -1 : 0;
|
||||
}
|
||||
@for (int? i = startOffsetSeason; i <= 5; i++)
|
||||
{
|
||||
int? season = currentSeason + i;
|
||||
<MudSelectItem Value="@season">Staffel @season</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<!--</editor-fold>-->
|
||||
|
||||
<!--<editor-fold desc="Dropdown-Episode">-->
|
||||
<MudSelect
|
||||
T="int?"
|
||||
Value="PrivateEntity.Episode"
|
||||
ValueChanged="@(newEpisode => OnEpisodeChange.InvokeAsync(newEpisode))"
|
||||
Dense="true"
|
||||
Variant="Variant.Outlined"
|
||||
Label="">
|
||||
@{
|
||||
int? currentEpisode = PrivateEntity.Episode ?? 1;
|
||||
int? startOffsetEpisode = currentEpisode > 1 ? -1 : 0;
|
||||
}
|
||||
@for (int? i = startOffsetEpisode; i <= 5; i++)
|
||||
{
|
||||
int? episode = currentEpisode + i;
|
||||
<MudSelectItem Value="@episode">Episode @episode</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<!--</editor-fold>-->
|
||||
<!--<editor-fold desc="Dropdown-Episode">-->
|
||||
<MudSelect
|
||||
T="int?"
|
||||
Value="PrivateEntity.Episode"
|
||||
ValueChanged="@(newEpisode => OnEpisodeChange.InvokeAsync(newEpisode))"
|
||||
Dense="true"
|
||||
Variant="Variant.Outlined"
|
||||
Label=""
|
||||
Class="@(PrivateEntity.GlobalEntity.MediaType.Name == "Series" ? "" : "invisible")">
|
||||
@{
|
||||
int? currentEpisode = PrivateEntity.Episode ?? 1;
|
||||
int? startOffsetEpisode = currentEpisode > 1 ? -1 : 0;
|
||||
}
|
||||
@for (int? i = startOffsetEpisode; i <= 5; i++)
|
||||
{
|
||||
int? episode = currentEpisode + i;
|
||||
<MudSelectItem Value="@episode">Episode @episode</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<!--</editor-fold>-->
|
||||
<!--}-->
|
||||
|
||||
<!--<editor-fold desc="Details Button">-->
|
||||
<MudStack Row="true" Justify="Justify.FlexEnd">
|
||||
|
||||
@@ -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
@@ -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; }
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 410 KiB |
Reference in New Issue
Block a user