Got most of admin panel working. Data issues fixed

This commit is contained in:
Vincent Allen
2025-09-02 09:27:23 -04:00
parent dd3968f6ef
commit ff34eb87b9
401 changed files with 10478 additions and 10675 deletions

View File

@@ -1,14 +1,14 @@
using System.Security.Claims;
using System.Text.Json;
using OpenArchival.Blazor.Components.Account.Pages.Manage;
using OpenArchival.Blazor.Components.Account.Pages;
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives; using Microsoft.Extensions.Primitives;
using OpenArchival.Blazor.Components.Account.Pages;
using OpenArchival.Blazor.Components.Account.Pages.Manage;
using OpenArchival.Blazor.Data;
using System.Security.Claims;
using System.Text.Json;
namespace Microsoft.AspNetCore.Routing namespace Microsoft.AspNetCore.Routing
{ {

View File

@@ -1,8 +1,8 @@
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Identity.UI.Services;
using OpenArchival.Blazor.Data;
namespace OpenArchival.Blazor.Components.Account namespace MyAppName.WebApp.Components.Account
{ {
// Remove the "else if (EmailSender is IdentityNoOpEmailSender)" block from RegisterConfirmation.razor after updating with a real implementation. // Remove the "else if (EmailSender is IdentityNoOpEmailSender)" block from RegisterConfirmation.razor after updating with a real implementation.
internal sealed class IdentityNoOpEmailSender : IEmailSender<ApplicationUser> internal sealed class IdentityNoOpEmailSender : IEmailSender<ApplicationUser>

View File

@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Components;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components;
namespace OpenArchival.Blazor.Components.Account namespace MyAppName.WebApp.Components.Account
{ {
internal sealed class IdentityRedirectManager(NavigationManager navigationManager) internal sealed class IdentityRedirectManager(NavigationManager navigationManager)
{ {

View File

@@ -1,11 +1,11 @@
using System.Security.Claims;
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Server; using Microsoft.AspNetCore.Components.Server;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using OpenArchival.Blazor.Data;
using System.Security.Claims;
namespace OpenArchival.Blazor.Components.Account namespace MyAppName.WebApp.Components.Account
{ {
// This is a server-side AuthenticationStateProvider that revalidates the security stamp for the connected user // This is a server-side AuthenticationStateProvider that revalidates the security stamp for the connected user
// every 30 minutes an interactive circuit is connected. // every 30 minutes an interactive circuit is connected.

View File

@@ -1,7 +1,7 @@
using OpenArchival.DataAccess;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using OpenArchival.Blazor.Data;
namespace OpenArchival.Blazor.Components.Account namespace MyAppName.WebApp.Components.Account
{ {
internal sealed class IdentityUserAccessor(UserManager<ApplicationUser> userManager, IdentityRedirectManager redirectManager) internal sealed class IdentityUserAccessor(UserManager<ApplicationUser> userManager, IdentityRedirectManager redirectManager)
{ {

View File

@@ -2,4 +2,7 @@
<PageTitle>Access denied</PageTitle> <PageTitle>Access denied</PageTitle>
<MudAlert Severity="Severity.Error">You do not have access to this resource.</MudAlert> <header>
<h1 class="text-danger">Access denied</h1>
<p class="text-danger">You do not have access to this resource.</p>
</header>

View File

@@ -3,7 +3,8 @@
@using System.Text @using System.Text
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IdentityRedirectManager RedirectManager @inject IdentityRedirectManager RedirectManager

View File

@@ -3,7 +3,8 @@
@using System.Text @using System.Text
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager

View File

@@ -6,7 +6,9 @@
@using System.Text.Encodings.Web @using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@using OpenArchival.Blazor.Components.Account.Pages;
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@@ -21,7 +23,7 @@
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<h1>Register</h1> <h1>Register</h1>
<h2>Associate your @ProviderDisplayName account.</h2> <h2>Associate your @ProviderDisplayName account.</h2>
<MudDivider /> <hr />
<div class="alert alert-info"> <div class="alert alert-info">
You've successfully authenticated with <strong>@ProviderDisplayName</strong>. You've successfully authenticated with <strong>@ProviderDisplayName</strong>.
@@ -105,8 +107,8 @@
// Sign in the user with this external login provider if the user already has a login. // Sign in the user with this external login provider if the user already has a login.
var result = await SignInManager.ExternalLoginSignInAsync( var result = await SignInManager.ExternalLoginSignInAsync(
externalLoginInfo!.LoginProvider, externalLoginInfo.LoginProvider,
externalLoginInfo!.ProviderKey, externalLoginInfo.ProviderKey,
isPersistent: false, isPersistent: false,
bypassTwoFactor: true); bypassTwoFactor: true);
@@ -174,7 +176,7 @@
message = $"Error: {string.Join(",", result.Errors.Select(error => error.Description))}"; message = $"Error: {string.Join(",", result.Errors.Select(error => error.Description))}";
} }
private static ApplicationUser CreateUser() private ApplicationUser CreateUser()
{ {
try try
{ {

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web @using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender @inject IEmailSender<ApplicationUser> EmailSender
@@ -14,24 +15,24 @@
<PageTitle>Forgot your password?</PageTitle> <PageTitle>Forgot your password?</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Forgot your password?</MudText> <h1>Forgot your password?</h1>
<MudText Typo="Typo.body1" GutterBottom="true">Enter your email.</MudText> <h2>Enter your email.</h2>
<hr />
<EditForm Model="Input" FormName="forgot-password" OnValidSubmit="OnValidSubmitAsync" method="post"> <div class="row">
<div class="col-md-4">
<EditForm Model="Input" FormName="forgot-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<MudGrid> <InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<MudItem md="12"> <label for="Input.Email" class="form-label">Email</label>
<MudTextField @bind-Value="Input.Email" For="@(() => Input.Email)" <ValidationMessage For="() => Input.Email" class="text-danger" />
Label="Email" Placeholder="name@example.com" </div>
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" /> <button type="submit" class="w-100 btn btn-lg btn-primary">Reset password</button>
</MudItem> </EditForm>
<MudItem md="12"> </div>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Reset password</MudButton> </div>
</MudItem>
</MudGrid>
</EditForm>
@code { @code {
[SupplyParameterFromForm] [SupplyParameterFromForm]

View File

@@ -2,6 +2,7 @@
<PageTitle>Forgot password confirmation</PageTitle> <PageTitle>Forgot password confirmation</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Forgot password confirmation</MudText> <h1>Forgot password confirmation</h1>
<p role="alert">
<MudText Typo="Typo.body1" GutterBottom="true">Please check your email to reset your password.</MudText> Please check your email to reset your password.
</p>

View File

@@ -3,7 +3,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Authentication @using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject ILogger<Login> Logger @inject ILogger<Login> Logger
@@ -12,50 +13,57 @@
<PageTitle>Log in</PageTitle> <PageTitle>Log in</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Log in</MudText> <h1>Log in</h1>
<div class="row">
<MudGrid> <div class="col-lg-6">
<MudItem md="6"> <section>
<StatusMessage Message="@errorMessage" /> <StatusMessage Message="@errorMessage" />
<EditForm Model="Input" method="post" OnValidSubmit="LoginUser" FormName="login"> <EditForm Model="Input" method="post" OnValidSubmit="LoginUser" FormName="login">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<h2>Use a local account to log in.</h2>
<MudText GutterBottom="true" Typo="Typo.body1">Use a local account to log in.</MudText> <hr />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid> <div class="form-floating mb-3">
<MudItem md="12"> <InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<MudTextField For="@(() => Input.Email)" @bind-Value="Input.Email" <label for="Input.Email" class="form-label">Email</label>
Label="Email" Placeholder="name@example.com" <ValidationMessage For="() => Input.Email" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <div class="form-floating mb-3">
<MudItem md="12"> <InputText type="password" @bind-Value="Input.Password" id="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="password" />
<MudTextField For="@(() => Input.Password)" @bind-Value="Input.Password" <label for="Input.Password" class="form-label">Password</label>
Label="Password" InputType="InputType.Password" Placeholder="password" <ValidationMessage For="() => Input.Password" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "current-password" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <div class="checkbox mb-3">
<MudItem md="12"> <label class="form-label">
<MudCheckBox For="@(() => Input.RememberMe)" @bind-Value="Input.RememberMe">Remember me</MudCheckBox> <InputCheckbox @bind-Value="Input.RememberMe" class="darker-border-checkbox form-check-input" />
</MudItem> Remember me
<MudItem md="12"> </label>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Log in</MudButton> </div>
</MudItem> <div>
</MudGrid> <button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>
</div>
<div>
<p>
<a href="Account/ForgotPassword">Forgot your password?</a>
</p>
<p>
<a href="@(NavigationManager.GetUriWithQueryParameters("Account/Register", new Dictionary<string, object?> { ["ReturnUrl"] = ReturnUrl }))">Register as a new user</a>
</p>
<p>
<a href="Account/ResendEmailConfirmation">Resend email confirmation</a>
</p>
</div>
</EditForm> </EditForm>
</section>
<MudGrid Class="mt-4"> </div>
<MudItem md="12"> <div class="col-lg-4 col-lg-offset-2">
<MudLink Href="Account/ForgotPassword">Forgot your password?</MudLink><br /> <section>
<MudLink Href="@(NavigationManager.GetUriWithQueryParameters("Account/Register", new Dictionary<string, object?> { ["ReturnUrl"] = ReturnUrl }))">Register as a new user</MudLink><br /> <h3>Use another service to log in.</h3>
<MudLink Href="Account/ResendEmailConfirmation">Resend email confirmation</MudLink> <hr />
</MudItem>
</MudGrid>
</MudItem>
<MudItem md="6">
<MudText GutterBottom="true" Typo="Typo.body1">Use another service to log in.</MudText>
<ExternalLoginPicker /> <ExternalLoginPicker />
</MudItem> </section>
</MudGrid> </div>
</div>
@code { @code {
private string? errorMessage; private string? errorMessage;

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@@ -12,7 +13,7 @@
<PageTitle>Two-factor authentication</PageTitle> <PageTitle>Two-factor authentication</PageTitle>
<h1>Two-factor authentication</h1> <h1>Two-factor authentication</h1>
<MudDivider /> <hr />
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<p>Your login is protected with an authenticator app. Enter your authenticator code below.</p> <p>Your login is protected with an authenticator app. Enter your authenticator code below.</p>
<div class="row"> <div class="row">
@@ -41,7 +42,7 @@
</div> </div>
<p> <p>
Don't have access to your authenticator device? You can Don't have access to your authenticator device? You can
<a class="mud-link mud-primary-text mud-link-underline-hover" href="Account/LoginWithRecoveryCode?ReturnUrl=@ReturnUrl">log in with a recovery code</a>. <a href="Account/LoginWithRecoveryCode?ReturnUrl=@ReturnUrl">log in with a recovery code</a>.
</p> </p>
@code { @code {

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@@ -12,7 +13,7 @@
<PageTitle>Recovery code verification</PageTitle> <PageTitle>Recovery code verification</PageTitle>
<h1>Recovery code verification</h1> <h1>Recovery code verification</h1>
<MudDivider /> <hr />
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<p> <p>
You have requested to log in with a recovery code. This login will not be remembered until you provide You have requested to log in with a recovery code. This login will not be remembered until you provide
@@ -24,8 +25,8 @@
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" /> <ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<InputText @bind-Value="Input.RecoveryCode" class="form-control" autocomplete="off" placeholder="RecoveryCode" /> <InputText @bind-Value="Input.RecoveryCode" id="Input.RecoveryCode" class="form-control" autocomplete="off" placeholder="RecoveryCode" />
<label for="recovery-code" class="form-label">Recovery Code</label> <label for="Input.RecoveryCode" class="form-label">Recovery Code</label>
<ValidationMessage For="() => Input.RecoveryCode" class="text-danger" /> <ValidationMessage For="() => Input.RecoveryCode" class="text-danger" />
</div> </div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button> <button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@@ -12,34 +13,32 @@
<PageTitle>Change password</PageTitle> <PageTitle>Change password</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Change password</MudText> <h3>Change password</h3>
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<div class="row">
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post"> <div class="col-xl-6">
<EditForm Model="Input" FormName="change-password" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid> <div class="form-floating mb-3">
<MudItem md="12"> <InputText type="password" @bind-Value="Input.OldPassword" id="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Enter the old password" />
<MudTextField For="@(() => Input.OldPassword)" @bind-Value="Input.OldPassword" InputType="InputType.Password" <label for="Input.OldPassword" class="form-label">Old password</label>
Label="Old Password" Placeholder="old password" HelperText="Please enter your old password." <ValidationMessage For="() => Input.OldPassword" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "current-password" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <div class="form-floating mb-3">
<MudItem md="12"> <InputText type="password" @bind-Value="Input.NewPassword" id="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" />
<MudTextField For="@(() => Input.NewPassword)" @bind-Value="Input.NewPassword" InputType="InputType.Password" <label for="Input.NewPassword" class="form-label">New password</label>
Label="New Password" Placeholder="new password" HelperText="Please enter your new password." <ValidationMessage For="() => Input.NewPassword" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <div class="form-floating mb-3">
<MudItem md="12"> <InputText type="password" @bind-Value="Input.ConfirmPassword" id="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Enter the new password" />
<MudTextField For="@(() => Input.ConfirmPassword)" @bind-Value="Input.ConfirmPassword" InputType="InputType.Password" <label for="Input.ConfirmPassword" class="form-label">Confirm password</label>
Label="Confirm Password" Placeholder="confirm password" HelperText="Please confirm your new password." <ValidationMessage For="() => Input.ConfirmPassword" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <button type="submit" class="w-100 btn btn-lg btn-primary">Update password</button>
<MudItem md="12"> </EditForm>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Update password</MudButton> </div>
</MudItem> </div>
</MudGrid>
</EditForm>
@code { @code {
private string? message; private string? message;

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@@ -12,31 +13,31 @@
<PageTitle>Delete Personal Data</PageTitle> <PageTitle>Delete Personal Data</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Delete personal data</MudText>
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<MudAlert Severity="Severity.Error" Variant="Variant.Text"> <h3>Delete Personal Data</h3>
Deleting this data will permanently remove your account, and this cannot be recovered.
</MudAlert>
<EditForm Model="Input" FormName="delete-user" OnValidSubmit="OnValidSubmitAsync" method="post"> <div class="alert alert-warning" role="alert">
<p>
<strong>Deleting this data will permanently remove your account, and this cannot be recovered.</strong>
</p>
</div>
<div>
<EditForm Model="Input" FormName="delete-user" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid>
@if (requirePassword) @if (requirePassword)
{ {
<MudItem md="12"> <div class="form-floating mb-3">
<MudTextField For="@(() => Input.Password)" @bind-Value="Input.Password" InputType="InputType.Password" <InputText type="password" @bind-Value="Input.Password" id="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Please enter your password." />
Label="Password" Placeholder="password" HelperText="Please enter your new password." <label for="Input.Password" class="form-label">Password</label>
UserAttributes="@(new() { { "autocomplete", "current-password" }, { "aria-required", "true" } } )" /> <ValidationMessage For="() => Input.Password" class="text-danger" />
</MudItem> </div>
} }
<MudItem md="12"> <button class="w-100 btn btn-lg btn-danger" type="submit">Delete data and close my account</button>
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Delete data and close my account</MudStaticButton> </EditForm>
</MudItem> </div>
</MudGrid>
</EditForm>
@code { @code {
private string? message; private string? message;

View File

@@ -1,7 +1,8 @@
@page "/Account/Manage/Disable2fa" @page "/Account/Manage/Disable2fa"
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IdentityUserAccessor UserAccessor @inject IdentityUserAccessor UserAccessor

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web @using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender @inject IEmailSender<ApplicationUser> EmailSender
@@ -14,43 +15,44 @@
<PageTitle>Manage email</PageTitle> <PageTitle>Manage email</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Manage email</MudText> <h3>Manage email</h3>
<StatusMessage Message="@message" /> <StatusMessage Message="@message"/>
<div class="row">
<form @onsubmit="OnSendEmailVerificationAsync" @formname="send-verification" id="send-verification-form" method="post"> <div class="col-xl-6">
<form @onsubmit="OnSendEmailVerificationAsync" @formname="send-verification" id="send-verification-form" method="post">
<AntiforgeryToken /> <AntiforgeryToken />
</form> </form>
<EditForm Model="Input" FormName="change-email" OnValidSubmit="OnValidSubmitAsync" method="post"> <EditForm Model="Input" FormName="change-email" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid>
@if (isEmailConfirmed) @if (isEmailConfirmed)
{ {
<MudItem md="12"> <div class="form-floating mb-3 input-group">
<MudTextField Value="@email" Label="Email" Placeholder="Please enter your email." Disabled="true" AdornmentIcon="Icons.Material.Filled.Check" AdornmentColor="Color.Success" /> <input type="text" value="@email" id="email" class="form-control" placeholder="Enter your email" disabled />
</MudItem> <div class="input-group-append">
<span class="h-100 input-group-text text-success font-weight-bold">✓</span>
</div>
<label for="email" class="form-label">Email</label>
</div>
} }
else else
{ {
<MudItem md="12"> <div class="form-floating mb-3">
<MudTextField Value="@email" Label="Email" Placeholder="Please enter your email." Disabled="true" /> <input type="text" value="@email" id="email" class="form-control" placeholder="Enter your email" disabled />
</MudItem> <label for="email" class="form-label">Email</label>
<MudItem md="12"> <button type="submit" class="btn btn-link" form="send-verification-form">Send verification email</button>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Send verification email</MudButton> </div>
</MudItem>
} }
<div class="form-floating mb-3">
<MudItem md="12"> <InputText @bind-Value="Input.NewEmail" id="Input.NewEmail" class="form-control" autocomplete="email" aria-required="true" placeholder="Enter a new email" />
<MudTextField @bind-Value="@Input.NewEmail" For="@(() => Input.NewEmail)" UserAttributes="@(new() { { "autocomplete", "email" }, { "aria-required", "true" } } )" Label="New Email" HelperText="Please enter new email." /> <label for="Input.NewEmail" class="form-label">New email</label>
</MudItem> <ValidationMessage For="() => Input.NewEmail" class="text-danger" />
</div>
<MudItem md="12"> <button type="submit" class="w-100 btn btn-lg btn-primary">Change email</button>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Change email</MudButton> </EditForm>
</MudItem> </div>
</MudGrid> </div>
</EditForm>
@code { @code {
private string? message; private string? message;

View File

@@ -5,7 +5,8 @@
@using System.Text @using System.Text
@using System.Text.Encodings.Web @using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IdentityUserAccessor UserAccessor @inject IdentityUserAccessor UserAccessor
@@ -21,55 +22,49 @@
} }
else else
{ {
<MudText Typo="Typo.h6" GutterBottom="true">Configure authenticator app</MudText>
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<h3>Configure authenticator app</h3>
<MudText Typo="Typo.body1" GutterBottom="true">To use an authenticator app go through the following steps:</MudText> <div>
<p>To use an authenticator app go through the following steps:</p>
<ol class="list"> <ol class="list">
<li> <li>
<MudText Typo="Typo.body2"> <p>
Download a two-factor authenticator app like Microsoft Authenticator for Download a two-factor authenticator app like Microsoft Authenticator for
<MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?Linkid=825072">Android</MudLink> and <a href="https://go.microsoft.com/fwlink/?Linkid=825072">Android</a> and
<MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?Linkid=825073">iOS</MudLink> or <a href="https://go.microsoft.com/fwlink/?Linkid=825073">iOS</a> or
Google Authenticator for Google Authenticator for
<MudLink Target="_blank" Href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Android</MudLink> and <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=en">Android</a> and
<MudLink Target="_blank" Href="https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8">iOS</MudLink>. <a href="https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8">iOS</a>.
</MudText> </p>
</li> </li>
<li> <li>
<MudText Typo="Typo.body2"> <p>Scan the QR Code or enter this key <kbd>@sharedKey</kbd> into your two factor authenticator app. Spaces and casing do not matter.</p>
Scan the QR Code or enter this key into your two factor authenticator app. Spaces and casing do not matter: <div class="alert alert-info">Learn how to <a href="https://go.microsoft.com/fwlink/?Linkid=852423">enable QR code generation</a>.</div>
</MudText> <div></div>
<MudAlert Variant="Variant.Text" Severity="Severity.Info" Icon="@Icons.Material.Filled.Key">@sharedKey</MudAlert>
<MudText Typo="Typo.body2">
Learn how to <MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?Linkid=852423">enable QR code generation</MudLink>.
</MudText>
<div data-url="@authenticatorUri"></div> <div data-url="@authenticatorUri"></div>
</li> </li>
<li> <li>
<MudText Typo="Typo.body2"> <p>
Once you have scanned the QR code or input the key above, your two factor authentication app will provide you Once you have scanned the QR code or input the key above, your two factor authentication app will provide you
with a unique code. Enter the code in the confirmation box below. with a unique code. Enter the code in the confirmation box below.
</MudText> </p>
<div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="send-code" OnValidSubmit="OnValidSubmitAsync" method="post"> <EditForm Model="Input" FormName="send-code" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<MudGrid> <div class="form-floating mb-3">
<MudItem md="12"> <InputText @bind-Value="Input.Code" id="Input.Code" class="form-control" autocomplete="off" placeholder="Enter the code" />
<MudTextField @bind-Value="@Input.Code" For="@(() => Input.Code)" Label="Verification Code" HelperText="Please enter the code." /> <label for="Input.Code" class="control-label form-label">Verification Code</label>
</MudItem> <ValidationMessage For="() => Input.Code" class="text-danger" />
<MudItem md="12"> </div>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Verify</MudButton> <button type="submit" class="w-100 btn btn-lg btn-primary">Verify</button>
</MudItem> <ValidationSummary class="text-danger" role="alert" />
</MudGrid>
</EditForm> </EditForm>
</div>
</div>
</li> </li>
</ol> </ol>
</div>
} }
@code { @code {

View File

@@ -2,7 +2,8 @@
@using Microsoft.AspNetCore.Authentication @using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@@ -47,7 +48,7 @@
@if (otherLogins?.Count > 0) @if (otherLogins?.Count > 0)
{ {
<h4>Add another service to log in.</h4> <h4>Add another service to log in.</h4>
<MudDivider /> <hr />
<form class="form-horizontal" action="Account/Manage/LinkExternalLogin" method="post"> <form class="form-horizontal" action="Account/Manage/LinkExternalLogin" method="post">
<AntiforgeryToken /> <AntiforgeryToken />
<div> <div>

View File

@@ -1,7 +1,8 @@
@page "/Account/Manage/GenerateRecoveryCodes" @page "/Account/Manage/GenerateRecoveryCodes"
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IdentityUserAccessor UserAccessor @inject IdentityUserAccessor UserAccessor

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@@ -11,27 +12,27 @@
<PageTitle>Profile</PageTitle> <PageTitle>Profile</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Profile</MudText> <h3>Profile</h3>
<StatusMessage /> <StatusMessage />
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post"> <div class="row">
<div class="col-xl-6">
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid> <div class="form-floating mb-3">
<MudItem md="12"> <input type="text" value="@username" id="username" class="form-control" placeholder="Choose your username." disabled />
<MudTextField Value="@username" Label="Username" Disabled="true" Placeholder="Please choose your username." /> <label for="username" class="form-label">Username</label>
</MudItem> </div>
<MudItem md="12"> <div class="form-floating mb-3">
<MudTextField For="@(() => Input.PhoneNumber)" @bind-Value="Input.PhoneNumber" <InputText @bind-Value="Input.PhoneNumber" id="Input.PhoneNumber" class="form-control" placeholder="Enter your phone number" />
Label="Phone Number" HelperText="Please enter your phone number." <label for="Input.PhoneNumber" class="form-label">Phone number</label>
UserAttributes="@(new() { { "autocomplete", "tel-national" } } )" /> <ValidationMessage For="() => Input.PhoneNumber" class="text-danger" />
</MudItem> </div>
<MudItem md="12"> <button type="submit" class="w-100 btn btn-lg btn-primary">Save</button>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Save</MudButton> </EditForm>
</MudItem> </div>
</MudGrid> </div>
</EditForm>
@code { @code {
private ApplicationUser user = default!; private ApplicationUser user = default!;

View File

@@ -1,34 +1,28 @@
@page "/Account/Manage/PersonalData" @page "/Account/Manage/PersonalData"
@using MyAppName.WebApp.Components.Account
@inject IdentityUserAccessor UserAccessor @inject IdentityUserAccessor UserAccessor
<PageTitle>Personal Data</PageTitle> <PageTitle>Personal Data</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Personal data</MudText>
<StatusMessage /> <StatusMessage />
<h3>Personal Data</h3>
<MudGrid> <div class="row">
<MudItem md="12"> <div class="col-md-6">
<MudText Typo="Typo.body1"> <p>Your account contains personal data that you have given us. This page allows you to download or delete that data.</p>
Your account contains personal data that you have given us. This page allows you to download or delete that data. <p>
</MudText> <strong>Deleting this data will permanently remove your account, and this cannot be recovered.</strong>
</MudItem> </p>
<MudItem md="12">
<MudAlert Severity="Severity.Warning" Variant="Variant.Text">
Deleting this data will permanently remove your account, and this cannot be recovered.
</MudAlert>
</MudItem>
<MudItem md="12">
<form action="Account/Manage/DownloadPersonalData" method="post"> <form action="Account/Manage/DownloadPersonalData" method="post">
<AntiforgeryToken /> <AntiforgeryToken />
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Download</MudStaticButton> <button class="btn btn-primary" type="submit">Download</button>
</form> </form>
</MudItem> <p>
<MudItem md="12"> <a href="Account/Manage/DeletePersonalData" class="btn btn-danger">Delete</a>
<MudLink Href="Account/Manage/DeletePersonalData" Color="Color.Error">Delete</MudLink> </p>
</MudItem> </div>
</MudGrid> </div>
@code { @code {
[CascadingParameter] [CascadingParameter]

View File

@@ -1,7 +1,8 @@
@page "/Account/Manage/ResetAuthenticator" @page "/Account/Manage/ResetAuthenticator"
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@@ -11,24 +12,24 @@
<PageTitle>Reset authenticator key</PageTitle> <PageTitle>Reset authenticator key</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Reset authenticator key</MudText>
<StatusMessage /> <StatusMessage />
<h3>Reset authenticator key</h3>
<MudAlert Severity="Severity.Warning" Variant="Variant.Text"> <div class="alert alert-warning" role="alert">
If you reset your authenticator key your authenticator app will not work until you reconfigure it. <p>
</MudAlert> <span class="glyphicon glyphicon-warning-sign"></span>
<strong>If you reset your authenticator key your authenticator app will not work until you reconfigure it.</strong>
<MudText Typo="Typo.body2" Class="my-4"> </p>
<p>
This process disables 2FA until you verify your authenticator app. This process disables 2FA until you verify your authenticator app.
If you do not complete your authenticator app configuration you may lose access to your account. If you do not complete your authenticator app configuration you may lose access to your account.
</MudText> </p>
</div>
<form @formname="reset-authenticator" @onsubmit="OnSubmitAsync" method="post"> <div>
<form @formname="reset-authenticator" @onsubmit="OnSubmitAsync" method="post">
<AntiforgeryToken /> <AntiforgeryToken />
<button class="btn btn-danger" type="submit">Reset authenticator key</button>
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Reset authenticator key</MudStaticButton> </form>
</form> </div>
@code { @code {
[CascadingParameter] [CascadingParameter]

View File

@@ -2,7 +2,8 @@
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager

View File

@@ -2,7 +2,8 @@
@using Microsoft.AspNetCore.Http.Features @using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@@ -11,72 +12,63 @@
<PageTitle>Two-factor authentication (2FA)</PageTitle> <PageTitle>Two-factor authentication (2FA)</PageTitle>
<MudText Typo="Typo.h6" GutterBottom="true">Two-factor authentication (2FA)</MudText>
<StatusMessage /> <StatusMessage />
<h3>Two-factor authentication (2FA)</h3>
@if (canTrack) @if (canTrack)
{ {
if (is2faEnabled) if (is2faEnabled)
{ {
if (recoveryCodesLeft == 0) if (recoveryCodesLeft == 0)
{ {
<MudAlert Variant="Variant.Text" Severity="Severity.Error">You have no recovery codes left.</MudAlert> <div class="alert alert-danger">
<strong>You have no recovery codes left.</strong>
<MudText Typo="Typo.body1" Class="pt-4"> <p>You must <a href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</a> before you can log in with a recovery code.</p>
You must <MudLink Href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</MudLink> </div>
before you can log in with a recovery code.
</MudText>
} }
else if (recoveryCodesLeft == 1) else if (recoveryCodesLeft == 1)
{ {
<MudAlert Variant="Variant.Text" Severity="Severity.Warning">You have 1 recovery code left.</MudAlert> <div class="alert alert-danger">
<strong>You have 1 recovery code left.</strong>
<MudText Typo="Typo.body1" Class="pt-4"> <p>You can <a href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</a>.</p>
You can <MudLink Href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</MudLink>. </div>
</MudText>
} }
else if (recoveryCodesLeft <= 3) else if (recoveryCodesLeft <= 3)
{ {
<MudAlert Variant="Variant.Text" Severity="Severity.Warning">You have @recoveryCodesLeft recovery codes left.</MudAlert> <div class="alert alert-warning">
<strong>You have @recoveryCodesLeft recovery codes left.</strong>
<MudText Typo="Typo.body1" Class="pt-4"> <p>You should <a href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</a>.</p>
You should <MudLink Href="Account/Manage/GenerateRecoveryCodes">generate a new set of recovery codes</MudLink>. </div>
</MudText>
} }
if (isMachineRemembered) if (isMachineRemembered)
{ {
<form style="display: inline-block" @formname="forget-browser" @onsubmit="OnSubmitForgetBrowserAsync" method="post"> <form style="display: inline-block" @formname="forget-browser" @onsubmit="OnSubmitForgetBrowserAsync" method="post">
<AntiforgeryToken /> <AntiforgeryToken />
<button type="submit" class="btn btn-primary">Forget this browser</button>
<MudStaticButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Forget this browser</MudStaticButton>
</form> </form>
} }
<MudLink Href="Account/Manage/Disable2fa">Disable 2FA</MudLink><br /> <a href="Account/Manage/Disable2fa" class="btn btn-primary">Disable 2FA</a>
<MudLink Href="Account/Manage/GenerateRecoveryCodes">Reset recovery codes</MudLink> <a href="Account/Manage/GenerateRecoveryCodes" class="btn btn-primary">Reset recovery codes</a>
} }
<MudText Typo="Typo.h6" GutterBottom="true">Authenticator app</MudText> <h4>Authenticator app</h4>
@if (!hasAuthenticator) @if (!hasAuthenticator)
{ {
<MudLink Href="Account/Manage/EnableAuthenticator">Add authenticator app</MudLink><br /> <a href="Account/Manage/EnableAuthenticator" class="btn btn-primary">Add authenticator app</a>
} }
else else
{ {
<MudLink Href="Account/Manage/EnableAuthenticator">Set up authenticator app</MudLink><br /> <a href="Account/Manage/EnableAuthenticator" class="btn btn-primary">Set up authenticator app</a>
<MudLink Href="Account/Manage/ResetAuthenticator">Reset authenticator app</MudLink> <a href="Account/Manage/ResetAuthenticator" class="btn btn-primary">Reset authenticator app</a>
} }
} }
else else
{ {
<MudAlert Variant="Variant.Text" Severity="Severity.Error">Privacy and cookie policy have not been accepted.</MudAlert> <div class="alert alert-danger">
<strong>Privacy and cookie policy have not been accepted.</strong>
<MudText Typo="Typo.body1" Class="pt-4"> <p>You must accept the policy before you can enable two factor authentication.</p>
You must accept the policy before you can enable two factor authentication. </div>
</MudText>
} }
@code { @code {

View File

@@ -1,2 +1,3 @@
@layout ManageLayout @using OpenArchival.Blazor.Components.Account.Shared
@layout ManageLayout
@attribute [Microsoft.AspNetCore.Authorization.Authorize] @attribute [Microsoft.AspNetCore.Authorization.Authorize]

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web @using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IUserStore<ApplicationUser> UserStore @inject IUserStore<ApplicationUser> UserStore
@@ -17,43 +18,42 @@
<PageTitle>Register</PageTitle> <PageTitle>Register</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Register</MudText> <h1>Register</h1>
<MudGrid> <div class="row">
<MudItem md="6"> <div class="col-lg-6">
<StatusMessage Message="@Message" /> <StatusMessage Message="@Message" />
<EditForm Model="Input" asp-route-returnUrl="@ReturnUrl" method="post" OnValidSubmit="RegisterUser" FormName="register"> <EditForm Model="Input" asp-route-returnUrl="@ReturnUrl" method="post" OnValidSubmit="RegisterUser" FormName="register">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<h2>Create a new account.</h2>
<MudText Typo="Typo.body1" GutterBottom="true">Create a new account.</MudText> <hr />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid> <div class="form-floating mb-3">
<MudItem md="12"> <InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<MudTextField For="@(() => Input.Email)" @bind-Value="Input.Email" <label for="Input.Email">Email</label>
Label="Email" Placeholder="name@example.com" <ValidationMessage For="() => Input.Email" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <div class="form-floating mb-3">
<MudItem md="12"> <InputText type="password" @bind-Value="Input.Password" id="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
<MudTextField For="@(() => Input.Password)" @bind-Value="Input.Password" <label for="Input.Password">Password</label>
Label="Password" InputType="InputType.Password" Placeholder="password" <ValidationMessage For="() => Input.Password" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <div class="form-floating mb-3">
<MudItem md="12"> <InputText type="password" @bind-Value="Input.ConfirmPassword" id="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
<MudTextField For="@(() => Input.ConfirmPassword)" @bind-Value="Input.ConfirmPassword" <label for="Input.ConfirmPassword">Confirm Password</label>
Label="Confirm Password" InputType="InputType.Password" Placeholder="confirm password" <ValidationMessage For="() => Input.ConfirmPassword" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "new-password" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <button type="submit" class="w-100 btn btn-lg btn-primary">Register</button>
<MudItem md="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Register</MudButton>
</MudItem>
</MudGrid>
</EditForm> </EditForm>
</MudItem> </div>
<MudItem md="6"> <div class="col-lg-4 col-lg-offset-2">
<MudText Typo="Typo.body1" GutterBottom="true">Use another service to register.</MudText> <section>
<h3>Use another service to register.</h3>
<hr />
<ExternalLoginPicker /> <ExternalLoginPicker />
</MudItem> </section>
</MudGrid> </div>
</div>
@code { @code {
private IEnumerable<IdentityError>? identityErrors; private IEnumerable<IdentityError>? identityErrors;
@@ -73,8 +73,9 @@
await UserStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); await UserStore.SetUserNameAsync(user, Input.Email, CancellationToken.None);
var emailStore = GetEmailStore(); var emailStore = GetEmailStore();
await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None);
var result = await UserManager.CreateAsync(user, Input.Password);
await UserManager.AddToRoleAsync(user, "User");
var result = await UserManager.CreateAsync(user, Input.Password);
if (!result.Succeeded) if (!result.Succeeded)
{ {
identityErrors = result.Errors; identityErrors = result.Errors;
@@ -103,7 +104,7 @@
RedirectManager.RedirectTo(ReturnUrl); RedirectManager.RedirectTo(ReturnUrl);
} }
private static ApplicationUser CreateUser() private ApplicationUser CreateUser()
{ {
try try
{ {

View File

@@ -3,7 +3,8 @@
@using System.Text @using System.Text
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender @inject IEmailSender<ApplicationUser> EmailSender
@@ -19,8 +20,8 @@
@if (emailConfirmationLink is not null) @if (emailConfirmationLink is not null)
{ {
<p> <p>
This app does not currently have a real email sender registered, see <a class="mud-link mud-primary-text mud-link-underline-hover" href="https://aka.ms/aspaccountconf">these docs</a> for how to configure a real email sender. This app does not currently have a real email sender registered, see <a href="https://aka.ms/aspaccountconf">these docs</a> for how to configure a real email sender.
Normally this would be emailed: <a class="mud-link mud-primary-text mud-link-underline-hover" href="@emailConfirmationLink">Click here to confirm your account</a> Normally this would be emailed: <a href="@emailConfirmationLink">Click here to confirm your account</a>
</p> </p>
} }
else else

View File

@@ -5,7 +5,8 @@
@using System.Text.Encodings.Web @using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject IEmailSender<ApplicationUser> EmailSender @inject IEmailSender<ApplicationUser> EmailSender
@@ -14,26 +15,24 @@
<PageTitle>Resend email confirmation</PageTitle> <PageTitle>Resend email confirmation</PageTitle>
<MudText Typo="Typo.h3" GutterBottom="true">Resend email confirmation</MudText> <h1>Resend email confirmation</h1>
<h2>Enter your email.</h2>
<MudText Typo="Typo.body1" GutterBottom="true">Enter your email.</MudText> <hr />
<StatusMessage Message="@message" /> <StatusMessage Message="@message" />
<div class="row">
<EditForm Model="Input" FormName="resend-email-confirmation" OnValidSubmit="OnValidSubmitAsync" method="post"> <div class="col-md-4">
<EditForm Model="Input" FormName="resend-email-confirmation" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator /> <DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<MudGrid> <div class="form-floating mb-3">
<MudItem md="12"> <InputText @bind-Value="Input.Email" id="Input.Email" class="form-control" aria-required="true" placeholder="name@example.com" />
<MudTextField For="@(() => Input.Email)" @bind-Value="Input.Email" <label for="Input.Email" class="form-label">Email</label>
Label="Email" Placeholder="name@example.com" <ValidationMessage For="() => Input.Email" class="text-danger" />
UserAttributes="@(new() { { "autocomplete", "username" }, { "aria-required", "true" } } )" /> </div>
</MudItem> <button type="submit" class="w-100 btn btn-lg btn-primary">Resend</button>
<MudItem md="12"> </EditForm>
<MudButton Variant="Variant.Filled" Color="Color.Primary" FullWidth="true" FormAction="FormAction.Submit">Resend</MudButton> </div>
</MudItem> </div>
</MudGrid>
</EditForm>
@code { @code {
private string? message; private string? message;

View File

@@ -4,7 +4,8 @@
@using System.Text @using System.Text
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities @using Microsoft.AspNetCore.WebUtilities
@using OpenArchival.Blazor.Data @using MyAppName.WebApp.Components.Account
@using OpenArchival.DataAccess
@inject IdentityRedirectManager RedirectManager @inject IdentityRedirectManager RedirectManager
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@@ -13,7 +14,7 @@
<h1>Reset password</h1> <h1>Reset password</h1>
<h2>Reset your password.</h2> <h2>Reset your password.</h2>
<MudDivider /> <hr />
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<StatusMessage Message="@Message" /> <StatusMessage Message="@Message" />

View File

@@ -3,5 +3,5 @@
<h1>Reset password confirmation</h1> <h1>Reset password confirmation</h1>
<p role="alert"> <p role="alert">
Your password has been reset. Please <a class="mud-link mud-primary-text mud-link-underline-hover" href="Account/Login">click here to log in</a>. Your password has been reset. Please <a href="Account/Login">click here to log in</a>.
</p> </p>

View File

@@ -1,3 +1,2 @@
@using MudBlazor @using OpenArchival.Blazor.Components.Account.Shared
@using OpenArchival.Blazor.Components.Account.Shared
@attribute [ExcludeFromInteractiveRouting] @attribute [ExcludeFromInteractiveRouting]

View File

@@ -1,18 +1,19 @@
@using Microsoft.AspNetCore.Authentication @using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using MudBlazor @using MyAppName.WebApp.Components.Account
@using OpenArchival.Blazor.Data @using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject IdentityRedirectManager RedirectManager @inject IdentityRedirectManager RedirectManager
@if (externalLogins.Length == 0) @if (externalLogins.Length == 0)
{ {
<MudAlert Variant="Variant.Text" Severity="Severity.Warning">There are no external authentication services configured.</MudAlert> <div>
<MudText Typo="Typo.body1" Class="pt-4"> <p>
See <MudLink Target="_blank" Href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</MudLink> There are no external authentication services configured. See this <a href="https://go.microsoft.com/fwlink/?LinkID=532715">article
about setting up this ASP.NET application to support logging in via external services about setting up this ASP.NET application to support logging in via external services</a>.
</MudText> </p>
</div>
} }
else else
{ {

View File

@@ -1,14 +1,18 @@
@inherits LayoutComponentBase @using OpenArchival.Blazor.Components.Layout
@layout OpenArchival.Blazor.Components.Layout.MainLayout @inherits LayoutComponentBase
@layout MainLayout
<MudText Typo="Typo.h3" GutterBottom="true">Manage your account</MudText> <h1>Manage your account</h1>
<MudGrid> <div>
<MudItem md="5"> <h2>Change your account settings</h2>
<MudText Typo="Typo.h6" GutterBottom="true">Change your account settings</MudText> <hr />
<div class="row">
<div class="col-lg-3">
<ManageNavMenu /> <ManageNavMenu />
</MudItem> </div>
<MudItem md="7"> <div class="col-lg-9">
@Body @Body
</MudItem> </div>
</MudGrid> </div>
</div>

View File

@@ -1,19 +1,31 @@
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using OpenArchival.Blazor.Data @using OpenArchival.DataAccess
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
<MudNavMenu> <ul class="nav nav-pills flex-column">
<MudNavLink Href="Account/Manage" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Person">Profile</MudNavLink> <li class="nav-item">
<MudNavLink Href="Account/Manage/Email" Icon="@Icons.Material.Filled.Email">Email</MudNavLink> <NavLink class="nav-link" href="Account/Manage" Match="NavLinkMatch.All">Profile</NavLink>
<MudNavLink Href="Account/Manage/ChangePassword" Icon="@Icons.Material.Filled.Lock">Password</MudNavLink> </li>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/Email">Email</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/ChangePassword">Password</NavLink>
</li>
@if (hasExternalLogins) @if (hasExternalLogins)
{ {
<MudNavLink Href="Account/Manage/ExternalLogins" Icon="@Icons.Material.Filled.PhoneLocked">External logins</MudNavLink> <li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/ExternalLogins">External logins</NavLink>
</li>
} }
<MudNavLink Href="Account/Manage/TwoFactorAuthentication" Icon="@Icons.Material.Filled.LockClock">Two-factor authentication</MudNavLink> <li class="nav-item">
<MudNavLink Href="Account/Manage/PersonalData" Icon="@Icons.Material.Filled.PersonRemove">Personal data</MudNavLink> <NavLink class="nav-link" href="Account/Manage/TwoFactorAuthentication">Two-factor authentication</NavLink>
</MudNavMenu> </li>
<li class="nav-item">
<NavLink class="nav-link" href="Account/Manage/PersonalData">Personal data</NavLink>
</li>
</ul>
@code { @code {
private bool hasExternalLogins; private bool hasExternalLogins;

View File

@@ -1,8 +1,10 @@
@if (!string.IsNullOrEmpty(DisplayMessage)) @using MyAppName.WebApp.Components.Account
@if (!string.IsNullOrEmpty(DisplayMessage))
{ {
var severity = DisplayMessage.StartsWith("Error") ? Severity.Error : Severity.Success; var statusMessageClass = DisplayMessage.StartsWith("Error") ? "danger" : "success";
<div class="alert alert-@statusMessageClass" role="alert">
<MudAlert Variant="Variant.Outlined" Severity="@severity">@DisplayMessage</MudAlert> @DisplayMessage
</div>
} }
@code { @code {

View File

@@ -1,5 +1,4 @@
@using Microsoft.Extensions.Options @using Microsoft.Extensions.Options
TODO: Handle the case in which there are duplicate file names
<style> <style>
.file-upload-input { .file-upload-input {

View File

@@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Components;
namespace OpenArchival.Blazor;
public static class HelperExtensions
{
public static void ReloadPage(this NavigationManager manager)
{
manager.NavigateTo(manager.Uri, true);
}
}

View File

@@ -0,0 +1,43 @@
@page "/archiveadmin"
@using Microsoft.AspNetCore.Authorization
@using OpenArchival.Blazor.Components
@using OpenArchival.Blazor.Components.Pages.Administration.ArchiveItems
@using OpenArchival.Blazor.Components.Pages.Administration.Categories;
@attribute [Authorize(Roles = "Admin")]
<MudTabs
ApplyEffectsToContainer="true"
PanelClass=""
Centered=true>
<MudTabPanel Text="Categories">
<ViewAddCategoriesComponent></ViewAddCategoriesComponent>
</MudTabPanel>
<MudTabPanel Text="Add Grouping">
<AddArchiveGroupingComponent
GroupingPublished="Helpers.OnGroupingPublished"
ForwardLink="@null"
ClearOnPublish=true/>
</MudTabPanel>
<MudTabPanel Text="Manage Groupings">
<ArchiveGroupingsTable/>
</MudTabPanel>
</MudTabs>
@inject ArtifactEntrySharedHelpers Helpers;
@inject IDialogService DialogService;
@code {
public async Task ShowAddGroupingDialog(ArtifactGroupingRowElement validationModel)
{
var parameters = new DialogParameters { ["Model"] = validationModel, ["IsUpdate"] = true};
var options = new DialogOptions { CloseOnEscapeKey = true, BackdropClick = false };
var dialog = await DialogService.ShowAsync<AddGroupingDialog>("Create a Group", parameters, options);
var result = await dialog.Result;
}
}

View File

@@ -1,23 +1,35 @@
@page "/add" @using OpenArchival.Blazor.Components.CustomComponents;
@using OpenArchival.Blazor.Components.CustomComponents;
@using OpenArchival.Blazor.Components.Pages.Administration.Categories @using OpenArchival.Blazor.Components.Pages.Administration.Categories
@using OpenArchival.DataAccess; @using OpenArchival.DataAccess;
@using System.ComponentModel.DataAnnotations
@inject IDialogService DialogService
@inject NavigationManager NavigationManager;
@inject IArchiveCategoryProvider CategoryProvider;
@inject ArtifactEntrySharedHelpers Helpers;
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3"> <MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h5" Color="Color.Primary">Add an Archive Item</MudText> <MudText Typo="Typo.h5" Color="Color.Primary">Add an Archive Item</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
@if (!IsValid && _isFormDivVisible)
@foreach (var result in ValidationResults)
{ {
<MudAlert Severity="Severity.Error" Class="mt-4"> <MudAlert Severity="Severity.Error">@result.ErrorMessage</MudAlert>
All identifier fields must be filled in.
</MudAlert>
} }
<MudGrid Justify="Justify.Center" Class="pt-4"> <MudGrid Justify="Justify.Center" Class="pt-4">
<MudItem> <MudItem>
<MudAutocomplete T="string" Label="Category" @bind-Value="Model.Category" @bind-Value:after=OnCategoryChanged SearchFunc="SearchCategory" CoerceValue=false CoerceText=false/> <MudAutocomplete
T="ArchiveCategory"
ToStringFunc="@(val => val?.Name)"
Label="Category"
@bind-Value="Model.Category"
@bind-Value:after=OnCategoryChanged
SearchFunc="SearchCategory"
CoerceValue=false
CoerceText=false
/>
</MudItem> </MudItem>
<MudItem> <MudItem>
@@ -32,16 +44,56 @@
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3"> <MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Identifier</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Identifier</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<IdentifierTextBox @ref="_identifierTextBox" IdentifierFields="@Model.IdentifierFields"></IdentifierTextBox> <IdentifierTextBox @ref="_identifierTextBox" IdentifierFields="@Model.IdentifierFieldValues"></IdentifierTextBox>
</MudPaper> </MudPaper>
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3"> <MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<UploadDropBox FilesUploaded="OnFilesUploaded" ClearClicked="OnClearFilesClicked"></UploadDropBox> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Grouping Title</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField
T="string"
For="@(() => Model.Title)"
Placeholder="Grouping Title"
@bind-Value=Model.Title></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Grouping Description</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField
T="string"
For="@(() => Model.Description)"
Lines="5"
Placeholder="Grouping Description"
@bind-Value=Model.Description></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Grouping Type</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudAutocomplete
For="@(() => Model.Type)"
T="string"
Label="Artifact Type"
Class="pt-0 mt-0 pl-2 pr-2"
@bind-Value=Model.Type
SearchFunc="Helpers.SearchItemTypes"
CoerceValue=true></MudAutocomplete>
</MudPaper> </MudPaper>
@foreach (FilePathListing listing in _filePathListings) <MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<UploadDropBox
@ref="@_uploadComponent"
FilesUploaded="OnFilesUploaded"
ClearClicked="OnClearFilesClicked"></UploadDropBox>
</MudPaper>
@for (int index = 0; index < Model.ArtifactEntries.Count; ++index)
{ {
<ArchiveEntryCreatorCard FilePath="listing" OnValueChanged="OnChanged"></ArchiveEntryCreatorCard> // Capture the current item in a local variable for the lambda
var currentEntry = Model.ArtifactEntries[index];
<ArchiveEntryCreatorCard Model="currentEntry"
ModelChanged="(updatedEntry) => HandleEntryUpdate(currentEntry, updatedEntry)"
InputsChanged="OnChanged"
@key="currentEntry"
ArtifactEntryIndex="index"
OnEntryDeletedClicked="() => OnDeleteEntryClicked(index)"/>
} }
</div> </div>
@@ -51,25 +103,52 @@
@*<MudCheckBox Label="Publicly Visible" T="bool" @bind-Value=Model.IsPublic></MudCheckBox>*@ @*<MudCheckBox Label="Publicly Visible" T="bool" @bind-Value=Model.IsPublic></MudCheckBox>*@
</MudItem> </MudItem>
<MudItem Style="pr-0"> <MudItem Class="pr-0">
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="CancelClicked">Cancel</MudButton> <MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="CancelClicked">Cancel</MudButton>
</MudItem> </MudItem>
<MudItem Style="pl-2"> <MudItem Class="pl-2">
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="PublishClicked">Publish</MudButton> <MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="PublishClicked" Disabled="@(!IsValid)" >Publish</MudButton>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
@using System.ComponentModel.DataAnnotations
@inject IDialogService DialogService
@inject NavigationManager NavigationManager;
@inject IArchiveCategoryProvider CategoryProvider;
@code { @code {
[Parameter]
public bool ClearOnPublish { get; set; } = true;
/// <summary>
/// The URI to navigate to if cancel is pressed. null to navigate to no page
/// </summary>
[Parameter]
public string? BackLink { get; set; } = null;
/// <summary>
/// The URI to navigate to if publish is pressed, null to navigate to no page
/// </summary>
[Parameter]
public string? ForwardLink { get; set; } = null;
/// <summary>
/// Called when publish is clicked
/// </summary>
[Parameter]
public EventCallback<ArtifactGroupingValidationModel> GroupingPublished { get; set; }
/// <summary>
/// The model to display on the form
/// </summary>
[Parameter]
public ArtifactGroupingValidationModel Model { get; set; } = new();
private UploadDropBox _uploadComponent = default!;
private IdentifierTextBox _identifierTextBox = default!; private IdentifierTextBox _identifierTextBox = default!;
private ElementReference _formDiv = default!; private ElementReference _formDiv = default!;
private bool _isFormDivVisible = false; private bool _isFormDivVisible = false;
private string _formDivStyle => _isFormDivVisible ? "" : "display: none;"; private string _formDivStyle => _isFormDivVisible ? "" : "display: none;";
public List<string> DatesData { get; set; } = []; public List<string> DatesData { get; set; } = [];
@@ -80,17 +159,34 @@
private bool _categorySelected = false; private bool _categorySelected = false;
//public List<IdentifierFieldValidationModel> IdentifierFields { get; set; } = [new IdentifierFieldValidationModel() { Name = "Field One", Value = "" }, new IdentifierFieldValidationModel() { Name = "Field Two", Value = "" }, new IdentifierFieldValidationModel() { Name = "Field Three", Value = "" }];
public ArchiveItemValidationModel Model { get; set; } = new();
public bool IsValid { get; set; } = false; public bool IsValid { get; set; } = false;
/// <summary>
/// The URI to navigate to if cancel is pressed
/// </summary>
public string? BackLink { get; set; } = "/";
public string? ForwardLink { get; set; } = "/"; public List<ValidationResult> ValidationResults { get; private set; } = [];
private async Task PublishClicked(MouseEventArgs args)
{
var validationContext = new ValidationContext(Model);
var validationResult = new List<ValidationResult>();
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
ArtifactGroupingValidationModel oldModel = Model;
if (ForwardLink is not null)
{
if (IsValid)
{
NavigationManager.NavigateTo(ForwardLink);
}
}
if (IsValid && ClearOnPublish)
{
Model = new();
await _uploadComponent.ClearClicked.InvokeAsync();
StateHasChanged();
}
await GroupingPublished.InvokeAsync(oldModel);
}
private void CancelClicked(MouseEventArgs args) private void CancelClicked(MouseEventArgs args)
{ {
@@ -103,74 +199,71 @@
} }
} }
private void HandleEntryUpdate(ArtifactEntryValidationModel originalEntry, ArtifactEntryValidationModel updatedEntry)
{
// Find the index of the original object in our list
var index = Model.ArtifactEntries.IndexOf(originalEntry);
// If found, replace it with the updated version
if (index != -1)
{
Model.ArtifactEntries[index] = updatedEntry;
}
// Now, run the validation logic
OnChanged();
}
// You can now simplify your OnFilesUploaded method slightly
private async Task OnFilesUploaded(List<FilePathListing> args) private async Task OnFilesUploaded(List<FilePathListing> args)
{ {
_filePathListings = args; _filePathListings = args;
StateHasChanged();
// This part is tricky. Adding items while iterating can be problematic.
// A better approach is to create the entries first, then tell Blazor to render.
var newEntries = new List<ArtifactEntryValidationModel>();
foreach (var file in args)
{
// Associate the file with the entry if needed
newEntries.Add(new ArtifactEntryValidationModel { Files = [file]});
}
Model.ArtifactEntries.AddRange(newEntries);
// StateHasChanged() is implicitly called by OnChanged() if validation passes
await OnChanged(); await OnChanged();
} }
private async Task OnClearFilesClicked() private async Task OnClearFilesClicked()
{ {
_filePathListings = []; _filePathListings = [];
Model.ArtifactEntries = [];
StateHasChanged(); StateHasChanged();
await OnChanged(); await OnChanged();
} }
private void PublishClicked(MouseEventArgs args)
{
var validationContext = new ValidationContext(Model);
var validationResult = new List<ValidationResult>();
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
/*
if (ForwardLink is not null)
{
if (IsValid)
{
NavigationManager.NavigateTo(ForwardLink);
}
else
{
StateHasChanged();
}
}
else
{
throw new ArgumentNullException("No forward link provided for the add archive item page.");
}
// TODO: assign parents to all file path listings
throw new NotImplementedException();
*/
}
async Task OnChanged() async Task OnChanged()
{ {
var validationContext = new ValidationContext(Model); var validationContext = new ValidationContext(Model);
var validationResult = new List<ValidationResult>(); var validationResult = new List<ValidationResult>();
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult); IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
if (IsValid)
{
StateHasChanged();
}
} }
async Task OnCategoryChanged() async Task OnCategoryChanged()
{ {
List<ArchiveCategory>? newCategory = await CategoryProvider.GetArchiveCategory(Model.Category); if (Model.Category is not null)
if (newCategory.Count != 1)
{ {
throw new ArgumentException(nameof(Model.Category), $"Got {newCategory.Count} rows for category name={Model.Category}"); _identifierTextBox.VerifyFormatCategory = Model.Category;
}
if (newCategory is not null)
{
_identifierTextBox.VerifyFormatCategory = newCategory[0];
_isFormDivVisible = true; _isFormDivVisible = true;
StateHasChanged();
}
if (!_categorySelected) if (!_categorySelected)
{ {
_categorySelected = true; _categorySelected = true;
}
StateHasChanged(); StateHasChanged();
} }
@@ -192,7 +285,7 @@
} }
} }
private async Task<IEnumerable<string>> SearchCategory(string value, CancellationToken cancellationToken) private async Task<IEnumerable<ArchiveCategory>> SearchCategory(string value, CancellationToken cancellationToken)
{ {
List<ArchiveCategory> categories; List<ArchiveCategory> categories;
if (string.IsNullOrEmpty(value)) if (string.IsNullOrEmpty(value))
@@ -204,13 +297,12 @@
categories = new((await CategoryProvider.Search(value) ?? [])); categories = new((await CategoryProvider.Search(value) ?? []));
} }
List<string> categoryStrings = []; return categories;
foreach (var category in categories) }
private async void OnDeleteEntryClicked(int index)
{ {
categoryStrings.Add(category.Name); Model.ArtifactEntries.RemoveAt(index);
StateHasChanged();
} }
return categoryStrings;
}
} }

View File

@@ -0,0 +1,32 @@
<MudDialog>
<TitleContent>
<MudText Typo="Typo.h6">Create a Category</MudText>
</TitleContent>
<DialogContent>
<AddArchiveGroupingComponent Model="Model"></AddArchiveGroupingComponent>
</DialogContent>
<DialogActions>
<MudButton OnClick="OnCancel">Cancel</MudButton>
<MudButton Color="Color.Primary" OnClick="OnSubmit">OK</MudButton>
</DialogActions>
</MudDialog>
@code {
[Parameter]
public required ArtifactGroupingValidationModel Model { get; set; }
[Parameter]
public bool IsUpdate { get; set; } = false;
private void OnCancel(MouseEventArgs args)
{
throw new NotImplementedException();
}
private void OnSubmit(MouseEventArgs args)
{
throw new NotImplementedException();
}
}

View File

@@ -1,39 +1,75 @@
@using OpenArchival.Blazor.Components.CustomComponents; @using OpenArchival.Blazor.Components.CustomComponents;
@using System.ComponentModel.DataAnnotations
@using MudBlazor
@inject ArtifactEntrySharedHelpers Helpers;
@inject IArtifactDefectProvider DefectsProvider;
@inject IArtifactStorageLocationProvider StorageLocationProvider;
@inject IArchiveEntryTagProvider TagsProvider;
@inject IArtifactTypeProvider TypesProvider;
@inject IListedNameProvider ListedNameProvider;
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3"> <MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<h3>@FilePath.OriginalName</h3> <MudGrid>
<MudItem>
@if (Model.Files.Count > 0) {
<MudText Typo="Typo.h6">@(Model.Files[0].OriginalName)</MudText>
}
</MudItem>
<MudItem>
<MudButton
Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Delete"
Color="Color.Error"
OnClick="OnDeleteEntryClicked"
>Delete</MudButton>
</MudItem>
</MudGrid>
@foreach (var error in ValidationResults)
{
<MudAlert Severity="Severity.Error">
@error.ErrorMessage
</MudAlert>
}
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Title</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Title</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField Required=true Placeholder="Archive Item Title" T="string" Class="pl-4 pr-4" @bind-Value=Model.Title @bind-Value:after=OnInputsChanged></MudTextField> <MudTextField For="@(() => Model.Title)" Required=true Placeholder="Archive Item Title" T="string" Class="pl-4 pr-4" @bind-Value=Model.Title @bind-Value:after=OnInputsChanged></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Archive Item Numbering</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Enter a unique ID for this entry</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField For="@(() => Model.ArtifactNumber)" Placeholder="Numbering" T="string" @bind-Value=Model.ArtifactNumber @bind-Value:after=OnInputsChanged/>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Item Description</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Item Description</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField Lines=8 Placeholder="Description" T="string" Class="pl-4 pr-4" @bind-Value=Model.Description @bind-Value:after=OnInputsChanged></MudTextField> <MudTextField For="@(() => Model.Description)" Lines=8 Placeholder="Description" T="string" Class="pl-4 pr-4" @bind-Value=Model.Description @bind-Value:after=OnInputsChanged></MudTextField>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Storage Location</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Storage Location</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudAutocomplete T="string" Label="Storage Location" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.StorageLocation @bind-Value:after=OnInputsChanged SearchFunc="SearchStorageLocation" CoerceValue=true></MudAutocomplete> <MudAutocomplete For="@(() => Model.StorageLocation)" T="string" Label="Storage Location" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.StorageLocation @bind-Value:after=OnInputsChanged SearchFunc="Helpers.SearchStorageLocation" CoerceValue=true></MudAutocomplete>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Artifact Type</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Artifact Type</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudAutocomplete T="string" Label="Artifact Type" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.ArtifactType @bind-Value:after=OnInputsChanged SearchFunc="SearchItemTypes" CoerceValue=true></MudAutocomplete> <MudAutocomplete For="@(() => Model.Type)" T="string" Label="Artifact Type" Class="pt-0 mt-0 pl-2 pr-2" @bind-Value=Model.Type @bind-Value:after=OnInputsChanged SearchFunc="Helpers.SearchItemTypes" CoerceValue=true></MudAutocomplete>
@* Tags entry *@ @* Tags entry *@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Tags</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Tags</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="string" @ref="@_tagsChipContainer" @bind-Items="Model.Tags"> <ChipContainer T="string" @ref="@_tagsChipContainer" @bind-Items="Model.Tags">
<InputContent> <InputContent>
<MudAutocomplete <MudAutocomplete T="string"
T="string"
OnInternalInputChanged="OnInputsChanged" OnInternalInputChanged="OnInputsChanged"
SearchFunc="SearchTags" SearchFunc="Helpers.SearchTags"
Value="_tagsInputValue" Value="_tagsInputValue"
ValueChanged="OnTagsInputTextChanged" ValueChanged="OnTagsInputTextChanged"
OnKeyDown="@(ev => HandleChipContainerEnter<string>(ev, _tagsChipContainer, _tagsInputValue, () => _tagsInputValue = string.Empty))" OnKeyDown="@(ev => HandleChipContainerEnter<string>(ev, _tagsChipContainer, _tagsInputValue, () => _tagsInputValue = string.Empty))"
CoerceValue=true CoerceValue=true
Placeholder="Add Tags..." Placeholder="Add Tags..."
ShowProgressIndicator="true"> ShowProgressIndicator="true"
>
</MudAutocomplete> </MudAutocomplete>
</InputContent> </InputContent>
</ChipContainer> </ChipContainer>
@@ -41,11 +77,10 @@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Listed Names</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Listed Names</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Enter any names of the people associated with this entry.</MudText> <MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Enter any names of the people associated with this entry.</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="string" @ref=_listedNamesChipContainer> <ChipContainer T="string" @ref=_listedNamesChipContainer @bind-Items="Model.ListedNames">
<InputContent> <InputContent>
<MudAutocomplete <MudAutocomplete T="string"
T="string" SearchFunc="Helpers.SearchListedNames"
SearchFunc="SearchListedNames"
OnInternalInputChanged="OnInputsChanged" OnInternalInputChanged="OnInputsChanged"
Value="_listedNamesInputValue" Value="_listedNamesInputValue"
ValueChanged="OnListedNamesTextChanged" ValueChanged="OnListedNamesTextChanged"
@@ -55,30 +90,27 @@
ShowProgressIndicator=true> ShowProgressIndicator=true>
</MudAutocomplete> </MudAutocomplete>
</InputContent> </InputContent>
</ChipContainer> </ChipContainer>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Associated Dates</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Associated Dates</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="DateTime" @ref="_assocaitedDatesChipContainer" DisplayFunc="date=>date.ToShortDateString()"> <ChipContainer T="DateTime" @ref="_assocaitedDatesChipContainer" @bind-Items="Model.AssociatedDates" DisplayFunc="date => date.ToShortDateString()">
<InputContent> <InputContent>
<MudDatePicker @bind-Date=_associatedDateInputValue> <MudDatePicker @bind-Date=_associatedDateInputValue>
</MudDatePicker> </MudDatePicker>
</InputContent> </InputContent>
<SubmitButton> <SubmitButton>
<MudButton <MudButton Color="Color.Primary"
Color="Color.Primary"
OnClick="HandleAssociatedDateChipContainerAdd">+</MudButton> OnClick="HandleAssociatedDateChipContainerAdd">+</MudButton>
</SubmitButton> </SubmitButton>
</ChipContainer> </ChipContainer>
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Defects</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Defects</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="string" @ref=_defectsChipContainer> <ChipContainer T="string" @ref=_defectsChipContainer @bind-Items="Model.Defects">
<InputContent> <InputContent>
<MudAutocomplete <MudAutocomplete T="string"
T="string" SearchFunc="Helpers.SearchDefects"
SearchFunc="SearchDefects"
OnInternalInputChanged="OnInputsChanged" OnInternalInputChanged="OnInputsChanged"
Value="_defectsInputValue" Value="_defectsInputValue"
ValueChanged="OnDefectsValueChanged" ValueChanged="OnDefectsValueChanged"
@@ -93,14 +125,13 @@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Related Artifacts</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Related Artifacts</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Tag this entry with the identifier of any other entry to link them.</MudText> <MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Tag this entry with the identifier of any other entry to link them.</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<ChipContainer T="ArtifactGrouping" @ref="_assocaitedArtifactsChipContainer" DisplayFunc="artifact => artifact.ArtifactGroupingIdentifier"> <ChipContainer T="ArtifactEntry" @ref="_assocaitedArtifactsChipContainer" @bind-Items="Model.RelatedArtifacts" DisplayFunc="artifact => artifact.ArtifactIdentifier">
<InputContent> <InputContent>
<MudAutocomplete <MudAutocomplete T="ArtifactEntry"
T="ArtifactGrouping"
OnInternalInputChanged="OnInputsChanged" OnInternalInputChanged="OnInputsChanged"
Value="_associatedArtifactValue" Value="_associatedArtifactValue"
ValueChanged="OnAssociatedArtifactChanged" ValueChanged="OnAssociatedArtifactChanged"
OnKeyDown="@(EventArgs=>HandleChipContainerEnter<ArtifactGrouping>(EventArgs, _assocaitedArtifactsChipContainer, _associatedArtifactValue, () => _associatedArtifactValue = null))" OnKeyDown="@(EventArgs=>HandleChipContainerEnter<ArtifactEntry>(EventArgs, _assocaitedArtifactsChipContainer, _associatedArtifactValue, () => _associatedArtifactValue = null))"
CoerceValue="false" CoerceValue="false"
Placeholder="Link artifact groupings..." Placeholder="Link artifact groupings..."
ShowProgressIndicator=true> ShowProgressIndicator=true>
@@ -111,24 +142,35 @@
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Artifact Text Contents</MudText> <MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Artifact Text Contents</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Input the text transcription of the words on the artifact if applicable to aid the search engine.</MudText> <MudText Typo="Typo.caption" Color="Color.Secondary" Class="pb-2">Input the text transcription of the words on the artifact if applicable to aid the search engine.</MudText>
<MudDivider DividerType="DividerType.Middle"></MudDivider> <MudDivider DividerType="DividerType.Middle"></MudDivider>
<MudTextField T="string" Value=_artifactTextContent ValueChanged="OnArtifactTextContentChanged"></MudTextField> <MudTextField T="string"
Value=_artifactTextContent
ValueChanged="OnArtifactTextContentChanged"
Lines="5"
For="@(() => Model.FileTextContent)"></MudTextField>
<MudText Typo=Typo.h6 Color="Color.Primary">Additional files</MudText>
<UploadDropBox FilesUploaded="OnFilesUploaded"></UploadDropBox>
</MudPaper> </MudPaper>
@inject IArtifactDefectProvider DefectsProvider;
@inject IArtifactStorageLocationProvider StorageLocationProvider;
@inject IArchiveEntryTagProvider TagsProvider;
@inject IArtifactTypeProvider TypesProvider;
@inject IListedNameProvider ListedNameProvider;
@code { @code {
[Parameter] [Parameter]
public required FilePathListing FilePath { get; set; } public required FilePathListing MainFilePath { get; set; }
[Parameter] [Parameter]
public EventCallback OnValueChanged { get; set; } public EventCallback<ArtifactEntryValidationModel> ModelChanged { get; set; }
[Parameter] [Parameter]
public required ArtifactEntryValidationModel Model { get; set; } = new(){StorageLocation="hello", Title="Hello"}; public EventCallback InputsChanged { get; set; }
[Parameter]
public required ArtifactEntryValidationModel Model { get; set; } = new() { StorageLocation = "hello", Title = "Hello" };
[Parameter]
public required int ArtifactEntryIndex {get; set;}
[Parameter]
public EventCallback<int> OnEntryDeletedClicked { get; set; }
private ChipContainer<string> _tagsChipContainer; private ChipContainer<string> _tagsChipContainer;
@@ -146,49 +188,86 @@
private string _defectsInputValue = ""; private string _defectsInputValue = "";
private ChipContainer<ArtifactGrouping> _assocaitedArtifactsChipContainer; private ChipContainer<ArtifactEntry> _assocaitedArtifactsChipContainer;
private ArtifactGrouping? _associatedArtifactValue = null; private ArtifactEntry? _associatedArtifactValue = null;
private string _artifactTextContent = ""; private string _artifactTextContent = "";
public Task OnInputsChanged() public bool IsValid { get; set; }
public List<ValidationResult> ValidationResults { get; private set; } = [];
public async Task OnInputsChanged()
{ {
return OnValueChanged.InvokeAsync(); // 1. Clear previous validation errors
ValidationResults.Clear();
var validationContext = new ValidationContext(Model);
// 2. Run the validator
IsValid = Validator.TryValidateObject(Model, validationContext, ValidationResults, validateAllProperties: true);
// 3. REMOVE this line. Let the parent's update trigger the re-render.
// StateHasChanged();
await InputsChanged.InvokeAsync();
}
private async Task OnFilesUploaded(List<FilePathListing> filePathListings)
{
if (MainFilePath is not null)
{
Model.Files = [MainFilePath];
} else
{
Model.Files = [];
}
Model.Files.AddRange(filePathListings);
}
private async Task OnFilesCleared()
{
if (MainFilePath is not null) {
Model.Files = [MainFilePath];
} else
{
Model.Files = [];
}
} }
private Task OnDefectsValueChanged(string text) private Task OnDefectsValueChanged(string text)
{ {
_defectsInputValue = text; _defectsInputValue = text;
return OnValueChanged.InvokeAsync(); return ModelChanged.InvokeAsync(Model);
} }
private Task OnTagsInputTextChanged(string text) private Task OnTagsInputTextChanged(string text)
{ {
_tagsInputValue = text; _tagsInputValue = text;
return OnValueChanged.InvokeAsync(); return ModelChanged.InvokeAsync(Model);
} }
private Task OnListedNamesTextChanged(string text) private Task OnListedNamesTextChanged(string text)
{ {
_listedNamesInputValue = text; _listedNamesInputValue = text;
return OnValueChanged.InvokeAsync(); return ModelChanged.InvokeAsync(Model);
} }
private Task OnAssociatedArtifactChanged(ArtifactGrouping grouping) private Task OnAssociatedArtifactChanged(ArtifactEntry grouping)
{ {
if (grouping is not null) if (grouping is not null)
{ {
_associatedArtifactValue = grouping; _associatedArtifactValue = grouping;
return OnValueChanged.InvokeAsync(); return ModelChanged.InvokeAsync(Model);
} }
return OnValueChanged.InvokeAsync(); return ModelChanged.InvokeAsync(Model);
} }
private Task OnArtifactTextContentChanged(string value) private Task OnArtifactTextContentChanged(string value)
{ {
return OnValueChanged.InvokeAsync(); Model.FileTextContent = value;
return ModelChanged.InvokeAsync(Model);
} }
public async Task HandleChipContainerEnter<Type>(KeyboardEventArgs args, ChipContainer<Type> container, Type value, Action resetInputAction) public async Task HandleChipContainerEnter<Type>(KeyboardEventArgs args, ChipContainer<Type> container, Type value, Action resetInputAction)
@@ -198,7 +277,7 @@
await container.AddItem(value); await container.AddItem(value);
resetInputAction?.Invoke(); resetInputAction?.Invoke();
StateHasChanged(); StateHasChanged();
await OnValueChanged.InvokeAsync(); await ModelChanged.InvokeAsync(Model);
} }
} }
@@ -206,84 +285,17 @@
{ {
if (_associatedDateInputValue is not null) if (_associatedDateInputValue is not null)
{ {
await _assocaitedDatesChipContainer.AddItem((DateTime)_associatedDateInputValue); DateTime unspecifiedDate = (DateTime)_associatedDateInputValue;
DateTime utcDate = DateTime.SpecifyKind(unspecifiedDate, DateTimeKind.Utc);
await _assocaitedDatesChipContainer.AddItem(utcDate);
_associatedDateInputValue = default; _associatedDateInputValue = default;
} }
} }
private async Task OnDeleteEntryClicked(MouseEventArgs args)
private async Task<IEnumerable<string>> SearchDefects(string value, CancellationToken cancellationToken)
{ {
List<string> defects; await OnEntryDeletedClicked.InvokeAsync(ArtifactEntryIndex);
if (string.IsNullOrEmpty(value))
{
defects = new((await DefectsProvider.Top(25) ?? []).Select(prop => prop.Description));
}
else
{
defects = new((await DefectsProvider.Search(value) ?? []).Select(prop => prop.Description));
}
return defects;
}
private async Task<IEnumerable<string>> SearchStorageLocation(string value, CancellationToken cancellationToken)
{
List<string> storageLocations;
if (string.IsNullOrEmpty(value))
{
storageLocations = new((await StorageLocationProvider.Top(25) ?? []).Select(prop => prop.Location));
}
else
{
storageLocations = new((await StorageLocationProvider.Search(value) ?? []).Select(prop => prop.Location));
}
return storageLocations;
}
private async Task<IEnumerable<string>> SearchTags(string value, CancellationToken cancellationToken)
{
List<string> tags;
if (string.IsNullOrEmpty(value))
{
tags = new((await TagsProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
tags = new((await TagsProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return tags;
}
private async Task<IEnumerable<string>> SearchItemTypes(string value, CancellationToken cancellationToken)
{
List<string> itemTypes;
if (string.IsNullOrEmpty(value))
{
itemTypes = new((await TypesProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
itemTypes = new((await TypesProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return itemTypes;
}
private async Task<IEnumerable<string>> SearchListedNames(string value, CancellationToken cancellationToken)
{
List<string> names;
if (string.IsNullOrEmpty(value))
{
names = new((await ListedNameProvider.Top(25) ?? []).Select(prop=>$"{prop.FirstName} {prop.LastName}"));
}
else
{
names = new((await ListedNameProvider.Search(value) ?? []).Select(prop=>$"{prop.FirstName} {prop.LastName}"));
}
return names;
} }
} }

View File

@@ -0,0 +1,125 @@
<MudDataGrid
T="ArtifactGroupingRowElement"
MultiSelection=true
Items="ArtifactGroupingRows"
Filterable=false
SelectOnRowClick=true
@ref=@DataGrid>
<ToolBarContent>
<MudButton
Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Delete"
Color="Color.Error"
OnClick="OnDeleteClicked">Delete</MudButton>
</ToolBarContent>
<Columns>
<SelectColumn T="ArtifactGroupingRowElement"/>
<PropertyColumn
Title="Id"
Property="x=>x.ArtifactGroupingIdentifier"
Filterable="false"/>
<PropertyColumn
Title="Category"
Property="x=>x.CategoryName"
Filterable="false"/>
<PropertyColumn
Title="Title"
Property="x=>x.Title"
Filterable="false"/>
<PropertyColumn
Title="Publically Visible"
Property="x=>x.IsPublicallyVisible"
Filterable="false"/>
<TemplateColumn Title="Edit">
<CellTemplate>
<MudIconButton
Color="Color.Primary"
Icon="@Icons.Material.Filled.Edit"
Variant="Variant.Filled"
OnClick="() => OnRowEditClick(context.Item)">Edit</MudIconButton>
</CellTemplate>
</TemplateColumn>
</Columns>
<PagerContent>
<MudDataGridPager T="ArtifactGroupingRowElement"/>
</PagerContent>
</MudDataGrid>
@inject IArtifactGroupingProvider GroupingProvider;
@inject IDialogService DialogService;
@inject IArtifactGroupingProvider GroupingProvider;
@code
{
public List<ArtifactGroupingRowElement> ArtifactGroupingRows { get; set; } = new();
public MudDataGrid<ArtifactGroupingRowElement> DataGrid { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
// Load inital data
List<ArtifactGrouping> groupings = await GroupingProvider.GetGroupingsPaged(1, 25);
SetGroupingRows(groupings);
await base.OnInitializedAsync();
StateHasChanged();
}
private void SetGroupingRows(IEnumerable<ArtifactGrouping> groupings)
{
ArtifactGroupingRows.Clear();
foreach (var grouping in groupings)
{
ArtifactGroupingRows.Add(new ArtifactGroupingRowElement()
{
ArtifactGroupingIdentifier=grouping.ArtifactGroupingIdentifier ?? throw new ArgumentNullException(nameof(grouping), "Got a null grouping identifier"),
CategoryName=grouping.Category.Name,
Title=grouping.Title,
IsPublicallyVisible=grouping.IsPublicallyVisible,
Id=grouping.Id
}
);
}
}
private void OnRowEditClick(ArtifactGroupingRowElement row)
{
throw new NotImplementedException();
}
private async Task OnDeleteClicked(MouseEventArgs args)
{
HashSet<ArtifactGroupingRowElement> selected = DataGrid.SelectedItems;
bool? confirmed = await DialogService.ShowMessageBox
(
new MessageBoxOptions(){
Message=$"Are you sure you want to delete {selected.Count} groupings?",
Title="Delete Groupings",
CancelText="Cancel",
YesText="Delete"
});
if (confirmed is not null && (confirmed ?? throw new ArgumentNullException("confirmed was null")))
{
foreach (var grouping in selected)
{
await GroupingProvider.DeleteGroupingAsync(grouping.Id);
StateHasChanged();
}
}
}
}

View File

@@ -0,0 +1,316 @@
using Microsoft.EntityFrameworkCore;
using OpenArchival.DataAccess;
namespace OpenArchival.Blazor;
public class ArtifactEntrySharedHelpers
{
IArtifactDefectProvider DefectsProvider { get; set; }
IArtifactStorageLocationProvider StorageLocationProvider { get; set; }
IArchiveEntryTagProvider TagsProvider { get; set; }
IArtifactTypeProvider TypesProvider { get; set; }
IListedNameProvider ListedNameProvider { get; set; }
IDbContextFactory<ApplicationDbContext> DbContextFactory { get; set; }
public ArtifactEntrySharedHelpers(IArtifactDefectProvider defectsProvider, IArtifactStorageLocationProvider storageLocationProvider, IArchiveEntryTagProvider tagsProvider, IArtifactTypeProvider typesProvider, IListedNameProvider listedNamesProvider, IDbContextFactory<ApplicationDbContext> contextFactory)
{
DefectsProvider = defectsProvider;
StorageLocationProvider = storageLocationProvider;
TagsProvider = tagsProvider;
TypesProvider = typesProvider;
ListedNameProvider = listedNamesProvider;
DbContextFactory = contextFactory;
}
public async Task<IEnumerable<string>> SearchDefects(string value, CancellationToken cancellationToken)
{
List<string> defects;
if (string.IsNullOrEmpty(value))
{
defects = new((await DefectsProvider.Top(25) ?? []).Select(prop => prop.Description));
}
else
{
defects = new((await DefectsProvider.Search(value) ?? []).Select(prop => prop.Description));
}
return defects;
}
public async Task<IEnumerable<string>> SearchStorageLocation(string value, CancellationToken cancellationToken)
{
List<string> storageLocations;
if (string.IsNullOrEmpty(value))
{
storageLocations = new((await StorageLocationProvider.Top(25) ?? []).Select(prop => prop.Location));
}
else
{
storageLocations = new((await StorageLocationProvider.Search(value) ?? []).Select(prop => prop.Location));
}
return storageLocations;
}
public async Task<IEnumerable<string>> SearchTags(string value, CancellationToken cancellationToken)
{
List<string> tags;
if (string.IsNullOrEmpty(value))
{
tags = new((await TagsProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
tags = new((await TagsProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return tags;
}
public async Task<IEnumerable<string>> SearchItemTypes(string value, CancellationToken cancellationToken)
{
List<string> itemTypes;
if (string.IsNullOrEmpty(value))
{
itemTypes = new((await TypesProvider.Top(25) ?? []).Select(prop => prop.Name));
}
else
{
itemTypes = new((await TypesProvider.Search(value) ?? []).Select(prop => prop.Name));
}
return itemTypes;
}
public async Task<IEnumerable<string>> SearchListedNames(string value, CancellationToken cancellationToken)
{
List<ListedName> names;
if (string.IsNullOrEmpty(value))
{
names = new((await ListedNameProvider.Top(25) ?? []));
}
else
{
names = new((await ListedNameProvider.Search(value) ?? []));
}
return names.Select(p => p.Value);
}
public async Task OnGroupingPublished(ArtifactGroupingValidationModel model)
{
await using var context = await DbContextFactory.CreateDbContextAsync();
var grouping = model.ToArtifactGrouping();
// Caches to track entities processed within this transaction
var processedFilePaths = new Dictionary<string, FilePathListing>();
var processedLocations = new Dictionary<string, ArtifactStorageLocation>();
var processedTags = new Dictionary<string, ArtifactEntryTag>();
var processedDefects = new Dictionary<string, ArtifactDefect>();
var processedTypes = new Dictionary<string, ArtifactType>();
var processedNames = new Dictionary<string, ListedName>();
// Process File Paths for each entry first
foreach (var entry in grouping.ChildArtifactEntries)
{
if (entry.Files is { Count: > 0 })
{
var correctedFileList = new List<FilePathListing>();
foreach (var fileListing in entry.Files)
{
var path = fileListing.Path;
if (string.IsNullOrWhiteSpace(path)) continue;
if (processedFilePaths.TryGetValue(path, out var trackedFile))
{
correctedFileList.Add(trackedFile);
}
else
{
var existingFile = await context.ArtifactFilePaths
.FirstOrDefaultAsync(f => f.Path == path);
if (existingFile != null)
{
correctedFileList.Add(existingFile);
processedFilePaths[path] = existingFile;
}
else
{
correctedFileList.Add(fileListing);
processedFilePaths[path] = fileListing;
}
}
}
entry.Files = correctedFileList;
}
}
// Process all other related entities for each entry
foreach (var entry in grouping.ChildArtifactEntries)
{
// Attach entry to its parent grouping
entry.ArtifactGrouping = grouping;
// --- Process Storage Location ---
var locationName = entry.StorageLocation?.Location;
if (!string.IsNullOrWhiteSpace(locationName))
{
if (processedLocations.TryGetValue(locationName, out var trackedLocation))
{
entry.StorageLocation = trackedLocation;
}
else
{
var existingLocation = await context.ArtifactStorageLocations
.FirstOrDefaultAsync(l => l.Location == locationName);
if (existingLocation != null)
{
entry.StorageLocation = existingLocation;
processedLocations[locationName] = existingLocation;
}
else
{
processedLocations[locationName] = entry.StorageLocation;
}
}
}
// --- Process Tags ---
if (entry.Tags is { Count: > 0 })
{
var correctedTagList = new List<ArtifactEntryTag>();
foreach (var tag in entry.Tags)
{
var tagName = tag.Name;
if (string.IsNullOrWhiteSpace(tagName)) continue;
if (processedTags.TryGetValue(tagName, out var trackedTag))
{
correctedTagList.Add(trackedTag);
}
else
{
var existingTag = await context.ArtifactEntryTags.FirstOrDefaultAsync(t => t.Name == tagName);
if (existingTag != null)
{
correctedTagList.Add(existingTag);
processedTags[tagName] = existingTag;
}
else
{
correctedTagList.Add(tag);
processedTags[tagName] = tag;
}
}
}
entry.Tags = correctedTagList;
}
// --- Process Defects ---
if (entry.Defects is { Count: > 0 })
{
var correctedDefectList = new List<ArtifactDefect>();
foreach (var defect in entry.Defects)
{
var defectDesc = defect.Description;
if (string.IsNullOrWhiteSpace(defectDesc)) continue;
if (processedDefects.TryGetValue(defectDesc, out var trackedDefect))
{
correctedDefectList.Add(trackedDefect);
}
else
{
var existingDefect = await context.ArtifactDefects.FirstOrDefaultAsync(d => d.Description == defectDesc);
if (existingDefect != null)
{
correctedDefectList.Add(existingDefect);
processedDefects[defectDesc] = existingDefect;
}
else
{
correctedDefectList.Add(defect);
processedDefects[defectDesc] = defect;
}
}
}
entry.Defects = correctedDefectList;
}
// --- Process Types ---
if (entry.Type is not null)
{
var typeName = entry.Type.Name;
if (!string.IsNullOrWhiteSpace(typeName))
{
if (processedTypes.TryGetValue(typeName, out var trackedType))
{
entry.Type = trackedType;
}
else
{
var existingType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == typeName);
if (existingType != null)
{
entry.Type = existingType;
processedTypes[typeName] = existingType;
}
else
{
processedTypes[typeName] = entry.Type;
}
}
}
}
// --- Process Listed Names ---
if (entry.ListedNames is { Count: > 0 })
{
var correctedNameList = new List<ListedName>();
foreach (var name in entry.ListedNames)
{
var nameValue = name.Value;
if (string.IsNullOrWhiteSpace(nameValue)) continue;
if (processedNames.TryGetValue(nameValue, out var trackedName))
{
correctedNameList.Add(trackedName);
}
else
{
var existingName = await context.ArtifactAssociatedNames
.FirstOrDefaultAsync(n => n.Value == nameValue);
if (existingName != null)
{
correctedNameList.Add(existingName);
processedNames[nameValue] = existingName;
}
else
{
correctedNameList.Add(name);
processedNames[nameValue] = name;
}
}
}
entry.ListedNames = correctedNameList;
}
}
if (grouping.Category != null && grouping.Category.Id > 0)
{
context.Attach(grouping.Category);
}
// Add the entire graph. EF Core will correctly handle new vs. existing entities.
context.ArtifactGroupings.Add(grouping);
await context.SaveChangesAsync();
}
}

View File

@@ -1,37 +0,0 @@
using System.ComponentModel.DataAnnotations;
using OpenArchival.DataAccess;
namespace OpenArchival.Blazor;
public class ArchiveItemValidationModel
{
[Required(ErrorMessage = "A category is required", AllowEmptyStrings = false)]
public string Category { get; set; } = "";
[Required(ErrorMessage = "An item identifier is required", AllowEmptyStrings = false)]
public List<IdentifierFieldValidationModel> IdentifierFields { get; set; } = new();
public string Identifier { get; set; } = "";
[Required(ErrorMessage = "An item title is required", AllowEmptyStrings = false)]
public string Title { get; set; } = "";
public string? Description { get; set; }
public string? StorageLocation { get; set; }
public string? ArtifactType { get; set; }
public List<string> Tags { get; set; } = new();
public List<string> AssociatedNames { get; set; } = new();
public List<DateTime> AssociatedDates { get; set; } = new();
public List<string> Defects { get; set; } = new();
public List<string> RelatedArtifacts { get; set; } = new();
public bool IsPublic { get; set; } = true;
}

View File

@@ -4,19 +4,19 @@ using Microsoft.IdentityModel.Tokens;
using OpenArchival.DataAccess; using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
public class ArtifactEntryValidationModel : IValidatableObject public class ArtifactEntryValidationModel
{ {
[Required(AllowEmptyStrings = false, ErrorMessage = "An artifact numbering must be supplied")] [Required(AllowEmptyStrings = false, ErrorMessage = "An artifact numbering must be supplied")]
public string? ArtifactNumber { get; set; } public string? ArtifactNumber { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "A title must be provided")] [Required(AllowEmptyStrings = false, ErrorMessage = "A title must be provided")]
public required string Title { get; set; } public string? Title { get; set; }
public string? Description { get; set; } public string? Description { get; set; }
public string? Type { get; set; } public string? Type { get; set; }
public required string? StorageLocation { get; set; } public string? StorageLocation { get; set; }
public List<string>? Tags { get; set; } = []; public List<string>? Tags { get; set; } = [];
@@ -28,22 +28,70 @@ public class ArtifactEntryValidationModel : IValidatableObject
public List<string>? Links { get; set; } = []; public List<string>? Links { get; set; } = [];
public string? ArtifactType { get; set; }
public List<FilePathListing>? Files { get; set; } = []; public List<FilePathListing>? Files { get; set; } = [];
public Dictionary<string, string>? FileTextContent { get; set; } = []; public string? FileTextContent { get; set; }
public List<ArtifactEntry> RelatedArtifacts { get; set; } = [];
/*
public IEnumerable<ValidationResult> Validate(ValidationContext context) public IEnumerable<ValidationResult> Validate(ValidationContext context)
{ {
if (Links.IsNullOrEmpty() && Files.IsNullOrEmpty())
}
*/
public bool IsPublicallyVisible { get; set; }
public ArtifactEntry ToArtifactEntry(ArtifactGrouping? parent = null)
{ {
yield return new ValidationResult( List<ArtifactEntryTag> tags = new();
"Either uploaded files or add content links", if (Tags is not null)
new[] {nameof(Links), nameof(Files)} {
); foreach (var tag in Tags)
{
tags.Add(new ArtifactEntryTag() { Name = tag });
} }
} }
public bool IsPublicallyVisible { get; set; } List<ArtifactDefect> defects = new();
foreach (var defect in Defects)
{
defects.Add(new ArtifactDefect() { Description=defect});
}
var entry = new ArtifactEntry()
{
Files = Files,
Type = new DataAccess.ArtifactType() { Name = Type },
ArtifactNumber = ArtifactNumber,
AssociatedDates = AssociatedDates,
Defects = defects,
Links = Links,
StorageLocation = null,
Description = Description,
FileTextContent = FileTextContent,
IsPubliclyVisible = IsPublicallyVisible,
Tags = tags,
Title = Title,
ArtifactGrouping = parent,
RelatedTo = RelatedArtifacts,
};
List<ListedName> listedNames = new();
foreach (var name in ListedNames)
{
listedNames.Add(new ListedName() { ParentArtifactEntry=entry, Value=name});
}
entry.ListedNames = listedNames;
if (!string.IsNullOrEmpty(StorageLocation))
{
entry.StorageLocation = new ArtifactStorageLocation() { Location = StorageLocation };
}
return entry;
}
} }

View File

@@ -1,14 +1,76 @@
using OpenArchival.DataAccess; using Microsoft.IdentityModel.Tokens;
using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations;
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor;
public class ArtifactGroupingValidationModel public class ArtifactGroupingValidationModel : IValidatableObject
{ {
public required ArchiveCategory Category { get; set; } [Required(ErrorMessage = "A grouping title is required.")]
public string? Title { get; set; }
public List<string>? IdentifierFieldValues { get; set; } [Required(ErrorMessage = "A grouping description is required.")]
public string? Description { get; set; }
public List<ArtifactEntryValidationModel>? ArtifactEntries { get; set; } [Required(ErrorMessage = "A type is required.")]
public string? Type { get; set; }
public ArchiveCategory? Category { get; set; }
public List<IdentifierFieldValidationModel> IdentifierFieldValues { get; set; } = new();
public List<ArtifactEntryValidationModel> ArtifactEntries { get; set; } = new();
public bool IsPublicallyVisible { get; set; } public bool IsPublicallyVisible { get; set; }
public ArtifactGrouping ToArtifactGrouping()
{
IdentifierFields identifierFields = new();
identifierFields.Values = IdentifierFieldValues.Select(p => p.Value).ToList();
List<ArtifactEntry> entries = [];
foreach (var entry in ArtifactEntries)
{
entries.Add(entry.ToArtifactEntry());
}
var grouping = new ArtifactGrouping()
{
Title = Title,
Description = Description,
Category = Category,
IdentifierFields = identifierFields,
IsPublicallyVisible = true,
ChildArtifactEntries = entries,
Type = Type
};
// Create the parent link
foreach (var entry in grouping.ChildArtifactEntries)
{
entry.ArtifactGrouping = grouping;
}
return grouping;
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach (var entry in ArtifactEntries)
{
var context = new ValidationContext(entry);
var validationResult = new List<ValidationResult>();
bool valid = Validator.TryValidateObject(entry, context, validationResult);
foreach (var result in validationResult)
{
yield return result;
}
}
if (ArtifactEntries.IsNullOrEmpty())
{
yield return new ValidationResult("Must upload one or more files");
}
}
} }

View File

@@ -1,14 +1,28 @@
@using Microsoft.EntityFrameworkCore; @using Microsoft.EntityFrameworkCore;
@using MudBlazor.Interfaces
@page "/categorieslist" @page "/categorieslist"
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3"> <MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h6">Categories</MudText> <MudText Typo="Typo.h6">Categories</MudText>
<MudDivider></MudDivider> <MudDivider Class="mb-2"></MudDivider>
<MudList T="string"> <MudList T="string" Clickable="true">
@foreach (ArchiveCategory category in _categories) @foreach (ArchiveCategory category in _categories)
{ {
<MudListItem Text=@category.Name OnClick="@(() => OnCategoryItemClicked(category))"></MudListItem> <MudListItem OnClick="@(() => OnCategoryItemClicked(category))">
@category.Name
@if (ShowDeleteButton)
{
<MudListItemMeta ActionPosition="ActionPosition.End">
<MudIconButton
Icon="@Icons.Material.Filled.Delete"
Color="Color.Error"
Size="Size.Small"
OnClick="@((e) => HandleDeleteClick(category))"
/>
</MudListItemMeta>
}
</MudListItem>
} }
</MudList> </MudList>
@ChildContent @ChildContent
@@ -21,41 +35,47 @@
[Parameter] [Parameter]
public RenderFragment ChildContent { get; set; } = default!; public RenderFragment ChildContent { get; set; } = default!;
private List<ArchiveCategory> _categories = new(); [Parameter]
public bool ShowDeleteButton { get; set; } = false;
[Parameter] [Parameter]
public EventCallback<ArchiveCategory> ListItemClickedCallback { get; set; } public EventCallback<ArchiveCategory> ListItemClickedCallback { get; set; }
[Parameter]
public EventCallback<ArchiveCategory> OnDeleteClickedCallback { get; set; }
private List<ArchiveCategory> _categories = new();
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
await LoadCategories();
}
private async Task LoadCategories()
{
var categories = await CategoryProvider.GetAllArchiveCategories(); var categories = await CategoryProvider.GetAllArchiveCategories();
if (categories is null) if (categories is null)
{ {
Logger.LogError("There were no categories in the database when attempting to load the list of categories."); Logger.LogError("There were no categories in the database when attempting to load the list of categories.");
_categories.Clear();
return; return;
} }
_categories = categories.ToList();
_categories.AddRange(categories);
} }
public async Task RefreshData() public async Task RefreshData()
{ {
_categories.Clear(); await LoadCategories();
var categories = await CategoryProvider.GetAllArchiveCategories();
if (categories is null)
{
Logger.LogError("There were no categories in the database when attempting to load the list of categories.");
return;
}
_categories.AddRange(categories);
StateHasChanged(); StateHasChanged();
} }
protected async Task OnCategoryItemClicked(ArchiveCategory category) private async Task OnCategoryItemClicked(ArchiveCategory category)
{ {
await ListItemClickedCallback.InvokeAsync(category); await ListItemClickedCallback.InvokeAsync(category);
} }
private async Task HandleDeleteClick(ArchiveCategory category)
{
await OnDeleteClickedCallback.InvokeAsync(category);
}
} }

View File

@@ -77,6 +77,7 @@
[Parameter] [Parameter]
public string OriginalName { get; set; } = string.Empty; public string OriginalName { get; set; } = string.Empty;
private MudForm _form = default!; private MudForm _form = default!;
private string FormatPreview { get; set; } = string.Empty; private string FormatPreview { get; set; } = string.Empty;

View File

@@ -0,0 +1,22 @@
namespace OpenArchival.Blazor;
public class ArtifactGroupingRowElement
{
public required int Id { get; set; }
public required string ArtifactGroupingIdentifier { get; set; }
public required string CategoryName { get; set; }
public required string Title { get; set; }
public bool IsPublicallyVisible { get; set; }
public override bool Equals(object? o)
{
var other = o as ArtifactGroupingRowElement;
return other?.Id == Id;
}
public override int GetHashCode() => Id.GetHashCode();
}

View File

@@ -1,13 +1,18 @@
@page "/categories" @page "/categories"
@using Microsoft.EntityFrameworkCore
@using OpenArchival.DataAccess; @using OpenArchival.DataAccess;
@inject IDialogService DialogService @inject IDialogService DialogService
@inject IArchiveCategoryProvider CategoryProvider; @inject IArchiveCategoryProvider CategoryProvider;
@inject ArchiveDbContext Context; @inject IDbContextFactory<ApplicationDbContext> DbContextFactory;
@inject ILogger<ViewAddCategoriesComponent> Logger; @inject ILogger<ViewAddCategoriesComponent> Logger;
<CategoriesListComponent @ref=_categoriesListComponent ListItemClickedCallback="ShowFilledDialog"> <CategoriesListComponent
@ref=_categoriesListComponent
ListItemClickedCallback="ShowFilledDialog"
ShowDeleteButton=true
OnDeleteClickedCallback="DeleteCategory">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OnAddClick">Add Category</MudButton> <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OnAddClick">Add Category</MudButton>
</CategoriesListComponent> </CategoriesListComponent>
@@ -15,6 +20,17 @@
@code { @code {
CategoriesListComponent _categoriesListComponent = default!; CategoriesListComponent _categoriesListComponent = default!;
private async Task DeleteCategory(ArchiveCategory category)
{
// 1. Show a confirmation dialog (recommended)
var confirmed = await DialogService.ShowMessageBox("Confirm", $"Delete {category.Name}?", yesText:"Delete", cancelText:"Cancel");
if (confirmed != true) return;
await CategoryProvider.DeleteCategoryAsync(category);
await _categoriesListComponent.RefreshData();
StateHasChanged();
}
private async Task ShowFilledDialog(ArchiveCategory category) private async Task ShowFilledDialog(ArchiveCategory category)
{ {
CategoryValidationModel validationModel = CategoryValidationModel.FromArchiveCategory(category); CategoryValidationModel validationModel = CategoryValidationModel.FromArchiveCategory(category);
@@ -36,7 +52,9 @@
CategoryValidationModel model = (CategoryValidationModel)result.Data; CategoryValidationModel model = (CategoryValidationModel)result.Data;
CategoryValidationModel.UpdateArchiveValidationModel(model, category); CategoryValidationModel.UpdateArchiveValidationModel(model, category);
await Context.SaveChangesAsync();
await using var context = await DbContextFactory.CreateDbContextAsync();
await context.SaveChangesAsync();
StateHasChanged(); StateHasChanged();
await _categoriesListComponent.RefreshData(); await _categoriesListComponent.RefreshData();
@@ -50,8 +68,13 @@
var result = await dialog.Result; var result = await dialog.Result;
if (result is not null && !result.Canceled && _categoriesListComponent is not null) if (result is not null && !result.Canceled && _categoriesListComponent is not null && result.Data is not null)
{ {
await using var context = await DbContextFactory.CreateDbContextAsync();
CategoryValidationModel model = (CategoryValidationModel)result.Data;
context.ArchiveCategories.Add(CategoryValidationModel.ToArchiveCategory(model));
await context.SaveChangesAsync();
StateHasChanged(); StateHasChanged();
await _categoriesListComponent.RefreshData(); await _categoriesListComponent.RefreshData();
} }

View File

@@ -2,8 +2,8 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize] @*@attribute [Authorize]*@
@attribute [Authorize(Roles = "Admin")]
<PageTitle>Auth</PageTitle> <PageTitle>Auth</PageTitle>

View File

@@ -1,9 +0,0 @@
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace OpenArchival.Blazor.Data
{
public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : IdentityDbContext<ApplicationUser>(options)
{
}
}

View File

@@ -1,10 +0,0 @@
using Microsoft.AspNetCore.Identity;
namespace OpenArchival.Blazor.Data
{
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser
{
}
}

View File

@@ -1,279 +0,0 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using OpenArchival.Blazor.Data;
using System;
#nullable disable
namespace OpenArchival.Blazor.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("00000000000000_CreateIdentitySchema")]
partial class CreateIdentitySchema
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("OpenArchival.Blazor.Data.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<int>("AccessFailedCount")
.HasColumnType("int");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("bit");
b.Property<bool>("LockoutEnabled")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("datetimeoffset");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PasswordHash")
.HasColumnType("nvarchar(max)");
b.Property<string>("PhoneNumber")
.HasColumnType("nvarchar(max)");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("bit");
b.Property<string>("SecurityStamp")
.HasColumnType("nvarchar(max)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex")
.HasFilter("[NormalizedUserName] IS NOT NULL");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderKey")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("RoleId")
.HasColumnType("nvarchar(450)");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.Property<string>("Value")
.HasColumnType("nvarchar(max)");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,276 +0,0 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using OpenArchival.Blazor.Data;
using System;
#nullable disable
namespace OpenArchival.Blazor.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("OpenArchival.Blazor.Data.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<int>("AccessFailedCount")
.HasColumnType("int");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("bit");
b.Property<bool>("LockoutEnabled")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("datetimeoffset");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PasswordHash")
.HasColumnType("nvarchar(max)");
b.Property<string>("PhoneNumber")
.HasColumnType("nvarchar(max)");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("bit");
b.Property<string>("SecurityStamp")
.HasColumnType("nvarchar(max)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex")
.HasFilter("[NormalizedUserName] IS NOT NULL");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderKey")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("RoleId")
.HasColumnType("nvarchar(450)");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.Property<string>("Value")
.HasColumnType("nvarchar(max)");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.Blazor.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -12,7 +12,6 @@
<PackageReference Include="CodeBeam.MudExtensions" Version="6.3.0" /> <PackageReference Include="CodeBeam.MudExtensions" Version="6.3.0" />
<PackageReference Include="Dapper" Version="2.1.66" /> <PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="9.*" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="9.*" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.8" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.*" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.*" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.*" />

View File

@@ -2,49 +2,61 @@ using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MudBlazor.Services; using MudBlazor.Services;
using OpenArchival.Blazor;
using OpenArchival.Blazor.Components; using OpenArchival.Blazor.Components;
using OpenArchival.Blazor.Components.Account; using OpenArchival.Blazor.Components.Account;
using OpenArchival.Blazor.Data;
using Dapper;
using Npgsql;
using OpenArchival.DataAccess; using OpenArchival.DataAccess;
using Microsoft.IdentityModel.Tokens; using OpenArchival.Blazor.Components.Account;
using MyAppName.WebApp.Components.Account;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add MudBlazor services // --- UI Services ---
builder.Services.AddMudServices();
// Add services to the container.
builder.Services.AddRazorComponents() builder.Services.AddRazorComponents()
.AddInteractiveServerComponents(); .AddInteractiveServerComponents();
builder.Services.AddMudServices();
builder.Services.AddMudExtensions(); builder.Services.AddMudExtensions();
var postgresConnectionString = builder.Configuration.GetConnectionString("PostgresConnection"); // --- Database & Identity Configuration ---
builder.Services.AddDbContextFactory<ArchiveDbContext> // Get the single connection string for your PostgreSQL database.
( var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
options => options.UseNpgsql(postgresConnectionString)
);
builder.Services.AddOptions<FileUploadOptions>().Bind(builder.Configuration.GetSection(FileUploadOptions.Key)); // Use AddDbContextFactory for Blazor Server. This is safer for managing DbContext lifecycles.
// This single ApplicationDbContext will handle both Identity and your application data.
builder.Services.AddDbContextFactory<ApplicationDbContext>(options =>
options.UseNpgsql(connectionString));
var uploadSettings = builder.Configuration.GetSection(FileUploadOptions.Key).Get<FileUploadOptions>(); builder.Services.AddDatabaseDeveloperPageExceptionFilter();
if (uploadSettings is null)
{
throw new ArgumentNullException(nameof(uploadSettings), $"The provided {nameof(FileUploadOptions)} did not have a max upload size.");
}
builder.Services.AddServerSideBlazor().AddHubOptions(options => // Configure Identity to use ApplicationDbContext, which is now pointed at PostgreSQL.
{ builder.Services.AddIdentityCore<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
options.MaximumReceiveMessageSize = uploadSettings.MaxUploadSizeBytes; .AddRoles<IdentityRole>()
}); .AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddCascadingAuthenticationState(); builder.Services.AddCascadingAuthenticationState();
builder.Services.AddScoped<IdentityUserAccessor>(); builder.Services.AddScoped<IdentityUserAccessor>();
builder.Services.AddScoped<IdentityRedirectManager>(); builder.Services.AddScoped<IdentityRedirectManager>();
builder.Services.AddScoped<AuthenticationStateProvider, IdentityRevalidatingAuthenticationStateProvider>(); builder.Services.AddScoped<AuthenticationStateProvider, IdentityRevalidatingAuthenticationStateProvider>();
builder.Services.AddSingleton<IEmailSender<ApplicationUser>, IdentityNoOpEmailSender>();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();
// --- File Upload Configuration ---
builder.Services.AddOptions<FileUploadOptions>().Bind(builder.Configuration.GetSection(FileUploadOptions.Key));
var uploadSettings = builder.Configuration.GetSection(FileUploadOptions.Key).Get<FileUploadOptions>() ?? throw new ArgumentNullException("FileUploadOptions");
builder.Services.AddServerSideBlazor().AddHubOptions(options =>
{
options.MaximumReceiveMessageSize = uploadSettings.MaxUploadSizeBytes;
});
// --- Custom Application Services ---
builder.Services.AddScoped<IArchiveCategoryProvider, ArchiveCategoryProvider>(); builder.Services.AddScoped<IArchiveCategoryProvider, ArchiveCategoryProvider>();
builder.Services.AddScoped<IFilePathListingProvider, FilePathListingProvider>(); builder.Services.AddScoped<IFilePathListingProvider, FilePathListingProvider>();
builder.Services.AddScoped<IArtifactStorageLocationProvider, ArtifactStorageLocationProvider>(); builder.Services.AddScoped<IArtifactStorageLocationProvider, ArtifactStorageLocationProvider>();
@@ -52,30 +64,28 @@ builder.Services.AddScoped<IArtifactDefectProvider, ArtifactDefectProvider>();
builder.Services.AddScoped<IArtifactTypeProvider, ArtifactTypeProvider>(); builder.Services.AddScoped<IArtifactTypeProvider, ArtifactTypeProvider>();
builder.Services.AddScoped<IArchiveEntryTagProvider, ArchiveEntryTagProvider>(); builder.Services.AddScoped<IArchiveEntryTagProvider, ArchiveEntryTagProvider>();
builder.Services.AddScoped<IListedNameProvider, ListedNameProvider>(); builder.Services.AddScoped<IListedNameProvider, ListedNameProvider>();
builder.Services.AddScoped<ArtifactEntrySharedHelpers>();
builder.Services.AddAuthentication(options => builder.Services.AddScoped<IArtifactGroupingProvider, ArtifactGroupingProvider>();
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddIdentityCore<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddSingleton<IEmailSender<ApplicationUser>, IdentityNoOpEmailSender>();
builder.Services.AddLogging(); builder.Services.AddLogging();
var app = builder.Build(); var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var serviceProvider = scope.ServiceProvider;
try
{
await IdentityDataSeeder.SeedRolesAndAdminUserAsync(serviceProvider);
}
catch (Exception ex)
{
// Log errors or handle them as needed
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database.");
}
}
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
{ {
@@ -84,38 +94,16 @@ if (app.Environment.IsDevelopment())
else else
{ {
app.UseExceptionHandler("/Error", createScopeForErrors: true); app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts(); app.UseHsts();
} }
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery(); app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>() app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode(); .AddInteractiveServerRenderMode();
// Add additional endpoints required by the Identity /Account Razor components.
app.MapAdditionalIdentityEndpoints(); app.MapAdditionalIdentityEndpoints();
await InitializeDatabaseAsync(app.Services);
async Task InitializeDatabaseAsync(IServiceProvider services)
{
using var scope = services.CreateScope();
var serviceProvider = scope.ServiceProvider;
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
var categoryProvider = serviceProvider.GetRequiredService<IArchiveCategoryProvider>();
// await categoryProvider.CreateCategoryAsync(new ArchiveCategory {Name="Yearbooks", Description="This is a description", FieldSeparator="-", FieldNames = [], FieldDescriptions = [] });
}
app.Run(); app.Run();
//TODO: Periodic clean of the uploaded files to prune ones not in the database

View File

@@ -1,6 +1,6 @@
{ {
"ConnectionStrings": { "ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-OpenArchival.Blazor-2bdd9108-567b-4b19-b97f-47edace03070;Trusted_Connection=True;MultipleActiveResultSets=true", "DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=",
"PostgresConnection": "Host=localhost;Database=postgres;Username=postgres;Password=" "PostgresConnection": "Host=localhost;Database=postgres;Username=postgres;Password="
}, },
"Logging": { "Logging": {

View File

@@ -11,7 +11,6 @@
"CodeBeam.MudExtensions": "6.3.0", "CodeBeam.MudExtensions": "6.3.0",
"Dapper": "2.1.66", "Dapper": "2.1.66",
"Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "9.0.8", "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "9.0.8",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore": "9.0.8", "Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore.SqlServer": "9.0.8", "Microsoft.EntityFrameworkCore.SqlServer": "9.0.8",
"Microsoft.EntityFrameworkCore.Tools": "9.0.8", "Microsoft.EntityFrameworkCore.Tools": "9.0.8",
@@ -1196,14 +1195,7 @@
} }
} }
}, },
"System.Formats.Asn1/9.0.8": { "System.Formats.Asn1/9.0.8": {},
"runtime": {
"lib/net9.0/System.Formats.Asn1.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36511"
}
}
},
"System.IdentityModel.Tokens.Jwt/6.35.0": { "System.IdentityModel.Tokens.Jwt/6.35.0": {
"dependencies": { "dependencies": {
"Microsoft.IdentityModel.JsonWebTokens": "6.35.0", "Microsoft.IdentityModel.JsonWebTokens": "6.35.0",
@@ -1314,14 +1306,7 @@
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "System.Runtime.CompilerServices.Unsafe": "6.0.0"
} }
}, },
"System.Text.Json/9.0.8": { "System.Text.Json/9.0.8": {},
"runtime": {
"lib/net9.0/System.Text.Json.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36511"
}
}
},
"System.Threading.Channels/7.0.0": {}, "System.Threading.Channels/7.0.0": {},
"System.Threading.Tasks.Extensions/4.5.4": {}, "System.Threading.Tasks.Extensions/4.5.4": {},
"System.Windows.Extensions/6.0.0": { "System.Windows.Extensions/6.0.0": {
@@ -1346,6 +1331,7 @@
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"dependencies": { "dependencies": {
"EntityFramework": "6.5.1", "EntityFramework": "6.5.1",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore": "9.0.8", "Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Npgsql": "9.0.3", "Npgsql": "9.0.3",

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"ContentRoots":["E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","E:\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}} {"ContentRoots":["D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}

View File

@@ -9,9 +9,10 @@
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"dependencies": { "dependencies": {
"EntityFramework": "6.5.1", "EntityFramework": "6.5.1",
"Microsoft.EntityFrameworkCore": "9.0.7", "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore.Design": "9.0.7", "Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7", "Microsoft.EntityFrameworkCore.Design": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Npgsql": "9.0.3", "Npgsql": "9.0.3",
"Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.4" "Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.4"
}, },
@@ -46,6 +47,37 @@
} }
} }
}, },
"Microsoft.AspNetCore.Cryptography.Internal/9.0.8": {
"runtime": {
"lib/net9.0/Microsoft.AspNetCore.Cryptography.Internal.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.AspNetCore.Cryptography.KeyDerivation/9.0.8": {
"dependencies": {
"Microsoft.AspNetCore.Cryptography.Internal": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.AspNetCore.Cryptography.KeyDerivation.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.AspNetCore.Identity.EntityFrameworkCore/9.0.8": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Relational": "9.0.8",
"Microsoft.Extensions.Identity.Stores": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll": {
"assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.Bcl.AsyncInterfaces/7.0.0": { "Microsoft.Bcl.AsyncInterfaces/7.0.0": {
"runtime": { "runtime": {
"lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
@@ -288,7 +320,7 @@
"Microsoft.Build.Framework": "17.8.3", "Microsoft.Build.Framework": "17.8.3",
"Microsoft.CodeAnalysis.Common": "4.8.0", "Microsoft.CodeAnalysis.Common": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0", "Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0",
"System.Text.Json": "9.0.7" "System.Text.Json": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": { "lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": {
@@ -343,30 +375,30 @@
} }
}, },
"Microsoft.CSharp/4.7.0": {}, "Microsoft.CSharp/4.7.0": {},
"Microsoft.EntityFrameworkCore/9.0.7": { "Microsoft.EntityFrameworkCore/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "9.0.7", "Microsoft.EntityFrameworkCore.Abstractions": "9.0.8",
"Microsoft.EntityFrameworkCore.Analyzers": "9.0.7", "Microsoft.EntityFrameworkCore.Analyzers": "9.0.8",
"Microsoft.Extensions.Caching.Memory": "9.0.7", "Microsoft.Extensions.Caching.Memory": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.7" "Microsoft.Extensions.Logging": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.dll": { "lib/net8.0/Microsoft.EntityFrameworkCore.dll": {
"assemblyVersion": "9.0.7.0", "assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.725.31607" "fileVersion": "9.0.825.36802"
} }
} }
}, },
"Microsoft.EntityFrameworkCore.Abstractions/9.0.7": { "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": {
"runtime": { "runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": {
"assemblyVersion": "9.0.7.0", "assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.725.31607" "fileVersion": "9.0.825.36802"
} }
} }
}, },
"Microsoft.EntityFrameworkCore.Analyzers/9.0.7": {}, "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": {},
"Microsoft.EntityFrameworkCore.Design/9.0.7": { "Microsoft.EntityFrameworkCore.Design/9.0.8": {
"dependencies": { "dependencies": {
"Humanizer.Core": "2.14.1", "Humanizer.Core": "2.14.1",
"Microsoft.Build.Framework": "17.8.3", "Microsoft.Build.Framework": "17.8.3",
@@ -374,140 +406,166 @@
"Microsoft.CodeAnalysis.CSharp": "4.8.0", "Microsoft.CodeAnalysis.CSharp": "4.8.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0", "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0", "Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0",
"Microsoft.EntityFrameworkCore.Relational": "9.0.7", "Microsoft.EntityFrameworkCore.Relational": "9.0.8",
"Microsoft.Extensions.Caching.Memory": "9.0.7", "Microsoft.Extensions.Caching.Memory": "9.0.8",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.7", "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
"Microsoft.Extensions.DependencyModel": "9.0.7", "Microsoft.Extensions.DependencyModel": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.7", "Microsoft.Extensions.Logging": "9.0.8",
"Mono.TextTemplating": "3.0.0", "Mono.TextTemplating": "3.0.0",
"System.Text.Json": "9.0.7" "System.Text.Json": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": { "lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": {
"assemblyVersion": "9.0.7.0", "assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.725.31607" "fileVersion": "9.0.825.36802"
} }
} }
}, },
"Microsoft.EntityFrameworkCore.Relational/9.0.7": { "Microsoft.EntityFrameworkCore.Relational/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.EntityFrameworkCore": "9.0.7", "Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.Extensions.Caching.Memory": "9.0.7", "Microsoft.Extensions.Caching.Memory": "9.0.8",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.7", "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.7" "Microsoft.Extensions.Logging": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": { "lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": {
"assemblyVersion": "9.0.7.0", "assemblyVersion": "9.0.8.0",
"fileVersion": "9.0.725.31607" "fileVersion": "9.0.825.36802"
} }
} }
}, },
"Microsoft.Extensions.Caching.Abstractions/9.0.7": { "Microsoft.Extensions.Caching.Abstractions/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.Primitives": "9.0.7" "Microsoft.Extensions.Primitives": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.Caching.Memory/9.0.7": { "Microsoft.Extensions.Caching.Memory/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "9.0.7", "Microsoft.Extensions.Caching.Abstractions": "9.0.8",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Microsoft.Extensions.Logging.Abstractions": "9.0.7", "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
"Microsoft.Extensions.Options": "9.0.7", "Microsoft.Extensions.Options": "9.0.8",
"Microsoft.Extensions.Primitives": "9.0.7" "Microsoft.Extensions.Primitives": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.Configuration.Abstractions/9.0.7": { "Microsoft.Extensions.Configuration.Abstractions/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.Primitives": "9.0.7" "Microsoft.Extensions.Primitives": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.dll": { "lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.DependencyInjection/9.0.7": { "Microsoft.Extensions.DependencyInjection/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7" "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.7": { "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": {
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.DependencyModel/9.0.7": { "Microsoft.Extensions.DependencyModel/9.0.8": {
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyModel.dll": { "lib/net9.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "9.0.0.7", "assemblyVersion": "9.0.0.8",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.Logging/9.0.7": { "Microsoft.Extensions.Identity.Core/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.7", "Microsoft.AspNetCore.Cryptography.KeyDerivation": "9.0.8",
"Microsoft.Extensions.Logging.Abstractions": "9.0.7", "Microsoft.Extensions.Logging": "9.0.8",
"Microsoft.Extensions.Options": "9.0.7" "Microsoft.Extensions.Options": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Identity.Core.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.Extensions.Identity.Stores/9.0.8": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "9.0.8",
"Microsoft.Extensions.Identity.Core": "9.0.8",
"Microsoft.Extensions.Logging": "9.0.8"
},
"runtime": {
"lib/net9.0/Microsoft.Extensions.Identity.Stores.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.825.36808"
}
}
},
"Microsoft.Extensions.Logging/9.0.8": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.8",
"Microsoft.Extensions.Logging.Abstractions": "9.0.8",
"Microsoft.Extensions.Options": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Logging.dll": { "lib/net9.0/Microsoft.Extensions.Logging.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.Logging.Abstractions/9.0.7": { "Microsoft.Extensions.Logging.Abstractions/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7" "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.Options/9.0.7": { "Microsoft.Extensions.Options/9.0.8": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
"Microsoft.Extensions.Primitives": "9.0.7" "Microsoft.Extensions.Primitives": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Options.dll": { "lib/net9.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
"Microsoft.Extensions.Primitives/9.0.7": { "Microsoft.Extensions.Primitives/9.0.8": {
"runtime": { "runtime": {
"lib/net9.0/Microsoft.Extensions.Primitives.dll": { "lib/net9.0/Microsoft.Extensions.Primitives.dll": {
"assemblyVersion": "9.0.0.0", "assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.725.31616" "fileVersion": "9.0.825.36511"
} }
} }
}, },
@@ -546,7 +604,7 @@
}, },
"Npgsql/9.0.3": { "Npgsql/9.0.3": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "9.0.7" "Microsoft.Extensions.Logging.Abstractions": "9.0.8"
}, },
"runtime": { "runtime": {
"lib/net8.0/Npgsql.dll": { "lib/net8.0/Npgsql.dll": {
@@ -557,8 +615,8 @@
}, },
"Npgsql.EntityFrameworkCore.PostgreSQL/9.0.4": { "Npgsql.EntityFrameworkCore.PostgreSQL/9.0.4": {
"dependencies": { "dependencies": {
"Microsoft.EntityFrameworkCore": "9.0.7", "Microsoft.EntityFrameworkCore": "9.0.8",
"Microsoft.EntityFrameworkCore.Relational": "9.0.7", "Microsoft.EntityFrameworkCore.Relational": "9.0.8",
"Npgsql": "9.0.3" "Npgsql": "9.0.3"
}, },
"runtime": { "runtime": {
@@ -773,7 +831,7 @@
} }
}, },
"System.Security.Principal.Windows/4.7.0": {}, "System.Security.Principal.Windows/4.7.0": {},
"System.Text.Json/9.0.7": {}, "System.Text.Json/9.0.8": {},
"System.Threading.Channels/7.0.0": {}, "System.Threading.Channels/7.0.0": {},
"System.Windows.Extensions/6.0.0": { "System.Windows.Extensions/6.0.0": {
"dependencies": { "dependencies": {
@@ -816,6 +874,27 @@
"path": "humanizer.core/2.14.1", "path": "humanizer.core/2.14.1",
"hashPath": "humanizer.core.2.14.1.nupkg.sha512" "hashPath": "humanizer.core.2.14.1.nupkg.sha512"
}, },
"Microsoft.AspNetCore.Cryptography.Internal/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NwGO0wh/IjEthBLGA6fWfIiftsNF/paA5RxWp6ji4wWazetJgQ4truR9nU2thAzzFLiXqlg8vGjdVDA8bHu0zA==",
"path": "microsoft.aspnetcore.cryptography.internal/9.0.8",
"hashPath": "microsoft.aspnetcore.cryptography.internal.9.0.8.nupkg.sha512"
},
"Microsoft.AspNetCore.Cryptography.KeyDerivation/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gK70xxXYwwPiXYKYVmLYMuIO5EOGrRtQghmM6PkgtZ/0lgLEjIs//xgSLvZkV/mroNHA1DEqTcqscEj9OzZ1IA==",
"path": "microsoft.aspnetcore.cryptography.keyderivation/9.0.8",
"hashPath": "microsoft.aspnetcore.cryptography.keyderivation.9.0.8.nupkg.sha512"
},
"Microsoft.AspNetCore.Identity.EntityFrameworkCore/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-z4q9roxXMQePwFM5tXXZS5sKkU78yYXVkj56NYYx9xKe+mxGkJMV1MaO0GFE6HnnM8bE3Xxhs0hAPw2jKbse6w==",
"path": "microsoft.aspnetcore.identity.entityframeworkcore/9.0.8",
"hashPath": "microsoft.aspnetcore.identity.entityframeworkcore.9.0.8.nupkg.sha512"
},
"Microsoft.Bcl.AsyncInterfaces/7.0.0": { "Microsoft.Bcl.AsyncInterfaces/7.0.0": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
@@ -886,110 +965,124 @@
"path": "microsoft.csharp/4.7.0", "path": "microsoft.csharp/4.7.0",
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512" "hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
}, },
"Microsoft.EntityFrameworkCore/9.0.7": { "Microsoft.EntityFrameworkCore/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-PbD0q5ax15r91jD4TN7xbDCjldZSz4JfpYN4ZZjAkWeUyROkV92Ydg0O2/1keFA+2u3KPsDkJMmBKv2zQ06ZVg==", "sha512": "sha512-bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==",
"path": "microsoft.entityframeworkcore/9.0.7", "path": "microsoft.entityframeworkcore/9.0.8",
"hashPath": "microsoft.entityframeworkcore.9.0.7.nupkg.sha512" "hashPath": "microsoft.entityframeworkcore.9.0.8.nupkg.sha512"
}, },
"Microsoft.EntityFrameworkCore.Abstractions/9.0.7": { "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-YUXNerEkCf4OANO+zjuMznpUW7R8XxSCqmBfYhBrbrJVc09i84KkNgeUTaOUXCGogSK/3d7ORRhMqfUobnejBg==", "sha512": "sha512-B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==",
"path": "microsoft.entityframeworkcore.abstractions/9.0.7", "path": "microsoft.entityframeworkcore.abstractions/9.0.8",
"hashPath": "microsoft.entityframeworkcore.abstractions.9.0.7.nupkg.sha512" "hashPath": "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512"
}, },
"Microsoft.EntityFrameworkCore.Analyzers/9.0.7": { "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-HqiPjAvjVOsyA1svnjL81/Wk2MRQYMK/lxKVWvw0f5IcA//VcxBepVSAqe7CFirdsPXqe8rFKEwZROWZTz7Jqw==", "sha512": "sha512-2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==",
"path": "microsoft.entityframeworkcore.analyzers/9.0.7", "path": "microsoft.entityframeworkcore.analyzers/9.0.8",
"hashPath": "microsoft.entityframeworkcore.analyzers.9.0.7.nupkg.sha512" "hashPath": "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512"
}, },
"Microsoft.EntityFrameworkCore.Design/9.0.7": { "Microsoft.EntityFrameworkCore.Design/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-zvZ2/bRwdPrBfQ2fRd2IQL6icyIOtosZSz2QpXtsn7M+c6e4GvpNfpSxBprLfoKhH6NeAFNV9ool0Vp/1DJd/A==", "sha512": "sha512-02e8OcoumSUAES3VkXrMT9EnNCUKWJoifn5+8fFEbAtRhKL3xg2a/Mj6rsAUGF7tkYFox6oKzJCn0jbm6b8Lbw==",
"path": "microsoft.entityframeworkcore.design/9.0.7", "path": "microsoft.entityframeworkcore.design/9.0.8",
"hashPath": "microsoft.entityframeworkcore.design.9.0.7.nupkg.sha512" "hashPath": "microsoft.entityframeworkcore.design.9.0.8.nupkg.sha512"
}, },
"Microsoft.EntityFrameworkCore.Relational/9.0.7": { "Microsoft.EntityFrameworkCore.Relational/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-Yo5joquG7L79H5BhtpqP8apu+KFOAYfvmj0dZnVkPElBY14wY5qva0SOcrDWzYw5BrJrhIArfCcJCJHBvMYiKg==", "sha512": "sha512-OVhfyxiHxMvYpwQ8Jy3YZi4koy6TK5/Q7C1oq3z6db+HEGuu6x9L1BX5zDIdJxxlRePMyO4D8ORiXj/D7+MUqw==",
"path": "microsoft.entityframeworkcore.relational/9.0.7", "path": "microsoft.entityframeworkcore.relational/9.0.8",
"hashPath": "microsoft.entityframeworkcore.relational.9.0.7.nupkg.sha512" "hashPath": "microsoft.entityframeworkcore.relational.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Caching.Abstractions/9.0.7": { "Microsoft.Extensions.Caching.Abstractions/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-30necCQehcg9lFkMEIE7HczcoYGML8GUH6jlincA18d896fLZM9wl5tpTPJHgzANQE/6KXRLZSWbgevgg5csSw==", "sha512": "sha512-4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==",
"path": "microsoft.extensions.caching.abstractions/9.0.7", "path": "microsoft.extensions.caching.abstractions/9.0.8",
"hashPath": "microsoft.extensions.caching.abstractions.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Caching.Memory/9.0.7": { "Microsoft.Extensions.Caching.Memory/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-nDu6c8fwrHQYccLnWnvyElrdkL3rZ97TZNqL+niMFUcApVBHdpDmKcRvciGymJ4Y0iLDTOo5J2XhDQEbNb+dFg==", "sha512": "sha512-grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==",
"path": "microsoft.extensions.caching.memory/9.0.7", "path": "microsoft.extensions.caching.memory/9.0.8",
"hashPath": "microsoft.extensions.caching.memory.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Configuration.Abstractions/9.0.7": { "Microsoft.Extensions.Configuration.Abstractions/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-lut/kiVvNsQ120VERMUYSFhpXPpKjjql+giy03LesASPBBcC0o6+aoFdzJH9GaYpFTQ3fGVhVjKjvJDoAW5/IQ==", "sha512": "sha512-yNou2KM35RvzOh4vUFtl2l33rWPvOCoba+nzEDJ+BgD8aOL/jew4WPCibQvntRfOJ2pJU8ARygSMD+pdjvDHuA==",
"path": "microsoft.extensions.configuration.abstractions/9.0.7", "path": "microsoft.extensions.configuration.abstractions/9.0.8",
"hashPath": "microsoft.extensions.configuration.abstractions.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.configuration.abstractions.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.DependencyInjection/9.0.7": { "Microsoft.Extensions.DependencyInjection/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-i05AYA91vgq0as84ROVCyltD2gnxaba/f1Qw2rG7mUsS0gv8cPTr1Gm7jPQHq7JTr4MJoQUcanLVs16tIOUJaQ==", "sha512": "sha512-JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==",
"path": "microsoft.extensions.dependencyinjection/9.0.7", "path": "microsoft.extensions.dependencyinjection/9.0.8",
"hashPath": "microsoft.extensions.dependencyinjection.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.7": { "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-iPK1FxbGFr2Xb+4Y+dTYI8Gupu9pOi8I3JPuPsrogUmEhe2hzZ9LpCmolMEBhVDo2ikcSr7G5zYiwaapHSQTew==", "sha512": "sha512-xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/9.0.7", "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.DependencyModel/9.0.7": { "Microsoft.Extensions.DependencyModel/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-aXEt8QW1Fj9aC81GfkMtfip4wfbkEA7VBvNkx6Rx6ZKyqXIF/9qzRtH6v/2096IDK4lt6dlQp5Ajf+kjHfUdOA==", "sha512": "sha512-3CW02zNjyqJ2eORo8Zkznpw6+QvK+tYUKZgKuKuAIYdy73TRFvpaqCwYws1k6/lMSJ7ZqABfWn0/wa5bRsIJ4w==",
"path": "microsoft.extensions.dependencymodel/9.0.7", "path": "microsoft.extensions.dependencymodel/9.0.8",
"hashPath": "microsoft.extensions.dependencymodel.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.dependencymodel.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Logging/9.0.7": { "Microsoft.Extensions.Identity.Core/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-fdIeQpXYV8yxSWG03cCbU2Otdrq4NWuhnQLXokWLv3L9YcK055E7u8WFJvP+uuP4CFeCEoqZQL4yPcjuXhCZrg==", "sha512": "sha512-giUYz84GHAizDucZp5vWAusDO2s9Jrrg2jQ6HUQNGs5HQMKJVobLPMQSiyg8R4yecH0pIc0QjANh0B/Kw13BHA==",
"path": "microsoft.extensions.logging/9.0.7", "path": "microsoft.extensions.identity.core/9.0.8",
"hashPath": "microsoft.extensions.logging.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.identity.core.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Logging.Abstractions/9.0.7": { "Microsoft.Extensions.Identity.Stores/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-sMM6NEAdUTE/elJ2wqjOi0iBWqZmSyaTByLF9e8XHv6DRJFFnOe0N+s8Uc6C91E4SboQCfLswaBIZ+9ZXA98AA==", "sha512": "sha512-sycaHcq78yI591+KxEdd53a7pJGQEl9H/wDsFkaPNE9g7loyq8vufPcc/9RH3KlGt5joR5Ey7PdoRSrlLjCgJg==",
"path": "microsoft.extensions.logging.abstractions/9.0.7", "path": "microsoft.extensions.identity.stores/9.0.8",
"hashPath": "microsoft.extensions.logging.abstractions.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.identity.stores.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Options/9.0.7": { "Microsoft.Extensions.Logging/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-trJnF6cRWgR5uMmHpGoHmM1wOVFdIYlELlkO9zX+RfieK0321Y55zrcs4AaEymKup7dxgEN/uJU25CAcMNQRXw==", "sha512": "sha512-Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==",
"path": "microsoft.extensions.options/9.0.7", "path": "microsoft.extensions.logging/9.0.8",
"hashPath": "microsoft.extensions.options.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.logging.9.0.8.nupkg.sha512"
}, },
"Microsoft.Extensions.Primitives/9.0.7": { "Microsoft.Extensions.Logging.Abstractions/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-ti/zD9BuuO50IqlvhWQs9GHxkCmoph5BHjGiWKdg2t6Or8XoyAfRJiKag+uvd/fpASnNklfsB01WpZ4fhAe0VQ==", "sha512": "sha512-pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==",
"path": "microsoft.extensions.primitives/9.0.7", "path": "microsoft.extensions.logging.abstractions/9.0.8",
"hashPath": "microsoft.extensions.primitives.9.0.7.nupkg.sha512" "hashPath": "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Options/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==",
"path": "microsoft.extensions.options/9.0.8",
"hashPath": "microsoft.extensions.options.9.0.8.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/9.0.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==",
"path": "microsoft.extensions.primitives/9.0.8",
"hashPath": "microsoft.extensions.primitives.9.0.8.nupkg.sha512"
}, },
"Microsoft.Win32.Registry/4.7.0": { "Microsoft.Win32.Registry/4.7.0": {
"type": "package", "type": "package",
@@ -1187,12 +1280,12 @@
"path": "system.security.principal.windows/4.7.0", "path": "system.security.principal.windows/4.7.0",
"hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512" "hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512"
}, },
"System.Text.Json/9.0.7": { "System.Text.Json/9.0.8": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-u/lN2FEEXs3ghj2ta8tWA4r2MS9Yni07K7jDmnz8h1UPDf0lIIIEMkWx383Zz4fJjJio7gDl+00RYuQ/7R8ZQw==", "sha512": "sha512-mIQir9jBqk0V7X0Nw5hzPJZC8DuGdf+2DS3jAVsr6rq5+/VyH5rza0XGcONJUWBrZ+G6BCwNyjWYd9lncBu48A==",
"path": "system.text.json/9.0.7", "path": "system.text.json/9.0.8",
"hashPath": "system.text.json.9.0.7.nupkg.sha512" "hashPath": "system.text.json.9.0.8.nupkg.sha512"
}, },
"System.Threading.Channels/7.0.0": { "System.Threading.Channels/7.0.0": {
"type": "package", "type": "package",

View File

@@ -1,6 +1,6 @@
{ {
"ConnectionStrings": { "ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-OpenArchival.Blazor-2bdd9108-567b-4b19-b97f-47edace03070;Trusted_Connection=True;MultipleActiveResultSets=true", "DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=",
"PostgresConnection": "Host=localhost;Database=postgres;Username=postgres;Password=" "PostgresConnection": "Host=localhost;Database=postgres;Username=postgres;Password="
}, },
"Logging": { "Logging": {

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor")] [assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+57f67e85356af6759fc0211e8a510bd5b9f63dfa")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dd3968f6effa8f45f27a3ec91c34762c88380f06")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor")] [assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor")] [assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
a1b35575568c1043399b569538c23ee93b0a3fde5462a39aaab68b815fa02e10 4cb1f71ab75baefd50d4cf23fe890ca9a8c7d28dbae39628ffdc79e6bcb2fe49

View File

@@ -20,241 +20,261 @@ build_property.MudAllowedAttributePattern =
build_property.MudAllowedAttributeList = build_property.MudAllowedAttributeList =
build_property.RootNamespace = OpenArchival.Blazor build_property.RootNamespace = OpenArchival.Blazor
build_property.RootNamespace = OpenArchival.Blazor build_property.RootNamespace = OpenArchival.Blazor
build_property.ProjectDir = E:\Open-Archival\OpenArchival.Blazor\ build_property.ProjectDir = D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\
build_property.EnableComHosting = build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop = build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 9.0 build_property.RazorLangVersion = 9.0
build_property.SupportLocalizedComponentNames = build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes = build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = E:\Open-Archival\OpenArchival.Blazor build_property.MSBuildProjectDirectory = D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor
build_property._RazorSourceGeneratorDebug = build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 9.0 build_property.EffectiveAnalysisLevelStyle = 9.0
build_property.EnableCodeStyleSeverity = build_property.EnableCodeStyleSeverity =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/AccessDenied.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/AccessDenied.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEFjY2Vzc0RlbmllZC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEFjY2Vzc0RlbmllZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmail.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmail.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXENvbmZpcm1FbWFpbC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXENvbmZpcm1FbWFpbC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmailChange.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ConfirmEmailChange.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXENvbmZpcm1FbWFpbENoYW5nZS5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXENvbmZpcm1FbWFpbENoYW5nZS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ExternalLogin.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ExternalLogin.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEV4dGVybmFsTG9naW4ucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEV4dGVybmFsTG9naW4ucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPassword.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEZvcmdvdFBhc3N3b3JkLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEZvcmdvdFBhc3N3b3JkLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPasswordConfirmation.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ForgotPasswordConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEZvcmdvdFBhc3N3b3JkQ29uZmlybWF0aW9uLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEZvcmdvdFBhc3N3b3JkQ29uZmlybWF0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidPasswordReset.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidPasswordReset.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEludmFsaWRQYXNzd29yZFJlc2V0LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEludmFsaWRQYXNzd29yZFJlc2V0LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidUser.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/InvalidUser.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEludmFsaWRVc2VyLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXEludmFsaWRVc2VyLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Lockout.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Lockout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvY2tvdXQucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvY2tvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Login.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Login.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWith2fa.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWith2fa.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luV2l0aDJmYS5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luV2l0aDJmYS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWithRecoveryCode.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/LoginWithRecoveryCode.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luV2l0aFJlY292ZXJ5Q29kZS5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXExvZ2luV2l0aFJlY292ZXJ5Q29kZS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ChangePassword.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ChangePassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDaGFuZ2VQYXNzd29yZC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDaGFuZ2VQYXNzd29yZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/DeletePersonalData.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Component.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDb21wb25lbnQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Component1.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxDb21wb25lbnQxLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/DeletePersonalData.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxEZWxldGVQZXJzb25hbERhdGEucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxEZWxldGVQZXJzb25hbERhdGEucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Disable2fa.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Disable2fa.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxEaXNhYmxlMmZhLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxEaXNhYmxlMmZhLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Email.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Email.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFbWFpbC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFbWFpbC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/EnableAuthenticator.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/EnableAuthenticator.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFbmFibGVBdXRoZW50aWNhdG9yLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFbmFibGVBdXRoZW50aWNhdG9yLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ExternalLogins.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ExternalLogins.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFeHRlcm5hbExvZ2lucy5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxFeHRlcm5hbExvZ2lucy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/GenerateRecoveryCodes.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/GenerateRecoveryCodes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxHZW5lcmF0ZVJlY292ZXJ5Q29kZXMucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxHZW5lcmF0ZVJlY292ZXJ5Q29kZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Index.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/Index.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxJbmRleC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxJbmRleC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/PersonalData.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/PersonalData.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxQZXJzb25hbERhdGEucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxQZXJzb25hbERhdGEucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ResetAuthenticator.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/ResetAuthenticator.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxSZXNldEF1dGhlbnRpY2F0b3IucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxSZXNldEF1dGhlbnRpY2F0b3IucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/SetPassword.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/SetPassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxTZXRQYXNzd29yZC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxTZXRQYXNzd29yZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/TwoFactorAuthentication.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/TwoFactorAuthentication.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxUd29GYWN0b3JBdXRoZW50aWNhdGlvbi5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxUd29GYWN0b3JBdXRoZW50aWNhdGlvbi5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/_Imports.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Manage/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxfSW1wb3J0cy5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXE1hbmFnZVxfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Register.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/Register.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlZ2lzdGVyLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlZ2lzdGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/RegisterConfirmation.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/RegisterConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlZ2lzdGVyQ29uZmlybWF0aW9uLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlZ2lzdGVyQ29uZmlybWF0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResendEmailConfirmation.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResendEmailConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2VuZEVtYWlsQ29uZmlybWF0aW9uLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2VuZEVtYWlsQ29uZmlybWF0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPassword.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPassword.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2V0UGFzc3dvcmQucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2V0UGFzc3dvcmQucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPasswordConfirmation.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/ResetPasswordConfirmation.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2V0UGFzc3dvcmRDb25maXJtYXRpb24ucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXFJlc2V0UGFzc3dvcmRDb25maXJtYXRpb24ucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/_Imports.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Pages/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXF9JbXBvcnRzLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFBhZ2VzXF9JbXBvcnRzLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ExternalLoginPicker.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ExternalLoginPicker.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxFeHRlcm5hbExvZ2luUGlja2VyLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxFeHRlcm5hbExvZ2luUGlja2VyLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageLayout.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxNYW5hZ2VMYXlvdXQucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxNYW5hZ2VMYXlvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageNavMenu.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ManageNavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxNYW5hZ2VOYXZNZW51LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxNYW5hZ2VOYXZNZW51LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/RedirectToLogin.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/RedirectToLogin.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxSZWRpcmVjdFRvTG9naW4ucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxSZWRpcmVjdFRvTG9naW4ucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ShowRecoveryCodes.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/ShowRecoveryCodes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxTaG93UmVjb3ZlcnlDb2Rlcy5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxTaG93UmVjb3ZlcnlDb2Rlcy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/StatusMessage.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Account/Shared/StatusMessage.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxTdGF0dXNNZXNzYWdlLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvdW50XFNoYXJlZFxTdGF0dXNNZXNzYWdlLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/App.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/ChipContainer.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/ChipContainer.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDdXN0b21Db21wb25lbnRzXENoaXBDb250YWluZXIucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDdXN0b21Db21wb25lbnRzXENoaXBDb250YWluZXIucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/UploadDropBox.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/CustomComponents/UploadDropBox.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDdXN0b21Db21wb25lbnRzXFVwbG9hZERyb3BCb3gucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDdXN0b21Db21wb25lbnRzXFVwbG9hZERyb3BCb3gucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Layout/MainLayout.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Layout/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Layout/NavMenu.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/AddArchiveGroupingComponent.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveConfiguration.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlQ29uZmlndXJhdGlvbi5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/AddArchiveGroupingComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQWRkQXJjaGl2ZUdyb3VwaW5nQ29tcG9uZW50LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQWRkQXJjaGl2ZUdyb3VwaW5nQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/ArchiveEntryCreatorCard.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/AddGroupingDialog.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQWRkR3JvdXBpbmdEaWFsb2cucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/ArchiveEntryCreatorCard.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQXJjaGl2ZUVudHJ5Q3JlYXRvckNhcmQucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQXJjaGl2ZUVudHJ5Q3JlYXRvckNhcmQucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/Component.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/ArchiveGroupingsTable.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQXJjaGl2ZUdyb3VwaW5nc1RhYmxlLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/Component.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQ29tcG9uZW50LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/IdentifierTextBox.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/ArchiveItems/IdentifierTextBox.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcSWRlbnRpZmllclRleHRCb3gucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxBcmNoaXZlSXRlbXNcSWRlbnRpZmllclRleHRCb3gucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoriesListComponent.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoriesListComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3JpZXNMaXN0Q29tcG9uZW50LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3JpZXNMaXN0Q29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryCreatorDialog.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryCreatorDialog.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3J5Q3JlYXRvckRpYWxvZy5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3J5Q3JlYXRvckRpYWxvZy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryFieldCardComponent.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/CategoryFieldCardComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3J5RmllbGRDYXJkQ29tcG9uZW50LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXENhdGVnb3J5RmllbGRDYXJkQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/ViewAddCategoriesComponent.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Administration/Categories/ViewAddCategoriesComponent.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXFZpZXdBZGRDYXRlZ29yaWVzQ29tcG9uZW50LnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBZG1pbmlzdHJhdGlvblxDYXRlZ29yaWVzXFZpZXdBZGRDYXRlZ29yaWVzQ29tcG9uZW50LnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Auth.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Auth.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBdXRoLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xBdXRoLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Counter.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Counter.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xDb3VudGVyLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xDb3VudGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Error.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Error.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Home.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Home.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Pages/Weather.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Pages/Weather.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xXZWF0aGVyLnJhem9y build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xXZWF0aGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/Routes.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/Routes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I= build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[E:/Open-Archival/OpenArchival.Blazor/Components/_Imports.razor] [D:/Nextcloud/Documents/Open-Archival/OpenArchival.Blazor/Components/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =

View File

@@ -1 +1 @@
326eba80d7bb6026e445989e7f52bb482aaae70f7db3f2ee6b6719c19b6c0c05 f4fe04d3a83dd960d50ee00632d4977ca7b08f3452ea570cd998617e1803dd8a

View File

@@ -621,3 +621,407 @@ E:\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\netcorea
E:\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll E:\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
E:\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz E:\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz
E:\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz E:\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.AssemblyReference.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rpswa.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfoInputs.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfo.cs
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.CoreCompileInputs.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.MvcApplicationPartsAssemblyInfo.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.sourcelink.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.deps.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.runtimeconfig.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.staticwebassets.endpoints.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.exe
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.Development.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.runtime.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.endpoints.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.exe
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.deps.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.runtimeconfig.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.pdb
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Core.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Identity.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CodeBeam.MudExtensions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CsvHelper.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Dapper.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.SqlServer.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Humanizer.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Authorization.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Forms.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Web.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.Internal.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.KeyDerivation.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Metadata.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Bcl.AsyncInterfaces.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Build.Locator.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Design.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Relational.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.SqlServer.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Memory.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Configuration.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyModel.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Core.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Stores.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Options.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Primitives.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.Extensions.Msal.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Abstractions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.JsonWebTokens.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Logging.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Tokens.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.JSInterop.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.SqlServer.Server.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Win32.SystemEvents.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Mono.TextTemplating.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\MudBlazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.DependencyInjection.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.EntityFrameworkCore.PostgreSQL.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.ClientModel.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.CodeDom.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.AttributedModel.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Convention.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Hosting.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Runtime.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.TypedParts.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Configuration.ConfigurationManager.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Drawing.Common.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.IdentityModel.Tokens.Jwt.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Memory.Data.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Runtime.Caching.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Permissions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Windows.Extensions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\Microsoft.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Win32.SystemEvents.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\sni.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\sni.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\sni.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\netcoreapp2.1\System.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\System.Drawing.Common.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Drawing.Common.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Runtime.Caching.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Windows.Extensions.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjimswa.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmrazor.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmcshtml.dswa.cache.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\scopedcss\bundle\OpenArchival.Blazor.styles.css
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\24gzn4tg1a-qz4batx9cb.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\stwk5nfoxp-loe7cozwzj.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\uorc1pfmvs-2jeq8efc6q.gz
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.development.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.endpoints.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArch.17AC99BC.Up2Date
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\refint\OpenArchival.Blazor.dll
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.pdb
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.genruntimeconfig.cache
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\ref\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.AssemblyReference.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rpswa.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.GeneratedMSBuildEditorConfig.editorconfig
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfoInputs.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.AssemblyInfo.cs
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.csproj.CoreCompileInputs.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.MvcApplicationPartsAssemblyInfo.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.sourcelink.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.deps.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.runtimeconfig.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.staticwebassets.endpoints.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.exe
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.Development.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\appsettings.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.runtime.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.staticwebassets.endpoints.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.exe
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.deps.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.runtimeconfig.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.Blazor.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Core.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Azure.Identity.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CodeBeam.MudExtensions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\CsvHelper.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Dapper.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.SqlServer.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\EntityFramework.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Humanizer.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Authorization.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Forms.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Components.Web.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.Internal.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.KeyDerivation.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.AspNetCore.Metadata.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Bcl.AsyncInterfaces.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Build.Locator.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Design.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Relational.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.SqlServer.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Caching.Memory.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Configuration.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.DependencyModel.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Core.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Identity.Stores.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Localization.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Options.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Extensions.Primitives.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Identity.Client.Extensions.Msal.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Abstractions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.JsonWebTokens.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Logging.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.IdentityModel.Tokens.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.JSInterop.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.SqlServer.Server.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Microsoft.Win32.SystemEvents.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Mono.TextTemplating.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\MudBlazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.DependencyInjection.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\Npgsql.EntityFrameworkCore.PostgreSQL.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.ClientModel.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.CodeDom.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.AttributedModel.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Convention.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Hosting.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.Runtime.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Composition.TypedParts.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Configuration.ConfigurationManager.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Drawing.Common.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.IdentityModel.Tokens.Jwt.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Memory.Data.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Runtime.Caching.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Cryptography.ProtectedData.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Security.Permissions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\System.Windows.Extensions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\Microsoft.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Win32.SystemEvents.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-arm64\native\sni.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x64\native\sni.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win-x86\native\sni.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\netcoreapp2.1\System.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\unix\lib\net6.0\System.Drawing.Common.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Drawing.Common.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Runtime.Caching.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Security.Cryptography.ProtectedData.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Windows.Extensions.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjimswa.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmrazor.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\rjsmcshtml.dswa.cache.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\scopedcss\bundle\OpenArchival.Blazor.styles.css
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\tzxjg6is5z-n8rndlt7dy.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\0wz98yz2xy-ofbdodmtsc.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\24gzn4tg1a-qz4batx9cb.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\stwk5nfoxp-loe7cozwzj.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\compressed\uorc1pfmvs-2jeq8efc6q.gz
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.json.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.development.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.build.endpoints.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArch.17AC99BC.Up2Date
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\refint\OpenArchival.Blazor.dll
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\OpenArchival.Blazor.genruntimeconfig.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.Blazor\obj\Debug\net9.0\ref\OpenArchival.Blazor.dll

View File

@@ -1 +1 @@
d0a6fb3953398680c50cc4e2e3db4a58765accb6a23ced407e2a4d82c5cc4a51 b200e0f0470dd235c3a5cab1b38d5ba8f2e1a42e25a95a84f147aaac078e2328

View File

@@ -1 +1 @@
{"documents":{"E:\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/57f67e85356af6759fc0211e8a510bd5b9f63dfa/*"}} {"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/dd3968f6effa8f45f27a3ec91c34762c88380f06/*"}}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"1qg6JQFg463JgCFBqLRezrbbwdHDoJB+OfEwITXaNNk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["ykhp/DWRyaBSdvKYr7L99V2ldt2eA0lnPR/Lip\u002BNhdA="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"1qg6JQFg463JgCFBqLRezrbbwdHDoJB+OfEwITXaNNk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["49rrwWjJwaHTHSPL9a1cTI6wS9aWKEroxqNMdQj4hoU="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"dkWMOexH3+NeGsyGUK6gmxmNxkLPrN4n2MYfrYb5il0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=","i\u002BvQzbAFvT1goFh2MLbHY\u002BJWn2Eh7Jl4g/q8RpLfC8A=","pfhwXTM2AVbf0fIzoujtXXysEv0sxUWJeUH8jlKl69U=","LoW/IbY96JtGVBQwgV4RU9pFIHWXewp133ftl6DKTIw=","mI4dZ32ilpCRzXGr\u002BWVDecoU\u002BVOLgydPqNJjMKHNdu8=","YKnUzOJSqvSXasqB1jpW74SsQF2TZE4fnPjW8aX8jbI=","RcfY8TKyA1fGkS4hI80n1fR8vUz5dHI8Zc/dBJvu/Dk=","atDNp4hCKEseULZJEhQH3J4I9EiuN3SpuYtMQDsK3qQ=","WZx9W1Vc6ZK6luZN471UsIvsu9lGKSsIEeBUar4mozs=","jkoEvaqsPzcTRdVNEMNTwjCJo/gcZcrDlC6559hnQgY=","omASLVx21WFFSIXofN7Mgt4Rbo3oabvr5fzzmsFxMvI=","lXXjxKIMOad\u002Bl8ZQu/DD0THTKOIYNutTzjUThIIU6I0=","QcnomBz1uPYwLGgZDUVATcQ2p1s03wcmM79Fx/DEFoo=","eZdFRuq9u/BpaTxhG0ao3ZFZME\u002B2DnDbMC6X120sClw=","vpHo7ABmLDBlQP55A05Sm1QDxTiMyW9IHvegQ62aO4Q=","nvLUUgeCArCSPNiBODlStpxVtUEYFpG0dUgOi14Lf9s=","u57Wi9KMnMRA2o3jz6BhqXzQVI3Ir3voSgETHjU9yMc=","sbqDm5w5rCBQ4iKkiWrHK8RFLpUzGPpJ8tEfvVVXgnA=","\u002Blhqn0VoTSgHLY5Q3qRYaIUa0LLuHtZUj7HMxrkgMLg=","T/4GaRcxvRhqOKVJuzfuuXiODiKlW8VoV\u002Bue0crYk4k=","nLRCqYrvI071yTq7isfmei\u002B9DS5/1\u002B76YBFTBhf8gy4=","E\u002B11omJsZpkHO3oOSS5YeE1RGv4n0DrDmxhs3vFwhBI=","dacKUiEwlg1CQ1D/IRZhZKHR0iZ1x9W8ngbPFqjiTnM=","0Sxw27xfqSS84Ms6vshV5R17qdwPoUbBG8eN7uAZxHw=","I75wQ9\u002BiQxmcB3r0G9AGuWkFinf\u002B9s21v3ZQ2zT4V5Y=","Z7Wm\u002B96BYhgeyHA1Q9j/eY7hgFXceWxOXETEPQD9DsI=","o5K4y7mf/1cceNZO6PYnHBcNWt39CI9prJwNvX\u002BciE0=","sYXyIiv6lbef57lkXNs6omr9yCdn9x5tSXCEwWS\u002BF5A=","KwPhL\u002BYvbPluoL8a6tMet9W9zrr1RdZOKGnjKt9KTq8=","qHL24jBTHag\u002BbiZmdcXac\u002BqgyCGRVi3GX1Bw/XlOQfg=","5r2410efCavi17uG7UMHBeR4OBgaezsjoa17tLV4rRw=","ilvddDdhFKZTHtbY6gCRxpwbRS4oiHfhPsUmxyJn/fY=","1jrMjSs7jo5Dy6V4PL7yuwmaS/qtkFzOiZQPfKBE9Gk=","SGJjB/IsL\u002B6xg/nPs6/KqtVyCZP3cXrrZ0FtoQiXjNY=","5kDmUAv6mhPhK5BC5OMQpjHRnsyUXmfcVS8fqQUU9Ak=","fL43hMRoVKDnBfjg50t0ipKeHUsl/zc64v2oUtuNb2g=","1vn1NCs4f5X6ZM8Sy9omzlMpC\u002BrIZsWZljtCjpYTNgg=","SKHt0xd1jjo84tjCANhsirvlwYC\u002B\u002ByQbSNrlz6uEOXI=","M0MgfAbpqWWC/ErtHxZoXg\u002B3Zl9JNUnwRZKruy/3s38=","CQYmRgDGkxqs2/haNK16UFZbN1z7d6hqBAfAcZczkZg=","FcngoYMPbhafYeG58adhnkxd/NW\u002B5HWIsiblAAWNDS0=","Qs8rm6/XRjP6R2bRufrwEd4Q9FhG7R9juLX5\u002Bcn8fQ0=","y6FkIKZXBJscZUhLvdVWQnXCG1Zy03oxJtWMk3K85e8=","ileX1upGYxdPFPmcVk99kDNEodZlM46nNVJIomVyl04=","y0pkoLMJfD8WwkEEb5UiCS9/42NXuQ5mZ7rPdLuZzlg=","8Mn8jnlH7fwOMBJc5P09I\u002B3ACWI6A3bD9B9LLxkmGjA=","OXO1xKYd6Ch\u002BTZbTzW/KL1e/6vDOrvsYNIUP\u002BybWUtY=","0MA7NXJNA4T1CzpXSCJCdQ6e5dIHK99Z9JWOVQBTDWw=","boJu4ZFwOZzRw1CZ/DiZCzJ\u002BsIBP/ClQEueVsZQIFtI=","3a/1UMYr3ii3NDaBhUH4AeAmDuBTnPhW6ioY\u002BxllwM0=","BlO0gHIipML9uJhpDBkxR/y8n0yCX6lhEvoQGoALQGw=","WlpAcAYMpG3h/Zk/pKjkknMA2zax0WKb/5I3EkV7w24=","3v2xrFFiX2IOwDLwkF\u002Bzceo7MRr9p1z5ja9vqolxT1g=","z8JhsSAgeJBBd\u002B9k1RT6TkOaBdtIh0Xe1JFsMUDXpX4=","hnqFfzQod\u002Bz5OYgpUfOIEqTkm3YcVMZa8TOvdtf30tY=","Z8CRap3CpUd1M7YVBIqu469P\u002BT4xwnkhyndoTr\u002Bjw1Y=","\u002BdTEUjM4KfQhNtLBonfdtHnT28NuRlxBcJumszRotrs=","/mgp\u002Buq8B6nJX/qBrMeSgxGwpftYq6yD2zMgZUB0JVU=","PAYDq0k\u002BY28zDKXkt/eAzi2Cc1o5tHSqhbZdkngG5tk=","zSQa8aZccQ0dYkljtkW6JXmQojEJlA2iXu1MOo6Db\u002Bg=","173g5Oh2i2VuhQpGAIJawm90Z6pFENG9e7tpkhcSAhI=","W6/1z4FKA65sghio\u002BFjDfEL9Id/D/DuCgcSq6vM0QIw=","BxZABb7by8p04mDwLGbOUD97EVvTyq40iiUPWUOZKdk=","q0ctPBQoqn/xQ\u002BxPmZ44z7DNCVPj/k9bdvyvPsLBkmE="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"w2zJjDlrZF5/5p80zNaW9/DaLrmtiqb1ym05zjQa8AU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","itNr5KUbu31/YaznAa3H9HU94pR2G5E\u002By41ZOAziBso=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","ZKiapX8zYGlD2F5aGELVEVwu/xqbGH52dLsAPCg\u002BK1c=","MFwB9\u002Bmf\u002BLmDERjgvazd6oBnknubBcqxnX25YF5O\u002BR4=","ychUFdjaQZpbiFmAejbm6r2LE3ryZr0QzpQWAf8pYAU=","HHMN9Vvcgvov4W7M1YjdvfTZsFWuzyUh9TPfALHD8ys=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","nJEkwqZ2WHoYX/lkd1ag99OObwa\u002BUacCxi8cPwQyYZQ=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","om8bC4Me/ps3m/rDiQ48q6XITG3NcGTkzfULk51DvlQ="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"avuMhEtIo3H45UA2svfeTlnXB62DXs+d+NBSO4GjtXA=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=","i\u002BvQzbAFvT1goFh2MLbHY\u002BJWn2Eh7Jl4g/q8RpLfC8A=","pfhwXTM2AVbf0fIzoujtXXysEv0sxUWJeUH8jlKl69U=","LoW/IbY96JtGVBQwgV4RU9pFIHWXewp133ftl6DKTIw=","mI4dZ32ilpCRzXGr\u002BWVDecoU\u002BVOLgydPqNJjMKHNdu8=","YKnUzOJSqvSXasqB1jpW74SsQF2TZE4fnPjW8aX8jbI=","RcfY8TKyA1fGkS4hI80n1fR8vUz5dHI8Zc/dBJvu/Dk=","atDNp4hCKEseULZJEhQH3J4I9EiuN3SpuYtMQDsK3qQ=","WZx9W1Vc6ZK6luZN471UsIvsu9lGKSsIEeBUar4mozs=","jkoEvaqsPzcTRdVNEMNTwjCJo/gcZcrDlC6559hnQgY=","omASLVx21WFFSIXofN7Mgt4Rbo3oabvr5fzzmsFxMvI=","lXXjxKIMOad\u002Bl8ZQu/DD0THTKOIYNutTzjUThIIU6I0=","QcnomBz1uPYwLGgZDUVATcQ2p1s03wcmM79Fx/DEFoo=","eZdFRuq9u/BpaTxhG0ao3ZFZME\u002B2DnDbMC6X120sClw=","vpHo7ABmLDBlQP55A05Sm1QDxTiMyW9IHvegQ62aO4Q=","nvLUUgeCArCSPNiBODlStpxVtUEYFpG0dUgOi14Lf9s=","u57Wi9KMnMRA2o3jz6BhqXzQVI3Ir3voSgETHjU9yMc=","sbqDm5w5rCBQ4iKkiWrHK8RFLpUzGPpJ8tEfvVVXgnA=","\u002Blhqn0VoTSgHLY5Q3qRYaIUa0LLuHtZUj7HMxrkgMLg=","T/4GaRcxvRhqOKVJuzfuuXiODiKlW8VoV\u002Bue0crYk4k=","nLRCqYrvI071yTq7isfmei\u002B9DS5/1\u002B76YBFTBhf8gy4=","E\u002B11omJsZpkHO3oOSS5YeE1RGv4n0DrDmxhs3vFwhBI=","dacKUiEwlg1CQ1D/IRZhZKHR0iZ1x9W8ngbPFqjiTnM=","0Sxw27xfqSS84Ms6vshV5R17qdwPoUbBG8eN7uAZxHw=","I75wQ9\u002BiQxmcB3r0G9AGuWkFinf\u002B9s21v3ZQ2zT4V5Y=","Z7Wm\u002B96BYhgeyHA1Q9j/eY7hgFXceWxOXETEPQD9DsI=","o5K4y7mf/1cceNZO6PYnHBcNWt39CI9prJwNvX\u002BciE0=","sYXyIiv6lbef57lkXNs6omr9yCdn9x5tSXCEwWS\u002BF5A=","KwPhL\u002BYvbPluoL8a6tMet9W9zrr1RdZOKGnjKt9KTq8=","qHL24jBTHag\u002BbiZmdcXac\u002BqgyCGRVi3GX1Bw/XlOQfg=","5r2410efCavi17uG7UMHBeR4OBgaezsjoa17tLV4rRw=","ilvddDdhFKZTHtbY6gCRxpwbRS4oiHfhPsUmxyJn/fY=","1jrMjSs7jo5Dy6V4PL7yuwmaS/qtkFzOiZQPfKBE9Gk=","SGJjB/IsL\u002B6xg/nPs6/KqtVyCZP3cXrrZ0FtoQiXjNY=","5kDmUAv6mhPhK5BC5OMQpjHRnsyUXmfcVS8fqQUU9Ak=","fL43hMRoVKDnBfjg50t0ipKeHUsl/zc64v2oUtuNb2g=","1vn1NCs4f5X6ZM8Sy9omzlMpC\u002BrIZsWZljtCjpYTNgg=","SKHt0xd1jjo84tjCANhsirvlwYC\u002B\u002ByQbSNrlz6uEOXI=","M0MgfAbpqWWC/ErtHxZoXg\u002B3Zl9JNUnwRZKruy/3s38=","CQYmRgDGkxqs2/haNK16UFZbN1z7d6hqBAfAcZczkZg=","FcngoYMPbhafYeG58adhnkxd/NW\u002B5HWIsiblAAWNDS0=","Qs8rm6/XRjP6R2bRufrwEd4Q9FhG7R9juLX5\u002Bcn8fQ0=","y6FkIKZXBJscZUhLvdVWQnXCG1Zy03oxJtWMk3K85e8=","ileX1upGYxdPFPmcVk99kDNEodZlM46nNVJIomVyl04=","y0pkoLMJfD8WwkEEb5UiCS9/42NXuQ5mZ7rPdLuZzlg=","8Mn8jnlH7fwOMBJc5P09I\u002B3ACWI6A3bD9B9LLxkmGjA=","OXO1xKYd6Ch\u002BTZbTzW/KL1e/6vDOrvsYNIUP\u002BybWUtY=","0MA7NXJNA4T1CzpXSCJCdQ6e5dIHK99Z9JWOVQBTDWw=","boJu4ZFwOZzRw1CZ/DiZCzJ\u002BsIBP/ClQEueVsZQIFtI=","3a/1UMYr3ii3NDaBhUH4AeAmDuBTnPhW6ioY\u002BxllwM0=","BlO0gHIipML9uJhpDBkxR/y8n0yCX6lhEvoQGoALQGw=","WlpAcAYMpG3h/Zk/pKjkknMA2zax0WKb/5I3EkV7w24=","3v2xrFFiX2IOwDLwkF\u002Bzceo7MRr9p1z5ja9vqolxT1g=","z8JhsSAgeJBBd\u002B9k1RT6TkOaBdtIh0Xe1JFsMUDXpX4=","hnqFfzQod\u002Bz5OYgpUfOIEqTkm3YcVMZa8TOvdtf30tY=","Z8CRap3CpUd1M7YVBIqu469P\u002BT4xwnkhyndoTr\u002Bjw1Y=","\u002BdTEUjM4KfQhNtLBonfdtHnT28NuRlxBcJumszRotrs=","/mgp\u002Buq8B6nJX/qBrMeSgxGwpftYq6yD2zMgZUB0JVU=","PAYDq0k\u002BY28zDKXkt/eAzi2Cc1o5tHSqhbZdkngG5tk=","zSQa8aZccQ0dYkljtkW6JXmQojEJlA2iXu1MOo6Db\u002Bg=","173g5Oh2i2VuhQpGAIJawm90Z6pFENG9e7tpkhcSAhI=","W6/1z4FKA65sghio\u002BFjDfEL9Id/D/DuCgcSq6vM0QIw=","BxZABb7by8p04mDwLGbOUD97EVvTyq40iiUPWUOZKdk=","q0ctPBQoqn/xQ\u002BxPmZ44z7DNCVPj/k9bdvyvPsLBkmE="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"uX1JeFdFTytYlQPawspOQefa+m0agbesQLMiaeAPgD0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","m0ZalmIclG1CWERwq7TJzaS3UTwdWU7vJTH5wtXTRu0=","kYIUaswTSm/vuWdrFVk9i7vGl7gi4QutG\u002BtCBbnKC6I=","I92NrQVtDRIlAXcy/VupzptYIRXUmfdARzJEd\u002BMwPPI=","vwFknGJfBqZvyW3NEetGDZikd1HNT74cx2PojJjY\u002BPY=","3KENyb8mlCPncPOO5PbFfE0ubEK97voAevXn\u002BluJF7w=","NwDfbvguyiABZkN\u002B7yp6ClTOKkIFe/x4/v8tW4SUWHs=","Hourq1FvI\u002BJdRWbGSIe8r7GJGmkjFaIIQ8xB71hUBj4=","5n3ZEfHdKhL/ejFZA6mAyU6RVQAOd2wCgH3KjVv4d0U=","76\u002Bi/9Jz2zUyw2kfeC1dt0\u002B2uS7aFC2hMxE6ERdLn6s=","nvIt8ExR97wRoREETNPoXJ8D7Pb3KMAHZcwls7Q6c5E=","VfYWVT8Cth4Ztc4/xdY/qocO1V5snDiDHqbnmGMbvSw=","JxOQqF9Br69IsgvR\u002BTp8Vp93AFvsAKAiWtrgUjK7uKE=","5fR1TRHdDoMpaYhFN4ET8XHmhPG8hvpyxjiTF2qwx3M=","lxWH\u002B23ZAM/D8nGa5K0aryPD\u002BJPkC8vLJw2cEPhz8BA=","V8fXm0xeM7wossowKO5U7zhqV0P4uUGyIdkFdI9/LmY=","DGTAL07rwTwMmN0h4z8RtKm1\u002BbRR4K\u002B39bnl/wF43ZM=","rph0gnGKJ2XM54sr0iGk\u002BWTEktu647aepqf4FJUOLY8=","nklMuuwtwGoNNErDuvc4h4TaCmj4xyGZdjpGKgNvLGE=","Onb4gjU\u002B/9a/TKG0C3dG2hXdTEVs7OCECl6pWNTR6pQ=","WY7f0A5zLk9CD0lYECdLRR2b9b8GL2skPQO91AQ5wOM=","Ac8RYrUWtH4wwvUsQ9V6ndbtfhGuDzP1S9Hkh0JQLPg=","ixUpDxEYNKdhPZM9//dDIaFJGC9LvGDbh6rENZRYjWc=","SaPHXK2AwnFe3srooGZwMezdZmaxj0st4ZuBcZ0nfqE=","T5f5jCFFR0KCQwbQwHvZbWrVp7NucmIDfBynM8At\u002BFg=","DMXcRradogfvYUFJEJJT\u002B\u002B5RQjl\u002BI7kUSkHrHCl8oOk=","OLr6tSbzkGk2i5G0fVdSkw7v0IzsX6NL86pLF9m6eX0=","es5rRr8vQCVUTmRO5bFYu0yMvzBffvEDZTKp5IpEEvA=","//xOpsw6IkdGK7auzNWaN3ipl2miVcBMSjnir/YlMBM=","LxLYDw\u002BNEQs1/4eWj5xZUyDYpsFLgH0ApDhFJ57Tdxw=","MFYQHMUPDwTl5G2r85YGLzdn1v369NvEoKIV/yqP9D0=","suYCRRYSyx84XfGpJ642kjRBvpsYCZrXHIQdrDjHhM8=","FWll23MBvwnmTx45GuMEkpaohrEGlqtK5xFGH7EFhFQ=","xVQXdj83lrOmePZ2H/X8gQKeb0ZsdJwmwGlVhgn1iKk=","JBM4mmoRLcKW020j1M5/od\u002BktwV30JiF0IURK3neeVA=","LhQEEPfBv1x4zkjLkNo5UOqbP6vpsuxmDZfWrrYUOuQ=","6Ej25\u002BdEOADcqNkFwaGEjzHy7JwZjxZHE484x/wngas=","eFGzh1RmS7P9u2g03QpW6hWZdSUmi7k6aTjXbhIxvBw=","8EP2SMLjn\u002Ba9MBRxAWB0Chr/dyRQru36g4tGLaVvC5U=","1cSaY4ZOdlRQ4J8JEJcTCTaxFW6wCIkDNaHt4gOO6O0=","lOJzvq/mt94Oz7XdoNgAi5xhxeLtmYb8fQBwlPPQZZE=","OcnWLAVaHOsYs4bxnEnZqIWag3elwA7S4wtI2W/UU/w=","itNr5KUbu31/YaznAa3H9HU94pR2G5E\u002By41ZOAziBso=","9L2A6DEc9nUgGsAfznPoDJDiHK9N5yUnvVAZ55HFU5o=","jrhMriKpKb8MMoF/fFjCvVghgR1nPdlicua/iXMULrs=","CdwSbAeG72nDXEn8OBaMcL1/VmjlgS7xHzBX6FqCAhM=","ZKiapX8zYGlD2F5aGELVEVwu/xqbGH52dLsAPCg\u002BK1c=","MFwB9\u002Bmf\u002BLmDERjgvazd6oBnknubBcqxnX25YF5O\u002BR4=","ychUFdjaQZpbiFmAejbm6r2LE3ryZr0QzpQWAf8pYAU=","HHMN9Vvcgvov4W7M1YjdvfTZsFWuzyUh9TPfALHD8ys=","Rg0Zc7\u002B6aN84D0yIgRswn0g5Z\u002BCedtn8RjWnxPXD6Bc=","nJEkwqZ2WHoYX/lkd1ag99OObwa\u002BUacCxi8cPwQyYZQ=","haqWbxLhmiGrPyfId7Eidma9bDdT\u002BLmPiYFcTJeIvwM=","6Rdh8TmSgxQlWiZ1JiwrbUrqh6GigCZcyq3Y/p/GyEg=","3nVS5wBdgLMIZvvaoi8wriTzs3BDkKg37FtwHfDMhjQ=","PTCwsDOSptetl4jJHyelugE6oXbRSgUnDGBZeR5DJAw=","zzh3FW9R/C\u002BpOP8SPV2JXRRAhd1LLuYlGOyyOnZ9Gnk=","kEChOeuFq85XCariss4dIamJogzRzhHv3I\u002Bwz\u002BTM3qg=","ILgZb/GGIWdwm7iauiYzhswQLxIwoFQmo7WuMsDLZI8=","hPcbJaDUq2Gr6BBrUFWuGPpXtI2\u002Bzf\u002BB131nyeR/VhM=","6VyD1SdAUVe84G4oPqyBEYJ2vsYxzN6p\u002BE2JPzfsaHs=","g3sYtiwGKZqWqJmIFnpgMlXuzekOZOJp7bP\u002BeCGlEJg=","5kGuu3Hg/IoCEyBXsQ7ggsNkiuRTW4VUgJHrzZ6A32A=","V6Cuay3Fa0FmnT45Y/Je3\u002BP\u002BmRZG1Vn7QzNexS/U9QM=","x61JOwZ6Rincvaxrd7L/sxlpqJIbZhN8ugbqRa58Bh0=","2aJE9mIzYveQB88MIjZDblZknjB6XucYyey1JlyCSHw=","om8bC4Me/ps3m/rDiQ48q6XITG3NcGTkzfULk51DvlQ="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"6yMjsR64sBt4b1B/FqRnEeV1bEtcafo0b0yaBC++2mE=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=","i\u002BvQzbAFvT1goFh2MLbHY\u002BJWn2Eh7Jl4g/q8RpLfC8A=","pfhwXTM2AVbf0fIzoujtXXysEv0sxUWJeUH8jlKl69U=","niplJBQaN9/7QLiDkRvZHVu70u4FJsVdZ9GE1KT4bR8=","60HBy8v9lxxCHuWCr3jJDU9j7bsT904TCwhmFs7TGkY=","pb5yKz4MIApJ8z39LfutrKPDbuta2BL1E86CmYnkCRM=","rfibCqcCuMtg95N8wJ9faxeZ\u002BulZ8idK/RPugHk0N7w=","rVvFMjo3WlMSYnHYzjofQxtRDAeZkxL1YKbiuDW\u002BAIE=","D/Y5UnmLzNrwms/zmgtFvGFCc229dUY/oNJJCLeAkNc=","UFelDgpodRudHZR5vlGC/4LGvPaAxrkDsFTyg\u002B15E9Y=","AFU\u002BpBvjFNvLokgLHssz2HE6Hx9E43D1Unu3ZBDd68o=","qm8R3ZZIWjEmZy/E62oKWB4PLQEApL2uaiVcq5ZIgY0=","0ejf0klEgjnXfFleA\u002BoRzdXSH4hvhKw0taX/t8CnMoo=","8csUfqhyXzantst7BSF8t7BGEmfrfFodd4ox0WctT2A=","JvwJr76EG9Z0vSdHyFVpVAqoIvYN12WZXm8SugYMnmc=","rEqVehtrDRmc6aJSF\u002Bww7qSldjJz5URv73k8bzhZY9o=","gOW1xMFxBdC23Mj839IPRqScYD\u002BtUBKSeCFxmmgwdK4=","yYsRQLIhV70LQ3eeTl5U2xq/IxuEPWSBrhwd46mpq3M=","3cVv01CI7MHFArgKXF74nEWAT6JduvNBigcKx8KOQMw=","mtfGqmYfBfmVYYdGaol6lQ05xFYc8j0BmSxdNKOIonY=","V6rTdAcVbI3Rfvwl345hHMwYmyIKBQCl9BIY\u002Bl4fuEo=","bwLBFqscvHguV9K/MtD9TvuZKNTW0CmCb3a1Cy2YoWg=","kox6hybxSZPZ1nHLZ\u002BZHVwp6fi9rL\u002BqrqhBST2qIQSk=","fn/VF5C0Enqf7Vx/n7ur46DVx9E8yl3g5uy2gftcsbg=","TrtiUGMK7djB8lByW7WY57K7MYmjqXB\u002BPCzH\u002BO1xF\u002Bw=","ZOtVRtkYy3LVwy1UFRpvnr/3NgNexwdZC9tsTfjZiGs=","bBHpFzqig/CDb2U7DwIJy3/hyvkuIwQGCm8TYMYDMyc=","RBn2eWYEmz0QrZv46WQnL7HVRY3MiywStQxiRl7GMR4=","Rs3dHXp2OhfxF5Z7OSLZTGzw/QE7t9B\u002BGFmLHPWcXrk=","QLqAkoqq5z2wGK5iPFW3fn6u3TFt7\u002BC5qAnl477jTpo=","bdOKTqUHcufFkFxUJHjNLudSteuvHHnHBoseaYICRTI=","g3UMQizRNaXRlkQFLKj19so2GjLYEhR6JzIufABPYwk=","jMYfYW47VV3EoX4MSmAjRrR90I0YQiABdgaUvtwmtAE=","ia8pTl\u002BYfGWeSBvzt4ldj94pr5n2KW\u002BzRhvhvv2nujM=","apUzwxuOx8yhGnPpJ4BDj3ADEM5Mvm64M2jhAEV/fgs=","jJw7OnxWWuf1dJs1hH7yogZz2QAwynOYxHtnweTx/IQ=","9XrljF5y5X5bn\u002Bsa8GSAHYKFjO\u002BUoCe8038mpGr\u002BxCs=","pFpGHYE23\u002BahN1yA8g8QvuZ0VrG9IINmEACu8K\u002BQyNM=","Eb/3JKAKgHy9seB8x0oBVOz\u002BDVvOBUEM78ZA2YASQ\u002Bo=","mhg5XdxVL\u002BpiNyFA9CgZCJVrjdso7toW9OLPqQTTuU8=","KpmhbpEty8U6keVPQdV/jparkL0LZXugZbwejCPDCjE=","BVzSUl6VzDs/dl/DNrGFd\u002BNlu1FHbhbKkE3DJkDkdkY=","Gm0foPVT8/sv3cAV3t2aEn4NOFHYIBRAN1F\u002Bs3UUGf4=","FTcogBQsqYJ9D9vXXU/ebA9bDlLU6i\u002B2Qd3CZkgx9Ts=","91iJEQ6xILwCzXAkwPdag3M9EOOxc3e6wS5M6qUpW6c=","d4inFzKrhtd9A0Au/Zk5YYbginynHGLW4z6y\u002B2PTIjM=","i8t5peOgQqigZk7S8ZKT9O9m3hSohJSqVRVkBphNWsE=","lF3yjKIhcUx18JtlqKMrV4HzQusbqMaojpl48032CeI=","uwHBsoFQnMBHtvg51ZuFUZWbfitdYc6Im3IfWnCQjuQ=","zj8zEoubFtNbO84LSwDWHbQ/8WIuQiNb\u002BpF7X1Y9Flk=","s7jB0ijOxUP3MJGTfR1kBWj6DQE6SfP2kfoyXwQV1N8=","08ECpnuyDFu70Dt3uLn6PfEXYuVo4Kqe71vHRHlZedU=","2uURsoUpwhLUTBWQd\u002BBfn4r\u002Bjl6mepLgmEn0o8Dc2uM=","8k7Aw\u002B3J3e\u002Bge1aI\u002B8boWN48dsiimIrQQd2NMvAkewE=","meEEmo/l/xZRc3trfqCVOi6T5ArwbpH29nzezJEJPvI=","7euOxuz8g9tIfjUEapb9yCJkZ9LKmQGwKzAe31LJwYk=","XWoTp0uk5pRKqhcSJTMrYYQ/EHsOD/PUgQtBAVIAL/E=","61glfHM0cSnFwZtnWZVKwundEG5RCSNPEEG95MYzQ88=","SDA4nIiShrfDQ7xDtLms\u002BjQnVHw6ySVVDfyoRt9afDM=","idR2TEYU5QnXS8g8SXq/9u8dhcB\u002B\u002BNq9V0PI96e00Sg="],"CachedAssets":{"\u002Bmpt5QPdKRMnohOLT\u002BdUG\u002BqDLzgUPlLqzp\u002BmGEZagE8=":{"Identity":"E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\favicon.ico","SourceId":"OpenArchival.Blazor","SourceType":"Discovered","ContentRoot":"E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","BasePath":"_content/OpenArchival.Blazor","RelativePath":"favicon#[.{fingerprint}]?.ico","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"2jeq8efc6q","Integrity":"8kNQh\u002BLErZHx3sMz237BHWFasAGQ88EWakJrWWYOxTA=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.ico","FileLength":15086,"LastWriteTime":"2025-07-17T01:32:04+00:00"}},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"XVWMafEhfrS/fg2Zj7asTNqgDrfpiwoMDXnjdP5dMDc=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=","J7kZmrOHXGR7mhUJ1qRNPdV4NRND\u002BvY/dHsYc/Fs5FA=","zoyQzHz20Gq24s2eR\u002BQU8CSBO06r9oxWByDVQGHt4qE=","S9txWBMkH4Yj1eG2HUPOkUWz9AoQkGdbSfeW8NgN\u002BxE=","o0aea9nqp02517BUOs9/nGaM6H/UnpWWtWAeDomcgV4=","y2dTx6xFkyjAzITP/\u002BSs40MCBm/Tmm7ZOBpI/DqlBFE=","ZmxUJu7Va54dnyLTpPaeb3LXxiTxJP0LRIHL\u002BnuF44c=","cg4n0kRzzWgY2qlZdUwROVqv25x8/QQaCM/NXeXHAm0=","AcEyg5sF\u002BG7h8cTd4OPHIBGSDc58NkKWM9LXnPCts2s=","VFrRe4girF3FRpDOlYSBnVrkOnl76ekWOxNm7mF4t0A=","j9/Tw8fXyMbeynWjJYmY6kJ7FJ59tcwknts73gweoEI=","8d5OfgLy6a4RJsFXKLcxA1egZHtmIKAbps5lBmeNt38=","AaPPr3bR/sBWrgmYgZKKMSIKNbQeqLf310KQRpKnfsI=","5IT4oOrh1c8VH1VjwWuD7ai4PiPBq/13R4tEiY/TSPI=","Czn9tLfHWPwVf9uh/XrNgA6Ks6J9tVB4JwfLegj/ftM=","SphdH4dZI\u002BUI/NAY8yVibP3CY6lMLtHcvNauNjiMUG4=","NuRRqbDGasbzd5BYo0DL2OjUjjh57dbMlAUsJkIwkPM=","yLN/BA9iAut9Pd7HzcSogC02i9ddxjif2fdbbGIUB70=","CPWWJ2Bp2hzILnMJAY673sNfUfm3FZSJEAufT8hMY6E=","2QKOn\u002BHTSGGnvtnKhUgPyG3helsQD0OCrMBMj\u002B7T3lw=","wtIXZYfkJHNxuSRxgTwoC\u002BU59\u002Byk38nSrpBgrm/qiAo=","9b\u002BWZIOTiDlyAbFbG434M0hhY786ENq3Fu7wCA09jUo=","87spKP4vbfUzWbrg4lDHyoNr6kpsnJEK24nTFEP9rck=","/vMoyd2fA4sgtfeJQc7cppdLQDn8TcwztXnss03HUUw=","oNCxGtvhYEhZorlxe3gldEXtD1YdpsMnXGcFwqqeeQw=","Ld9r0/i9fUO7QsnlP7r1KKriqtVDmSx8cLG0in2YMSo=","53lPHr9hM1ATjEpC\u002B2/TXZeAlArG\u002BcTVBOU0rnOCSYY=","XPDTlgt2uSfOwx8b0oKHXnDrOjRanq/v7VC/aAqsKsg=","XA43zdGlmTrdY6wEAYknKYBFN9IztLZ2jSrofw0b6V4=","InYJRKMtWl6vOkkIYW9DWTiLIRhMbWwp/GcLrfgTYhs=","b/\u002BexuVW46WvMaRrT/V89clZeIFOODWEpaVshFcyvdA=","A0ZKYLLhNwY/0fzk/IVDeOqWtMmS3l3OqAUcDcBwc/A=","CVg6HDxR8p\u002BKSy1NlJ3zIKBQvgufzL\u002BppFGICUQ\u002Bt3w=","QIOQB6Fr0POEbCmn8nJHkvxhD/MBJBkLkRbYJLA/IYQ=","JJFYlRoX9pKL3BogzIBb9yD5WmSNP4CS7LqbhDK3ZV0=","m//7eW/q\u002B\u002BS7cLBAJncoxjjMdd4ob9yeVwXyO\u002BUT9eI=","bK\u002BMzz3RPOuZoQyDguWcV6QBHxrg2U2\u002B/bAVZ\u002BgpVmE=","Xo3U/owG8nW3wjViQjnwmTJExAAnQChLevgIL6SxVgs=","SfZ1OYxt3htPAa47uV4vmWa1Bdgc4ieW\u002B9xakLRDHO8=","vzc7efbyllU994SpWhcuSAj24nDhk3qWXXJzCFKhIec=","Hv9au18n6omxvLxP0EsBJ8HeLnUAyfa1Jg4xpVg87no=","adO3IRtQJ9N8t04wKkZwPZiqyI0LJOP6xF/Suhog1JE=","4pzRrv9HLcQeFngePzOiTXUmXw1iRIiKRoSCce0cugM=","ngTcMNcqz/xhWZBn5CPSCOvjsrREr0HuEN5UW941TxA=","M9OQdzerfnWfXeRb3kqjQR22ZEAOhPUxnUuB5YzydL0=","orh0CcK78/TtV1LjA11aYsn/YxKYUBNSni\u002BannRaWeI=","UGiYv\u002B7Q0HlOyGACdO9FzYJXDNFgT/cKO8xYQLlx5eg=","mplxK8c12PonhfXKpL\u002BHRLxWkaWn30SmMhIBChvSCVE=","BiFEtxAeulxzg4093ODVO/hBU6BTvilbCg7luNc0QSk=","DKhaZ5fHA5jhqYZosYg5BHMriRJHTo30JRbiC\u002BOpd3c=","h0g/Fvvw0atLURHfHCthiHIOZpDTYQ3D\u002BxmffXCZTGs=","OX7hVhGLcy1hGsMR9Q6K5e1m9Inuxss\u002B3dBLxzpfxGo=","zSEvxET0DOTN2cpCiXQExXCGOxdoXNvPpmHsUTUhTXM=","ePeQgUMQPfE9ZZdl8jI2rfGshuKKHGpnajQ0M5shZSk=","BZMtXiMXFAikFlU3GpSO4qnu4ytUYCrr\u002BH44xQ0sqVg=","WhBc1hqkyc8177jVvo4eQuWlpHVI96iHm4VFZAOO7Fc=","mcMbV2\u002BNCfk5eAGwoYnsWOyN8b8NuAO7iH1ewAHyW6U=","DcLX4hxLgf7iG7fZIKLj7eUITuiIGEgGnDYTCSAmcII=","nzN2wI8kPPjBRWwSKLalEYmrDXyx2Y8f5S\u002BJCKVFj1o=","3QVdUFr8xuBbDhinUAe\u002BtHZRSDw8whCbedlQRGg3ByU=","Uml6Zk4Nd3yDJrKkoHqxmSCEYTiat3222CyFbAAoU28=","GstRCs2Ap1VD2t\u002BJ6nr0UpVFlKhrBm8Fi9PmSQbgj\u002B8=","sr4sunvZGYlxTk47R8QnORuMVrTEufupLlUwtph8jAE=","fm0hNxD23Xg4KufltLQTxCmPvcM3fZYY\u002B7jlnuLutTc=","DH6X9\u002BUzPeMZmgXVBMIcvPEMbk70kYRRprZcygSB9Q8="],"CachedAssets":{"Ql2PiheSms1jp3ze9191\u002BLNizQeYVsVG\u002B7N0KZ1uG20=":{"Identity":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\favicon.ico","SourceId":"OpenArchival.Blazor","SourceType":"Discovered","ContentRoot":"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","BasePath":"_content/OpenArchival.Blazor","RelativePath":"favicon#[.{fingerprint}]?.ico","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"2jeq8efc6q","Integrity":"8kNQh\u002BLErZHx3sMz237BHWFasAGQ88EWakJrWWYOxTA=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.ico","FileLength":15086,"LastWriteTime":"2025-08-12T18:28:17.583355+00:00"}},"CachedCopyCandidates":{}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
7UxNhFjzx9q9fjpjqAnwb5kIFP4yRdO/xgX54/7tGJc= locj772PPuINB/J15NsKtk4cyOwyvBk04k+4hYZqXlQ=

View File

@@ -1 +1 @@
{"ContentRoots":["E:\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","E:\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}} {"ContentRoots":["D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\wwwroot\\","D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.Blazor\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\Vincent Allen\\.nuget\\packages\\mudblazor\\8.11.0\\staticwebassets\\"],"Root":{"Children":{"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"favicon.ico.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"uorc1pfmvs-2jeq8efc6q.gz"},"Patterns":null},"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.css"},"Patterns":null},"MudExtensions.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"24gzn4tg1a-qz4batx9cb.gz"},"Patterns":null},"MudExtensions.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudExtensions.min.js"},"Patterns":null},"MudExtensions.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"stwk5nfoxp-loe7cozwzj.gz"},"Patterns":null}},"Asset":null,"Patterns":null},"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-n8rndlt7dy.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":3,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-ofbdodmtsc.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}

View File

@@ -87,3 +87,134 @@ E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.
E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json E:\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\Vincent Allen\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json

View File

@@ -1 +0,0 @@
D:\Open-Archival\OpenArchival.Blazor\wwwroot\favicon.ico

Some files were not shown because too many files have changed in this diff Show More