Extracted some pages to their own assembly and finished the artifact display page code
This commit is contained in:
34
OpenArchival.Blazor.AdminPages/ArchiveConfiguration.razor
Normal file
34
OpenArchival.Blazor.AdminPages/ArchiveConfiguration.razor
Normal file
@@ -0,0 +1,34 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@page "/archiveadmin"
|
||||
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using MudBlazor
|
||||
|
||||
@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 {
|
||||
}
|
||||
@@ -0,0 +1,358 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using System.ComponentModel.DataAnnotations
|
||||
@using MudBlazor
|
||||
@using global::OpenArchival.DataAccess
|
||||
@using OpenArchival.Blazor.CustomComponents
|
||||
|
||||
@inject IDialogService DialogService
|
||||
@inject NavigationManager NavigationManager;
|
||||
@inject IArchiveCategoryProvider CategoryProvider;
|
||||
@inject ArtifactEntrySharedHelpers Helpers;
|
||||
|
||||
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<MudText Typo="Typo.h5" Color="Color.Primary">Add an Archive Item</MudText>
|
||||
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
|
||||
@foreach (var result in ValidationResults)
|
||||
{
|
||||
<MudAlert Severity="Severity.Error">@result.ErrorMessage</MudAlert>
|
||||
}
|
||||
|
||||
<MudGrid Justify="Justify.Center" Class="pt-4">
|
||||
<MudItem>
|
||||
<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>
|
||||
<MudFab Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add" OnClick="OnAddCategoryClicked"/>
|
||||
</MudItem>
|
||||
|
||||
</MudGrid>
|
||||
</MudPaper>
|
||||
|
||||
<div @ref="_formDiv" style="@_formDivStyle">
|
||||
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<IdentifierTextBox @ref="_identifierTextBox" IdentifierFields="@Model.IdentifierFieldValues"></IdentifierTextBox>
|
||||
</MudPaper>
|
||||
|
||||
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<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 Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<UploadDropBox
|
||||
@ref="@_uploadComponent"
|
||||
FilesUploaded="OnFilesUploaded"
|
||||
ClearClicked="OnClearFilesClicked"
|
||||
ExistingFiles="ExistingFiles"></UploadDropBox>
|
||||
</MudPaper>
|
||||
@if (Model is not null)
|
||||
{
|
||||
@for (int index = 0; index < Model.ArtifactEntries.Count; ++index)
|
||||
{
|
||||
// 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"/>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
|
||||
<MudGrid Justify="Justify.FlexEnd" Class="pt-6">
|
||||
<MudItem>
|
||||
<MudCheckBox Label="Publicly Visible" T="bool" @bind-Value=Model.IsPublicallyVisible></MudCheckBox>
|
||||
</MudItem>
|
||||
|
||||
@if (FormButtonsEnabled)
|
||||
{
|
||||
<MudItem Class="pr-0">
|
||||
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="CancelClicked">Cancel</MudButton>
|
||||
</MudItem>
|
||||
|
||||
<MudItem Class="pl-2">
|
||||
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="ml-4" OnClick="PublishClicked" Disabled="@(!IsValid)" >Publish</MudButton>
|
||||
</MudItem>
|
||||
}
|
||||
</MudGrid>
|
||||
|
||||
|
||||
@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();
|
||||
|
||||
/// <summary>
|
||||
/// Determines if the cancel and publish buttons should be show to the user or if the containing component will
|
||||
/// handle their functionality (ie if used in a dialog and you want to use the dialog buttons instead of this component's handlers)
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public bool FormButtonsEnabled { get; set; } = true;
|
||||
|
||||
private UploadDropBox _uploadComponent = default!;
|
||||
|
||||
private IdentifierTextBox _identifierTextBox = default!;
|
||||
|
||||
private ElementReference _formDiv = default!;
|
||||
|
||||
private bool _isFormDivVisible = false;
|
||||
|
||||
private string _formDivStyle => _isFormDivVisible ? "" : "display: none;";
|
||||
|
||||
public List<string> DatesData { get; set; } = [];
|
||||
|
||||
public List<ArchiveCategory> Categories { get; set; } = new();
|
||||
|
||||
private List<FilePathListing> _filePathListings = new();
|
||||
|
||||
private bool _categorySelected = false;
|
||||
|
||||
public bool IsValid { get; set; } = false;
|
||||
|
||||
public List<ValidationResult> ValidationResults { get; private set; } = [];
|
||||
|
||||
// Used to store the files that have already been uploaded if this component is being displayed
|
||||
// with a filled in model. Used to populate the upload drop box
|
||||
private List<FilePathListing> ExistingFiles { get; set; } = new();
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
// Ensure to reload the component if a model has been supplied so that the full
|
||||
// component will render
|
||||
if (Model?.Category is not null)
|
||||
{
|
||||
await OnCategoryChanged();
|
||||
}
|
||||
|
||||
if (Model is not null && Model.Category is not null)
|
||||
{
|
||||
// The data entry should only be shown if a category has been selected
|
||||
_isFormDivVisible = true;
|
||||
} else
|
||||
{
|
||||
_isFormDivVisible = false;
|
||||
}
|
||||
|
||||
if (Model is not null)
|
||||
{
|
||||
ExistingFiles = Model.ArtifactEntries
|
||||
.Where(e => e.Files.Any())
|
||||
.Select(e => e.Files[0])
|
||||
.ToList();
|
||||
}
|
||||
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (BackLink is not null) {
|
||||
NavigationManager.NavigateTo(BackLink);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentNullException("No back link provided for the add archive item page.");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task 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
|
||||
await OnChanged();
|
||||
}
|
||||
|
||||
// You can now simplify your OnFilesUploaded method slightly
|
||||
private async Task OnFilesUploaded(List<FilePathListing> args)
|
||||
{
|
||||
_filePathListings = args;
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
private async Task OnClearFilesClicked()
|
||||
{
|
||||
_filePathListings = [];
|
||||
Model.ArtifactEntries = [];
|
||||
StateHasChanged();
|
||||
await OnChanged();
|
||||
}
|
||||
|
||||
async Task OnChanged()
|
||||
{
|
||||
var validationContext = new ValidationContext(Model);
|
||||
var validationResult = new List<ValidationResult>();
|
||||
|
||||
IsValid = Validator.TryValidateObject(Model, validationContext, validationResult);
|
||||
|
||||
if (IsValid)
|
||||
{
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
async Task OnCategoryChanged()
|
||||
{
|
||||
if (Model.Category is not null && _identifierTextBox is not null)
|
||||
{
|
||||
_identifierTextBox.VerifyFormatCategory = Model.Category;
|
||||
_isFormDivVisible = true;
|
||||
if (!_categorySelected)
|
||||
{
|
||||
_categorySelected = true;
|
||||
}
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
await OnChanged();
|
||||
}
|
||||
|
||||
public async Task OnAddCategoryClicked()
|
||||
{
|
||||
var options = new DialogOptions { CloseOnEscapeKey = true, BackdropClick = false };
|
||||
var dialog = await DialogService.ShowAsync<CategoryCreatorDialog>("Create a Category", options);
|
||||
|
||||
var result = await dialog.Result;
|
||||
|
||||
if (result is not null && !result.Canceled)
|
||||
{
|
||||
await CategoryProvider.CreateCategoryAsync(CategoryValidationModel.ToArchiveCategory((CategoryValidationModel)result.Data));
|
||||
StateHasChanged();
|
||||
await OnChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ArchiveCategory>> SearchCategory(string value, CancellationToken cancellationToken)
|
||||
{
|
||||
List<ArchiveCategory> categories;
|
||||
if (string.IsNullOrEmpty(value))
|
||||
{
|
||||
categories = new(await CategoryProvider.Top(25) ?? []);
|
||||
}
|
||||
else
|
||||
{
|
||||
categories = new((await CategoryProvider.Search(value) ?? []));
|
||||
}
|
||||
|
||||
return categories;
|
||||
}
|
||||
|
||||
private async void OnDeleteEntryClicked((int index, string filename) data)
|
||||
{
|
||||
Model.ArtifactEntries.RemoveAt(data.index);
|
||||
_uploadComponent.RemoveFile(data.filename);
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using MudBlazor
|
||||
|
||||
<MudDialog>
|
||||
<TitleContent>
|
||||
<MudText Typo="Typo.h6">Edit a Category</MudText>
|
||||
</TitleContent>
|
||||
|
||||
<DialogContent>
|
||||
<AddArchiveGroupingComponent
|
||||
Model="Model"
|
||||
FormButtonsEnabled=false></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; }
|
||||
|
||||
[CascadingParameter]
|
||||
IMudDialogInstance MudDialog { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public bool IsUpdate { get; set; } = false;
|
||||
|
||||
|
||||
private void OnCancel(MouseEventArgs args)
|
||||
{
|
||||
MudDialog.Cancel();
|
||||
}
|
||||
private void OnSubmit(MouseEventArgs args)
|
||||
{
|
||||
MudDialog.Close(DialogResult.Ok(Model));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,326 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using OpenArchival.DataAccess
|
||||
@using System.ComponentModel.DataAnnotations
|
||||
@using OpenArchival.Blazor.CustomComponents
|
||||
@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">
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<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>
|
||||
<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 @bind-Value:after=OnInputsChanged SearchFunc="Helpers.SearchItemTypes" CoerceValue=true></MudAutocomplete>
|
||||
|
||||
@* Tags entry *@
|
||||
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Tags</MudText>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<ChipContainer T="string" @ref="@_tagsChipContainer" @bind-Items="Model.Tags">
|
||||
<InputContent>
|
||||
<MudAutocomplete T="string"
|
||||
OnInternalInputChanged="OnInputsChanged"
|
||||
SearchFunc="Helpers.SearchTags"
|
||||
Value="_tagsInputValue"
|
||||
ValueChanged="OnTagsInputTextChanged"
|
||||
OnKeyDown="@(ev => HandleChipContainerEnter<string>(ev, _tagsChipContainer, _tagsInputValue, () => _tagsInputValue = string.Empty))"
|
||||
CoerceValue=true
|
||||
Placeholder="Add Tags..."
|
||||
ShowProgressIndicator="true"
|
||||
>
|
||||
</MudAutocomplete>
|
||||
</InputContent>
|
||||
</ChipContainer>
|
||||
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<ChipContainer T="string" @ref=_listedNamesChipContainer @bind-Items="Model.ListedNames">
|
||||
<InputContent>
|
||||
<MudAutocomplete T="string"
|
||||
SearchFunc="Helpers.SearchListedNames"
|
||||
OnInternalInputChanged="OnInputsChanged"
|
||||
Value="_listedNamesInputValue"
|
||||
ValueChanged="OnListedNamesTextChanged"
|
||||
OnKeyDown="@(ev=>HandleChipContainerEnter<string>(ev, _listedNamesChipContainer, _listedNamesInputValue, () => _listedNamesInputValue = string.Empty))"
|
||||
CoerceValue=true
|
||||
Placeholder="Add Listed Names..."
|
||||
ShowProgressIndicator=true>
|
||||
</MudAutocomplete>
|
||||
</InputContent>
|
||||
</ChipContainer>
|
||||
|
||||
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Associated Dates</MudText>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<ChipContainer T="DateTime" @ref="_assocaitedDatesChipContainer" @bind-Items="Model.AssociatedDates" DisplayFunc="date => date.ToShortDateString()">
|
||||
<InputContent>
|
||||
<MudDatePicker @bind-Date=_associatedDateInputValue MinDate="new DateTime(1000, 1, 1)">
|
||||
</MudDatePicker>
|
||||
</InputContent>
|
||||
<SubmitButton>
|
||||
<MudButton Color="Color.Primary"
|
||||
OnClick="HandleAssociatedDateChipContainerAdd">+</MudButton>
|
||||
</SubmitButton>
|
||||
</ChipContainer>
|
||||
|
||||
<MudText Typo="Typo.h6" Color="Color.Primary" Class="pt-4 pb-0">Defects</MudText>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<ChipContainer T="string" @ref=_defectsChipContainer @bind-Items="Model.Defects">
|
||||
<InputContent>
|
||||
<MudAutocomplete T="string"
|
||||
SearchFunc="Helpers.SearchDefects"
|
||||
OnInternalInputChanged="OnInputsChanged"
|
||||
Value="_defectsInputValue"
|
||||
ValueChanged="OnDefectsValueChanged"
|
||||
OnKeyDown="@(ev=>HandleChipContainerEnter<string>(ev, _defectsChipContainer, _defectsInputValue, () => _defectsInputValue = string.Empty))"
|
||||
CoerceValue=true
|
||||
Placeholder="Add Defects..."
|
||||
ShowProgressIndicator=true>
|
||||
</MudAutocomplete>
|
||||
</InputContent>
|
||||
</ChipContainer>
|
||||
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<ChipContainer T="ArtifactEntry" @ref="_assocaitedArtifactsChipContainer" @bind-Items="Model.RelatedArtifacts" DisplayFunc="artifact => artifact.ArtifactIdentifier">
|
||||
<InputContent>
|
||||
<MudAutocomplete T="ArtifactEntry"
|
||||
OnInternalInputChanged="OnInputsChanged"
|
||||
Value="_associatedArtifactValue"
|
||||
ValueChanged="OnAssociatedArtifactChanged"
|
||||
OnKeyDown="@(EventArgs=>HandleChipContainerEnter<ArtifactEntry>(EventArgs, _assocaitedArtifactsChipContainer, _associatedArtifactValue, () => _associatedArtifactValue = null))"
|
||||
CoerceValue="false"
|
||||
Placeholder="Link artifact groupings..."
|
||||
ShowProgressIndicator=true>
|
||||
</MudAutocomplete>
|
||||
</InputContent>
|
||||
</ChipContainer>
|
||||
|
||||
<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>
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<MudTextField T="string"
|
||||
Value=Model.FileTextContent
|
||||
ValueChanged="OnArtifactTextContentChanged"
|
||||
Lines="5"
|
||||
For="@(() => Model.FileTextContent)"></MudTextField>
|
||||
|
||||
<MudText Typo=Typo.h6 Color="Color.Primary">Additional files</MudText>
|
||||
<UploadDropBox @ref=_uploadDropBox FilesUploaded="OnFilesUploaded"></UploadDropBox>
|
||||
</MudPaper>
|
||||
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public required FilePathListing MainFilePath { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<ArtifactEntryValidationModel> ModelChanged { get; set; }
|
||||
|
||||
[Parameter]
|
||||
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 index, string filename)> OnEntryDeletedClicked { get; set; }
|
||||
|
||||
private ChipContainer<string> _tagsChipContainer;
|
||||
|
||||
private string _tagsInputValue { get; set; } = "";
|
||||
|
||||
private ChipContainer<DateTime> _assocaitedDatesChipContainer;
|
||||
|
||||
private DateTime? _associatedDateInputValue { get; set; } = default;
|
||||
|
||||
private ChipContainer<string> _listedNamesChipContainer;
|
||||
|
||||
private string _listedNamesInputValue { get; set; } = "";
|
||||
|
||||
private ChipContainer<string> _defectsChipContainer;
|
||||
|
||||
private string _defectsInputValue = "";
|
||||
|
||||
private ChipContainer<ArtifactEntry> _assocaitedArtifactsChipContainer;
|
||||
|
||||
private ArtifactEntry? _associatedArtifactValue = null;
|
||||
|
||||
private string _artifactTextContent = "";
|
||||
|
||||
public bool IsValid { get; set; }
|
||||
|
||||
public List<ValidationResult> ValidationResults { get; private set; } = [];
|
||||
|
||||
public UploadDropBox _uploadDropBox = default!;
|
||||
|
||||
protected override Task OnParametersSetAsync()
|
||||
{
|
||||
if (_uploadDropBox is not null && Model is not null && Model.Files is not null)
|
||||
{
|
||||
_uploadDropBox.ExistingFiles = Model.Files.GetRange(1, Model.Files.Count - 1);
|
||||
}
|
||||
|
||||
if (Model.Files is not null && Model.Files.Any())
|
||||
{
|
||||
MainFilePath = Model.Files[0];
|
||||
}
|
||||
|
||||
return base.OnParametersSetAsync();
|
||||
}
|
||||
|
||||
public async Task OnInputsChanged()
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
var oldFiles = Model.Files.GetRange(1, Model.Files.Count - 1);
|
||||
Model.Files = [MainFilePath];
|
||||
Model.Files.AddRange(oldFiles);
|
||||
Model.Files.AddRange(filePathListings);
|
||||
} else
|
||||
{
|
||||
Model.Files = [];
|
||||
}
|
||||
Model.Files.AddRange(filePathListings);
|
||||
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task OnFilesCleared()
|
||||
{
|
||||
if (MainFilePath is not null) {
|
||||
Model.Files = [MainFilePath];
|
||||
} else
|
||||
{
|
||||
Model.Files = [];
|
||||
}
|
||||
}
|
||||
|
||||
private Task OnDefectsValueChanged(string text)
|
||||
{
|
||||
_defectsInputValue = text;
|
||||
return ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
|
||||
private Task OnTagsInputTextChanged(string text)
|
||||
{
|
||||
_tagsInputValue = text;
|
||||
return ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
|
||||
private Task OnListedNamesTextChanged(string text)
|
||||
{
|
||||
_listedNamesInputValue = text;
|
||||
return ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
|
||||
private Task OnAssociatedArtifactChanged(ArtifactEntry grouping)
|
||||
{
|
||||
if (grouping is not null)
|
||||
{
|
||||
_associatedArtifactValue = grouping;
|
||||
return ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
|
||||
return ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
|
||||
private Task OnArtifactTextContentChanged(string value)
|
||||
{
|
||||
Model.FileTextContent = value;
|
||||
return ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
|
||||
public async Task HandleChipContainerEnter<Type>(KeyboardEventArgs args, ChipContainer<Type> container, Type value, Action resetInputAction)
|
||||
{
|
||||
if (args.Key == "Enter")
|
||||
{
|
||||
await container.AddItem(value);
|
||||
resetInputAction?.Invoke();
|
||||
StateHasChanged();
|
||||
await ModelChanged.InvokeAsync(Model);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task HandleAssociatedDateChipContainerAdd(MouseEventArgs args)
|
||||
{
|
||||
if (_associatedDateInputValue is not null)
|
||||
{
|
||||
DateTime unspecifiedDate = (DateTime)_associatedDateInputValue;
|
||||
|
||||
DateTime utcDate = DateTime.SpecifyKind(unspecifiedDate, DateTimeKind.Utc);
|
||||
|
||||
await _assocaitedDatesChipContainer.AddItem(utcDate);
|
||||
|
||||
_associatedDateInputValue = default;
|
||||
}
|
||||
}
|
||||
private async Task OnDeleteEntryClicked(MouseEventArgs args)
|
||||
{
|
||||
await OnEntryDeletedClicked.InvokeAsync((ArtifactEntryIndex, MainFilePath.OriginalName));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using MudBlazor
|
||||
@using MudExtensions
|
||||
@using OpenArchival.DataAccess
|
||||
|
||||
<MudDataGrid
|
||||
T="ArtifactGroupingRowElement"
|
||||
MultiSelection=true
|
||||
Filterable=false
|
||||
SelectOnRowClick=true
|
||||
ServerData="new Func<GridState<ArtifactGroupingRowElement>, Task<GridData<ArtifactGroupingRowElement>>>(ServerReload)"
|
||||
@key=@ArtifactGroupingRows
|
||||
@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;
|
||||
@inject ArtifactEntrySharedHelpers Helpers;
|
||||
|
||||
@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 async Task OnRowEditClick(ArtifactGroupingRowElement row)
|
||||
{
|
||||
var parameters = new DialogParameters();
|
||||
|
||||
var model = await GroupingProvider.GetGroupingAsync(row.Id);
|
||||
|
||||
parameters.Add("Model", ArtifactGroupingValidationModel.ToValidationModel(model));
|
||||
|
||||
var options = new DialogOptions()
|
||||
{
|
||||
MaxWidth = MaxWidth.ExtraExtraLarge,
|
||||
FullWidth = true
|
||||
};
|
||||
|
||||
var dialog = await DialogService.ShowAsync<AddGroupingDialog>("Edit Grouping", parameters, options);
|
||||
|
||||
var result = await dialog.Result;
|
||||
|
||||
if (result is not null && !result.Canceled)
|
||||
{
|
||||
var validationModel = (ArtifactGroupingValidationModel)result.Data!;
|
||||
|
||||
await Helpers.OnGroupingPublished(validationModel);
|
||||
|
||||
await DataGrid.ReloadServerData();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<GridData<ArtifactGroupingRowElement>> ServerReload(GridState<ArtifactGroupingRowElement> state)
|
||||
{
|
||||
int totalItems = await GroupingProvider.GetTotalCount();
|
||||
|
||||
IEnumerable<ArtifactGrouping> groupings = await GroupingProvider.GetGroupingsPaged(state.Page + 1, state.PageSize);
|
||||
|
||||
var pagedItems = groupings.Select(grouping => new ArtifactGroupingRowElement()
|
||||
{
|
||||
Id = grouping.Id,
|
||||
Title = grouping.Title,
|
||||
ArtifactGroupingIdentifier = grouping.ArtifactGroupingIdentifier ?? throw new ArgumentNullException(nameof(grouping), "Got a null ArtifactGroupingIdentifier"),
|
||||
CategoryName = grouping.Category.Name,
|
||||
IsPublicallyVisible = grouping.IsPublicallyVisible,
|
||||
});
|
||||
|
||||
return new GridData<ArtifactGroupingRowElement>()
|
||||
{
|
||||
TotalItems = totalItems,
|
||||
Items = pagedItems
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,259 @@
|
||||
namespace OpenArchival.Blazor.AdminPages;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using OpenArchival.DataAccess;
|
||||
|
||||
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; }
|
||||
|
||||
IArtifactGroupingProvider GroupingProvider { get; set; }
|
||||
|
||||
|
||||
public ArtifactEntrySharedHelpers(IArtifactDefectProvider defectsProvider, IArtifactStorageLocationProvider storageLocationProvider, IArchiveEntryTagProvider tagsProvider, IArtifactTypeProvider typesProvider, IListedNameProvider listedNamesProvider, IDbContextFactory<ApplicationDbContext> contextFactory, IArtifactGroupingProvider groupingProvider)
|
||||
{
|
||||
DefectsProvider = defectsProvider;
|
||||
StorageLocationProvider = storageLocationProvider;
|
||||
TagsProvider = tagsProvider;
|
||||
TypesProvider = typesProvider;
|
||||
ListedNameProvider = listedNamesProvider;
|
||||
DbContextFactory = contextFactory;
|
||||
GroupingProvider = groupingProvider;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
// The old logic for attaching the category is still good.
|
||||
context.Attach(grouping.Category);
|
||||
|
||||
// 1. Handle ArtifactType (no change, this was fine)
|
||||
if (grouping.Type is not null)
|
||||
{
|
||||
var existingType = await context.ArtifactTypes
|
||||
.FirstOrDefaultAsync(t => t.Name == grouping.Type.Name);
|
||||
|
||||
if (existingType is not null)
|
||||
{
|
||||
grouping.Type = existingType;
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Process ChildArtifactEntries
|
||||
foreach (var entry in grouping.ChildArtifactEntries)
|
||||
{
|
||||
// Handle ArtifactStorageLocation (no change, this was fine)
|
||||
var existingLocation = await context.ArtifactStorageLocations
|
||||
.FirstOrDefaultAsync(l => l.Location == entry.StorageLocation.Location);
|
||||
|
||||
if (existingLocation is not null)
|
||||
{
|
||||
entry.StorageLocation = existingLocation;
|
||||
}
|
||||
|
||||
// Handle Defects
|
||||
if (entry.Defects is not null && entry.Defects.Any())
|
||||
{
|
||||
var defectDescriptions = entry.Defects.Select(d => d.Description).ToList();
|
||||
var existingDefects = await context.ArtifactDefects
|
||||
.Where(d => defectDescriptions.Contains(d.Description))
|
||||
.ToListAsync();
|
||||
|
||||
// Replace in-memory defects with existing ones
|
||||
for (int i = 0; i < entry.Defects.Count; i++)
|
||||
{
|
||||
var existingDefect = existingDefects
|
||||
.FirstOrDefault(ed => ed.Description == entry.Defects[i].Description);
|
||||
|
||||
if (existingDefect is not null)
|
||||
{
|
||||
entry.Defects[i] = existingDefect;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle ListedNames
|
||||
if (entry.ListedNames is not null && entry.ListedNames.Any())
|
||||
{
|
||||
var listedNamesValues = entry.ListedNames.Select(n => n.Value).ToList();
|
||||
var existingNames = await context.ArtifactAssociatedNames
|
||||
.Where(n => listedNamesValues.Contains(n.Value))
|
||||
.ToListAsync();
|
||||
|
||||
for (int i = 0; i < entry.ListedNames.Count; i++)
|
||||
{
|
||||
var existingName = existingNames
|
||||
.FirstOrDefault(en => en.Value == entry.ListedNames[i].Value);
|
||||
|
||||
if (existingName is not null)
|
||||
{
|
||||
entry.ListedNames[i] = existingName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle Tags
|
||||
if (entry.Tags is not null && entry.Tags.Any())
|
||||
{
|
||||
var tagNames = entry.Tags.Select(t => t.Name).ToList();
|
||||
var existingTags = await context.ArtifactEntryTags
|
||||
.Where(t => tagNames.Contains(t.Name))
|
||||
.ToListAsync();
|
||||
|
||||
for (int i = 0; i < entry.Tags.Count; i++)
|
||||
{
|
||||
var existingTag = existingTags
|
||||
.FirstOrDefault(et => et.Name == entry.Tags[i].Name);
|
||||
|
||||
if (existingTag is not null)
|
||||
{
|
||||
entry.Tags[i] = existingTag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 💡 NEW: Handle pre-existing FilePathListings
|
||||
// This is the key change to resolve the exception
|
||||
if (entry.Files is not null)
|
||||
{
|
||||
foreach (var filepath in entry.Files)
|
||||
{
|
||||
// The issue is trying to add a new entity that has an existing primary key.
|
||||
// Since you stated that all files are pre-added, you must attach them.
|
||||
// Attach() tells EF Core to track the entity, assuming it already exists.
|
||||
context.Attach(filepath);
|
||||
// Also ensure the parent-child relationship is set correctly, though it's likely set by ToArtifactGrouping
|
||||
filepath.ParentArtifactEntry = entry;
|
||||
}
|
||||
}
|
||||
// Tag each entry with the parent grouping so it is linked correctly in the database
|
||||
entry.ArtifactGrouping = grouping;
|
||||
}
|
||||
|
||||
// 3. Add the main grouping object and let EF Core handle the graph
|
||||
// The previous issues with the graph are resolved, so this line should now work.
|
||||
context.ArtifactGroupings.Add(grouping);
|
||||
|
||||
// 4. Save all changes in a single transaction
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
*/
|
||||
|
||||
public async Task OnGroupingPublished(ArtifactGroupingValidationModel model)
|
||||
{
|
||||
// The OnGroupingPublished method in this class should not contain DbContext logic.
|
||||
// It should orchestrate the data flow by calling the appropriate provider methods.
|
||||
var isNew = model.Id == 0 || model.Id is null;
|
||||
|
||||
// Convert the validation model to an entity
|
||||
var grouping = model.ToArtifactGrouping();
|
||||
|
||||
if (isNew)
|
||||
{
|
||||
// For a new grouping, use the CreateGroupingAsync method.
|
||||
// The provider method will handle the file path logic.
|
||||
await GroupingProvider.CreateGroupingAsync(grouping);
|
||||
}
|
||||
else
|
||||
{
|
||||
// For an existing grouping, use the UpdateGroupingAsync method.
|
||||
// The provider method will handle the change tracking.
|
||||
await GroupingProvider.UpdateGroupingAsync(grouping);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using System.Text
|
||||
@using MudBlazor
|
||||
|
||||
<MudText Typo="Typo.body2" Color="Color.Primary">Item Identifier: @Value</MudText>
|
||||
@if (_identifierError)
|
||||
{
|
||||
<MudAlert Severity="Severity.Error" Class="mt-4">
|
||||
All identifier fields must be filled in.
|
||||
</MudAlert>
|
||||
}
|
||||
<MudDivider DividerType="DividerType.Middle"></MudDivider>
|
||||
<MudGrid Class="pt-0 pl-4 pr-4" Justify="Justify.FlexStart" AlignItems="AlignItems.Center">
|
||||
|
||||
@for (int index = 0; index < IdentifierFields.Count; index++)
|
||||
{
|
||||
// You must create a local variable inside the loop for binding to work correctly.
|
||||
var field = IdentifierFields[index];
|
||||
|
||||
<MudItem Class="pt-6">
|
||||
<MudTextField Label="@field.Name"
|
||||
@bind-Value="@field.Value"
|
||||
@bind-Value:after="OnInputChanged"
|
||||
DebounceInterval="100"
|
||||
Required=true/>
|
||||
</MudItem>
|
||||
|
||||
@if (index < IdentifierFields.Count - 1)
|
||||
{
|
||||
<MudItem Class="pt-6">
|
||||
<MudText>@FieldSeparator</MudText>
|
||||
</MudItem>
|
||||
}
|
||||
}
|
||||
</MudGrid>
|
||||
|
||||
@using OpenArchival.DataAccess;
|
||||
@inject IArchiveCategoryProvider CategoryProvider;
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public required string FieldSeparator { get; set; } = "-";
|
||||
|
||||
private List<IdentifierFieldValidationModel> _identifierFields = new();
|
||||
|
||||
[Parameter]
|
||||
public required List<IdentifierFieldValidationModel> IdentifierFields
|
||||
{
|
||||
get => _identifierFields;
|
||||
set => _identifierFields = value ?? new();
|
||||
}
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<string> ValueChanged { get; set; }
|
||||
|
||||
private ArchiveCategory _verifyFormatCategory;
|
||||
public ArchiveCategory? VerifyFormatCategory
|
||||
{
|
||||
get
|
||||
{
|
||||
return _verifyFormatCategory;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value is not null)
|
||||
{
|
||||
_identifierFields.Clear();
|
||||
_verifyFormatCategory = value;
|
||||
foreach (var field in value.FieldNames)
|
||||
{
|
||||
_identifierFields.Add(new IdentifierFieldValidationModel() {Name=field, Value=""});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsValid { get; set; } = false;
|
||||
|
||||
// Computed property that builds the final string
|
||||
public string Value => string.Join(FieldSeparator, IdentifierFields.Select(f => f.Value).Where(v => !string.IsNullOrEmpty(v)));
|
||||
|
||||
private bool _identifierError = false;
|
||||
|
||||
/// <summary>
|
||||
/// This runs when parameters are first set, ensuring the initial state is correct.
|
||||
/// </summary>
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
ValidateFields();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This runs after the user types into a field.
|
||||
/// </summary>
|
||||
private async Task OnInputChanged()
|
||||
{
|
||||
ValidateFields();
|
||||
await ValueChanged.InvokeAsync(this.Value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reusable method to check the validity of the identifier fields.
|
||||
/// </summary>
|
||||
private void ValidateFields()
|
||||
{
|
||||
// Set to true if ANY field is empty or null.
|
||||
_identifierError = IdentifierFields.Any(f => string.IsNullOrEmpty(f.Value));
|
||||
IsValid = !_identifierError;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
namespace OpenArchival.Blazor;
|
||||
|
||||
using OpenArchival.DataAccess;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
public class ArtifactEntryValidationModel
|
||||
{
|
||||
/// <summary>
|
||||
/// Used when translating between the validation model and the database model
|
||||
/// </summary>
|
||||
public int? Id { get; set; }
|
||||
|
||||
[Required(AllowEmptyStrings = false, ErrorMessage = "An artifact numbering must be supplied")]
|
||||
public string? ArtifactNumber { get; set; }
|
||||
|
||||
[Required(AllowEmptyStrings = false, ErrorMessage = "A title must be provided")]
|
||||
public string? Title { get; set; }
|
||||
|
||||
public string? Description { get; set; }
|
||||
|
||||
public string? Type { get; set; }
|
||||
|
||||
public string? StorageLocation { get; set; }
|
||||
|
||||
public List<string>? Tags { get; set; } = [];
|
||||
|
||||
public List<string>? ListedNames { get; set; } = [];
|
||||
|
||||
public List<DateTime>? AssociatedDates { get; set; } = [];
|
||||
|
||||
public List<string>? Defects { get; set; } = [];
|
||||
|
||||
public List<string>? Links { get; set; } = [];
|
||||
|
||||
public List<FilePathListing>? Files { get; set; } = [];
|
||||
|
||||
public string? FileTextContent { get; set; }
|
||||
|
||||
public List<ArtifactEntry> RelatedArtifacts { get; set; } = [];
|
||||
|
||||
public bool IsPublicallyVisible { get; set; } = true;
|
||||
|
||||
public ArtifactEntry ToArtifactEntry(ArtifactGrouping? parent = null)
|
||||
{
|
||||
List<ArtifactEntryTag> tags = new();
|
||||
if (Tags is not null)
|
||||
{
|
||||
foreach (var tag in Tags)
|
||||
{
|
||||
tags.Add(new ArtifactEntryTag() { Name = tag });
|
||||
}
|
||||
}
|
||||
|
||||
List<ArtifactDefect> defects = new();
|
||||
foreach (var defect in Defects)
|
||||
{
|
||||
defects.Add(new ArtifactDefect() { Description=defect});
|
||||
}
|
||||
|
||||
var entry = new ArtifactEntry()
|
||||
{
|
||||
Id = Id ?? 0,
|
||||
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() { Value=name });
|
||||
}
|
||||
|
||||
entry.ListedNames = listedNames;
|
||||
|
||||
if (!string.IsNullOrEmpty(StorageLocation))
|
||||
{
|
||||
entry.StorageLocation = new ArtifactStorageLocation() { Location = StorageLocation };
|
||||
}
|
||||
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
using OpenArchival.DataAccess;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace OpenArchival.Blazor;
|
||||
|
||||
public class ArtifactGroupingValidationModel : IValidatableObject
|
||||
{
|
||||
/// <summary>
|
||||
/// Used by update code to track the database record that corresponds to the data within this DTO
|
||||
/// </summary>
|
||||
public int? Id { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "A grouping title is required.")]
|
||||
public string? Title { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "A grouping description is required.")]
|
||||
public string? Description { 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; } = true;
|
||||
|
||||
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()
|
||||
{
|
||||
Id = Id ?? default,
|
||||
Title = Title,
|
||||
Description = Description,
|
||||
Category = Category,
|
||||
IdentifierFields = identifierFields,
|
||||
IsPublicallyVisible = true,
|
||||
ChildArtifactEntries = entries,
|
||||
Type = new ArtifactType() { Name = Type }
|
||||
};
|
||||
|
||||
// Create the parent link
|
||||
foreach (var entry in grouping.ChildArtifactEntries)
|
||||
{
|
||||
entry.ArtifactGrouping = grouping;
|
||||
}
|
||||
|
||||
return grouping;
|
||||
}
|
||||
|
||||
public static ArtifactGroupingValidationModel ToValidationModel(ArtifactGrouping grouping)
|
||||
{
|
||||
var entries = new List<ArtifactEntryValidationModel>();
|
||||
|
||||
foreach (var entry in grouping.ChildArtifactEntries)
|
||||
{
|
||||
var defects = new List<string>();
|
||||
|
||||
if (entry.Defects is not null)
|
||||
{
|
||||
defects.AddRange(entry.Defects.Select(defect => defect.Description));
|
||||
}
|
||||
|
||||
var validationModel = new ArtifactEntryValidationModel()
|
||||
{
|
||||
Id = entry.Id,
|
||||
Title = entry.Title,
|
||||
StorageLocation = entry.StorageLocation.Location,
|
||||
ArtifactNumber = entry.ArtifactNumber,
|
||||
AssociatedDates = entry.AssociatedDates,
|
||||
Defects = entry?.Defects?.Select(defect => defect.Description).ToList(),
|
||||
Description = entry?.Description,
|
||||
Files = entry?.Files,
|
||||
FileTextContent = entry?.FileTextContent,
|
||||
IsPublicallyVisible = entry.IsPubliclyVisible,
|
||||
Links = entry.Links,
|
||||
ListedNames = entry?.ListedNames?.Select(name => name.Value).ToList(),
|
||||
RelatedArtifacts = entry.RelatedTo,
|
||||
Tags = entry?.Tags?.Select(tag => tag.Name).ToList(),
|
||||
Type = entry?.Type.Name,
|
||||
};
|
||||
|
||||
entries.Add(validationModel);
|
||||
}
|
||||
|
||||
var identifierFieldsStrings = grouping.IdentifierFields.Values;
|
||||
List<IdentifierFieldValidationModel> identifierFields = new();
|
||||
for (int index = 0; index < identifierFieldsStrings.Count; ++index)
|
||||
{
|
||||
identifierFields.Add(new IdentifierFieldValidationModel()
|
||||
{
|
||||
Value = identifierFieldsStrings[index],
|
||||
Name = grouping.Category.FieldNames[index]
|
||||
});
|
||||
}
|
||||
return new ArtifactGroupingValidationModel()
|
||||
{
|
||||
Id = grouping.Id,
|
||||
Title = grouping.Title,
|
||||
ArtifactEntries = entries,
|
||||
Category = grouping.Category,
|
||||
Description = grouping.Description,
|
||||
IdentifierFieldValues = identifierFields,
|
||||
IsPublicallyVisible = grouping.IsPublicallyVisible,
|
||||
Type = grouping.Type.Name
|
||||
};
|
||||
}
|
||||
|
||||
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.Count > 0)
|
||||
{
|
||||
yield return new ValidationResult("Must upload one or more files");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace OpenArchival.Blazor;
|
||||
|
||||
public class IdentifierFieldValidationModel
|
||||
{
|
||||
public string Name { get; set; } = "";
|
||||
public string Value { get; set; } = "";
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using Microsoft.EntityFrameworkCore;
|
||||
@using Microsoft.Extensions.Logging
|
||||
@using MudBlazor.Interfaces
|
||||
@using OpenArchival.DataAccess
|
||||
@using MudBlazor
|
||||
@using MudExtensions
|
||||
|
||||
@page "/categorieslist"
|
||||
|
||||
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<MudText Typo="Typo.h6">Categories</MudText>
|
||||
<MudDivider Class="mb-2"></MudDivider>
|
||||
<MudList T="string" Clickable="true">
|
||||
@foreach (ArchiveCategory category in _categories)
|
||||
{
|
||||
<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>
|
||||
@ChildContent
|
||||
</MudPaper>
|
||||
|
||||
@inject IArchiveCategoryProvider CategoryProvider;
|
||||
@inject ILogger<CategoriesListComponent> Logger;
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public RenderFragment ChildContent { get; set; } = default!;
|
||||
|
||||
[Parameter]
|
||||
public bool ShowDeleteButton { get; set; } = false;
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<ArchiveCategory> ListItemClickedCallback { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<ArchiveCategory> OnDeleteClickedCallback { get; set; }
|
||||
|
||||
private List<ArchiveCategory> _categories = new();
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await LoadCategories();
|
||||
}
|
||||
|
||||
private async Task 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.");
|
||||
_categories.Clear();
|
||||
return;
|
||||
}
|
||||
_categories = categories.ToList();
|
||||
}
|
||||
|
||||
public async Task RefreshData()
|
||||
{
|
||||
await LoadCategories();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task OnCategoryItemClicked(ArchiveCategory category)
|
||||
{
|
||||
await ListItemClickedCallback.InvokeAsync(category);
|
||||
}
|
||||
|
||||
private async Task HandleDeleteClick(ArchiveCategory category)
|
||||
{
|
||||
await OnDeleteClickedCallback.InvokeAsync(category);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using System.ComponentModel.DataAnnotations;
|
||||
@using OpenArchival.DataAccess;
|
||||
@using MudBlazor
|
||||
|
||||
<MudDialog>
|
||||
<TitleContent>
|
||||
<MudText Typo="Typo.h6">Create a Category</MudText>
|
||||
</TitleContent>
|
||||
<DialogContent>
|
||||
<MudForm @ref="_form">
|
||||
<MudTextField @bind-Value="ValidationModel.Name"
|
||||
For="@(() => ValidationModel.Name)"
|
||||
Label="Category Name"
|
||||
Variant="Variant.Filled" />
|
||||
|
||||
<MudDivider Class="pt-4" DividerType="DividerType.Middle"/>
|
||||
|
||||
<MudText Typo="Typo.h6">Item Tag Identifier</MudText>
|
||||
<MudText Typo="Typo.subtitle2">This will be the format of the identifier used for each archive entry.</MudText>
|
||||
|
||||
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
||||
<MudText Typo="Typo.body2">Format Preview: </MudText>
|
||||
<MudText Type="Typo.body2" Color="Color.Primary">@FormatPreview</MudText>
|
||||
</MudStack>
|
||||
|
||||
<MudTextField @bind-Value="ValidationModel.FieldSeparator"
|
||||
@bind-Value:after="UpdateFormatPreview"
|
||||
For="@(() => ValidationModel.FieldSeparator)"
|
||||
Label="Field Separator"
|
||||
Variant="Variant.Filled"
|
||||
MaxLength="1" />
|
||||
|
||||
<MudDivider Class="pt-4" />
|
||||
|
||||
<MudNumericField
|
||||
Value="ValidationModel.NumFields"
|
||||
ValueChanged="@((int newCount) => OnNumFieldsChanged(newCount))"
|
||||
Label="Number of fields in the item identifiers"
|
||||
Variant="Variant.Filled"
|
||||
Min="1"></MudNumericField>
|
||||
|
||||
<MudDivider Class="pt-4" />
|
||||
|
||||
<MudGrid Class="pr-2 pt-2 pb-2 pl-8" Justify="Justify.FlexStart" Spacing="3">
|
||||
@for (int index = 0; index < ValidationModel.FieldNames.Count; ++index)
|
||||
{
|
||||
var localIndex = index;
|
||||
|
||||
<MudItem xs="12" sm="6" md="6">
|
||||
<CategoryFieldCardComponent Index="localIndex"
|
||||
FieldName="@ValidationModel.FieldNames[localIndex]"
|
||||
FieldDescription="@ValidationModel.FieldDescriptions[localIndex]"
|
||||
OnNameUpdate="HandleNameUpdate"
|
||||
OnDescriptionUpdate="HandleDescriptionUpdate"/>
|
||||
</MudItem>
|
||||
}
|
||||
</MudGrid>
|
||||
</MudForm>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<MudButton OnClick="Cancel">Cancel</MudButton>
|
||||
<MudButton Color="Color.Primary" OnClick="Submit">OK</MudButton>
|
||||
</DialogActions>
|
||||
</MudDialog>
|
||||
|
||||
@inject IArchiveCategoryProvider CategoryProvider;
|
||||
|
||||
@code {
|
||||
[CascadingParameter]
|
||||
private IMudDialogInstance MudDialog { get; set; } = default!;
|
||||
|
||||
[Parameter]
|
||||
public CategoryValidationModel ValidationModel { get; set; } = default!;
|
||||
|
||||
[Parameter]
|
||||
public bool IsUpdate { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public string OriginalName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
private MudForm _form = default!;
|
||||
private string FormatPreview { get; set; } = string.Empty;
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
if (ValidationModel is null)
|
||||
{
|
||||
ValidationModel = new CategoryValidationModel { NumFields = 1 };
|
||||
} else
|
||||
{
|
||||
ValidationModel.NumFields = ValidationModel.FieldNames.Count;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNumFieldsChanged(int newCount)
|
||||
{
|
||||
if (newCount < 1) return;
|
||||
ValidationModel.NumFields = newCount;
|
||||
UpdateStateFromModel();
|
||||
}
|
||||
|
||||
private void UpdateStateFromModel()
|
||||
{
|
||||
ValidationModel.FieldNames ??= new List<string>();
|
||||
ValidationModel.FieldDescriptions ??= new List<string>();
|
||||
|
||||
while (ValidationModel.FieldNames.Count < ValidationModel.NumFields)
|
||||
{
|
||||
ValidationModel.FieldNames.Add($"Field {ValidationModel.FieldNames.Count + 1}");
|
||||
}
|
||||
while (ValidationModel.FieldNames.Count > ValidationModel.NumFields)
|
||||
{
|
||||
ValidationModel.FieldNames.RemoveAt(ValidationModel.FieldNames.Count - 1);
|
||||
}
|
||||
|
||||
while (ValidationModel.FieldDescriptions.Count < ValidationModel.NumFields)
|
||||
{
|
||||
ValidationModel.FieldDescriptions.Add("");
|
||||
}
|
||||
while (ValidationModel.FieldDescriptions.Count > ValidationModel.NumFields)
|
||||
{
|
||||
ValidationModel.FieldDescriptions.RemoveAt(ValidationModel.FieldDescriptions.Count - 1);
|
||||
}
|
||||
|
||||
UpdateFormatPreview();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void UpdateFormatPreview()
|
||||
{
|
||||
var fieldNames = ValidationModel.FieldNames.Select(name => string.IsNullOrEmpty(name) ? "<...>" : $"<{name}>");
|
||||
FormatPreview = string.Join(ValidationModel.FieldSeparator, fieldNames);
|
||||
}
|
||||
|
||||
private async Task Submit()
|
||||
{
|
||||
await _form.Validate();
|
||||
if (!_form.IsValid) return;
|
||||
|
||||
MudDialog.Close(DialogResult.Ok(ValidationModel));
|
||||
}
|
||||
|
||||
private void Cancel() => MudDialog.Cancel();
|
||||
|
||||
// In your MudDialog component's @code block
|
||||
|
||||
private void HandleNameUpdate((int Index, string NewValue) data)
|
||||
{
|
||||
if (data.Index < ValidationModel.FieldNames.Count)
|
||||
{
|
||||
ValidationModel.FieldNames[data.Index] = data.NewValue;
|
||||
UpdateFormatPreview(); // Update the preview in real-time
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleDescriptionUpdate((int Index, string NewValue) data)
|
||||
{
|
||||
if (data.Index < ValidationModel.FieldDescriptions.Count)
|
||||
{
|
||||
ValidationModel.FieldDescriptions[data.Index] = data.NewValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using MudBlazor
|
||||
|
||||
<MudCard Outlined="true">
|
||||
<MudCardContent>
|
||||
<MudTextField @bind-Value="FieldName"
|
||||
@bind-Value:after="OnNameChanged"
|
||||
Label="Field Name"
|
||||
Variant="Variant.Filled"
|
||||
Immediate="true"
|
||||
/>
|
||||
|
||||
<MudTextField @bind-Value="FieldDescription"
|
||||
@bind-Value:after="OnDescriptionChanged"
|
||||
Label="Field Description"
|
||||
Variant="Variant.Filled"
|
||||
Lines="2"
|
||||
Class="mt-3"
|
||||
Immediate="true"
|
||||
/>
|
||||
</MudCardContent>
|
||||
</MudCard>
|
||||
|
||||
@code {
|
||||
[Parameter] public int Index { get; set; }
|
||||
|
||||
[Parameter] public string FieldName { get; set; } = "";
|
||||
[Parameter] public string FieldDescription { get; set; } = "";
|
||||
|
||||
[Parameter] public EventCallback<(int Index, string NewValue)> OnNameUpdate { get; set; }
|
||||
[Parameter] public EventCallback<(int Index, string NewValue)> OnDescriptionUpdate { get; set; }
|
||||
|
||||
private async Task OnNameChanged()
|
||||
{
|
||||
await OnNameUpdate.InvokeAsync((Index, FieldName));
|
||||
}
|
||||
|
||||
private async Task OnDescriptionChanged()
|
||||
{
|
||||
await OnDescriptionUpdate.InvokeAsync((Index, FieldDescription));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
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 bool Equals(ArtifactGroupingRowElement? other)
|
||||
{
|
||||
if (other is null) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
return Id == other.Id; // Compare based on the unique Id
|
||||
}
|
||||
|
||||
public override bool Equals(object? obj) => Equals(obj as ArtifactGroupingRowElement);
|
||||
|
||||
public override int GetHashCode() => Id.GetHashCode();
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
namespace OpenArchival.Blazor;
|
||||
|
||||
using Microsoft.IdentityModel.Abstractions;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using OpenArchival.DataAccess;
|
||||
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
public class CategoryValidationModel
|
||||
{
|
||||
public int? DatabaseId { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "Category name is required.")]
|
||||
public string? Name { get; set; }
|
||||
|
||||
public string? Description { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "Field separator is required.")]
|
||||
[StringLength(1, ErrorMessage = "Separator must be a single character.")]
|
||||
public string FieldSeparator { get; set; } = "-";
|
||||
|
||||
[Required(ErrorMessage = "At least one field is needed")]
|
||||
[Range(1, int.MaxValue, ErrorMessage = "At least one field must be created.")]
|
||||
public int NumFields { get; set; } = 1;
|
||||
|
||||
public List<string> FieldNames { get; set; } = [""];
|
||||
|
||||
public List<string> FieldDescriptions { get; set; } = [""];
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext context)
|
||||
{
|
||||
if ((FieldNames is null || FieldNames.Count == 0) || (FieldDescriptions is null || FieldDescriptions.Count > 0))
|
||||
{
|
||||
yield return new ValidationResult(
|
||||
"Either the FieldNames or FieldDescriptions were null or empty. At least one is required",
|
||||
new[] { nameof(FieldNames), nameof(FieldDescriptions) }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public static CategoryValidationModel FromArchiveCategory(ArchiveCategory category)
|
||||
{
|
||||
return new CategoryValidationModel()
|
||||
{
|
||||
Name = category.Name,
|
||||
Description = category.Description,
|
||||
DatabaseId = category.Id,
|
||||
FieldSeparator = category.FieldSeparator,
|
||||
FieldNames = category.FieldNames,
|
||||
FieldDescriptions = category.FieldDescriptions,
|
||||
};
|
||||
}
|
||||
|
||||
public static ArchiveCategory ToArchiveCategory(CategoryValidationModel model)
|
||||
{
|
||||
return new ArchiveCategory()
|
||||
{
|
||||
Name = model.Name,
|
||||
FieldSeparator = model.FieldSeparator,
|
||||
Description = model.Description,
|
||||
FieldNames = model.FieldNames,
|
||||
FieldDescriptions = model.FieldDescriptions
|
||||
};
|
||||
}
|
||||
|
||||
public static void UpdateArchiveValidationModel(CategoryValidationModel model, ArchiveCategory category)
|
||||
{
|
||||
category.Name = model.Name ?? throw new ArgumentNullException(nameof(model.Name), "The model name was null.");
|
||||
category.Description = model.Description;
|
||||
category.FieldSeparator = model.FieldSeparator;
|
||||
category.FieldNames = model.FieldNames;
|
||||
category.FieldDescriptions = model.FieldDescriptions;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
@page "/categories"
|
||||
|
||||
@namespace OpenArchival.Blazor.AdminPages
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using Microsoft.EntityFrameworkCore
|
||||
@using Microsoft.Extensions.Logging
|
||||
@using MudBlazor
|
||||
@using OpenArchival.DataAccess;
|
||||
|
||||
@inject IDialogService DialogService
|
||||
@inject IArchiveCategoryProvider CategoryProvider;
|
||||
@inject IDbContextFactory<ApplicationDbContext> DbContextFactory;
|
||||
@inject ILogger<ViewAddCategoriesComponent> Logger;
|
||||
|
||||
<CategoriesListComponent
|
||||
@ref=_categoriesListComponent
|
||||
ListItemClickedCallback="ShowFilledDialog"
|
||||
ShowDeleteButton=true
|
||||
OnDeleteClickedCallback="DeleteCategory">
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OnAddClick">Add Category</MudButton>
|
||||
</CategoriesListComponent>
|
||||
|
||||
|
||||
@code {
|
||||
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)
|
||||
{
|
||||
CategoryValidationModel validationModel = CategoryValidationModel.FromArchiveCategory(category);
|
||||
|
||||
var parameters = new DialogParameters { ["ValidationModel"] = validationModel, ["IsUpdate"] = true, ["OriginalName"] = category.Name};
|
||||
|
||||
var options = new DialogOptions { CloseOnEscapeKey = true, BackdropClick=false};
|
||||
|
||||
var dialog = await DialogService.ShowAsync<CategoryCreatorDialog>("Create a Category", parameters, options);
|
||||
var result = await dialog.Result;
|
||||
|
||||
if (result is not null && !result.Canceled && _categoriesListComponent is not null)
|
||||
{
|
||||
if (result.Data is null)
|
||||
{
|
||||
Logger.LogError($"The new category received by the result had a null data result member.");
|
||||
throw new NullReferenceException($"The new category received by the result had a null data result member.");
|
||||
}
|
||||
|
||||
CategoryValidationModel model = (CategoryValidationModel)result.Data;
|
||||
CategoryValidationModel.UpdateArchiveValidationModel(model, category);
|
||||
|
||||
await using var context = await DbContextFactory.CreateDbContextAsync();
|
||||
await context.SaveChangesAsync();
|
||||
|
||||
StateHasChanged();
|
||||
await _categoriesListComponent.RefreshData();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task OnAddClick()
|
||||
{
|
||||
var options = new DialogOptions { CloseOnEscapeKey = true, BackdropClick=false };
|
||||
var dialog = await DialogService.ShowAsync<CategoryCreatorDialog>("Create a Category", options);
|
||||
|
||||
var result = await dialog.Result;
|
||||
|
||||
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();
|
||||
await _categoriesListComponent.RefreshData();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CodeBeam.MudExtensions" Version="6.3.0" />
|
||||
<PackageReference Include="Microsoft.IdentityModel.Abstractions" Version="8.14.0" />
|
||||
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="8.14.0" />
|
||||
<PackageReference Include="MudBlazor" Version="8.13.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj" />
|
||||
<ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
||||
</Project>
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net9.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "9.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "9.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.Reflection.NullabilityInfoContext.IsSupported": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"ContentRoots":["C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\"],"Root":{"Children":{"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"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":0,"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":2,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-jk5eo7zo4m.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-tjzqk7tnel.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}}
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"ContentRoots":["C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\"],"Root":{"Children":{"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"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":0,"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":2,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-jk5eo7zo4m.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-tjzqk7tnel.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net9.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "9.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "9.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Reflection.NullabilityInfoContext.IsSupported": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"Version":1,"ManifestType":"Build","Endpoints":[]}
|
||||
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")]
|
||||
@@ -0,0 +1,23 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor.AdminPages")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+781793a27f2e164808340b1adb5ce70e1800b187")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor.AdminPages")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor.AdminPages")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
03f880883adc090fedb59e9491b447c2933338d46d6d2d065711b931694f9365
|
||||
@@ -0,0 +1,64 @@
|
||||
is_global = true
|
||||
build_property.MudDebugAnalyzer =
|
||||
build_property.MudAllowedAttributePattern =
|
||||
build_property.MudAllowedAttributeList =
|
||||
build_property.TargetFramework = net9.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = OpenArchival.Blazor.AdminPages
|
||||
build_property.RootNamespace = OpenArchival.Blazor.AdminPages
|
||||
build_property.ProjectDir = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.RazorLangVersion = 9.0
|
||||
build_property.SupportLocalizedComponentNames =
|
||||
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
build_property.EffectiveAnalysisLevelStyle = 9.0
|
||||
build_property.EnableCodeStyleSeverity =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveConfiguration.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZUNvbmZpZ3VyYXRpb24ucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveItems/AddArchiveGroupingComponent.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZUl0ZW1zXEFkZEFyY2hpdmVHcm91cGluZ0NvbXBvbmVudC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveItems/AddGroupingDialog.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZUl0ZW1zXEFkZEdyb3VwaW5nRGlhbG9nLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveItems/ArchiveEntryCreatorCard.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZUl0ZW1zXEFyY2hpdmVFbnRyeUNyZWF0b3JDYXJkLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveItems/ArchiveGroupingsTable.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZUl0ZW1zXEFyY2hpdmVHcm91cGluZ3NUYWJsZS5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveItems/IdentifierTextBox.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZUl0ZW1zXElkZW50aWZpZXJUZXh0Qm94LnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/Categories/CategoriesListComponent.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q2F0ZWdvcmllc1xDYXRlZ29yaWVzTGlzdENvbXBvbmVudC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/Categories/CategoryCreatorDialog.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q2F0ZWdvcmllc1xDYXRlZ29yeUNyZWF0b3JEaWFsb2cucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/Categories/CategoryFieldCardComponent.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q2F0ZWdvcmllc1xDYXRlZ29yeUZpZWxkQ2FyZENvbXBvbmVudC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/Categories/ViewAddCategoriesComponent.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q2F0ZWdvcmllc1xWaWV3QWRkQ2F0ZWdvcmllc0NvbXBvbmVudC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
@@ -0,0 +1,8 @@
|
||||
// <auto-generated/>
|
||||
global using global::System;
|
||||
global using global::System.Collections.Generic;
|
||||
global using global::System.IO;
|
||||
global using global::System.Linq;
|
||||
global using global::System.Net.Http;
|
||||
global using global::System.Threading;
|
||||
global using global::System.Threading.Tasks;
|
||||
@@ -0,0 +1 @@
|
||||
d5ac7ab69059af111e9d7125adeb7b174ca570725d4b64a544cca7bd11ac7ca0
|
||||
@@ -0,0 +1,18 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.ConsolidatedAssemblyApplicationPartFact" +
|
||||
"ory, Microsoft.AspNetCore.Mvc.Razor")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
7b14d6cd8ca2cd454322fa5abee82aff16a4403d21d3bf15fd4c259eff23b076
|
||||
@@ -0,0 +1,48 @@
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.DataAccess.deps.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.DataAccess.runtimeconfig.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.DataAccess.staticwebassets.endpoints.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.DataAccess.exe
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.CustomComponents.staticwebassets.runtime.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.CustomComponents.staticwebassets.endpoints.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.staticwebassets.runtime.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.staticwebassets.endpoints.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.deps.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.runtimeconfig.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.dll
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.pdb
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.CustomComponents.dll
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.DataAccess.dll
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.CustomComponents.pdb
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.csproj.AssemblyReference.cache
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\rpswa.dswa.cache.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.GeneratedMSBuildEditorConfig.editorconfig
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.AssemblyInfoInputs.cache
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.AssemblyInfo.cs
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.csproj.CoreCompileInputs.cache
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.sourcelink.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\rjimswa.dswa.cache.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\rjsmrazor.dswa.cache.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\rjsmcshtml.dswa.cache.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\scopedcss\bundle\OpenArchival.Blazor.AdminPages.styles.css
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\tzxjg6is5z-jk5eo7zo4m.gz
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\0wz98yz2xy-tjzqk7tnel.gz
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\24gzn4tg1a-qz4batx9cb.gz
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\stwk5nfoxp-loe7cozwzj.gz
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets.build.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets.build.json.cache
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets.development.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets.build.endpoints.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets\msbuild.OpenArchival.Blazor.AdminPages.Microsoft.AspNetCore.StaticWebAssets.props
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets\msbuild.OpenArchival.Blazor.AdminPages.Microsoft.AspNetCore.StaticWebAssetEndpoints.props
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets\msbuild.build.OpenArchival.Blazor.AdminPages.props
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets\msbuild.buildMultiTargeting.OpenArchival.Blazor.AdminPages.props
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets\msbuild.buildTransitive.OpenArchival.Blazor.AdminPages.props
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets.pack.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArch.0ED9BC11.Up2Date
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.dll
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\refint\OpenArchival.Blazor.AdminPages.dll
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.pdb
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.genruntimeconfig.cache
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\ref\OpenArchival.Blazor.AdminPages.dll
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
67d207aeb63062388b5b620fadc77cd4f736081899d2ec9627500cc089e0041d
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
{"documents":{"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/781793a27f2e164808340b1adb5ce70e1800b187/*"}}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
{"GlobalPropertiesHash":"2ilJ2M8+ZdH0swl4cXFj9Ji8kay0R08ISE/fEc+OL0o=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["NIIUVBxFVNWalGqMaYRb4Q0pTQcZfvgM\u002BLga0cJRnCk=","NkT/CTXRHggrpy2O1LIl4\u002BJi5JQLfpcuHaZxMH4OmZU=","rb\u002BHPKjKiQ6zdPsR2gvX0QVq699ulWvTMfcPOplKwrs=","t6btITApcWKecgR4\u002BP2MYIM\u002BeXc80LyAcPD1ABXwCBg="],"CachedAssets":{"NIIUVBxFVNWalGqMaYRb4Q0pTQcZfvgM\u002BLga0cJRnCk=":{"Identity":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\tzxjg6is5z-jk5eo7zo4m.gz","SourceId":"MudBlazor","SourceType":"Package","ContentRoot":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\","BasePath":"_content/MudBlazor","RelativePath":"MudBlazor.min.css.gz","AssetKind":"All","AssetMode":"All","AssetRole":"Alternative","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":"C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\MudBlazor.min.css","AssetTraitName":"Content-Encoding","AssetTraitValue":"gzip","Fingerprint":"93u47y2o0e","Integrity":"VcBMO3aXrzxl\u002BjfWY\u002BTaxPKsd3L0UWjeJZliEXOyzzI=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\MudBlazor.min.css","FileLength":65509,"LastWriteTime":"2025-10-08T17:06:28.0919138+00:00"},"NkT/CTXRHggrpy2O1LIl4\u002BJi5JQLfpcuHaZxMH4OmZU=":{"Identity":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\0wz98yz2xy-tjzqk7tnel.gz","SourceId":"MudBlazor","SourceType":"Package","ContentRoot":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\","BasePath":"_content/MudBlazor","RelativePath":"MudBlazor.min.js.gz","AssetKind":"All","AssetMode":"All","AssetRole":"Alternative","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":"C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\MudBlazor.min.js","AssetTraitName":"Content-Encoding","AssetTraitValue":"gzip","Fingerprint":"c1g0o1u83p","Integrity":"0BJxfo\u002BEOJvNKoBv/2ahm4RKrPjv7PhB/R16C3XOHDo=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\MudBlazor.min.js","FileLength":16352,"LastWriteTime":"2025-10-08T17:06:28.0816788+00:00"},"rb\u002BHPKjKiQ6zdPsR2gvX0QVq699ulWvTMfcPOplKwrs=":{"Identity":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\24gzn4tg1a-qz4batx9cb.gz","SourceId":"CodeBeam.MudExtensions","SourceType":"Package","ContentRoot":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\","BasePath":"_content/CodeBeam.MudExtensions","RelativePath":"MudExtensions.min.css.gz","AssetKind":"All","AssetMode":"All","AssetRole":"Alternative","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":"C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\MudExtensions.min.css","AssetTraitName":"Content-Encoding","AssetTraitValue":"gzip","Fingerprint":"cn6plcuhii","Integrity":"6PJ7t7WR38pQTSYe6IR0pbqo2cIZK5wuW/w26kprtBg=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\MudExtensions.min.css","FileLength":3383,"LastWriteTime":"2025-10-08T17:06:28.0771246+00:00"},"t6btITApcWKecgR4\u002BP2MYIM\u002BeXc80LyAcPD1ABXwCBg=":{"Identity":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\stwk5nfoxp-loe7cozwzj.gz","SourceId":"CodeBeam.MudExtensions","SourceType":"Package","ContentRoot":"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\","BasePath":"_content/CodeBeam.MudExtensions","RelativePath":"MudExtensions.min.js.gz","AssetKind":"All","AssetMode":"All","AssetRole":"Alternative","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":"C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\MudExtensions.min.js","AssetTraitName":"Content-Encoding","AssetTraitValue":"gzip","Fingerprint":"z9m1gj6ro7","Integrity":"B4PUgpr06\u002Bd3lAMWknp0EVkaGxPZJdpp5/UidGHzvnc=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\MudExtensions.min.js","FileLength":196,"LastWriteTime":"2025-10-08T17:06:28.076114+00:00"}},"CachedCopyCandidates":{}}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
{"GlobalPropertiesHash":"MRiB4IDUD95tznQVFDSUB/ZRBiL0l7NqvypMyWisBKY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["we2jLiX5lN\u002BZQJnUIhq1rvzj77lzaJPNQ8/EwgSkE9I=","UTgQbMUBuHpDU6uKT1aobIQNBTFUDdPN9dOXKbIXOxE=","gWjtd7QMqmKugLcjoA\u002Bz7uTk/kPdK0OzWgPxibM4Q80=","i87mXRCUZee30fegWrQI6qa83oxiclvoEj96XEo39xw=","lao90sMVLCx33PwCNC6c7eEpsWPlbqDw7v4MrMzvC8c=","fS8D7hjkphJRf6C\u002Bm/Qnypds9mEqiMfsUqX6crY95Cg=","LTKqIVmh6nq1MbEhySE0uxyFyWff9WrU1ON1M\u002BHeHU8=","sJjcvxwurmrqwAU/4zgO4hND3LvV36eZllxUbJFEZq4=","y1UjlmRucY2a7SZOaTcGmX43sccL/D64K/06s2Lir1U=","S2UnhitwgLXL4NKKJv8zqoaNXqB2nMFTAVHkB/UeLhk="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@@ -0,0 +1 @@
|
||||
{"GlobalPropertiesHash":"pFI6wgQWnM801WhA+kBqb87aAQ1SYD4hIz9ddwGuTRY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["we2jLiX5lN\u002BZQJnUIhq1rvzj77lzaJPNQ8/EwgSkE9I=","UTgQbMUBuHpDU6uKT1aobIQNBTFUDdPN9dOXKbIXOxE=","gWjtd7QMqmKugLcjoA\u002Bz7uTk/kPdK0OzWgPxibM4Q80=","i87mXRCUZee30fegWrQI6qa83oxiclvoEj96XEo39xw=","lao90sMVLCx33PwCNC6c7eEpsWPlbqDw7v4MrMzvC8c=","fS8D7hjkphJRf6C\u002Bm/Qnypds9mEqiMfsUqX6crY95Cg=","LTKqIVmh6nq1MbEhySE0uxyFyWff9WrU1ON1M\u002BHeHU8=","sJjcvxwurmrqwAU/4zgO4hND3LvV36eZllxUbJFEZq4=","y1UjlmRucY2a7SZOaTcGmX43sccL/D64K/06s2Lir1U=","S2UnhitwgLXL4NKKJv8zqoaNXqB2nMFTAVHkB/UeLhk="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@@ -0,0 +1 @@
|
||||
{"GlobalPropertiesHash":"zNJXz5rQrCxSXKP7vOgOdkHaQH0t0RaJ9A6BsbVWhRo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["VpZyiBGOAkLWHSfBDB2YaWyP5Hs/I5FsfoRDMuTRV7I=","DIwVeRfKzBgDjmyoyXr8pXd5b0nsGSijXl8TRo8v\u002BsY=","NJX1DoLCS76R8Ya2DcTwkSj46QhcH6070l9VbngqqvM=","7PZpI0EUxyt6crDRFnhGnqMAusn7W6e1FMmwHQI0V8Y=","vH6ZV\u002BdjcRzsq5yMoti6BFVvUM8HoPPsA7rcKsMGGGg=","8hUS3woWS6spbIauTI/Y56WYgds/lARH5p2YNH0zZbc=","uRurSxZAEKPpQhTAARkYymmooR4UmE\u002Bgv/DLtdyvYd0=","fQZMXudOPo1zhfhLFcNVfKnr2EUaUQuMoTsXBSpQgbU=","Vd0O9sdyyXroAIEWXKMP0l6ejQ31ESX7qvIwEqJlqQc=","JDq35wZFjR6BR0th1mOaInyWsHAwiS3cadTNqIXpQwM="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
56NYWClPRcGDRDv6U0GUX+zrxMWTJCc2DAgjkhrkfVc=
|
||||
@@ -0,0 +1 @@
|
||||
{"ContentRoots":["C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\"],"Root":{"Children":{"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"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":0,"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":2,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-jk5eo7zo4m.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-tjzqk7tnel.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}}
|
||||
@@ -0,0 +1,6 @@
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.CustomComponents\obj\Debug\net9.0\staticwebassets.build.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.CustomComponents\obj\Debug\net9.0\staticwebassets.build.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.CustomComponents\obj\Debug\net9.0\staticwebassets.build.json
|
||||
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
|
||||
@@ -0,0 +1,4 @@
|
||||
<Project>
|
||||
<Import Project="Microsoft.AspNetCore.StaticWebAssetEndpoints.props" />
|
||||
<Import Project="Microsoft.AspNetCore.StaticWebAssets.props" />
|
||||
</Project>
|
||||
@@ -0,0 +1,3 @@
|
||||
<Project>
|
||||
<Import Project="..\build\OpenArchival.Blazor.AdminPages.props" />
|
||||
</Project>
|
||||
@@ -0,0 +1,3 @@
|
||||
<Project>
|
||||
<Import Project="..\buildMultiTargeting\OpenArchival.Blazor.AdminPages.props" />
|
||||
</Project>
|
||||
@@ -0,0 +1,286 @@
|
||||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj",
|
||||
"projectName": "OpenArchival.Blazor.AdminPages",
|
||||
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj",
|
||||
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\NuGet.Config",
|
||||
"C:\\Users\\vtall\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net9.0"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files\\dotnet\\library-packs": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net9.0": {
|
||||
"targetAlias": "net9.0",
|
||||
"projectReferences": {
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\OpenArchival.Blazor.CustomComponents.csproj": {
|
||||
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\OpenArchival.Blazor.CustomComponents.csproj"
|
||||
},
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {
|
||||
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
},
|
||||
"SdkAnalysisLevel": "9.0.300"
|
||||
},
|
||||
"frameworks": {
|
||||
"net9.0": {
|
||||
"targetAlias": "net9.0",
|
||||
"dependencies": {
|
||||
"CodeBeam.MudExtensions": {
|
||||
"target": "Package",
|
||||
"version": "[6.3.0, )"
|
||||
},
|
||||
"Microsoft.IdentityModel.Abstractions": {
|
||||
"target": "Package",
|
||||
"version": "[8.14.0, )"
|
||||
},
|
||||
"Microsoft.IdentityModel.Tokens": {
|
||||
"target": "Package",
|
||||
"version": "[8.14.0, )"
|
||||
},
|
||||
"MudBlazor": {
|
||||
"target": "Package",
|
||||
"version": "[8.13.0, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.AspNetCore.App": {
|
||||
"privateAssets": "none"
|
||||
},
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
},
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\OpenArchival.Blazor.CustomComponents.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\OpenArchival.Blazor.CustomComponents.csproj",
|
||||
"projectName": "OpenArchival.Blazor.CustomComponents",
|
||||
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\OpenArchival.Blazor.CustomComponents.csproj",
|
||||
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\NuGet.Config",
|
||||
"C:\\Users\\vtall\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net9.0"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files\\dotnet\\library-packs": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net9.0": {
|
||||
"targetAlias": "net9.0",
|
||||
"projectReferences": {
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {
|
||||
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
},
|
||||
"SdkAnalysisLevel": "9.0.300"
|
||||
},
|
||||
"frameworks": {
|
||||
"net9.0": {
|
||||
"targetAlias": "net9.0",
|
||||
"dependencies": {
|
||||
"CodeBeam.MudExtensions": {
|
||||
"target": "Package",
|
||||
"version": "[6.3.0, )"
|
||||
},
|
||||
"MudBlazor": {
|
||||
"target": "Package",
|
||||
"version": "[8.13.0, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.AspNetCore.App": {
|
||||
"privateAssets": "none"
|
||||
},
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
},
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
|
||||
"projectName": "OpenArchival.DataAccess",
|
||||
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
|
||||
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\NuGet.Config",
|
||||
"C:\\Users\\vtall\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net9.0"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files\\dotnet\\library-packs": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net9.0": {
|
||||
"targetAlias": "net9.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
},
|
||||
"SdkAnalysisLevel": "9.0.300"
|
||||
},
|
||||
"frameworks": {
|
||||
"net9.0": {
|
||||
"targetAlias": "net9.0",
|
||||
"dependencies": {
|
||||
"EntityFramework": {
|
||||
"target": "Package",
|
||||
"version": "[6.5.1, )"
|
||||
},
|
||||
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": {
|
||||
"target": "Package",
|
||||
"version": "[9.0.8, )"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore": {
|
||||
"target": "Package",
|
||||
"version": "[9.0.8, )"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Design": {
|
||||
"include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
|
||||
"suppressParent": "All",
|
||||
"target": "Package",
|
||||
"version": "[9.0.8, )"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||
"target": "Package",
|
||||
"version": "[9.0.8, )"
|
||||
},
|
||||
"Npgsql": {
|
||||
"target": "Package",
|
||||
"version": "[9.0.3, )"
|
||||
},
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL": {
|
||||
"target": "Package",
|
||||
"version": "[9.0.4, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.AspNetCore.App": {
|
||||
"privateAssets": "none"
|
||||
},
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\vtall\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.1</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="C:\Users\vtall\.nuget\packages\" />
|
||||
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
||||
</ItemGroup>
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore\9.0.8\buildTransitive\net8.0\Microsoft.EntityFrameworkCore.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore\9.0.8\buildTransitive\net8.0\Microsoft.EntityFrameworkCore.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)entityframework\6.5.1\buildTransitive\net6.0\EntityFramework.props" Condition="Exists('$(NuGetPackageRoot)entityframework\6.5.1\buildTransitive\net6.0\EntityFramework.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)mudblazor\8.13.0\buildTransitive\MudBlazor.props" Condition="Exists('$(NuGetPackageRoot)mudblazor\8.13.0\buildTransitive\MudBlazor.props')" />
|
||||
<Import Project="$(NuGetPackageRoot)codebeam.mudextensions\6.3.0\buildTransitive\CodeBeam.MudExtensions.props" Condition="Exists('$(NuGetPackageRoot)codebeam.mudextensions\6.3.0\buildTransitive\CodeBeam.MudExtensions.props')" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<PkgEntityFramework Condition=" '$(PkgEntityFramework)' == '' ">C:\Users\vtall\.nuget\packages\entityframework\6.5.1</PkgEntityFramework>
|
||||
<PkgBuildBundlerMinifier Condition=" '$(PkgBuildBundlerMinifier)' == '' ">C:\Users\vtall\.nuget\packages\buildbundlerminifier\3.2.449</PkgBuildBundlerMinifier>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\9.0.8\buildTransitive\net8.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\9.0.8\buildTransitive\net8.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.options\9.0.8\buildTransitive\net8.0\Microsoft.Extensions.Options.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.options\9.0.8\buildTransitive\net8.0\Microsoft.Extensions.Options.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)entityframework\6.5.1\buildTransitive\net6.0\EntityFramework.targets" Condition="Exists('$(NuGetPackageRoot)entityframework\6.5.1\buildTransitive\net6.0\EntityFramework.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.components.analyzers\9.0.1\buildTransitive\netstandard2.0\Microsoft.AspNetCore.Components.Analyzers.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.components.analyzers\9.0.1\buildTransitive\netstandard2.0\Microsoft.AspNetCore.Components.Analyzers.targets')" />
|
||||
<Import Project="$(NuGetPackageRoot)mudblazor\8.13.0\build\MudBlazor.targets" Condition="Exists('$(NuGetPackageRoot)mudblazor\8.13.0\build\MudBlazor.targets')" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
2624
OpenArchival.Blazor.AdminPages/obj/project.assets.json
Normal file
2624
OpenArchival.Blazor.AdminPages/obj/project.assets.json
Normal file
File diff suppressed because it is too large
Load Diff
63
OpenArchival.Blazor.AdminPages/obj/project.nuget.cache
Normal file
63
OpenArchival.Blazor.AdminPages/obj/project.nuget.cache
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "jCOdA4qmsMg=",
|
||||
"success": true,
|
||||
"projectFilePath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\buildbundlerminifier\\3.2.449\\buildbundlerminifier.3.2.449.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\codebeam.mudextensions.6.3.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\csvhelper\\30.0.1\\csvhelper.30.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\entityframework\\6.5.1\\entityframework.6.5.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.authorization\\9.0.1\\microsoft.aspnetcore.authorization.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.components\\9.0.1\\microsoft.aspnetcore.components.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.components.analyzers\\9.0.1\\microsoft.aspnetcore.components.analyzers.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.components.forms\\9.0.1\\microsoft.aspnetcore.components.forms.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.components.web\\9.0.1\\microsoft.aspnetcore.components.web.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.cryptography.internal\\9.0.8\\microsoft.aspnetcore.cryptography.internal.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.cryptography.keyderivation\\9.0.8\\microsoft.aspnetcore.cryptography.keyderivation.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.identity.entityframeworkcore\\9.0.8\\microsoft.aspnetcore.identity.entityframeworkcore.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.metadata\\9.0.1\\microsoft.aspnetcore.metadata.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.csharp\\4.7.0\\microsoft.csharp.4.7.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.relational\\9.0.8\\microsoft.entityframeworkcore.relational.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\9.0.8\\microsoft.extensions.configuration.abstractions.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.identity.core\\9.0.8\\microsoft.extensions.identity.core.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.identity.stores\\9.0.8\\microsoft.extensions.identity.stores.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.localization\\9.0.1\\microsoft.extensions.localization.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.localization.abstractions\\9.0.1\\microsoft.extensions.localization.abstractions.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.identitymodel.abstractions\\8.14.0\\microsoft.identitymodel.abstractions.8.14.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.identitymodel.logging\\8.14.0\\microsoft.identitymodel.logging.8.14.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.identitymodel.tokens\\8.14.0\\microsoft.identitymodel.tokens.8.14.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.jsinterop\\9.0.1\\microsoft.jsinterop.9.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.win32.registry\\4.7.0\\microsoft.win32.registry.4.7.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.win32.systemevents\\6.0.0\\microsoft.win32.systemevents.6.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\mudblazor.8.13.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\npgsql\\9.0.3\\npgsql.9.0.3.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\npgsql.entityframeworkcore.postgresql\\9.0.4\\npgsql.entityframeworkcore.postgresql.9.0.4.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\runtime.native.system.data.sqlclient.sni\\4.7.0\\runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.codedom\\6.0.0\\system.codedom.6.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.componentmodel.annotations\\5.0.0\\system.componentmodel.annotations.5.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.configuration.configurationmanager\\6.0.1\\system.configuration.configurationmanager.6.0.1.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.data.sqlclient\\4.8.6\\system.data.sqlclient.4.8.6.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.drawing.common\\6.0.0\\system.drawing.common.6.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.security.accesscontrol\\6.0.0\\system.security.accesscontrol.6.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.security.cryptography.protecteddata\\6.0.0\\system.security.cryptography.protecteddata.6.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.security.permissions\\6.0.0\\system.security.permissions.6.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.security.principal.windows\\4.7.0\\system.security.principal.windows.4.7.0.nupkg.sha512",
|
||||
"C:\\Users\\vtall\\.nuget\\packages\\system.windows.extensions\\6.0.0\\system.windows.extensions.6.0.0.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
96
OpenArchival.Blazor.CustomComponents/ChipContainer.razor
Normal file
96
OpenArchival.Blazor.CustomComponents/ChipContainer.razor
Normal file
@@ -0,0 +1,96 @@
|
||||
@namespace OpenArchival.Blazor.CustomComponents
|
||||
|
||||
@using MudBlazor
|
||||
@using MudExtensions
|
||||
|
||||
@* ChipContainer.razor *@
|
||||
@typeparam T
|
||||
|
||||
<div class="d-flex flex-wrap ga-2 align-center">
|
||||
@* Loop through and display each item as a chip *@
|
||||
@foreach (var item in Items)
|
||||
{
|
||||
@if (DeleteEnabled)
|
||||
{
|
||||
<MudChip Color="Color.Primary" OnClose="() => RemoveItem(item)" T="T">
|
||||
@DisplayFunc(item)
|
||||
</MudChip>
|
||||
} else
|
||||
{
|
||||
<MudChip Color="Color.Primary" T="T">
|
||||
@DisplayFunc(item)
|
||||
</MudChip>
|
||||
}
|
||||
}
|
||||
|
||||
@* Render the input control provided by the consumer *@
|
||||
<div style="min-width: 150px;">
|
||||
@if (InputContent is not null)
|
||||
{
|
||||
@InputContent(this)
|
||||
}
|
||||
</div>
|
||||
|
||||
@SubmitButton
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public bool DeleteEnabled { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// The list of items to display and manage.
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public required List<T> Items { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// Required for two-way binding (@bind-Items).
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public EventCallback<List<T>> ItemsChanged { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The RenderFragment that defines the custom input control.
|
||||
/// The 'context' is a reference to this component instance.
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public RenderFragment<ChipContainer<T>>? InputContent { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public RenderFragment SubmitButton { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A function to convert an item of type T to a string for display in the chip.
|
||||
/// Defaults to item.ToString().
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public Func<T, string> DisplayFunc { get; set; } = item => item?.ToString() ?? string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// A public method that the consumer's input control can call to add a new item.
|
||||
/// </summary>
|
||||
public async Task AddItem(T item)
|
||||
{
|
||||
if (item is null || (item is string str && string.IsNullOrWhiteSpace(str)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Add the item if it doesn't already exist
|
||||
if (!Items.Contains(item))
|
||||
{
|
||||
Items.Add(item);
|
||||
await ItemsChanged.InvokeAsync(Items);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes an item from the list when the chip's close icon is clicked.
|
||||
/// </summary>
|
||||
private async Task RemoveItem(T item)
|
||||
{
|
||||
Items.Remove(item);
|
||||
await ItemsChanged.InvokeAsync(Items);
|
||||
}
|
||||
}
|
||||
10
OpenArchival.Blazor.CustomComponents/FileUploadOptions.cs
Normal file
10
OpenArchival.Blazor.CustomComponents/FileUploadOptions.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace OpenArchival.Blazor.CustomComponents;
|
||||
|
||||
public class FileUploadOptions
|
||||
{
|
||||
public static string Key = "FileUploadOptions";
|
||||
public required long MaxUploadSizeBytes { get; set; }
|
||||
public required string UploadFolderPath { get; set; }
|
||||
|
||||
public required int MaxFileCount { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CodeBeam.MudExtensions" Version="6.3.0" />
|
||||
<PackageReference Include="MudBlazor" Version="8.13.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
||||
</Project>
|
||||
254
OpenArchival.Blazor.CustomComponents/UploadDropBox.razor
Normal file
254
OpenArchival.Blazor.CustomComponents/UploadDropBox.razor
Normal file
@@ -0,0 +1,254 @@
|
||||
@namespace OpenArchival.Blazor.CustomComponents
|
||||
|
||||
@using Microsoft.Extensions.Logging
|
||||
@using Microsoft.Extensions.Options
|
||||
@using OpenArchival.DataAccess
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using MudBlazor
|
||||
|
||||
<style>
|
||||
.file-upload-input {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
z-index: 10;
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<MudStack Style="width: 100%">
|
||||
<MudFileUpload T="IReadOnlyList<IBrowserFile>"
|
||||
@ref="@_fileUpload"
|
||||
OnFilesChanged="OnInputFileChanged"
|
||||
AppendMultipleFiles=true
|
||||
MaximumFileCount="_options.Value.MaxFileCount"
|
||||
Hidden="@false"
|
||||
InputClass="file-upload-input"
|
||||
tabindex="-1"
|
||||
@ondrop="@ClearDragClass"
|
||||
@ondragenter="@SetDragClass"
|
||||
@ondragleave="@ClearDragClass"
|
||||
@ondragend="@ClearDragClass">
|
||||
<ActivatorContent>
|
||||
<MudPaper Outlined="true"
|
||||
Class="@_dragClass"
|
||||
Style="height: 150px; display: flex; flex-direction: column; position: relative;">
|
||||
|
||||
<div class="d-flex align-center justify-center pa-4" style="flex-shrink: 0;">
|
||||
<MudText Typo="Typo.h6">
|
||||
Drag and drop files here or click
|
||||
</MudText>
|
||||
</div>
|
||||
|
||||
</MudPaper>
|
||||
</ActivatorContent>
|
||||
</MudFileUpload>
|
||||
@if (Files.Any() || ExistingFiles.Any())
|
||||
{
|
||||
<MudPaper Style="max-height: 150px; overflow-y: auto;" Outlined="true" Class="pa-4">
|
||||
@foreach (var file in Files)
|
||||
{
|
||||
var color = _fileToDiskFileName.Keys.Contains(file) ? Color.Success : Color.Warning;
|
||||
<MudChip T="string"
|
||||
Color="@color"
|
||||
Text="@file.Name"
|
||||
tabindex="-1" />
|
||||
}
|
||||
|
||||
@foreach (var filelisting in ExistingFiles)
|
||||
{
|
||||
<MudChip T="string"
|
||||
Color="@Color.Success"
|
||||
Text="@filelisting.OriginalName"
|
||||
tabindex="-1" />
|
||||
}
|
||||
</MudPaper>
|
||||
}
|
||||
|
||||
<MudToolBar Gutters="@false"
|
||||
Class="relative d-flex justify-end gap-4">
|
||||
<MudButton Color="Color.Primary"
|
||||
OnClick="@OpenFilePickerAsync"
|
||||
Variant="Variant.Filled">
|
||||
Open file picker
|
||||
</MudButton>
|
||||
<MudButton Color="Color.Primary"
|
||||
Disabled="@(!Files.Any())"
|
||||
OnClick="@Upload"
|
||||
Variant="Variant.Filled">
|
||||
Upload
|
||||
</MudButton>
|
||||
<MudButton Color="Color.Error"
|
||||
Disabled="@(!Files.Any())"
|
||||
OnClick="@ClearAsync"
|
||||
Variant="Variant.Filled">
|
||||
Clear
|
||||
</MudButton>
|
||||
</MudToolBar>
|
||||
|
||||
@if (Files.Count != _fileToDiskFileName.Count)
|
||||
{
|
||||
<MudText Color="Color.Error" Align="Align.Right">*Files must be uploaded</MudText>
|
||||
}
|
||||
</MudStack>
|
||||
|
||||
@inject IOptions<FileUploadOptions> _options;
|
||||
@inject IFilePathListingProvider PathProvider;
|
||||
@inject ISnackbar Snackbar;
|
||||
@inject ILogger<UploadDropBox> _logger;
|
||||
|
||||
@code {
|
||||
private const string DefaultDragClass = "relative rounded-lg border-2 border-dashed pa-4 mt-4 mud-width-full mud-height-full";
|
||||
|
||||
private string _dragClass = DefaultDragClass;
|
||||
|
||||
public readonly List<IBrowserFile> Files = new();
|
||||
|
||||
private readonly Dictionary<IBrowserFile, string> _fileToDiskFileName = new();
|
||||
|
||||
private MudFileUpload<IReadOnlyList<IBrowserFile>>? _fileUpload;
|
||||
|
||||
public int SelectedFileCount { get => Files.Count; }
|
||||
|
||||
public bool UploadsComplete { get; set; } = true;
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<List<FilePathListing>> FilesUploaded {get; set; }
|
||||
|
||||
[Parameter]
|
||||
public EventCallback ClearClicked { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public List<FilePathListing> ExistingFiles { get; set; } = new();
|
||||
|
||||
protected override Task OnParametersSetAsync()
|
||||
{
|
||||
StateHasChanged();
|
||||
return base.OnParametersSetAsync();
|
||||
}
|
||||
|
||||
private async Task ClearAsync()
|
||||
{
|
||||
foreach (var pair in _fileToDiskFileName)
|
||||
{
|
||||
try
|
||||
{
|
||||
FileInfo targetFile = new(pair.Value);
|
||||
if (targetFile.Exists)
|
||||
{
|
||||
targetFile.Delete();
|
||||
}
|
||||
await PathProvider.DeleteFilePathListingAsync(pair.Key.Name, pair.Value);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error deleting file {FileName}", pair.Key.Name);
|
||||
Snackbar.Add($"Error cleaning up file: {pair.Key.Name}", Severity.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var listing in ExistingFiles)
|
||||
{
|
||||
try
|
||||
{
|
||||
FileInfo targetFile = new(listing.Path);
|
||||
if (targetFile.Exists)
|
||||
{
|
||||
targetFile.Delete();
|
||||
}
|
||||
await PathProvider.DeleteFilePathListingAsync(listing.OriginalName, listing.Path);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error deleting file {listing.Path}");
|
||||
Snackbar.Add($"Error cleaning up file: {listing.OriginalName}", Severity.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
_fileToDiskFileName.Clear();
|
||||
Files.Clear();
|
||||
await (_fileUpload?.ClearAsync() ?? Task.CompletedTask);
|
||||
|
||||
ClearDragClass();
|
||||
UploadsComplete = true;
|
||||
await ClearClicked.InvokeAsync();
|
||||
}
|
||||
|
||||
private Task OpenFilePickerAsync()
|
||||
=> _fileUpload?.OpenFilePickerAsync() ?? Task.CompletedTask;
|
||||
|
||||
private void OnInputFileChanged(InputFileChangeEventArgs e)
|
||||
{
|
||||
ClearDragClass();
|
||||
var files = e.GetMultipleFiles(maximumFileCount: _options.Value.MaxFileCount);
|
||||
Files.AddRange(files);
|
||||
|
||||
UploadsComplete = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task Upload()
|
||||
{
|
||||
if (!Files.Any())
|
||||
{
|
||||
Snackbar.Add("No files to upload.", Severity.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter;
|
||||
|
||||
List<FilePathListing> fileListings = [];
|
||||
foreach (var file in Files)
|
||||
{
|
||||
if (_fileToDiskFileName.ContainsKey(file)) continue;
|
||||
try
|
||||
{
|
||||
var diskFileName = $"{Guid.NewGuid()}{Path.GetExtension(file.Name)}";
|
||||
var destinationPath = Path.Combine(_options.Value.UploadFolderPath, diskFileName);
|
||||
|
||||
await using var browserUploadStream = file.OpenReadStream(maxAllowedSize: _options.Value.MaxUploadSizeBytes);
|
||||
await using var outFileStream = new FileStream(destinationPath, FileMode.Create);
|
||||
|
||||
await browserUploadStream.CopyToAsync(outFileStream);
|
||||
|
||||
_fileToDiskFileName.Add(file, destinationPath);
|
||||
|
||||
var fileListing = new FilePathListing() { Path = destinationPath, OriginalName = Path.GetFileName(file.Name) };
|
||||
fileListings.Add(fileListing);
|
||||
await PathProvider.CreateFilePathListingAsync(fileListing);
|
||||
|
||||
Snackbar.Add($"Uploaded {file.Name}", Severity.Success);
|
||||
|
||||
UploadsComplete = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add($"Error uploading file {file.Name}: {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
|
||||
await FilesUploaded.InvokeAsync(fileListings);
|
||||
}
|
||||
|
||||
private void SetDragClass()
|
||||
=> _dragClass = $"{DefaultDragClass} mud-border-primary";
|
||||
|
||||
private void ClearDragClass()
|
||||
=> _dragClass = DefaultDragClass;
|
||||
|
||||
public void RemoveFile(string filename)
|
||||
{
|
||||
var existingFile = ExistingFiles.Where(f => f.OriginalName == filename).FirstOrDefault();
|
||||
if (existingFile is not null)
|
||||
{
|
||||
ExistingFiles.Remove(existingFile);
|
||||
}
|
||||
|
||||
var file = Files.Where(f => f.Name == filename).FirstOrDefault();
|
||||
if (file is not null)
|
||||
{
|
||||
Files.Remove(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,949 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v9.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v9.0": {
|
||||
"OpenArchival.Blazor.CustomComponents/1.0.0": {
|
||||
"dependencies": {
|
||||
"CodeBeam.MudExtensions": "6.3.0",
|
||||
"MudBlazor": "8.13.0",
|
||||
"OpenArchival.DataAccess": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"OpenArchival.Blazor.CustomComponents.dll": {}
|
||||
}
|
||||
},
|
||||
"BuildBundlerMinifier/3.2.449": {},
|
||||
"CodeBeam.MudExtensions/6.3.0": {
|
||||
"dependencies": {
|
||||
"BuildBundlerMinifier": "3.2.449",
|
||||
"CsvHelper": "30.0.1",
|
||||
"Microsoft.AspNetCore.Components": "9.0.1",
|
||||
"Microsoft.AspNetCore.Components.Web": "9.0.1",
|
||||
"MudBlazor": "8.13.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net7.0/CodeBeam.MudExtensions.dll": {
|
||||
"assemblyVersion": "6.3.0.0",
|
||||
"fileVersion": "6.3.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CsvHelper/30.0.1": {
|
||||
"runtime": {
|
||||
"lib/net6.0/CsvHelper.dll": {
|
||||
"assemblyVersion": "30.0.0.0",
|
||||
"fileVersion": "30.0.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"EntityFramework/6.5.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.CSharp": "4.7.0",
|
||||
"System.CodeDom": "6.0.0",
|
||||
"System.ComponentModel.Annotations": "5.0.0",
|
||||
"System.Configuration.ConfigurationManager": "6.0.1",
|
||||
"System.Data.SqlClient": "4.8.6"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netstandard2.1/EntityFramework.SqlServer.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.500.124.31603"
|
||||
},
|
||||
"lib/netstandard2.1/EntityFramework.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.500.124.31603"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Authorization/9.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Metadata": "9.0.1",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Options": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.AspNetCore.Authorization.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Components/9.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Authorization": "9.0.1",
|
||||
"Microsoft.AspNetCore.Components.Analyzers": "9.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.AspNetCore.Components.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.Analyzers/9.0.1": {},
|
||||
"Microsoft.AspNetCore.Components.Forms/9.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Components": "9.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.AspNetCore.Components.Forms.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.Web/9.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Components": "9.0.1",
|
||||
"Microsoft.AspNetCore.Components.Forms": "9.0.1",
|
||||
"Microsoft.Extensions.DependencyInjection": "9.0.8",
|
||||
"Microsoft.Extensions.Primitives": "9.0.8",
|
||||
"Microsoft.JSInterop": "9.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.AspNetCore.Components.Web.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"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.AspNetCore.Metadata/9.0.1": {
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.AspNetCore.Metadata.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.CSharp/4.7.0": {},
|
||||
"Microsoft.EntityFrameworkCore/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore.Abstractions": "9.0.8",
|
||||
"Microsoft.EntityFrameworkCore.Analyzers": "9.0.8",
|
||||
"Microsoft.Extensions.Caching.Memory": "9.0.8",
|
||||
"Microsoft.Extensions.Logging": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.dll": {
|
||||
"assemblyVersion": "9.0.8.0",
|
||||
"fileVersion": "9.0.825.36802"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Abstractions/9.0.8": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": {
|
||||
"assemblyVersion": "9.0.8.0",
|
||||
"fileVersion": "9.0.825.36802"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Analyzers/9.0.8": {},
|
||||
"Microsoft.EntityFrameworkCore.Relational/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore": "9.0.8",
|
||||
"Microsoft.Extensions.Caching.Memory": "9.0.8",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Logging": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": {
|
||||
"assemblyVersion": "9.0.8.0",
|
||||
"fileVersion": "9.0.825.36802"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Abstractions/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Memory/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Caching.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Options": "9.0.8",
|
||||
"Microsoft.Extensions.Primitives": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": {
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Identity.Core/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Cryptography.KeyDerivation": "9.0.8",
|
||||
"Microsoft.Extensions.Logging": "9.0.8",
|
||||
"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.Localization/9.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Localization.Abstractions": "9.0.1",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Options": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Localization.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Localization.Abstractions/9.0.1": {
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Localization.Abstractions.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"lib/net9.0/Microsoft.Extensions.Logging.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Options/9.0.8": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
|
||||
"Microsoft.Extensions.Primitives": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Options.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Primitives/9.0.8": {
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.Extensions.Primitives.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.825.36511"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.JSInterop/9.0.1": {
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.JSInterop.dll": {
|
||||
"assemblyVersion": "9.0.0.0",
|
||||
"fileVersion": "9.0.124.61009"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Win32.Registry/4.7.0": {
|
||||
"dependencies": {
|
||||
"System.Security.AccessControl": "6.0.0",
|
||||
"System.Security.Principal.Windows": "4.7.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Win32.SystemEvents/6.0.0": {
|
||||
"runtime": {
|
||||
"lib/net6.0/Microsoft.Win32.SystemEvents.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"MudBlazor/8.13.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Components": "9.0.1",
|
||||
"Microsoft.AspNetCore.Components.Web": "9.0.1",
|
||||
"Microsoft.Extensions.Localization": "9.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/MudBlazor.dll": {
|
||||
"assemblyVersion": "8.13.0.0",
|
||||
"fileVersion": "8.13.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Npgsql/9.0.3": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "9.0.8"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Npgsql.dll": {
|
||||
"assemblyVersion": "9.0.3.0",
|
||||
"fileVersion": "9.0.3.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL/9.0.4": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore": "9.0.8",
|
||||
"Microsoft.EntityFrameworkCore.Relational": "9.0.8",
|
||||
"Npgsql": "9.0.3"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": {
|
||||
"assemblyVersion": "9.0.4.0",
|
||||
"fileVersion": "9.0.4.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Data.SqlClient.sni/4.7.0": {
|
||||
"dependencies": {
|
||||
"runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0",
|
||||
"runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0",
|
||||
"runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0"
|
||||
}
|
||||
},
|
||||
"runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0": {
|
||||
"runtimeTargets": {
|
||||
"runtimes/win-arm64/native/sni.dll": {
|
||||
"rid": "win-arm64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "4.6.25512.1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0": {
|
||||
"runtimeTargets": {
|
||||
"runtimes/win-x64/native/sni.dll": {
|
||||
"rid": "win-x64",
|
||||
"assetType": "native",
|
||||
"fileVersion": "4.6.25512.1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": {
|
||||
"runtimeTargets": {
|
||||
"runtimes/win-x86/native/sni.dll": {
|
||||
"rid": "win-x86",
|
||||
"assetType": "native",
|
||||
"fileVersion": "4.6.25512.1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.CodeDom/6.0.0": {
|
||||
"runtime": {
|
||||
"lib/net6.0/System.CodeDom.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.ComponentModel.Annotations/5.0.0": {},
|
||||
"System.Configuration.ConfigurationManager/6.0.1": {
|
||||
"dependencies": {
|
||||
"System.Security.Cryptography.ProtectedData": "6.0.0",
|
||||
"System.Security.Permissions": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Configuration.ConfigurationManager.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.922.41905"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Data.SqlClient/4.8.6": {
|
||||
"dependencies": {
|
||||
"Microsoft.Win32.Registry": "4.7.0",
|
||||
"System.Security.Principal.Windows": "4.7.0",
|
||||
"runtime.native.System.Data.SqlClient.sni": "4.7.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netcoreapp2.1/System.Data.SqlClient.dll": {
|
||||
"assemblyVersion": "4.6.1.6",
|
||||
"fileVersion": "4.700.23.52603"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/unix/lib/netcoreapp2.1/System.Data.SqlClient.dll": {
|
||||
"rid": "unix",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "4.6.1.6",
|
||||
"fileVersion": "4.700.23.52603"
|
||||
},
|
||||
"runtimes/win/lib/netcoreapp2.1/System.Data.SqlClient.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "4.6.1.6",
|
||||
"fileVersion": "4.700.23.52603"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Drawing.Common/6.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Win32.SystemEvents": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Drawing.Common.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/unix/lib/net6.0/System.Drawing.Common.dll": {
|
||||
"rid": "unix",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
},
|
||||
"runtimes/win/lib/net6.0/System.Drawing.Common.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Security.AccessControl/6.0.0": {},
|
||||
"System.Security.Cryptography.ProtectedData/6.0.0": {
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Security.Cryptography.ProtectedData.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/win/lib/net6.0/System.Security.Cryptography.ProtectedData.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Security.Permissions/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Security.AccessControl": "6.0.0",
|
||||
"System.Windows.Extensions": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Security.Permissions.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Security.Principal.Windows/4.7.0": {},
|
||||
"System.Windows.Extensions/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Drawing.Common": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Windows.Extensions.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
},
|
||||
"runtimeTargets": {
|
||||
"runtimes/win/lib/net6.0/System.Windows.Extensions.dll": {
|
||||
"rid": "win",
|
||||
"assetType": "runtime",
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"OpenArchival.DataAccess/1.0.0": {
|
||||
"dependencies": {
|
||||
"EntityFramework": "6.5.1",
|
||||
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "9.0.8",
|
||||
"Microsoft.EntityFrameworkCore": "9.0.8",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
|
||||
"Npgsql": "9.0.3",
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.4"
|
||||
},
|
||||
"runtime": {
|
||||
"OpenArchival.DataAccess.dll": {
|
||||
"assemblyVersion": "1.0.0.0",
|
||||
"fileVersion": "1.0.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"OpenArchival.Blazor.CustomComponents/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"BuildBundlerMinifier/3.2.449": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-uA9sYDy4VepL3xwzBTLcP2LyuVYMt0ZIT3gaSiXvGoX15Ob+rOP+hGydhevlSVd+rFo+Y+VQFEHDuWU8HBW+XA==",
|
||||
"path": "buildbundlerminifier/3.2.449",
|
||||
"hashPath": "buildbundlerminifier.3.2.449.nupkg.sha512"
|
||||
},
|
||||
"CodeBeam.MudExtensions/6.3.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-U5J0IlIg8R166hm9RwVjjbCtbBs3ixLev94NmfQHaBVUn3P4un+DoirfUjcUs96wvKb5K9H9ou39Yq+wBO11IA==",
|
||||
"path": "codebeam.mudextensions/6.3.0",
|
||||
"hashPath": "codebeam.mudextensions.6.3.0.nupkg.sha512"
|
||||
},
|
||||
"CsvHelper/30.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-rcZtgbWR+As4G3Vpgx0AMNmShGuQLFjkHAPIIflzrfkJCx8/AOd4m96ZRmiU1Wi39qS5UVjV0P8qdgqOo5Cwyg==",
|
||||
"path": "csvhelper/30.0.1",
|
||||
"hashPath": "csvhelper.30.0.1.nupkg.sha512"
|
||||
},
|
||||
"EntityFramework/6.5.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-sQRP2lWg1i3aAGWqdliAM8zrGx7LHMUk+9/MoxUjwfTZYGMXvZ2JYZTlyTm1PqDxvn3c9E3U76TWDON7Y5+CVA==",
|
||||
"path": "entityframework/6.5.1",
|
||||
"hashPath": "entityframework.6.5.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Authorization/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WgLlLBlMczb2+QLNG6sM95OUZ0EBztz60k/N75tjIgpyu0SdpIfYytAmX/7JJAjRTZF0c/CrWaQV+SH9FuGsrA==",
|
||||
"path": "microsoft.aspnetcore.authorization/9.0.1",
|
||||
"hashPath": "microsoft.aspnetcore.authorization.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Components/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-6pwfbQKNtvPkbF4tCGiAKGyt6BVpu58xAXz7u2YXcUKTNmNxrymbG1mEyMc0EPzVdnquDDqTyfXM3mC1EJycxQ==",
|
||||
"path": "microsoft.aspnetcore.components/9.0.1",
|
||||
"hashPath": "microsoft.aspnetcore.components.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.Analyzers/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-I8Rs4LXT5UQxM5Nin2+Oj8aSY2heszSZ3EyTLgt3mxmfiRPrVO7D8NNSsf1voI2Gb0qFJceof/J5c9E+nfNuHw==",
|
||||
"path": "microsoft.aspnetcore.components.analyzers/9.0.1",
|
||||
"hashPath": "microsoft.aspnetcore.components.analyzers.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.Forms/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-KyULVU32bLz74LWDwPEwNUEllTehzWJuM7YAsz80rMKEzvR0K8cRjRzO0fnN/nfydMeLRRlbI0xj8wnEAymLVw==",
|
||||
"path": "microsoft.aspnetcore.components.forms/9.0.1",
|
||||
"hashPath": "microsoft.aspnetcore.components.forms.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.Web/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-LI0vjYEd9MaDZPDQxPCn4gGYDkEC5U9rp1nWZo7rPozJxgTG2zU3WERujxTi2LeAC2ZzdXlOVCrUyPQ55LZV2A==",
|
||||
"path": "microsoft.aspnetcore.components.web/9.0.1",
|
||||
"hashPath": "microsoft.aspnetcore.components.web.9.0.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.AspNetCore.Metadata/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-EZnHifamF7IFEIyjAKMtJM3I/94OIe72i3P09v5oL0twmsmfQwal6Ni3m8lbB5mge3jWFhMozeW+rUdRSqnXRQ==",
|
||||
"path": "microsoft.aspnetcore.metadata/9.0.1",
|
||||
"hashPath": "microsoft.aspnetcore.metadata.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CSharp/4.7.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==",
|
||||
"path": "microsoft.csharp/4.7.0",
|
||||
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==",
|
||||
"path": "microsoft.entityframeworkcore/9.0.8",
|
||||
"hashPath": "microsoft.entityframeworkcore.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Abstractions/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==",
|
||||
"path": "microsoft.entityframeworkcore.abstractions/9.0.8",
|
||||
"hashPath": "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Analyzers/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==",
|
||||
"path": "microsoft.entityframeworkcore.analyzers/9.0.8",
|
||||
"hashPath": "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Relational/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-OVhfyxiHxMvYpwQ8Jy3YZi4koy6TK5/Q7C1oq3z6db+HEGuu6x9L1BX5zDIdJxxlRePMyO4D8ORiXj/D7+MUqw==",
|
||||
"path": "microsoft.entityframeworkcore.relational/9.0.8",
|
||||
"hashPath": "microsoft.entityframeworkcore.relational.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Abstractions/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==",
|
||||
"path": "microsoft.extensions.caching.abstractions/9.0.8",
|
||||
"hashPath": "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Memory/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==",
|
||||
"path": "microsoft.extensions.caching.memory/9.0.8",
|
||||
"hashPath": "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-yNou2KM35RvzOh4vUFtl2l33rWPvOCoba+nzEDJ+BgD8aOL/jew4WPCibQvntRfOJ2pJU8ARygSMD+pdjvDHuA==",
|
||||
"path": "microsoft.extensions.configuration.abstractions/9.0.8",
|
||||
"hashPath": "microsoft.extensions.configuration.abstractions.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==",
|
||||
"path": "microsoft.extensions.dependencyinjection/9.0.8",
|
||||
"hashPath": "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==",
|
||||
"path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8",
|
||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Identity.Core/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-giUYz84GHAizDucZp5vWAusDO2s9Jrrg2jQ6HUQNGs5HQMKJVobLPMQSiyg8R4yecH0pIc0QjANh0B/Kw13BHA==",
|
||||
"path": "microsoft.extensions.identity.core/9.0.8",
|
||||
"hashPath": "microsoft.extensions.identity.core.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Identity.Stores/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-sycaHcq78yI591+KxEdd53a7pJGQEl9H/wDsFkaPNE9g7loyq8vufPcc/9RH3KlGt5joR5Ey7PdoRSrlLjCgJg==",
|
||||
"path": "microsoft.extensions.identity.stores/9.0.8",
|
||||
"hashPath": "microsoft.extensions.identity.stores.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Localization/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-UgvX4Yb2T3tEsKT30ktZr0H7kTRPapCgEH0bdTwxiEGSdA39/hAQMvvb+vgHpqmevDU5+puyI9ujRkmmbF946w==",
|
||||
"path": "microsoft.extensions.localization/9.0.1",
|
||||
"hashPath": "microsoft.extensions.localization.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Localization.Abstractions/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-CABog43lyaZQMjmlktuImCy6zmAzRBaXqN81uPaMQjlp//ISDVYItZPh6KWpWRF4MY/B67X5oDc3JTUpfdocZw==",
|
||||
"path": "microsoft.extensions.localization.abstractions/9.0.1",
|
||||
"hashPath": "microsoft.extensions.localization.abstractions.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==",
|
||||
"path": "microsoft.extensions.logging/9.0.8",
|
||||
"hashPath": "microsoft.extensions.logging.9.0.8.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions/9.0.8": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==",
|
||||
"path": "microsoft.extensions.logging.abstractions/9.0.8",
|
||||
"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.JSInterop/9.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-/xBwIfb0YoC2Muv6EsHjxpqZw2aKv94+i0g0FWZvqvGv3DeAy+8wipAuECVvKYEs2EIclRD41bjajHLoD6mTtw==",
|
||||
"path": "microsoft.jsinterop/9.0.1",
|
||||
"hashPath": "microsoft.jsinterop.9.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Win32.Registry/4.7.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==",
|
||||
"path": "microsoft.win32.registry/4.7.0",
|
||||
"hashPath": "microsoft.win32.registry.4.7.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Win32.SystemEvents/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==",
|
||||
"path": "microsoft.win32.systemevents/6.0.0",
|
||||
"hashPath": "microsoft.win32.systemevents.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"MudBlazor/8.13.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-Y6JW93zf8tiVhMSkkL0mZ3ruqjOTNftvVoX3sik6NEnIye+Gs0FXI8rhXfrH2LU79Mw/fOtT5ms3L/Q4TKx2kA==",
|
||||
"path": "mudblazor/8.13.0",
|
||||
"hashPath": "mudblazor.8.13.0.nupkg.sha512"
|
||||
},
|
||||
"Npgsql/9.0.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-tPvY61CxOAWxNsKLEBg+oR646X4Bc8UmyQ/tJszL/7mEmIXQnnBhVJZrZEEUv0Bstu0mEsHZD5At3EO8zQRAYw==",
|
||||
"path": "npgsql/9.0.3",
|
||||
"hashPath": "npgsql.9.0.3.nupkg.sha512"
|
||||
},
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL/9.0.4": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-mw5vcY2IEc7L+IeGrxpp/J5OSnCcjkjAgJYCm/eD52wpZze8zsSifdqV7zXslSMmfJG2iIUGZyo3KuDtEFKwMQ==",
|
||||
"path": "npgsql.entityframeworkcore.postgresql/9.0.4",
|
||||
"hashPath": "npgsql.entityframeworkcore.postgresql.9.0.4.nupkg.sha512"
|
||||
},
|
||||
"runtime.native.System.Data.SqlClient.sni/4.7.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==",
|
||||
"path": "runtime.native.system.data.sqlclient.sni/4.7.0",
|
||||
"hashPath": "runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512"
|
||||
},
|
||||
"runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==",
|
||||
"path": "runtime.win-arm64.runtime.native.system.data.sqlclient.sni/4.4.0",
|
||||
"hashPath": "runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
|
||||
},
|
||||
"runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==",
|
||||
"path": "runtime.win-x64.runtime.native.system.data.sqlclient.sni/4.4.0",
|
||||
"hashPath": "runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
|
||||
},
|
||||
"runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==",
|
||||
"path": "runtime.win-x86.runtime.native.system.data.sqlclient.sni/4.4.0",
|
||||
"hashPath": "runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
|
||||
},
|
||||
"System.CodeDom/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==",
|
||||
"path": "system.codedom/6.0.0",
|
||||
"hashPath": "system.codedom.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.ComponentModel.Annotations/5.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==",
|
||||
"path": "system.componentmodel.annotations/5.0.0",
|
||||
"hashPath": "system.componentmodel.annotations.5.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Configuration.ConfigurationManager/6.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==",
|
||||
"path": "system.configuration.configurationmanager/6.0.1",
|
||||
"hashPath": "system.configuration.configurationmanager.6.0.1.nupkg.sha512"
|
||||
},
|
||||
"System.Data.SqlClient/4.8.6": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==",
|
||||
"path": "system.data.sqlclient/4.8.6",
|
||||
"hashPath": "system.data.sqlclient.4.8.6.nupkg.sha512"
|
||||
},
|
||||
"System.Drawing.Common/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
|
||||
"path": "system.drawing.common/6.0.0",
|
||||
"hashPath": "system.drawing.common.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Security.AccessControl/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==",
|
||||
"path": "system.security.accesscontrol/6.0.0",
|
||||
"hashPath": "system.security.accesscontrol.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Security.Cryptography.ProtectedData/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==",
|
||||
"path": "system.security.cryptography.protecteddata/6.0.0",
|
||||
"hashPath": "system.security.cryptography.protecteddata.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Security.Permissions/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
|
||||
"path": "system.security.permissions/6.0.0",
|
||||
"hashPath": "system.security.permissions.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Security.Principal.Windows/4.7.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==",
|
||||
"path": "system.security.principal.windows/4.7.0",
|
||||
"hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512"
|
||||
},
|
||||
"System.Windows.Extensions/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
|
||||
"path": "system.windows.extensions/6.0.0",
|
||||
"hashPath": "system.windows.extensions.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"OpenArchival.DataAccess/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net9.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "9.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "9.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.Reflection.NullabilityInfoContext.IsSupported": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"ContentRoots":["C:\\Users\\vtall\\.nuget\\packages\\codebeam.mudextensions\\6.3.0\\staticwebassets\\","C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.CustomComponents\\obj\\Debug\\net9.0\\compressed\\","C:\\Users\\vtall\\.nuget\\packages\\mudblazor\\8.13.0\\staticwebassets\\"],"Root":{"Children":{"_content":{"Children":{"CodeBeam.MudExtensions":{"Children":{"Mud_Secondary.png":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"Mud_Secondary.png"},"Patterns":null},"MudExtensions.min.css":{"Children":null,"Asset":{"ContentRootIndex":0,"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":0,"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":2,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.css.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"tzxjg6is5z-jk5eo7zo4m.gz"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"MudBlazor.min.js"},"Patterns":null},"MudBlazor.min.js.gz":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"0wz98yz2xy-tjzqk7tnel.gz"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null}}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net9.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "9.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "9.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Reflection.NullabilityInfoContext.IsSupported": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"Version":1,"ManifestType":"Build","Endpoints":[]}
|
||||
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")]
|
||||
@@ -0,0 +1,23 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor.CustomComponents")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+781793a27f2e164808340b1adb5ce70e1800b187")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor.CustomComponents")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor.CustomComponents")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
0f150b2c6c42fe6dc150484dc552ff72149942a646208d5d65628a770a14b473
|
||||
@@ -0,0 +1,32 @@
|
||||
is_global = true
|
||||
build_property.MudDebugAnalyzer =
|
||||
build_property.MudAllowedAttributePattern =
|
||||
build_property.MudAllowedAttributeList =
|
||||
build_property.TargetFramework = net9.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = OpenArchival.Blazor.CustomComponents
|
||||
build_property.RootNamespace = OpenArchival.Blazor.CustomComponents
|
||||
build_property.ProjectDir = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.CustomComponents\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.RazorLangVersion = 9.0
|
||||
build_property.SupportLocalizedComponentNames =
|
||||
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.CustomComponents
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
build_property.EffectiveAnalysisLevelStyle = 9.0
|
||||
build_property.EnableCodeStyleSeverity =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.CustomComponents/ChipContainer.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q2hpcENvbnRhaW5lci5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.CustomComponents/UploadDropBox.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = VXBsb2FkRHJvcEJveC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
@@ -0,0 +1,8 @@
|
||||
// <auto-generated/>
|
||||
global using global::System;
|
||||
global using global::System.Collections.Generic;
|
||||
global using global::System.IO;
|
||||
global using global::System.Linq;
|
||||
global using global::System.Net.Http;
|
||||
global using global::System.Threading;
|
||||
global using global::System.Threading.Tasks;
|
||||
@@ -0,0 +1 @@
|
||||
d5ac7ab69059af111e9d7125adeb7b174ca570725d4b64a544cca7bd11ac7ca0
|
||||
@@ -0,0 +1,18 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.ConsolidatedAssemblyApplicationPartFact" +
|
||||
"ory, Microsoft.AspNetCore.Mvc.Razor")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
ffba298797e6fdad0c0abef5845a41c31eea46adae15e71a79bc85acd520141c
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user