Fixed bug where deletes of artifact groupings would not cascade

This commit is contained in:
Vincent Allen
2025-11-12 19:10:35 -05:00
parent b34449808f
commit 9298829db6
325 changed files with 5233 additions and 20996 deletions

67
OpenArchival - Copy.sln Normal file
View File

@@ -0,0 +1,67 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36310.24
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}"
ProjectSection(SolutionItems) = preProject
.gitignore = .gitignore
nuget.config = nuget.config
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenArchival.Blazor", "OpenArchival.Blazor\OpenArchival.Blazor.csproj", "{E69C87C7-6376-425B-B4C5-82C4C45FC1C4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenArchival.DataAccess", "OpenArchival.DataAccess\OpenArchival.DataAccess.csproj", "{41A0E099-EAC2-4B88-B1C6-EBD0FA40BABC}"
EndProject
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{81DDED9D-158B-E303-5F62-77A2896D2A5A}"
<<<<<<< HEAD
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenArchival.Blazor.FileViewer", "OpenArchival.Blazor.FileViewer\OpenArchival.Blazor.FileViewer.csproj", "{C90DE897-C79F-EEE6-6DF6-936C80C3A783}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenArchival.Blazor.AdminPages", "OpenArchival.Blazor.AdminPages\OpenArchival.Blazor.AdminPages.csproj", "{520BA4C1-D700-44D9-80B3-F30FDB870166}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenArchival.Blazor.CustomComponents", "OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj", "{C8F28D94-810B-43E1-9520-FD2F7337175A}"
=======
>>>>>>> 781793a27f2e164808340b1adb5ce70e1800b187
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E69C87C7-6376-425B-B4C5-82C4C45FC1C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E69C87C7-6376-425B-B4C5-82C4C45FC1C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E69C87C7-6376-425B-B4C5-82C4C45FC1C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E69C87C7-6376-425B-B4C5-82C4C45FC1C4}.Release|Any CPU.Build.0 = Release|Any CPU
{41A0E099-EAC2-4B88-B1C6-EBD0FA40BABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41A0E099-EAC2-4B88-B1C6-EBD0FA40BABC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41A0E099-EAC2-4B88-B1C6-EBD0FA40BABC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41A0E099-EAC2-4B88-B1C6-EBD0FA40BABC}.Release|Any CPU.Build.0 = Release|Any CPU
{81DDED9D-158B-E303-5F62-77A2896D2A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81DDED9D-158B-E303-5F62-77A2896D2A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81DDED9D-158B-E303-5F62-77A2896D2A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81DDED9D-158B-E303-5F62-77A2896D2A5A}.Release|Any CPU.Build.0 = Release|Any CPU
<<<<<<< HEAD
{C90DE897-C79F-EEE6-6DF6-936C80C3A783}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C90DE897-C79F-EEE6-6DF6-936C80C3A783}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C90DE897-C79F-EEE6-6DF6-936C80C3A783}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C90DE897-C79F-EEE6-6DF6-936C80C3A783}.Release|Any CPU.Build.0 = Release|Any CPU
{520BA4C1-D700-44D9-80B3-F30FDB870166}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{520BA4C1-D700-44D9-80B3-F30FDB870166}.Debug|Any CPU.Build.0 = Debug|Any CPU
{520BA4C1-D700-44D9-80B3-F30FDB870166}.Release|Any CPU.ActiveCfg = Release|Any CPU
{520BA4C1-D700-44D9-80B3-F30FDB870166}.Release|Any CPU.Build.0 = Release|Any CPU
{C8F28D94-810B-43E1-9520-FD2F7337175A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8F28D94-810B-43E1-9520-FD2F7337175A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C8F28D94-810B-43E1-9520-FD2F7337175A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8F28D94-810B-43E1-9520-FD2F7337175A}.Release|Any CPU.Build.0 = Release|Any CPU
=======
>>>>>>> 781793a27f2e164808340b1adb5ce70e1800b187
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FE3486E7-7FEE-4B26-9CA7-D75E071DD7A3}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,13 @@
@page
@model OpenArchival.Blazor.AdminComponents.MyFeature.Pages.Page1Model
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Page1</title>
</head>
<body>
</body>
</html>

View File

@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OpenArchival.Blazor.AdminComponents.MyFeature.Pages
{
public class Page1Model : PageModel
{
public void OnGet()
{
}
}
}

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using MudBlazor @using MudBlazor

View File

@@ -26,7 +26,7 @@
<MudNavGroup Title="Blog" Icon="@Icons.Material.Filled.Book"> <MudNavGroup Title="Blog" Icon="@Icons.Material.Filled.Book">
<MudNavLink Href="/admin/blogedit" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Edit">Create Blog Post</MudNavLink> <MudNavLink Href="/admin/blogedit" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Edit">Create Blog Post</MudNavLink>
<MudNavLink Href="/admin/viewblogs" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Edit">View/Edit Blog Posts</MudNavLink> <MudNavLink Href="/admin/blogstable" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Edit">Edit Blog Posts</MudNavLink>
</MudNavGroup> </MudNavGroup>
</MudNavMenu> </MudNavMenu>
</MudDrawer> </MudDrawer>

View File

@@ -2,20 +2,28 @@
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using MudBlazor @using MudBlazor
@using MudExtensions @using MudExtensions
@using OpenArchival.Blazor.ArchiveSearch
@using OpenArchival.DataAccess @using OpenArchival.DataAccess
@using OpenArchival.Blazor.AdminPages.Shared;
@using OpenArchival.Blazor.AdminPages;
@using OpenArchival.Blazor;
<ArchiveSearchBar @ref=_searchBar SearchTermsChanged="OnSearchTermsChanged"></ArchiveSearchBar>
<MudDataGrid <MudDataGrid
T="ArtifactGroupingRowElement" T="ArtifactGroupingRowElement"
MultiSelection=true MultiSelection=true
Filterable=false Filterable=false
SelectOnRowClick=true SelectOnRowClick=true
ServerData="new Func<GridState<ArtifactGroupingRowElement>, Task<GridData<ArtifactGroupingRowElement>>>(ServerReload)" ServerData="new Func<GridState<ArtifactGroupingRowElement>, Task<GridData<ArtifactGroupingRowElement>>>(ServerReload)"
@key=@ArtifactGroupingRows @ref=@DataGrid
@ref=@DataGrid> @bind-SelectedItems="_selectedGroupings"
Comparer="_comparer">
<ToolBarContent> <ToolBarContent>
<MudButton
Variant="Variant.Filled" <MudSpacer />
<MudButton Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Delete" StartIcon="@Icons.Material.Filled.Delete"
Color="Color.Error" Color="Color.Error"
OnClick="OnDeleteClicked">Delete</MudButton> OnClick="OnDeleteClicked">Delete</MudButton>
@@ -66,13 +74,35 @@
@inject IDialogService DialogService; @inject IDialogService DialogService;
@inject IArtifactGroupingProvider GroupingProvider; @inject IArtifactGroupingProvider GroupingProvider;
@inject ArtifactEntrySharedHelpers Helpers; @inject ArtifactEntrySharedHelpers Helpers;
@inject ArtifactGroupingSearch SearchProvider;
@code @code
{ {
public class ArtifactGroupingRowElementComparer : IEqualityComparer<ArtifactGroupingRowElement>
{
public bool Equals(ArtifactGroupingRowElement? x, ArtifactGroupingRowElement? y)
{
if (ReferenceEquals(x, y)) return true;
if (x is null || y is null) return false;
return x.Id == y.Id;
}
public int GetHashCode(ArtifactGroupingRowElement obj)
{
return obj.Id.GetHashCode();
}
}
public List<ArtifactGroupingRowElement> ArtifactGroupingRows { get; set; } = new(); public List<ArtifactGroupingRowElement> ArtifactGroupingRows { get; set; } = new();
public MudDataGrid<ArtifactGroupingRowElement> DataGrid { get; set; } = default!; public MudDataGrid<ArtifactGroupingRowElement> DataGrid { get; set; } = default!;
private ArtifactGroupingRowElementComparer _comparer = new();
private string _searchString { get; set; } = "";
private ArchiveSearchBar _searchBar { get; set; } = default!;
private HashSet<ArtifactGroupingRowElement> _selectedGroupings { get; set; } = [];
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
// Load inital data // Load inital data
@@ -147,16 +177,30 @@
foreach (var grouping in selected) foreach (var grouping in selected)
{ {
await GroupingProvider.DeleteGroupingAsync(grouping.Id); await GroupingProvider.DeleteGroupingAsync(grouping.Id);
}
}
await DataGrid.ReloadServerData();
StateHasChanged(); StateHasChanged();
} }
}
}
private async Task<GridData<ArtifactGroupingRowElement>> ServerReload(GridState<ArtifactGroupingRowElement> state) private async Task<GridData<ArtifactGroupingRowElement>> ServerReload(GridState<ArtifactGroupingRowElement> state)
{ {
int totalItems = await GroupingProvider.GetTotalCount(); int totalItems = await GroupingProvider.GetTotalCount();
IEnumerable<ArtifactGrouping> groupings = await GroupingProvider.GetGroupingsPaged(state.Page + 1, state.PageSize); SearchProvider.PageSize = state.PageSize;
IEnumerable<ArtifactGrouping> groupings;
if (string.IsNullOrEmpty(_searchString))
{
groupings = await GroupingProvider.GetGroupingsPaged(state.Page + 1, state.PageSize);
totalItems = await GroupingProvider.GetTotalCount();
} else
{
await SearchProvider.Search(_searchString, _searchBar.SelectedFilter, state.Page + 1);
groupings = SearchProvider.SearchResults;
}
var pagedItems = groupings.Select(grouping => new ArtifactGroupingRowElement() var pagedItems = groupings.Select(grouping => new ArtifactGroupingRowElement()
{ {
@@ -167,10 +211,60 @@
IsPublicallyVisible = grouping.IsPublicallyVisible, IsPublicallyVisible = grouping.IsPublicallyVisible,
}); });
StateHasChanged();
return new GridData<ArtifactGroupingRowElement>() return new GridData<ArtifactGroupingRowElement>()
{ {
TotalItems = totalItems, TotalItems = totalItems,
Items = pagedItems Items = pagedItems
}; };
} }
private async Task OnSearchTermsChanged(string args)
{
_searchString = args;
await DataGrid.ReloadServerData();
}
public async Task<List<ArtifactGrouping>> SelectedItems()
{
List<ArtifactGrouping> selectedGroupings = [];
foreach (ArtifactGroupingRowElement row in DataGrid.SelectedItems)
{
selectedGroupings.Add(await GroupingProvider.GetGroupingAsync(row.Id));
}
return selectedGroupings;
}
public void ClearSelected()
{
// OLD: _selectedGroupings = new HashSet<ArtifactGroupingRowElement>();
// NEW: Initialize with the comparer
_selectedGroupings = new HashSet<ArtifactGroupingRowElement>(_comparer);
}
// 6. ADD THIS NEW PUBLIC METHOD
public Task SetSelectedItemsAsync(IEnumerable<ArtifactGrouping> groupingsToSelect)
{
// Convert from the full ArtifactGrouping entity to the RowElement.
// We only *really* need the Id for the comparer, but populating
// the other fields is good practice.
var rowElementsToSelect = groupingsToSelect.Select(grouping => new ArtifactGroupingRowElement
{
Id = grouping.Id,
Title = grouping.Title,
ArtifactGroupingIdentifier = grouping.ArtifactGroupingIdentifier ?? string.Empty,
CategoryName = grouping.Category?.Name ?? string.Empty,
IsPublicallyVisible = grouping.IsPublicallyVisible
});
// Create a new HashSet from the list, using the comparer.
// Assigning this to the bound variable will update the grid's UI.
_selectedGroupings = new HashSet<ArtifactGroupingRowElement>(rowElementsToSelect, _comparer);
StateHasChanged();
return Task.CompletedTask;
}
} }

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using OpenArchival.DataAccess @using OpenArchival.DataAccess
@using System.ComponentModel.DataAnnotations @using System.ComponentModel.DataAnnotations

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using System.Text @using System.Text
@using MudBlazor @using MudBlazor

View File

@@ -1,4 +1,4 @@
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor.AdminPages.Shared;
using OpenArchival.DataAccess; using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;

View File

@@ -1,7 +1,7 @@
using OpenArchival.DataAccess; using OpenArchival.DataAccess;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor.AdminPages.Shared;
public class ArtifactGroupingValidationModel : IValidatableObject public class ArtifactGroupingValidationModel : IValidatableObject
{ {

View File

@@ -1,4 +1,4 @@
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor.AdminPages.Shared;
public class IdentifierFieldValidationModel public class IdentifierFieldValidationModel
{ {

View File

@@ -1,4 +1,4 @@
namespace OpenArchival.Blazor.AdminPages; namespace OpenArchival.Blazor.AdminPages.Shared;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using OpenArchival.DataAccess; using OpenArchival.DataAccess;

View File

@@ -1,4 +1,4 @@
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor.AdminPages.Shared;
public class ArtifactGroupingRowElement public class ArtifactGroupingRowElement
{ {

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using Microsoft.EntityFrameworkCore; @using Microsoft.EntityFrameworkCore;
@using Microsoft.Extensions.Logging @using Microsoft.Extensions.Logging
@using MudBlazor.Interfaces @using MudBlazor.Interfaces

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using System.ComponentModel.DataAnnotations; @using System.ComponentModel.DataAnnotations;
@using OpenArchival.DataAccess; @using OpenArchival.DataAccess;
@using MudBlazor @using MudBlazor

View File

@@ -1,4 +1,4 @@
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using MudBlazor @using MudBlazor
<MudCard Outlined="true"> <MudCard Outlined="true">

View File

@@ -1,4 +1,4 @@
namespace OpenArchival.Blazor; namespace OpenArchival.Blazor.AdminPages.Shared;
using Microsoft.IdentityModel.Abstractions; using Microsoft.IdentityModel.Abstractions;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;

View File

@@ -1,6 +1,6 @@
@page "/categories" @page "/categories"
@namespace OpenArchival.Blazor.AdminPages @namespace OpenArchival.Blazor.AdminPages.Shared
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using Microsoft.EntityFrameworkCore @using Microsoft.EntityFrameworkCore
@using Microsoft.Extensions.Logging @using Microsoft.Extensions.Logging

View File

@@ -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="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.ArchiveSearch\OpenArchival.Blazor.ArchiveSearch.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj" />
<ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" />
</ItemGroup>
</Project>

View File

@@ -6,6 +6,7 @@
@using MudExRichTextEditor @using MudExRichTextEditor
@using MudBlazor @using MudBlazor
@using OpenArchival.Blazor @using OpenArchival.Blazor
@using OpenArchival.Blazor.AdminPages.Shared
@using OpenArchival.Blazor.Config @using OpenArchival.Blazor.Config
<MudText Typo="Typo.h6">About Page Editor</MudText> <MudText Typo="Typo.h6">About Page Editor</MudText>

View File

@@ -1,5 +1,5 @@
@page "/admin" @page "/admin"
@using OpenArchival.Blazor.AdminPages.Shared
@layout AdminControlPanelLayout @layout AdminControlPanelLayout
<h3>Admin Home</h3> <h3>Admin Home</h3>

View File

@@ -5,6 +5,7 @@
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using MudBlazor @using MudBlazor
@using OpenArchival.Blazor.AdminPages.Shared
@using static Microsoft.AspNetCore.Components.Web.RenderMode @using static Microsoft.AspNetCore.Components.Web.RenderMode
@rendermode InteractiveServer @rendermode InteractiveServer

View File

@@ -0,0 +1,13 @@
@page
@model OpenArchival.Blazor.AdminPages.MyFeature.Pages.Page1Model
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Page1</title>
</head>
<body>
</body>
</html>

View File

@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OpenArchival.Blazor.AdminPages.MyFeature.Pages
{
public class Page1Model : PageModel
{
public void OnGet()
{
}
}
}

View File

@@ -0,0 +1,12 @@
@page "/admin/blogstable"
@using OpenArchival.Blazor.AdminPages
@using OpenArchival.Blazor.AdminPages.Shared
@using OpenArchival.Blazor.Blog
@layout AdminControlPanelLayout
<BlogPostTable></BlogPostTable>
@code {
}

View File

@@ -6,6 +6,7 @@
@using MudExRichTextEditor @using MudExRichTextEditor
@using MudBlazor @using MudBlazor
@using OpenArchival.Blazor @using OpenArchival.Blazor
@using OpenArchival.Blazor.AdminPages.Shared
@using OpenArchival.Blazor.Config @using OpenArchival.Blazor.Config
<MudText Typo="Typo.h6">Home Page Editor</MudText> <MudText Typo="Typo.h6">Home Page Editor</MudText>

View File

@@ -20,6 +20,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenArchival.Blazor.AdminPages.Shared\OpenArchival.Blazor.AdminPages.Shared.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.ArchiveSearch\OpenArchival.Blazor.ArchiveSearch.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.Blog\OpenArchival.Blazor.Blog.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.Config\OpenArchival.Blazor.Config.csproj" /> <ProjectReference Include="..\OpenArchival.Blazor.Config\OpenArchival.Blazor.Config.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj" /> <ProjectReference Include="..\OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj" />
<ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" /> <ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" />

View File

@@ -4,6 +4,7 @@
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using Microsoft.EntityFrameworkCore @using Microsoft.EntityFrameworkCore
@using OpenArchival.Blazor.AdminPages.Shared
@using OpenArchival.Blazor.CustomComponents @using OpenArchival.Blazor.CustomComponents
@using MudBlazor @using MudBlazor
@using OpenArchival.DataAccess @using OpenArchival.DataAccess

View File

@@ -13,6 +13,9 @@
"Microsoft.IdentityModel.Tokens": "8.14.0", "Microsoft.IdentityModel.Tokens": "8.14.0",
"MudBlazor": "8.13.0", "MudBlazor": "8.13.0",
"MudExRichTextEditor": "8.13.0", "MudExRichTextEditor": "8.13.0",
"OpenArchival.Blazor.AdminPages.Shared": "1.0.0",
"OpenArchival.Blazor.ArchiveSearch": "1.0.0",
"OpenArchival.Blazor.Blog": "1.0.0",
"OpenArchival.Blazor.Config": "1.0.0", "OpenArchival.Blazor.Config": "1.0.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0", "OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.DataAccess": "1.0.0" "OpenArchival.DataAccess": "1.0.0"
@@ -991,6 +994,66 @@
} }
} }
}, },
"OpenArchival.Blazor.AdminPages.Shared/1.0.0": {
"dependencies": {
"Microsoft.IdentityModel.Abstractions": "8.14.0",
"Microsoft.IdentityModel.Tokens": "8.14.0",
"MudBlazor": "8.13.0",
"OpenArchival.Blazor.ArchiveSearch": "1.0.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"runtime": {
"OpenArchival.Blazor.AdminPages.Shared.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenArchival.Blazor.ArchiveSearch/1.0.0": {
"dependencies": {
"MudBlazor": "8.13.0",
"OpenArchival.Blazor.ArtifactGroupingDisplay": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"runtime": {
"OpenArchival.Blazor.ArchiveSearch.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenArchival.Blazor.ArtifactGroupingDisplay/1.0.0": {
"dependencies": {
"CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.Blazor.FileViewer": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"runtime": {
"OpenArchival.Blazor.ArtifactGroupingDisplay.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenArchival.Blazor.Blog/1.0.0": {
"dependencies": {
"MudBlazor": "8.13.0",
"MudExRichTextEditor": "8.13.0",
"OpenArchival.Blazor.AdminPages.Shared": "1.0.0",
"OpenArchival.Blazor.Config": "1.0.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"runtime": {
"OpenArchival.Blazor.Blog.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenArchival.Blazor.Config/1.0.0": { "OpenArchival.Blazor.Config/1.0.0": {
"runtime": { "runtime": {
"OpenArchival.Blazor.Config.dll": { "OpenArchival.Blazor.Config.dll": {
@@ -1003,6 +1066,7 @@
"dependencies": { "dependencies": {
"CodeBeam.MudExtensions": "6.3.0", "CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0", "MudBlazor": "8.13.0",
"OpenArchival.Blazor.Config": "1.0.0",
"OpenArchival.DataAccess": "1.0.0" "OpenArchival.DataAccess": "1.0.0"
}, },
"runtime": { "runtime": {
@@ -1012,6 +1076,19 @@
} }
} }
}, },
"OpenArchival.Blazor.FileViewer/1.0.0": {
"dependencies": {
"CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0",
"OpenArchival.DataAccess": "1.0.0"
},
"runtime": {
"OpenArchival.Blazor.FileViewer.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"dependencies": { "dependencies": {
"EntityFramework": "6.5.1", "EntityFramework": "6.5.1",
@@ -1695,6 +1772,26 @@
"path": "zstdsharp.port/0.8.5", "path": "zstdsharp.port/0.8.5",
"hashPath": "zstdsharp.port.0.8.5.nupkg.sha512" "hashPath": "zstdsharp.port.0.8.5.nupkg.sha512"
}, },
"OpenArchival.Blazor.AdminPages.Shared/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"OpenArchival.Blazor.ArchiveSearch/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"OpenArchival.Blazor.ArtifactGroupingDisplay/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"OpenArchival.Blazor.Blog/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"OpenArchival.Blazor.Config/1.0.0": { "OpenArchival.Blazor.Config/1.0.0": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
@@ -1705,6 +1802,11 @@
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"OpenArchival.Blazor.FileViewer/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,

View File

@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor.AdminPages")] [assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor.AdminPages")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0e24ce207395fb1c32a87d10049c1d81dc4784fe")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b34449808fa29388ff6ca79b560f657d74738fdd")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor.AdminPages")] [assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor.AdminPages")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor.AdminPages")] [assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor.AdminPages")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
1999676c2e39ed7655de012aa20c50d16eaa8954d13ff03c71308aba4df1d206 5dd13044308b5b7b2644a6e0b9714ed0a24d9f1d599346705c849cdb11095190

View File

@@ -27,52 +27,16 @@ build_property.EnableCodeStyleSeverity =
build_metadata.AdditionalFiles.TargetPath = QWJvdXRQYWdlRWRpdG9yLnJhem9y build_metadata.AdditionalFiles.TargetPath = QWJvdXRQYWdlRWRpdG9yLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/AdminControlPanelLayout.razor]
build_metadata.AdditionalFiles.TargetPath = QWRtaW5Db250cm9sUGFuZWxMYXlvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/AdminHome.razor] [C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/AdminHome.razor]
build_metadata.AdditionalFiles.TargetPath = QWRtaW5Ib21lLnJhem9y build_metadata.AdditionalFiles.TargetPath = QWRtaW5Ib21lLnJhem9y
build_metadata.AdditionalFiles.CssScope = 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/ArchiveManagement.razor] [C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/ArchiveManagement.razor]
build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZU1hbmFnZW1lbnQucmF6b3I= build_metadata.AdditionalFiles.TargetPath = QXJjaGl2ZU1hbmFnZW1lbnQucmF6b3I=
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/Categories/CategoriesListComponent.razor] [C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/BlogPostsTablePage.razor]
build_metadata.AdditionalFiles.TargetPath = Q2F0ZWdvcmllc1xDYXRlZ29yaWVzTGlzdENvbXBvbmVudC5yYXpvcg== build_metadata.AdditionalFiles.TargetPath = QmxvZ1Bvc3RzVGFibGVQYWdlLnJhem9y
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 = build_metadata.AdditionalFiles.CssScope =
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/HomePageEditor.razor] [C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/HomePageEditor.razor]
@@ -82,3 +46,7 @@ build_metadata.AdditionalFiles.CssScope =
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/SearchPageSettings.razor] [C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/SearchPageSettings.razor]
build_metadata.AdditionalFiles.TargetPath = U2VhcmNoUGFnZVNldHRpbmdzLnJhem9y build_metadata.AdditionalFiles.TargetPath = U2VhcmNoUGFnZVNldHRpbmdzLnJhem9y
build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.CssScope =
[C:/Users/vtall/source/repos/vtallen/Open-Archival/OpenArchival.Blazor.AdminPages/Areas/MyFeature/Pages/Page1.cshtml]
build_metadata.AdditionalFiles.TargetPath = QXJlYXNcTXlGZWF0dXJlXFBhZ2VzXFBhZ2UxLmNzaHRtbA==
build_metadata.AdditionalFiles.CssScope =

View File

@@ -1 +1 @@
cd77d473066694d90adbd3c207c6e29431a22a5d905d0b01001e9e6c37ed7282 8579fc445bbc22ef76c681f616873728ea28622341fe31bcbf18de7d0deb14c1

View File

@@ -4,24 +4,46 @@ C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages
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.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.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.CustomComponents.staticwebassets.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.FileViewer.staticwebassets.runtime.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.FileViewer.staticwebassets.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArtifactGroupingDisplay.staticwebassets.runtime.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArtifactGroupingDisplay.staticwebassets.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArchiveSearch.staticwebassets.runtime.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArchiveSearch.staticwebassets.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.Shared.staticwebassets.runtime.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.Shared.staticwebassets.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Blog.staticwebassets.runtime.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Blog.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.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.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.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.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.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.AdminPages.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.Shared.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArchiveSearch.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArtifactGroupingDisplay.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Blog.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Config.dll C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Config.dll
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.Blazor.CustomComponents.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.FileViewer.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.DataAccess.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.AdminPages.Shared.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArchiveSearch.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Blog.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Config.pdb C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.Config.pdb
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.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\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.ArtifactGroupingDisplay.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\bin\Debug\net9.0\OpenArchival.Blazor.FileViewer.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\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\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.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.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.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.csproj.CoreCompileInputs.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.RazorAssemblyInfo.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\OpenArchival.Blazor.AdminPages.RazorAssemblyInfo.cs
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\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\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\rjsmrazor.dswa.cache.json
@@ -708,7 +730,7 @@ C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\21hnyluk87-jo45u8913j.gz C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\21hnyluk87-jo45u8913j.gz
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\pm14qrlwbb-tkxqvq0zjw.gz C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\pm14qrlwbb-tkxqvq0zjw.gz
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\vuc6jv94xw-tf5u2o3oxg.gz C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\vuc6jv94xw-tf5u2o3oxg.gz
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\t5y2tgc8np-a9ucq0wzsm.gz C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages\obj\Debug\net9.0\compressed\t5y2tgc8np-w2ijupf7qe.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
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.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.development.json

View File

@@ -1 +1 @@
{"documents":{"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/0e24ce207395fb1c32a87d10049c1d81dc4784fe/*"}} {"documents":{"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/b34449808fa29388ff6ca79b560f657d74738fdd/*"}}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"MRiB4IDUD95tznQVFDSUB/ZRBiL0l7NqvypMyWisBKY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["yNASx2WVYnox7Rf0nRebIyEfzcxIHDp/Pb47b3qclZk=","5i4uB6FXFTMSwuITJArdIE4L1BFP0XwqpjmTIerviVM=","N4NvN2nZR/kOB4KK4/SyeGaNDwhoZplbvxum1\u002BUkgPI=","4GEmwvUAYPnwuwfQ7Kgd0bTvShxDlKFJCvNWYf/2m8Y=","gWjtd7QMqmKugLcjoA\u002Bz7uTk/kPdK0OzWgPxibM4Q80=","q5\u002BBQ0cq6yYjQt7fjTb0P66tO5bxjIqGHFBjOiPuszQ=","lao90sMVLCx33PwCNC6c7eEpsWPlbqDw7v4MrMzvC8c=","fS8D7hjkphJRf6C\u002Bm/Qnypds9mEqiMfsUqX6crY95Cg=","cF3g8FswId5g9A1UyRGfJgcpgxL4XwcQUsisKXtrqjw=","LTKqIVmh6nq1MbEhySE0uxyFyWff9WrU1ON1M\u002BHeHU8=","sJjcvxwurmrqwAU/4zgO4hND3LvV36eZllxUbJFEZq4=","y1UjlmRucY2a7SZOaTcGmX43sccL/D64K/06s2Lir1U=","S2UnhitwgLXL4NKKJv8zqoaNXqB2nMFTAVHkB/UeLhk=","MDaymOOBTf9aIEzQEvxamD7RXb4UCN/BaiI/tZTy\u002BFc=","viW3wF06mFdTO24KOFsfjpjmAHhCve7VMomZdzTnw24="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"MRiB4IDUD95tznQVFDSUB/ZRBiL0l7NqvypMyWisBKY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["hdkbLfBW80O6V8mRPDKVS4GxQBJ5Yq0//0f//uD6hCk=","ckfKiN/UexJCvNpv0IgeNIJ6YAGvgCi3MC1sfmYkoN0=","pbSNtMQDhFMOMtwKLca6IMii/j8hkhz/CWdMueUvqio=","GAOQQkPakdbiy9rSer1zfDSSyrRdi0aIzirRUblnpoU=","fIF/NHmkDZl/7KNBYJnkVWBYCllBDN72oTSxX0ge2yU=","NditJ\u002BqRyztCABpJJTUoV1KZMCGC3kRDrcfYTbZHb5g=","Yexa2RDYJdaq6TJVMfDtPNPpPgBmMC9np3fo6eRlcD4="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"pFI6wgQWnM801WhA+kBqb87aAQ1SYD4hIz9ddwGuTRY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["yNASx2WVYnox7Rf0nRebIyEfzcxIHDp/Pb47b3qclZk=","5i4uB6FXFTMSwuITJArdIE4L1BFP0XwqpjmTIerviVM=","N4NvN2nZR/kOB4KK4/SyeGaNDwhoZplbvxum1\u002BUkgPI=","4GEmwvUAYPnwuwfQ7Kgd0bTvShxDlKFJCvNWYf/2m8Y=","gWjtd7QMqmKugLcjoA\u002Bz7uTk/kPdK0OzWgPxibM4Q80=","q5\u002BBQ0cq6yYjQt7fjTb0P66tO5bxjIqGHFBjOiPuszQ=","lao90sMVLCx33PwCNC6c7eEpsWPlbqDw7v4MrMzvC8c=","fS8D7hjkphJRf6C\u002Bm/Qnypds9mEqiMfsUqX6crY95Cg=","cF3g8FswId5g9A1UyRGfJgcpgxL4XwcQUsisKXtrqjw=","LTKqIVmh6nq1MbEhySE0uxyFyWff9WrU1ON1M\u002BHeHU8=","sJjcvxwurmrqwAU/4zgO4hND3LvV36eZllxUbJFEZq4=","y1UjlmRucY2a7SZOaTcGmX43sccL/D64K/06s2Lir1U=","S2UnhitwgLXL4NKKJv8zqoaNXqB2nMFTAVHkB/UeLhk=","MDaymOOBTf9aIEzQEvxamD7RXb4UCN/BaiI/tZTy\u002BFc=","viW3wF06mFdTO24KOFsfjpjmAHhCve7VMomZdzTnw24="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"pFI6wgQWnM801WhA+kBqb87aAQ1SYD4hIz9ddwGuTRY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["hdkbLfBW80O6V8mRPDKVS4GxQBJ5Yq0//0f//uD6hCk=","ckfKiN/UexJCvNpv0IgeNIJ6YAGvgCi3MC1sfmYkoN0=","pbSNtMQDhFMOMtwKLca6IMii/j8hkhz/CWdMueUvqio=","GAOQQkPakdbiy9rSer1zfDSSyrRdi0aIzirRUblnpoU=","fIF/NHmkDZl/7KNBYJnkVWBYCllBDN72oTSxX0ge2yU=","NditJ\u002BqRyztCABpJJTUoV1KZMCGC3kRDrcfYTbZHb5g=","Yexa2RDYJdaq6TJVMfDtPNPpPgBmMC9np3fo6eRlcD4="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"zNJXz5rQrCxSXKP7vOgOdkHaQH0t0RaJ9A6BsbVWhRo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["5FYHdDpB/w9zgB42aIZXYNd5GUAQ2FtE1I/WTu04vIs=","TdaDWuRc1qjNpNDXZXgdepjK99ZMLKNb1l6c7haV0Es=","VT/GaZ7Ab\u002BNpRK9L5cmjsK80YbIYszAeLOk49kSkUaQ=","MjbUDu7L2AHbMq8\u002BfIQ5o9R1tMT28TQhppM8Z0hH4Fw=","NJX1DoLCS76R8Ya2DcTwkSj46QhcH6070l9VbngqqvM=","4w9GIxrOkKjQzjCQuxA\u002BR\u002BJbZDNA\u002BSXSFDobAntsTSQ=","vH6ZV\u002BdjcRzsq5yMoti6BFVvUM8HoPPsA7rcKsMGGGg=","8hUS3woWS6spbIauTI/Y56WYgds/lARH5p2YNH0zZbc=","ptK5lsbMMAF0MyfmXnXU0QoC0HJxlfM9v6gLIoJTbOU=","uRurSxZAEKPpQhTAARkYymmooR4UmE\u002Bgv/DLtdyvYd0=","fQZMXudOPo1zhfhLFcNVfKnr2EUaUQuMoTsXBSpQgbU=","Vd0O9sdyyXroAIEWXKMP0l6ejQ31ESX7qvIwEqJlqQc=","JDq35wZFjR6BR0th1mOaInyWsHAwiS3cadTNqIXpQwM=","KIc4Xg9bLENyVevCGosxCAfl48\u002BTWy\u002BG2OgadQk2MFQ=","gzECo3WgQldP5aVzMEsxwgkYTlGFI648GTf7zELSwpg="],"CachedAssets":{},"CachedCopyCandidates":{}} {"GlobalPropertiesHash":"zNJXz5rQrCxSXKP7vOgOdkHaQH0t0RaJ9A6BsbVWhRo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["8rwJW2oJ1N6avlB8aPUwJUw5ecsbB\u002Be8EVy698wb3Wk=","aIKWbliFkXTwMrmbq5VXtD\u002B\u002BibXnYpkRoAI/R9zrVc8=","PRgC7yKZYWW1HSmLLx7mFFjTsfnsSKZiWTubGfwop08=","GSj14sBlTN30VbywZSk/fdP7tmoXRFedlx\u002BiXkmTFmg=","BdvWuioCvJaYr3ccQPGGBr00IS0hQq/qmdfSXAG7/6Y=","wNN\u002B5ItYUgNVeQzGO8qCQ2yGyy7T0rECqedhBQC8U\u002BY=","1WESorfAcDx3QVqwphw2p6ZA8trBMrcqaH1gD3hkPBs="],"CachedAssets":{},"CachedCopyCandidates":{}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
vbnlO0s+h2GHPLEX05mBMBFzd0NgcWtiZQ9ZxvkIhPg= zpfJB2FFQN9dfjA4njRPgIiyBlXQHGgSUN/OsW2WpLo=

File diff suppressed because one or more lines are too long

View File

@@ -1,104 +1,119 @@
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArtifactGroupingDisplay\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.FileViewer\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.AdminPages.Shared\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.ArchiveSearch\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.Blazor.Blog\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.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.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.Blazor.ArtifactGroupingDisplay\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.FileViewer\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
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
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
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
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
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
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
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
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
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
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
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

View File

@@ -4,6 +4,99 @@
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj": {} "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj": {}
}, },
"projects": { "projects": {
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj",
"projectName": "OpenArchival.Blazor.AdminPages.Shared",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\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.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj"
},
"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": {
"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.AdminPages\\OpenArchival.Blazor.AdminPages.csproj": { "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj": {
"version": "1.0.0", "version": "1.0.0",
"restore": { "restore": {
@@ -33,6 +126,15 @@
"net9.0": { "net9.0": {
"targetAlias": "net9.0", "targetAlias": "net9.0",
"projectReferences": { "projectReferences": {
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\OpenArchival.Blazor.Blog.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\OpenArchival.Blazor.Blog.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": { "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj" "projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj"
}, },
@@ -105,6 +207,269 @@
} }
} }
}, },
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj",
"projectName": "OpenArchival.Blazor.ArchiveSearch",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\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.ArtifactGroupingDisplay\\OpenArchival.Blazor.ArtifactGroupingDisplay.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArtifactGroupingDisplay\\OpenArchival.Blazor.ArtifactGroupingDisplay.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": {
"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.ArtifactGroupingDisplay\\OpenArchival.Blazor.ArtifactGroupingDisplay.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArtifactGroupingDisplay\\OpenArchival.Blazor.ArtifactGroupingDisplay.csproj",
"projectName": "OpenArchival.Blazor.ArtifactGroupingDisplay",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArtifactGroupingDisplay\\OpenArchival.Blazor.ArtifactGroupingDisplay.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArtifactGroupingDisplay\\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.Blazor.FileViewer\\OpenArchival.Blazor.FileViewer.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.FileViewer\\OpenArchival.Blazor.FileViewer.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, )"
},
"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.Blog\\OpenArchival.Blazor.Blog.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\OpenArchival.Blazor.Blog.csproj",
"projectName": "OpenArchival.Blazor.Blog",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\OpenArchival.Blazor.Blog.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\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.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj"
},
"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": {
"MudBlazor": {
"target": "Package",
"version": "[8.13.0, )"
},
"MudExRichTextEditor": {
"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.Config\\OpenArchival.Blazor.Config.csproj": { "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": {
"version": "1.0.0", "version": "1.0.0",
"restore": { "restore": {
@@ -196,6 +561,92 @@
"C:\\Program Files\\dotnet\\library-packs": {}, "C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {} "https://api.nuget.org/v3/index.json": {}
}, },
"frameworks": {
"net9.0": {
"targetAlias": "net9.0",
"projectReferences": {
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.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, )"
},
"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.FileViewer\\OpenArchival.Blazor.FileViewer.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.FileViewer\\OpenArchival.Blazor.FileViewer.csproj",
"projectName": "OpenArchival.Blazor.FileViewer",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.FileViewer\\OpenArchival.Blazor.FileViewer.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.FileViewer\\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": { "frameworks": {
"net9.0": { "net9.0": {
"targetAlias": "net9.0", "targetAlias": "net9.0",

View File

@@ -1584,6 +1584,86 @@
"lib/net9.0/ZstdSharp.dll": {} "lib/net9.0/ZstdSharp.dll": {}
} }
}, },
"OpenArchival.Blazor.AdminPages.Shared/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"Microsoft.IdentityModel.Abstractions": "8.14.0",
"Microsoft.IdentityModel.Tokens": "8.14.0",
"MudBlazor": "8.13.0",
"OpenArchival.Blazor.ArchiveSearch": "1.0.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"compile": {
"bin/placeholder/OpenArchival.Blazor.AdminPages.Shared.dll": {}
},
"runtime": {
"bin/placeholder/OpenArchival.Blazor.AdminPages.Shared.dll": {}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
]
},
"OpenArchival.Blazor.ArchiveSearch/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"MudBlazor": "8.13.0",
"OpenArchival.Blazor.ArtifactGroupingDisplay": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"compile": {
"bin/placeholder/OpenArchival.Blazor.ArchiveSearch.dll": {}
},
"runtime": {
"bin/placeholder/OpenArchival.Blazor.ArchiveSearch.dll": {}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
]
},
"OpenArchival.Blazor.ArtifactGroupingDisplay/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.Blazor.FileViewer": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"compile": {
"bin/placeholder/OpenArchival.Blazor.ArtifactGroupingDisplay.dll": {}
},
"runtime": {
"bin/placeholder/OpenArchival.Blazor.ArtifactGroupingDisplay.dll": {}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
]
},
"OpenArchival.Blazor.Blog/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"MudBlazor": "8.13.0",
"MudExRichTextEditor": "8.13.0",
"OpenArchival.Blazor.AdminPages.Shared": "1.0.0",
"OpenArchival.Blazor.Config": "1.0.0",
"OpenArchival.Blazor.CustomComponents": "1.0.0",
"OpenArchival.DataAccess": "1.0.0"
},
"compile": {
"bin/placeholder/OpenArchival.Blazor.Blog.dll": {}
},
"runtime": {
"bin/placeholder/OpenArchival.Blazor.Blog.dll": {}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
]
},
"OpenArchival.Blazor.Config/1.0.0": { "OpenArchival.Blazor.Config/1.0.0": {
"type": "project", "type": "project",
"framework": ".NETCoreApp,Version=v9.0", "framework": ".NETCoreApp,Version=v9.0",
@@ -1600,6 +1680,7 @@
"dependencies": { "dependencies": {
"CodeBeam.MudExtensions": "6.3.0", "CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0", "MudBlazor": "8.13.0",
"OpenArchival.Blazor.Config": "1.0.0",
"OpenArchival.DataAccess": "1.0.0" "OpenArchival.DataAccess": "1.0.0"
}, },
"compile": { "compile": {
@@ -1612,6 +1693,24 @@
"Microsoft.AspNetCore.App" "Microsoft.AspNetCore.App"
] ]
}, },
"OpenArchival.Blazor.FileViewer/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0",
"OpenArchival.DataAccess": "1.0.0"
},
"compile": {
"bin/placeholder/OpenArchival.Blazor.FileViewer.dll": {}
},
"runtime": {
"bin/placeholder/OpenArchival.Blazor.FileViewer.dll": {}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
]
},
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"type": "project", "type": "project",
"framework": ".NETCoreApp,Version=v9.0", "framework": ".NETCoreApp,Version=v9.0",
@@ -4980,6 +5079,26 @@
"zstdsharp.port.nuspec" "zstdsharp.port.nuspec"
] ]
}, },
"OpenArchival.Blazor.AdminPages.Shared/1.0.0": {
"type": "project",
"path": "../OpenArchival.Blazor.AdminPages.Shared/OpenArchival.Blazor.AdminPages.Shared.csproj",
"msbuildProject": "../OpenArchival.Blazor.AdminPages.Shared/OpenArchival.Blazor.AdminPages.Shared.csproj"
},
"OpenArchival.Blazor.ArchiveSearch/1.0.0": {
"type": "project",
"path": "../OpenArchival.Blazor.ArchiveSearch/OpenArchival.Blazor.ArchiveSearch.csproj",
"msbuildProject": "../OpenArchival.Blazor.ArchiveSearch/OpenArchival.Blazor.ArchiveSearch.csproj"
},
"OpenArchival.Blazor.ArtifactGroupingDisplay/1.0.0": {
"type": "project",
"path": "../OpenArchival.Blazor.ArtifactGroupingDisplay/OpenArchival.Blazor.ArtifactGroupingDisplay.csproj",
"msbuildProject": "../OpenArchival.Blazor.ArtifactGroupingDisplay/OpenArchival.Blazor.ArtifactGroupingDisplay.csproj"
},
"OpenArchival.Blazor.Blog/1.0.0": {
"type": "project",
"path": "../OpenArchival.Blazor.Blog/OpenArchival.Blazor.Blog.csproj",
"msbuildProject": "../OpenArchival.Blazor.Blog/OpenArchival.Blazor.Blog.csproj"
},
"OpenArchival.Blazor.Config/1.0.0": { "OpenArchival.Blazor.Config/1.0.0": {
"type": "project", "type": "project",
"path": "../OpenArchival.Blazor.Config/OpenArchival.Blazor.Config.csproj", "path": "../OpenArchival.Blazor.Config/OpenArchival.Blazor.Config.csproj",
@@ -4990,6 +5109,11 @@
"path": "../OpenArchival.Blazor.CustomComponents/OpenArchival.Blazor.CustomComponents.csproj", "path": "../OpenArchival.Blazor.CustomComponents/OpenArchival.Blazor.CustomComponents.csproj",
"msbuildProject": "../OpenArchival.Blazor.CustomComponents/OpenArchival.Blazor.CustomComponents.csproj" "msbuildProject": "../OpenArchival.Blazor.CustomComponents/OpenArchival.Blazor.CustomComponents.csproj"
}, },
"OpenArchival.Blazor.FileViewer/1.0.0": {
"type": "project",
"path": "../OpenArchival.Blazor.FileViewer/OpenArchival.Blazor.FileViewer.csproj",
"msbuildProject": "../OpenArchival.Blazor.FileViewer/OpenArchival.Blazor.FileViewer.csproj"
},
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"type": "project", "type": "project",
"path": "../OpenArchival.DataAccess/OpenArchival.DataAccess.csproj", "path": "../OpenArchival.DataAccess/OpenArchival.DataAccess.csproj",
@@ -5003,6 +5127,9 @@
"Microsoft.IdentityModel.Tokens >= 8.14.0", "Microsoft.IdentityModel.Tokens >= 8.14.0",
"MudBlazor >= 8.13.0", "MudBlazor >= 8.13.0",
"MudExRichTextEditor >= 8.13.0", "MudExRichTextEditor >= 8.13.0",
"OpenArchival.Blazor.AdminPages.Shared >= 1.0.0",
"OpenArchival.Blazor.ArchiveSearch >= 1.0.0",
"OpenArchival.Blazor.Blog >= 1.0.0",
"OpenArchival.Blazor.Config >= 1.0.0", "OpenArchival.Blazor.Config >= 1.0.0",
"OpenArchival.Blazor.CustomComponents >= 1.0.0", "OpenArchival.Blazor.CustomComponents >= 1.0.0",
"OpenArchival.DataAccess >= 1.0.0" "OpenArchival.DataAccess >= 1.0.0"
@@ -5041,6 +5168,15 @@
"net9.0": { "net9.0": {
"targetAlias": "net9.0", "targetAlias": "net9.0",
"projectReferences": { "projectReferences": {
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages.Shared\\OpenArchival.Blazor.AdminPages.Shared.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.ArchiveSearch\\OpenArchival.Blazor.ArchiveSearch.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\OpenArchival.Blazor.Blog.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Blog\\OpenArchival.Blazor.Blog.csproj"
},
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": { "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj": {
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj" "projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.Config\\OpenArchival.Blazor.Config.csproj"
}, },

View File

@@ -1,6 +1,6 @@
{ {
"version": 2, "version": 2,
"dgSpecHash": "p8NDI2KjxEY=", "dgSpecHash": "h4IBbjhZjtg=",
"success": true, "success": true,
"projectFilePath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj", "projectFilePath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.Blazor.AdminPages\\OpenArchival.Blazor.AdminPages.csproj",
"expectedPackageFiles": [ "expectedPackageFiles": [

View File

@@ -0,0 +1,56 @@
@using MudBlazor
@namespace OpenArchival.Blazor.ArchiveSearch
<Microsoft.AspNetCore.Components.Forms.EditForm Model="this" OnSubmit="OnSubmit">
<MudTextField FullWidth="true"
AutoFocus="string.IsNullOrEmpty(SearchTerms)"
Placeholder="Search"
T="string"
Variant="Variant.Outlined"
Adornment="Adornment.Start"
AdornmentIcon="@Icons.Material.Filled.Search"
Class="mt-5"
@bind-Value="SearchTerms"
/>
<MudExpansionPanel Text="Filter...">
<MudText Typo="Typo.caption">Choose which data the serach bar will search on:</MudText>
<MudDivider></MudDivider>
<MudRadioGroup T="ArchiveSearchFilterType" @bind-SelectedOption="SelectedFilter">
<MudRadio Option="ArchiveSearchFilterType.All" T="ArchiveSearchFilterType">All</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.Tags" T="ArchiveSearchFilterType">Tags</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.Defects" T="ArchiveSearchFilterType">Defects</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.ListedNames" T="ArchiveSearchFilterType">Listed Names</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.Title" T="ArchiveSearchFilterType">Title</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.Description" T="ArchiveSearchFilterType">Description</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.Filenames" T="ArchiveSearchFilterType">Filenames</MudRadio>
<MudRadio Option="ArchiveSearchFilterType.ArtifactTranscriptions" T="ArchiveSearchFilterType">Artifact Transcriptions</MudRadio>
</MudRadioGroup>
</MudExpansionPanel>
</Microsoft.AspNetCore.Components.Forms.EditForm>
@code {
[Parameter]
public string SearchTerms { get; set; } = "";
[Parameter]
public EventCallback<string> SearchTermsChanged { get; set; }
[Parameter]
public ArchiveSearchFilterType SelectedFilter { get; set; } = ArchiveSearchFilterType.All;
[Parameter]
public EventCallback<ArchiveSearchFilterType> SelectedFilterChanged { get; set; }
private async Task HandleSearchKeyDown(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs args)
{
if (args.Key == "Enter")
{
await SearchTermsChanged.InvokeAsync(SearchTerms);
}
}
private async Task OnSubmit(Microsoft.AspNetCore.Components.Forms.EditContext args)
{
await SearchTermsChanged.InvokeAsync(SearchTerms);
}
}

View File

@@ -0,0 +1,13 @@
@page
@model OpenArchival.Blazor.ArchiveSearch.MyFeature.Pages.Page1Model
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Page1</title>
</head>
<body>
</body>
</html>

View File

@@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OpenArchival.Blazor.ArchiveSearch.MyFeature.Pages;
public class Page1Model : PageModel
{
public void OnGet()
{
}
}

View File

@@ -0,0 +1,132 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.Extensions.Logging;
using MudBlazor;
using Npgsql.EntityFrameworkCore.PostgreSQL;
using NpgsqlTypes;
using OpenArchival.DataAccess;
using OpenArchival.DataAccess;
using System;
using System.Collections.Generic;
using System.Drawing.Printing;
using System.Linq;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace OpenArchival.Blazor.ArchiveSearch;
public enum ArchiveSearchFilterType
{
All,
Tags,
Defects,
ListedNames,
Title,
Description,
Filenames,
ArtifactTranscriptions
}
public class ArtifactGroupingSearch
{
public int TotalResults { get; set; }
public int TotalPages { get; set; }
public int PageSize { get; set; } = 20;
public int CurrentPage { get; set; }
public List<ArtifactGrouping> SearchResults { get; set; } = [];
private string _searchTerms { get; set; }
private IDbContextFactory<ApplicationDbContext> _contextFactory { get; set; }
private Expression<Func<ArtifactGrouping, bool>> _currentFilterPredicate;
private ArchiveSearchFilterType _selectedFilter = ArchiveSearchFilterType.All;
public ArtifactGroupingSearch(IDbContextFactory<ApplicationDbContext> contextFactory)
{
_contextFactory = contextFactory;
}
public async Task Search(string Terms, ArchiveSearchFilterType filter, int page = 1)
{
_searchTerms = Terms;
_selectedFilter = filter;
// Determine which filter expression to use based on the radio button selection
switch (_selectedFilter)
{
case ArchiveSearchFilterType.Tags:
_currentFilterPredicate = x => x.TagsSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.Title:
_currentFilterPredicate = x => x.TitleSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.Description:
_currentFilterPredicate = x => x.DescriptionSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.Defects:
_currentFilterPredicate = x => x.DefectsSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.Filenames:
_currentFilterPredicate = x => x.FilenamesSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.ArtifactTranscriptions:
_currentFilterPredicate = x => x.FileContentSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.ListedNames:
_currentFilterPredicate = x => x.ListedNamesSearchVector.Matches(_searchTerms);
break;
case ArchiveSearchFilterType.All:
default:
_currentFilterPredicate = x => x.AllSearchVector.Matches(_searchTerms);
break;
}
// Get the total count using the chosen filter
await using var context = await _contextFactory.CreateDbContextAsync();
TotalResults = await context.ArtifactGroupings.Where(_currentFilterPredicate).CountAsync();
TotalPages = (int)Math.Ceiling(TotalResults / (double)PageSize);
// Load the first page with the chosen filter
await LoadPageAsync(page);
}
public async Task LoadPageAsync(int page)
{
CurrentPage = page;
if (_currentFilterPredicate == null) // Don't run if no search has been performed
{
return;
}
await using var context = await _contextFactory.CreateDbContextAsync();
// The query uses the dynamically set filter predicate
SearchResults = await context.ArtifactGroupings
.Where(_currentFilterPredicate)
.Include(x => x.ChildArtifactEntries)
.ThenInclude(x => x.Files)
.Include(x=>x.Category)
.OrderBy(x => x.Id)
.Skip((CurrentPage - 1) * PageSize)
.Take(PageSize)
.ToListAsync();
}
public void ClearResults()
{
SearchResults.Clear();
TotalResults = 0;
TotalPages = 0;
}
}

View File

@@ -12,33 +12,12 @@
@using System.Linq.Expressions @using System.Linq.Expressions
@using OpenArchival.Blazor.ArtifactGroupingDisplay @using OpenArchival.Blazor.ArtifactGroupingDisplay
@using OpenArchival.Blazor.ArchiveSearch
@* ^^^ Add this using statement to access your component and enum ^^^ *@
<MudAutocomplete FullWidth="true" <ArchiveSearchBar @bind-SelectedFilter="_selectedFilter"
AutoFocus="string.IsNullOrEmpty(SearchTerms)" SearchTermsChanged="OnSearchSubmittedAsync" />
Placeholder="Search"
T="string"
Variant="Variant.Outlined"
AdornmentIcon="@Icons.Material.Filled.Search"
Class="mt-5"
@bind-Text="@SearchTerms"
OnKeyDown="HandleSearchKeyDown" />
<MudExpansionPanel Text="Filter...">
<MudText Typo="Typo.caption"></MudText>
<MudDivider></MudDivider>
<MudRadioGroup T="SearchFilterType" @bind-SelectedOption="_selectedFilter">
<MudRadio Option="SearchFilterType.All" T="SearchFilterType">All</MudRadio>
<MudRadio Option="SearchFilterType.Tags" T="SearchFilterType">Tags</MudRadio>
<MudRadio Option="SearchFilterType.Defects" T="SearchFilterType">Defects</MudRadio>
<MudRadio Option="SearchFilterType.ListedNames" T="SearchFilterType">Listed Names</MudRadio>
<MudRadio Option="SearchFilterType.Title" T="SearchFilterType">Title</MudRadio>
<MudRadio Option="SearchFilterType.Description" T="SearchFilterType">Description</MudRadio>
<MudRadio Option="SearchFilterType.Filenames" T="SearchFilterType">Filenames</MudRadio>
<MudRadio Option="SearchFilterType.ArtifactTranscriptions" T="SearchFilterType">Artifact Transcriptions</MudRadio>
</MudRadioGroup>
</MudExpansionPanel>
@if (_totalResults > 0) @if (_totalResults > 0)
{ {
<MudGrid Justify="Justify.FlexStart" Class="mt-1 ml-1 mb-2"> <MudGrid Justify="Justify.FlexStart" Class="mt-1 ml-1 mb-2">
@@ -46,6 +25,7 @@
<MudButton Class="ml-1" StartIcon="@Icons.Material.Filled.Clear" OnClick="OnClearResults" Variant="Variant.Filled" Color="Color.Primary" Size="Size.Small">Clear</MudButton> <MudButton Class="ml-1" StartIcon="@Icons.Material.Filled.Clear" OnClick="OnClearResults" Variant="Variant.Filled" Color="Color.Primary" Size="Size.Small">Clear</MudButton>
</MudGrid> </MudGrid>
} }
@if (_artifactGroupings.Count > 0) @if (_artifactGroupings.Count > 0)
{ {
<MudGrid> <MudGrid>
@@ -58,7 +38,8 @@
</MudGrid> </MudGrid>
<MudPaper Class="d-flex justify-center py-2 mt-4" Elevation="0"> <MudPaper Class="d-flex justify-center py-2 mt-4" Elevation="0">
<MudPagination Count="_totalPages" Page="_currentPage" SelectedPageChanged="OnPageChangedAsync" /> @* === HERE IS THE FIX === *@
<MudPagination Count="_totalPages" Selected="_currentPage" SelectedChanged="OnPageChangedAsync" />
</MudPaper> </MudPaper>
} }
else else
@@ -73,22 +54,12 @@ else
@inject ILogger<SearchArchive> Logger; @inject ILogger<SearchArchive> Logger;
@inject NavigationManager NavigationManager; @inject NavigationManager NavigationManager;
@code { @code {
public enum SearchFilterType
{
All,
Tags,
Defects,
ListedNames,
Title,
Description,
Filenames,
ArtifactTranscriptions
}
[Parameter] [Parameter]
public string SearchTerms { get; set; } = ""; public string SearchTerms { get; set; } = "";
private SearchFilterType _selectedFilter = SearchFilterType.All; // This enum is now defined in your ArchiveSearchBar component/namespace
private ArchiveSearchFilterType _selectedFilter = ArchiveSearchFilterType.All;
private List<ArtifactGrouping> _artifactGroupings { get; set; } = []; private List<ArtifactGrouping> _artifactGroupings { get; set; } = [];
private int _currentPage { get; set; } = 1; private int _currentPage { get; set; } = 1;
private int _totalPages { get; set; } = 0; private int _totalPages { get; set; } = 0;
@@ -108,17 +79,22 @@ else
} }
await using var context = await ContextFactory.CreateDbContextAsync(); await using var context = await ContextFactory.CreateDbContextAsync();
_sliderEntries = await context.SearchPageSliderEntries.Include(e=>e.FilterTags).ToListAsync(); _sliderEntries = await context.SearchPageSliderEntries.Include(e => e.FilterTags).ToListAsync();
} }
private async Task HandleSearchKeyDown(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs args) /// <summary>
/// Called by the ArchiveSearchBar component's 'SearchTermsChanged' event.
/// </summary>
private async Task OnSearchSubmittedAsync(string searchTerms)
{ {
if (args.Key != "Enter" || string.IsNullOrWhiteSpace(SearchTerms)) if (string.IsNullOrWhiteSpace(searchTerms))
{ {
OnClearResults(null);
return; return;
} }
NavigationManager.NavigateTo($"/search/{SearchTerms}"); SearchTerms = searchTerms;
NavigationManager.NavigateTo($"/search/{Uri.EscapeDataString(SearchTerms)}", replace: true);
await PerformSearchAsync(); await PerformSearchAsync();
} }
@@ -127,31 +103,31 @@ else
/// </summary> /// </summary>
private async Task PerformSearchAsync() private async Task PerformSearchAsync()
{ {
// Determine which filter expression to use based on the radio button selection // Determine which filter expression to use
switch (_selectedFilter) switch (_selectedFilter)
{ {
case SearchFilterType.Tags: case ArchiveSearchFilterType.Tags:
_currentFilterPredicate = x => x.TagsSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.TagsSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.Title: case ArchiveSearchFilterType.Title:
_currentFilterPredicate = x => x.TitleSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.TitleSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.Description: case ArchiveSearchFilterType.Description:
_currentFilterPredicate = x => x.DescriptionSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.DescriptionSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.Defects: case ArchiveSearchFilterType.Defects:
_currentFilterPredicate = x => x.DefectsSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.DefectsSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.Filenames: case ArchiveSearchFilterType.Filenames:
_currentFilterPredicate = x => x.FilenamesSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.FilenamesSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.ArtifactTranscriptions: case ArchiveSearchFilterType.ArtifactTranscriptions:
_currentFilterPredicate = x => x.FileContentSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.FileContentSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.ListedNames: case ArchiveSearchFilterType.ListedNames:
_currentFilterPredicate = x => x.ListedNamesSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.ListedNamesSearchVector.Matches(SearchTerms);
break; break;
case SearchFilterType.All: case ArchiveSearchFilterType.All:
default: default:
_currentFilterPredicate = x => x.AllSearchVector.Matches(SearchTerms); _currentFilterPredicate = x => x.AllSearchVector.Matches(SearchTerms);
break; break;
@@ -197,10 +173,16 @@ else
StateHasChanged(); StateHasChanged();
} }
private void OnClearResults(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) private void OnClearResults(Microsoft.AspNetCore.Components.Web.MouseEventArgs args)
{ {
_totalResults = 0; _totalResults = 0;
_artifactGroupings.Clear(); _artifactGroupings.Clear();
_currentPage = 1;
_totalPages = 0;
SearchTerms = "";
NavigationManager.NavigateTo("/search", replace: true);
StateHasChanged(); StateHasChanged();
} }

View File

@@ -0,0 +1,13 @@
@page
@model OpenArchival.Blazor.ArtifactGroupingDisplay.MyFeature.Pages.Page1Model
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Page1</title>
</head>
<body>
</body>
</html>

View File

@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OpenArchival.Blazor.ArtifactGroupingDisplay.MyFeature.Pages
{
public class Page1Model : PageModel
{
public void OnGet()
{
}
}
}

View File

@@ -6,7 +6,8 @@
@page "/sr/{StringId}" @page "/sr/{StringId}"
<MudCard Style="@($"cursor: pointer; height: {Height}px; display: flex; flex-direction: column;")" onclick="@NavigateToArchive" > <MudLink Href="@($"/archive/{Id}")" Target="_blank" Style="text-decoration: none; color: inherit;">
<MudCard Style="@($"cursor: pointer; height: {Height}px; display: flex; flex-direction: column;")">
@if (_displayImageId >= 0) @if (_displayImageId >= 0)
{ {
<MudCardMedia Image="@($"/api/files/{_displayImageId}")" Height="150" /> <MudCardMedia Image="@($"/api/files/{_displayImageId}")" Height="150" />
@@ -19,7 +20,8 @@
<MudText Typo="Typo.body2">@ArtifactGrouping.Description</MudText> <MudText Typo="Typo.body2">@ArtifactGrouping.Description</MudText>
} }
</MudCardContent> </MudCardContent>
</MudCard> </MudCard>
</MudLink>
@inject IArtifactGroupingProvider GroupingProvider; @inject IArtifactGroupingProvider GroupingProvider;
@inject NavigationManager NavigationManager; @inject NavigationManager NavigationManager;
@code { @code {
@@ -71,18 +73,9 @@
{ {
_displayImageId = ArtifactGrouping.ChildArtifactEntries[0].Files[0].Id; _displayImageId = ArtifactGrouping.ChildArtifactEntries[0].Files[0].Id;
} }
Id = ArtifactGrouping.Id;
} }
StateHasChanged(); StateHasChanged();
} }
private async Task NavigateToArchive()
{
await Task.Delay(4);
if (ArtifactGrouping is not null)
{
NavigationManager.NavigateTo($"/archive/{ArtifactGrouping.Id}");
}
}
} }

View File

@@ -0,0 +1,6 @@
@namespace OpenArchival.Blazor.ArtifactGroupingDisplay
<h3>FileDisplayBase</h3>
@code {
}

View File

@@ -0,0 +1,37 @@
@using OpenArchival.DataAccess
@using MudBlazor
@if (File is not null)
{
<MudImage Fluid="true" Src="@File.Path" Alt="Swedish Farm House" Class="rounded-lg"/>
}
@code {
[Parameter]
public required FilePathListing File { get; set; }
/// <summary>
/// Sets the width of the image box while it loads
/// </summary>
[Parameter]
public int Width { get; set; } = 600;
/// <summary>
/// Sets the height of the image box while it loads
/// </summary>
[Parameter]
public int Height { get; set; } = 400;
[Parameter]
public string AltText { get; set; } = "";
protected override Task OnParametersSetAsync()
{
if (File is not null || !string.IsNullOrEmpty(AltText))
{
StateHasChanged();
}
return base.OnParametersSetAsync();
}
}

View File

@@ -0,0 +1,46 @@
using OpenArchival.Blazor.ArtifactGroupingDisplay;
using System.Collections.Generic;
using System.Collections.Specialized;
namespace OpenArchival.Blazor;
public class FileDisplayComponentFactory
{
private Dictionary<string, Type> _extensionToComponents { get; set; } = [];
public FileDisplayComponentFactory()
{
// Supported image file types taken from https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types
RegisterComponent<FileDisplayImage>(".apng");
RegisterComponent<FileDisplayImage>(".png");
RegisterComponent<FileDisplayImage>(".avif");
RegisterComponent<FileDisplayImage>(".gif");
RegisterComponent<FileDisplayImage>(".jpg");
RegisterComponent<FileDisplayImage>(".jpeg");
RegisterComponent<FileDisplayImage>(".jfif");
RegisterComponent<FileDisplayImage>(".pjpeg");
RegisterComponent<FileDisplayImage>(".pjg");
RegisterComponent<FileDisplayImage>(".png");
RegisterComponent<FileDisplayImage>(".svg");
RegisterComponent<FileDisplayImage>(".webp");
}
private string GetExtensionKey(string pathOrExtension)
{
return Path.GetExtension(pathOrExtension).ToUpperInvariant();
}
public bool RegisterComponent<ComponentType>(string filenameOrExtension) where ComponentType : IFileDisplayComponent
{
string extensionString = GetExtensionKey(filenameOrExtension);
_extensionToComponents.Add(extensionString, typeof(ComponentType));
return true;
}
public Type? GetDisplayComponentType(string filenameOrExtension) {
var result = _extensionToComponents.TryGetValue(GetExtensionKey(filenameOrExtension), out var component);
return (result) ? component : null;
}
}

View File

@@ -0,0 +1,10 @@
@using OpenArchival.DataAccess
@implements IFileDisplayComponent
<h3>FileDisplayImage</h3>
@code {
[Parameter]
public required FilePathListing FilePath { get; set; }
}

View File

@@ -0,0 +1,8 @@
using OpenArchival.DataAccess;
namespace OpenArchival.Blazor;
public interface IFileDisplayComponent
{
public FilePathListing FilePath { get; set; }
}

View File

@@ -0,0 +1,15 @@
@using MudBlazor
@page "/article-not-found"
@page "/article-not-found/{Message}"
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudText Typo="Typo.h1" Align="Align.Center">404: Article Not Found!</MudText>
@if (!string.IsNullOrEmpty(Message)) {
<MudText Typo="Typo.body1" Align="Align.Center">@Message</MudText>
}
</MudPaper>
@code {
[Parameter]
public string? Message { get; set; }
}

View File

@@ -1,20 +1,52 @@
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using Microsoft.EntityFrameworkCore @using Microsoft.EntityFrameworkCore
@using Microsoft.Extensions.Options
@using OpenArchival.Blazor.AdminPages @using OpenArchival.Blazor.AdminPages
@using OpenArchival.DataAccess @using OpenArchival.DataAccess
@using OpenArchival.Blazor.CustomComponents @using OpenArchival.Blazor.CustomComponents
@using MudExRichTextEditor @using MudExRichTextEditor
@using MudBlazor @using MudBlazor
@using System.Text @using System.Text
@using Microsoft.AspNetCore.Components.Forms;
@using OpenArchival.Blazor.Config
@using OpenArchival.Blazor.AdminPages.Shared;
@page "/admin/blogedit" @page "/admin/blogedit"
@page "/admin/blogedit/{Id}" @page "/admin/blogedit/{Id:int}"
@layout AdminPages.AdminControlPanelLayout; @layout AdminControlPanelLayout;
<MudText Typo="Typo.h6">Create a Blog Post</MudText> <MudText Typo="Typo.h6">Create a Blog Post</MudText>
<MudDivider></MudDivider> <MudDivider></MudDivider>
<MudTextField Placeholder="Title" T="string" @bind-Value=@BlogPostModel.Title></MudTextField> <MudTextField Placeholder="Title" T="string" @bind-Value=@BlogPostModel.Title></MudTextField>
<MudFileUpload T="IBrowserFile"
AppendMultipleFiles=false
Accept=".jpg,.png,.webp"
MaximumFileCount="1"
@bind-Files=_mainPhotoFile
Class="mt-4">
<ActivatorContent>
<MudButton Variant="Variant.Filled"
Color="Color.Primary">
Upload Main Photo
</MudButton>
</ActivatorContent>
<SelectedTemplate>
@if (context != null)
{
<MudText>@context.Name</MudText>
}
else if (BlogPostModel.MainPhoto != null)
{
<MudText>@BlogPostModel.MainPhoto.OriginalName</MudText>
}
else
{
<MudText>No Main Photo Selected</MudText>
}
</SelectedTemplate>
</MudFileUpload>
<MudExRichTextEdit @ref="@_contentEditor" <MudExRichTextEdit @ref="@_contentEditor"
ReadOnly="false" ReadOnly="false"
Height="444" Height="444"
@@ -25,21 +57,28 @@
@((MarkupString)BlogPostModel.Content) @((MarkupString)BlogPostModel.Content)
</MudExRichTextEdit> </MudExRichTextEdit>
<MudText Typo="Typo.h6">Add Tags</MudText>
<MudDivider />
<MudText Typo="Typo.caption" Color="Color.Primary">Press enter to add.</MudText>
<ChipContainer T="BlogPostTag" @ref="@_tagsChipContainer" @bind-Items="BlogPostModel.Tags"> <ChipContainer T="BlogPostTag" @ref="@_tagsChipContainer" @bind-Items="BlogPostModel.Tags">
<InputContent> <InputContent>
<MudAutocomplete T="string" <MudAutocomplete T="string"
Placeholder="Add Tags..." Placeholder="Add Tags..."
@bind-Text=_tagsInputValue @bind-Text=_tagsInputValue
OnKeyDown="HandleTagsEnter" OnKeyDown="HandleTagsEnter">
>
</MudAutocomplete> </MudAutocomplete>
</InputContent> </InputContent>
</ChipContainer> </ChipContainer>
<MudText Typo="Typo.h6" Class="mt-4">Link Artifact Groupings</MudText>
<MudDivider />
<MudText Typo="Typo.caption" Color="Color.Primary">Select Artifact Groupings to Associate with this post.</MudText>
<ArchiveGroupingsTable @ref=_artifactGroupingTable></ArchiveGroupingsTable>
<MudGrid Justify="Justify.FlexEnd" Class="mr-4 pt-8"> <MudGrid Justify="Justify.FlexEnd" Class="mr-4 pt-8">
<MudButton StartIcon="@Icons.Material.Filled.Publish" Color=Color.Primary Variant=Variant.Filled OnClick="OnPublishBlogPost">Publish</MudButton> <MudButton StartIcon="@Icons.Material.Filled.Publish" Color=Color.Primary Variant=Variant.Filled OnClick="OnPublishBlogPost">Publish</MudButton>
</MudGrid> </MudGrid>
@inject IOptions<FileUploadOptions> FileOptions;
@inject IDbContextFactory<ApplicationDbContext> ContextFactory; @inject IDbContextFactory<ApplicationDbContext> ContextFactory;
@inject ISnackbar Snackbar; @inject ISnackbar Snackbar;
@inject NavigationManager NavigationManager; @inject NavigationManager NavigationManager;
@@ -57,13 +96,23 @@
private string _tagsInputValue = ""; private string _tagsInputValue = "";
private ChipContainer<BlogPostTag> _tagsChipContainer = default!; private ChipContainer<BlogPostTag> _tagsChipContainer = default!;
private ArchiveGroupingsTable _artifactGroupingTable = default!;
private IBrowserFile? _mainPhotoFile;
protected override void OnParametersSet() protected override void OnParametersSet()
{ {
if (Id != 0) if (Id != 0)
{ {
using var context = ContextFactory.CreateDbContext(); using var context = ContextFactory.CreateDbContext();
BlogPost? existingPost = context.BlogPosts.Include(p => p.Tags).Where(p => p.Id == Id).FirstOrDefault(); BlogPost? existingPost = context.BlogPosts
.Include(p => p.Tags)
.Include(p=>p.ArtifactGroupings)
.ThenInclude(g=>g.Category)
.Include(p=>p.MainPhoto)
.Where(p => p.Id == Id)
.FirstOrDefault();
if (existingPost is null) if (existingPost is null)
{ {
@@ -76,6 +125,28 @@
base.OnParametersSet(); base.OnParametersSet();
} }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
// We only want to run this logic ONCE, on the very first render.
if (firstRender)
{
// Check if we are in "edit" mode (Id != 0) and the loaded post
// actually has any groupings to select.
if (Id != 0 && BlogPostModel.ArtifactGroupings.Any())
{
// Now it is safe to call the method because _artifactGroupingTable
// has been rendered and is no longer null.
await _artifactGroupingTable.SetSelectedItemsAsync(BlogPostModel.ArtifactGroupings);
// We call StateHasChanged() to ensure the UI updates
// with the selection state we just pushed to the child.
StateHasChanged();
}
}
await base.OnAfterRenderAsync(firstRender);
}
private async Task DeDuplicatePostTags(BlogPost post, ApplicationDbContext context) private async Task DeDuplicatePostTags(BlogPost post, ApplicationDbContext context)
{ {
List<BlogPostTag> finalTags = []; List<BlogPostTag> finalTags = [];
@@ -116,53 +187,110 @@
private async Task OnPublishBlogPost(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) private async Task OnPublishBlogPost(Microsoft.AspNetCore.Components.Web.MouseEventArgs args)
{ {
if (string.IsNullOrEmpty(BlogPostModel.Content)) // ... (content and title checks) ...
{
Snackbar.Add("Content is required in the blog post, write something.", Severity.Warning);
return;
}
if (string.IsNullOrEmpty(BlogPostModel.Title))
{
Snackbar.Add("A post title is required", Severity.Warning);
return;
}
await using var context = await ContextFactory.CreateDbContextAsync(); await using var context = await ContextFactory.CreateDbContextAsync();
BlogPostModel.ModifiedTime = DateTime.UtcNow;
// Blog post does not exist in database bool isCreatingNewPost = BlogPostModel.Id == 0;
if (BlogPostModel.Id == 0) FilePathListing? newPhoto = null; // Will hold the new photo entity, if one is uploaded
FilePathListing? oldPhotoToDelete = null; // Will hold the old photo entity for deletion
// --- 1. Handle New Photo Upload ---
if (_mainPhotoFile is not null)
{
// A new file was uploaded.
try
{
var diskFileName = $"{Guid.NewGuid()}{Path.GetExtension(_mainPhotoFile.Name)}";
var destinationPath = Path.Combine(FileOptions.Value.UploadFolderPath, diskFileName);
await using var browserUploadStream = _mainPhotoFile.OpenReadStream(maxAllowedSize: FileOptions.Value.MaxUploadSizeBytes);
await using var outFileStream = new FileStream(destinationPath, FileMode.Create);
await browserUploadStream.CopyToAsync(outFileStream);
// Create the new entity
newPhoto = new FilePathListing() { Path = destinationPath, OriginalName = Path.GetFileName(_mainPhotoFile.Name) };
// Add it to the context so it's tracked
context.ArtifactFilePaths.Add(newPhoto);
// We update the model's reference just in case
BlogPostModel.MainPhoto = newPhoto;
Snackbar.Add($"Uploaded {_mainPhotoFile.Name}", Severity.Success);
}
catch (Exception ex)
{
Snackbar.Add($"Error uploading file {_mainPhotoFile.Name}: {ex.Message}", Severity.Error);
return;
}
}
else if (isCreatingNewPost)
{
// Case: Creating a new post, but no file was provided. This is an error.
Snackbar.Add("A main photo is required", Severity.Warning);
return;
}
// --- 2. Database Save Logic ---
BlogPostModel.ModifiedTime = DateTime.UtcNow;
BlogPostModel.ArtifactGroupings = await _artifactGroupingTable.SelectedItems();
foreach (ArtifactGrouping grouping in BlogPostModel.ArtifactGroupings)
{
// This tells EF "this object already exists in the database."
// It will attach it in an "Unchanged" state without
// causing conflicts with its related entities.
context.Entry(grouping).State = EntityState.Unchanged;
}
if (isCreatingNewPost)
{ {
BlogPostModel.CreationTime = DateTime.UtcNow; BlogPostModel.CreationTime = DateTime.UtcNow;
// Loop through the tags and de-duplicate any of them
await DeDuplicatePostTags(BlogPostModel, context); await DeDuplicatePostTags(BlogPostModel, context);
BuildBlogSearchIndex(BlogPostModel); BuildBlogSearchIndex(BlogPostModel);
// Assign the new (and tracked) photo to the new post
BlogPostModel.MainPhoto = newPhoto!;
context.BlogPosts.Add(BlogPostModel); context.BlogPosts.Add(BlogPostModel);
} }
else else
{ {
// Blog post exists in database // --- 3. Update Existing Post ---
BlogPost? existing = await context.BlogPosts
.Include(p => p.Tags)
.Include(p => p.MainPhoto) // Load the existing photo
.Include(p=>p.ArtifactGroupings)
.FirstOrDefaultAsync(p => p.Id == BlogPostModel.Id);
// Find the existing post so we can update it
BlogPost? existing = await context.BlogPosts.Include(p=>p.Tags).FirstOrDefaultAsync(p => p.Id == BlogPostModel.Id);
if (existing is null) if (existing is null)
{ {
Snackbar.Add($"Unable to find a post with id {BlogPostModel.Id} in the database, cannot update post!", Severity.Error); Snackbar.Add($"Unable to find a post with id {BlogPostModel.Id} in the database, cannot update post!", Severity.Error);
return; return;
} }
// De-duplicate tags
await DeDuplicatePostTags(BlogPostModel, context); await DeDuplicatePostTags(BlogPostModel, context);
// Copy over the values we want
existing.Title = BlogPostModel.Title; existing.Title = BlogPostModel.Title;
existing.Content = BlogPostModel.Content; existing.Content = BlogPostModel.Content;
existing.ModifiedTime = BlogPostModel.ModifiedTime; existing.ModifiedTime = BlogPostModel.ModifiedTime;
existing.ArtifactGroupings = BlogPostModel.ArtifactGroupings;
// --- 4. Handle Photo Swap (THIS IS THE FIX) ---
if (newPhoto is not null)
{
// A new photo was uploaded.
// Save the *tracked* old photo for deletion later.
if (existing.MainPhoto is not null)
{
oldPhotoToDelete = existing.MainPhoto;
}
// Assign the *new, tracked* photo.
existing.MainPhoto = newPhoto;
}
// If newPhoto is null, we do nothing. existing.MainPhoto remains unchanged.
// This avoids the tracking conflict.
existing.Tags.Clear(); existing.Tags.Clear();
foreach (var tag in BlogPostModel.Tags) foreach (var tag in BlogPostModel.Tags)
@@ -173,14 +301,42 @@
BuildBlogSearchIndex(existing); BuildBlogSearchIndex(existing);
} }
// --- 5. Save Primary Changes ---
await context.SaveChangesAsync(); await context.SaveChangesAsync();
// --- 6. Old File Cleanup ---
if (oldPhotoToDelete is not null)
{
// Now that the DB save is successful, delete the old file
try
{
if (File.Exists(oldPhotoToDelete.Path))
{
File.Delete(oldPhotoToDelete.Path);
}
// And remove its record (which is tracked) from the database
context.ArtifactFilePaths.Remove(oldPhotoToDelete);
await context.SaveChangesAsync();
}
catch (Exception ex)
{
Snackbar.Add($"Error deleting old photo: {ex.Message}", Severity.Error);
}
}
Snackbar.Add("Changes saved!", Severity.Success); Snackbar.Add("Changes saved!", Severity.Success);
// Reset the model // --- 7. Reset Page ---
BlogPostModel = new(); BlogPostModel = new();
_mainPhotoFile = null;
// We can't navigate yet, we need to clear the groupings
await _artifactGroupingTable.SetSelectedItemsAsync(new List<ArtifactGrouping>());
StateHasChanged(); StateHasChanged();
NavigationManager.NavigateTo($"/admin/blogstable");
} }
public void HandleTagsEnter(KeyboardEventArgs args) public void HandleTagsEnter(KeyboardEventArgs args)
@@ -195,4 +351,5 @@
StateHasChanged(); StateHasChanged();
} }
} }
} }

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenArchival.Blazor;
public class BlogPostRowElement
{
public int Id { get; set; }
public string Title { get; set; } = "";
public DateTime CreationTime { get; set; }
public DateTime ModifiedTime { get; set; }
public override bool Equals(object? obj)
{
return obj is BlogPostRowElement other && this.Id == other.Id;
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}

View File

@@ -0,0 +1,139 @@
/*
“Commons Clause” License Condition v1.0
https://commonsclause.com/
The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition.
Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software.
For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice.
Software: Open Archival
License: GNU GPL: https://www.gnu.org/licenses/gpl-3.0.en.html
Licensor: Vincent Allen
*/
namespace OpenArchival.Blazor;
using global::OpenArchival.DataAccess;
using Microsoft.EntityFrameworkCore;
using MudBlazor;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
public enum BlogSearchFilterType
{
All,
Title,
Content,
Tags,
}
public class BlogPostSearch
{
public int TotalResults { get; set; }
public int TotalPages { get; set; }
public int PageSize { get; set; } = 20;
public int CurrentPage { get; set; } = 1;
public List<BlogPost> SearchResults { get; set; } = [];
private string _searchTerms { get; set; }
private IDbContextFactory<ApplicationDbContext> _contextFactory { get; set; }
private Expression<Func<BlogPost, bool>> _currentFilterPredicate;
private BlogSearchFilterType _selectedFilter = BlogSearchFilterType.All;
public BlogPostSearch(IDbContextFactory<ApplicationDbContext> contextFactory)
{
_contextFactory = contextFactory;
}
public async Task Search(string Terms, BlogSearchFilterType filter, int page = 1)
{
_searchTerms = Terms;
_selectedFilter = filter;
if (string.IsNullOrEmpty(_searchTerms))
{
await using var context = await _contextFactory.CreateDbContextAsync();
TotalResults = await context.BlogPosts.CountAsync();
;
TotalPages = (int)Math.Ceiling(TotalResults / (double)PageSize);
}
else
{
// Determine which filter expression to use based on the radio button selection
switch (_selectedFilter)
{
case BlogSearchFilterType.Tags:
_currentFilterPredicate = x => x.TagsSearchVector.Matches(_searchTerms);
break;
case BlogSearchFilterType.Title:
_currentFilterPredicate = x => x.TitleSearchVector.Matches(_searchTerms);
break;
case BlogSearchFilterType.Content:
_currentFilterPredicate = x => x.ContentSearchVector.Matches(_searchTerms);
break;
case BlogSearchFilterType.All:
default:
_currentFilterPredicate = x => x.AllSearchVector.Matches(_searchTerms);
break;
}
// Get the total count using the chosen filter
await using var context = await _contextFactory.CreateDbContextAsync();
TotalResults = await context.BlogPosts.Where(_currentFilterPredicate).CountAsync();
TotalPages = (int)Math.Ceiling(TotalResults / (double)PageSize);
}
// Load the first page with the chosen filter
await LoadPageAsync(page);
}
public async Task LoadPageAsync(int page)
{
CurrentPage = page;
await using var context = await _contextFactory.CreateDbContextAsync();
if (string.IsNullOrEmpty(_searchTerms))
{
SearchResults = await context.BlogPosts
.OrderByDescending(post => post.CreationTime)
.Include(p => p.ArtifactGroupings)
.Include(p => p.MainPhoto)
.Skip((CurrentPage - 1) * PageSize)
.Take(PageSize)
.ToListAsync();
}
else
{
SearchResults = await context.BlogPosts.Where(_currentFilterPredicate)
.Include(p => p.ArtifactGroupings)
.Include(p => p.MainPhoto)
.OrderBy(p => p.Id)
.Skip((CurrentPage - 1) * PageSize)
.Take(PageSize)
.ToListAsync();
}
}
public void ClearResults()
{
SearchResults.Clear();
TotalResults = 0;
TotalPages = 0;
}
}

View File

@@ -0,0 +1,52 @@
@namespace OpenArchival.Blazor
@using MudBlazor
<Microsoft.AspNetCore.Components.Forms.EditForm Model="this" OnSubmit="OnSubmit">
<MudTextField FullWidth="true"
AutoFocus="string.IsNullOrEmpty(SearchTerms)"
Placeholder="Search"
T="string"
Variant="Variant.Outlined"
Adornment="Adornment.Start"
AdornmentIcon="@Icons.Material.Filled.Search"
Class="mt-5"
@bind-Value="SearchTerms"
/>
<MudExpansionPanel Text="Filter...">
<MudText Typo="Typo.caption">Choose which data the serach bar will search on:</MudText>
<MudDivider></MudDivider>
<MudRadioGroup T="@BlogSearchFilterType" @bind-SelectedOption="SelectedFilter">
<MudRadio Option="BlogSearchFilterType.All" T="BlogSearchFilterType">All</MudRadio>
<MudRadio Option="BlogSearchFilterType.Title" T="BlogSearchFilterType">Title</MudRadio>
<MudRadio Option="BlogSearchFilterType.Content" T="BlogSearchFilterType">Content</MudRadio>
<MudRadio Option="BlogSearchFilterType.Tags" T="BlogSearchFilterType">Tags</MudRadio>
</MudRadioGroup>
</MudExpansionPanel>
</Microsoft.AspNetCore.Components.Forms.EditForm>
@code {
[Parameter]
public string SearchTerms { get; set; } = "";
[Parameter]
public EventCallback<string> SearchTermsChanged { get; set; }
[Parameter]
public BlogSearchFilterType SelectedFilter { get; set; } = BlogSearchFilterType.All;
[Parameter]
public EventCallback<BlogSearchFilterType> SelectedFilterChanged { get; set; }
private async Task HandleSearchKeyDown(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs args)
{
if (args.Key == "Enter")
{
await SearchTermsChanged.InvokeAsync(SearchTerms);
}
}
private async Task OnSubmit(Microsoft.AspNetCore.Components.Forms.EditContext args)
{
await SearchTermsChanged.InvokeAsync(SearchTerms);
}
}

View File

@@ -0,0 +1,219 @@
@using OpenArchival.Blazor.AdminPages.Shared;
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.EntityFrameworkCore
@using MudBlazor
@using MudExtensions
@using OpenArchival.Blazor.ArchiveSearch
@using OpenArchival.DataAccess
<BlogPostSearchBar @ref=_searchBar SearchTermsChanged="OnSearchTermsChanged"></BlogPostSearchBar>
<MudDataGrid T="BlogPostRowElement"
MultiSelection=true
Filterable=false
SelectOnRowClick=true
ServerData="new Func<GridState<BlogPostRowElement>, Task<GridData<BlogPostRowElement>>>(ServerReload)"
@ref=@DataGrid
@bind-SelectedItems="_selectedItems"
Comparer="_comparer">
<ToolBarContent>
<MudSpacer />
<MudButton Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Delete"
Color="Color.Error"
OnClick="OnDeleteClicked">Delete</MudButton>
</ToolBarContent>
<Columns>
<SelectColumn T="BlogPostRowElement"/>
<PropertyColumn
Title="Id"
Property="x=>x.Id"
Filterable="false"/>
<PropertyColumn
Title="Title"
Property="x=>x.Title"
Filterable="false"/>
<PropertyColumn
Title="Created Time"
Property="x=>x.CreationTime"
Filterable="false"/>
<PropertyColumn
Title="Modified Time"
Property="x=>x.ModifiedTime"
Filterable="false"/>
<TemplateColumn Title="Edit">
<CellTemplate>
<MudIconButton
Color="Color.Primary"
Icon="@Icons.Material.Filled.Edit"
Variant="Variant.Filled"
Href="@($"/admin/blogedit/{context.Item.Id}")"
Target="_blank">Edit</MudIconButton>
</CellTemplate>
</TemplateColumn>
</Columns>
<PagerContent>
<MudDataGridPager T="BlogPostRowElement"/>
</PagerContent>
</MudDataGrid>
@inject IArtifactGroupingProvider GroupingProvider;
@inject IDialogService DialogService;
@inject IArtifactGroupingProvider GroupingProvider;
@inject BlogPostSearch SearchProvider;
@inject IDbContextFactory<ApplicationDbContext> ContextFactory;
@inject ISnackbar Snackbar;
@inject NavigationManager NavigationManager;
@code
{
public class BlogPostRowElementComparer : IEqualityComparer<BlogPostRowElement>
{
public bool Equals(BlogPostRowElement? x, BlogPostRowElement? y)
{
if (ReferenceEquals(x, y)) return true;
if (x is null || y is null) return false;
return x.Id == y.Id;
}
public int GetHashCode(BlogPostRowElement obj)
{
return obj.Id.GetHashCode();
}
}
private BlogPostRowElementComparer _comparer = new();
public MudDataGrid<BlogPostRowElement> DataGrid { get; set; } = default!;
private HashSet<BlogPostRowElement> _selectedItems = new();
private string _searchString { get; set; } = "";
private BlogPostSearchBar _searchBar { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
StateHasChanged();
}
private async Task OnDeleteClicked(MouseEventArgs args)
{
HashSet<BlogPostRowElement> selected = DataGrid.SelectedItems;
bool? confirmed = await DialogService.ShowMessageBox
(
new MessageBoxOptions(){
Message=$"Are you sure you want to delete {selected.Count} posts?",
Title="Delete Posts?",
CancelText="Cancel",
YesText="Delete"
});
// It was REALLY whining about null here ;-;
if (confirmed is not null && (confirmed ?? throw new ArgumentNullException("confirmed was null")))
{
await using var context = await ContextFactory.CreateDbContextAsync();
foreach (BlogPostRowElement post in selected)
{
await context.BlogPosts.Where(p => p.Id == post.Id).ExecuteDeleteAsync();
}
}
await DataGrid.ReloadServerData();
StateHasChanged();
}
private async Task<GridData<BlogPostRowElement>> ServerReload(GridState<BlogPostRowElement> state)
{
await using var context = await ContextFactory.CreateDbContextAsync();
int totalItems = await context.BlogPosts.CountAsync();
SearchProvider.PageSize = state.PageSize;
IEnumerable<BlogPost> blogPosts;
if (string.IsNullOrEmpty(_searchString))
{
blogPosts = await context.BlogPosts
.Skip(state.Page * state.PageSize)
.Take(state.PageSize)
.ToListAsync();
} else
{
await SearchProvider.Search(_searchString, _searchBar.SelectedFilter, state.Page + 1);
blogPosts = SearchProvider.SearchResults;
}
var pagedItems = blogPosts.Select(post => new BlogPostRowElement()
{
Id = post.Id,
Title = post.Title,
CreationTime = post.CreationTime,
ModifiedTime = post.ModifiedTime
});
return new GridData<BlogPostRowElement>()
{
TotalItems = totalItems,
Items = pagedItems
};
}
private async Task OnSearchTermsChanged(string args)
{
_searchString = args;
await DataGrid.ReloadServerData();
}
public async Task<List<BlogPost>> SelectedItems()
{
List<BlogPost> selectedGroupings = [];
foreach (BlogPostRowElement row in DataGrid.SelectedItems)
{
await using var context = await ContextFactory.CreateDbContextAsync();
var post = await context.BlogPosts.Where(p => p.Id == row.Id).FirstOrDefaultAsync();
if (post is null)
{
Snackbar.Add($"Post with id {row.Id} no longer exists in the database.", Severity.Error);
continue;
}
selectedGroupings.Add(post);
}
return selectedGroupings;
}
public Task SetSelectedItemsAsync(IEnumerable<BlogPost> postsToSelect)
{
var rowElementsToSelect = postsToSelect.Select(post => new BlogPostRowElement
{
Id = post.Id,
Title = post.Title,
CreationTime = post.CreationTime,
ModifiedTime = post.ModifiedTime
});
_selectedItems = new HashSet<BlogPostRowElement>(rowElementsToSelect, _comparer);
StateHasChanged();
return Task.CompletedTask;
}
public void ClearSelected()
{
_selectedItems = new HashSet<BlogPostRowElement>();
}
}

View File

@@ -0,0 +1,128 @@
@using Microsoft.EntityFrameworkCore
@using MudBlazor
@using OpenArchival.DataAccess
@page "/articles/{ArticleIdString}"
@if (_article is not null)
{
@if (_article.ArtifactGroupings.Any()) {
{
<MudPaper Class="pa-4 ma-2 rounded overflow-y-auto" Style="max-height: 400px;" Elevation="3">
<MudText Typo="Typo.h6">Related Artifacts</MudText>
<MudDivider/>
<MudGrid Justify="Justify.Center" Class="mt-4">
@foreach(ArtifactGrouping grouping in _article.ArtifactGroupings)
{
<MudItem xs="12" sm="12" md="8" lg="4">
<MudLink Href="@($"/archive/{grouping.Id}")" Target="_blank" Style="text-decoration: none; color: inherit;">
<MudCard Style="@($"height: {Math.Floor(400 * 0.7)}px; display: flex; flex-direction: column;")" >
@if (grouping.ChildArtifactEntries[0].Files.Any())
{
<MudCardMedia Image="@($"/api/files/{grouping.ChildArtifactEntries[0].Files[0].Id}")"/>
}
<MudCardContent Style=@($"flex-grow: 1; overflow-y: clip; height:{Math.Floor(400 * 0.3)}px;")>
<MudText Typo="Typo.h5">@grouping.Title</MudText>
<MudText Typo="Typo.body2">@grouping.Description</MudText>
</MudCardContent>
</MudCard>
</MudLink>
</MudItem>
}
</MudGrid>
</MudPaper>
}
}
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
<MudGrid Justify="Justify.Center" Class="mb-2">
<MudItem>
<MudImage ObjectPosition=ObjectPosition.Center Class="rounded-1g" Src=@($"/api/files/{_article.MainPhoto.Id}") Height="400"></MudImage>
</MudItem>
</MudGrid>
<MudText Typo="Typo.h6">@_article.Title</MudText>
<MudDivider/>
<MudText Typo="Typo.caption">Posted: @_article.CreationTime.Hour:@_article.CreationTime.Minute @_article.CreationTime.Month/@_article.CreationTime.Day/@_article.CreationTime.Year</MudText>
<MudText Typo="Typo.caption">Updated: @_article.ModifiedTime.Hour:@_article.ModifiedTime.Minute @_article.ModifiedTime.Month/@_article.ModifiedTime.Day/@_article.ModifiedTime.Year</MudText>
<MudDivider/>
<MudText Typo="Typo.caption" style="font-weight: 100;">Tags:</MudText>
<OpenArchival.Blazor.CustomComponents.ChipContainer T="BlogPostTag" @bind-Items=_article.Tags DeleteEnabled=false></OpenArchival.Blazor.CustomComponents.ChipContainer>
</MudPaper>
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
@((MarkupString)_article.Content)
</MudPaper>
}
@inject IArtifactGroupingProvider GroupingProvider;
@inject NavigationManager NavigationManager;
@inject IDbContextFactory<ApplicationDbContext> ContextFactory;
@code {
[Parameter]
public string ArticleIdString { get; set; }
/// <summary>
/// The converted grouping id from the URL
/// </summary>
private int _articleId { get; set; }
private BlogPost _article { get; set; } = default!;
protected override async Task OnParametersSetAsync()
{
if (!int.TryParse(ArticleIdString, out int articleId))
{
NavigationManager.NavigateTo("/article-not-found");
return;
}
_articleId = articleId;
await using var context = await ContextFactory.CreateDbContextAsync();
// --- FIX: Added .Include(a => a.Views) AND .FirstOrDefaultAsync(a => a.Id == _articleId)
var article = await context.BlogPosts
.Include(a => a.Views)
.Include(a => a.ArtifactGroupings)
.ThenInclude(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Files)
.Include(article=>article.Views)
.Include(article=>article.Tags)
.Include(article=>article.MainPhoto)
.FirstOrDefaultAsync(a => a.Id == _articleId); // <-- FIX 2: Filter by the correct ID
if (article is null)
{
NavigationManager.NavigateTo("/article-not-found");
return;
}
_article = article;
// --- This logic will now work correctly ---
if (_article.Views is null)
{
// This article has never been viewed, create a new view count
var viewCount = new BlogPostViewCount() { Post = _article, Views = 1 };
context.Add(viewCount); // Add the new count to the context
_article.Views = viewCount; // Associate it with the article
}
else
{
// It has been viewed, just increment the count
_article.Views.Views++;
}
await context.SaveChangesAsync(); // This will now correctly INSERT or UPDATE
// StateHasChanged() is not strictly necessary here, but doesn't hurt.
StateHasChanged();
await base.OnParametersSetAsync();
}
}

View File

@@ -17,7 +17,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenArchival.Blazor.AdminPages\OpenArchival.Blazor.AdminPages.csproj" /> <ProjectReference Include="..\OpenArchival.Blazor.AdminPages.Shared\OpenArchival.Blazor.AdminPages.Shared.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.Config\OpenArchival.Blazor.Config.csproj" /> <ProjectReference Include="..\OpenArchival.Blazor.Config\OpenArchival.Blazor.Config.csproj" />
<ProjectReference Include="..\OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj" /> <ProjectReference Include="..\OpenArchival.Blazor.CustomComponents\OpenArchival.Blazor.CustomComponents.csproj" />
<ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" /> <ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" />

View File

@@ -0,0 +1,166 @@
@page "/articles/search"
@page "/articles/search/{SearchTerms}"
@using Microsoft.EntityFrameworkCore
@using Microsoft.Extensions.Logging
@using MudBlazor
@using OpenArchival.DataAccess
@using System.Linq
@using System.Text.RegularExpressions
@using System.Net
<BlogPostSearchBar @ref="_searchBar"
@bind-SelectedFilter="_selectedFilter"
SearchTermsChanged="PerformSearchAsyncCallback" />
@{
if (_showMostRecent && PostSearch.TotalResults > 0)
{
<MudGrid Justify="Justify.FlexStart" Class="mt-1 ml-1 mb-2">
<MudText Typo="Typo.h6" Color="Color.Primary">Most Recent Posts:</MudText>
</MudGrid>
}
else if (PostSearch.TotalResults > 0)
{
<MudGrid Justify="Justify.FlexStart" Class="mt-1 ml-1 mb-2">
<MudText Typo="Typo.subtitle2" Class="my-2">@PostSearch.TotalResults results found</MudText>
<MudButton Class="ml-1" StartIcon="@Icons.Material.Filled.Clear" OnClick="OnClearResults" Variant="Variant.Filled" Color="Color.Primary" Size="Size.Small">Clear</MudButton>
</MudGrid>
}
}
@if (PostSearch.SearchResults.Count > 0)
{
<MudGrid>
@foreach (var post in PostSearch.SearchResults)
{
<MudItem xs="12" sm="6" md="4" lg="4">
<MudLink Href="@($"/articles/{post.Id}")" Target="_blank" Style="text-decoration: none; color: inherit;">
<MudCard Style="@($"height: {Math.Floor(400 * 0.7)}px; display: flex; flex-direction: column;")">
@if (post.MainPhoto != null)
{
<MudCardMedia Image="@($"/api/files/{post.MainPhoto.Id}")" Style="height: 100%;" />
}
else
{
<MudCardMedia Image="/images/placeholder.png" Style="height: 100%;" /> }
<MudCardContent Style=@($"flex-grow: 1; overflow-y: clip; height:{Math.Floor(400 * 0.3)}px;")>
<MudText Typo="Typo.h5">@post.Title</MudText>
<MudText Typo="Typo.body2">@CreateContentSnippet(post.Content)</MudText>
</MudCardContent>
</MudCard>
</MudLink>
</MudItem>
}
</MudGrid>
<MudPaper Class="d-flex justify-center py-2 mt-4" Elevation="0">
<MudPagination Count="PostSearch.TotalPages"
Selected="PostSearch.CurrentPage"
SelectedChanged="OnPageChangedAsync" />
</MudPaper>
}
@inject IDbContextFactory<ApplicationDbContext> ContextFactory;
@inject ILogger<SearchBlog> Logger;
@inject NavigationManager NavigationManager;
@inject BlogPostSearch PostSearch;
@code {
[Parameter]
public string SearchTerms { get; set; } = "";
private BlogSearchFilterType _selectedFilter = BlogSearchFilterType.All;
private BlogPostSearchBar _searchBar = default!;
// List for the "no results" slider display
private List<SearchPageSliderEntry> _sliderEntries { get; set; } = [];
private bool _showMostRecent = true;
protected override async Task OnParametersSetAsync()
{
// This runs when the page loads, checking for search terms in the URL
if (string.IsNullOrWhiteSpace(SearchTerms))
{
await PostSearch.Search("", _selectedFilter, 1);
_showMostRecent = true;
}
else
{
await PostSearch.Search(SearchTerms, _selectedFilter, 1);
_showMostRecent = false;
}
}
/// <summary>
/// This is called by the SearchBar component's 'SearchTermsChanged' event.
/// </summary>
private async Task PerformSearchAsyncCallback(string searchTerms)
{
if (string.IsNullOrEmpty(searchTerms))
{
_showMostRecent = true;
} else
{
_showMostRecent = false;
}
SearchTerms = searchTerms; // Update the page's parameter
// Update the URL to reflect the new search
NavigationManager.NavigateTo($"/articles/search/{Uri.EscapeDataString(searchTerms)}", replace: true);
// Perform the search (always start on page 1)
await PostSearch.Search(searchTerms, _selectedFilter, 1);
StateHasChanged(); // Re-render the page with results
}
/// <summary>
/// This is called by the MudPagination's 'SelectedChanged' event.
/// </summary>
private async Task OnPageChangedAsync(int page)
{
// Load the specific page using the service
await PostSearch.LoadPageAsync(page);
StateHasChanged(); // Re-render with the new page's data
}
/// <summary>
/// Clears the search results and state.
/// </summary>
private void OnClearResults()
{
PostSearch.ClearResults();
SearchTerms = "";
// Navigate back to the base search page
NavigationManager.NavigateTo("/articles/search", replace: true);
StateHasChanged();
}
public static string CreateContentSnippet(string html, int maxLength = 150)
{
if (string.IsNullOrEmpty(html))
{
return string.Empty;
}
// Strip HTML tags
string plainText = Regex.Replace(html, @"<[^>]+>", string.Empty);
// Decode HTML entities
plainText = WebUtility.HtmlDecode(plainText).Trim();
if (plainText.Length > maxLength)
{
return plainText.Substring(0, maxLength) + "...";
}
return plainText;
}
}

View File

@@ -0,0 +1,13 @@
@page
@model OpenArchival.Blazor.CustomComponents.MyFeature.Pages.Page1Model
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Page1</title>
</head>
<body>
</body>
</html>

View File

@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OpenArchival.Blazor.CustomComponents.MyFeature.Pages
{
public class Page1Model : PageModel
{
public void OnGet()
{
}
}
}

View File

@@ -17,6 +17,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenArchival.Blazor.Config\OpenArchival.Blazor.Config.csproj" />
<ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" /> <ProjectReference Include="..\OpenArchival.DataAccess\OpenArchival.DataAccess.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -5,6 +5,7 @@
@using OpenArchival.DataAccess @using OpenArchival.DataAccess
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Forms
@using MudBlazor @using MudBlazor
@using OpenArchival.Blazor.Config
<style> <style>
.file-upload-input { .file-upload-input {
@@ -97,6 +98,7 @@
@inject IFilePathListingProvider PathProvider; @inject IFilePathListingProvider PathProvider;
@inject ISnackbar Snackbar; @inject ISnackbar Snackbar;
@inject ILogger<UploadDropBox> _logger; @inject ILogger<UploadDropBox> _logger;
@inject IDialogService DialogService;
@code { @code {
private const string DefaultDragClass = "relative rounded-lg border-2 border-dashed pa-4 mt-4 mud-width-full mud-height-full"; private const string DefaultDragClass = "relative rounded-lg border-2 border-dashed pa-4 mt-4 mud-width-full mud-height-full";
@@ -129,6 +131,18 @@
} }
private async Task ClearAsync() private async Task ClearAsync()
{
bool? confirmed = await DialogService.ShowMessageBox
(
new MessageBoxOptions(){
Message=$"Are you sure you want to clear files? You will loose all changes.",
Title="Clear Files",
CancelText="Cancel",
YesText="Clear"
});
if (confirmed is not null && (confirmed ?? throw new ArgumentNullException("confirmed was null")))
{ {
foreach (var pair in _fileToDiskFileName) foreach (var pair in _fileToDiskFileName)
{ {
@@ -173,7 +187,9 @@
ClearDragClass(); ClearDragClass();
UploadsComplete = true; UploadsComplete = true;
await ClearClicked.InvokeAsync(); await ClearClicked.InvokeAsync();
} }
}
private Task OpenFilePickerAsync() private Task OpenFilePickerAsync()
=> _fileUpload?.OpenFilePickerAsync() ?? Task.CompletedTask; => _fileUpload?.OpenFilePickerAsync() ?? Task.CompletedTask;

View File

@@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"CodeBeam.MudExtensions": "6.3.0", "CodeBeam.MudExtensions": "6.3.0",
"MudBlazor": "8.13.0", "MudBlazor": "8.13.0",
"OpenArchival.Blazor.Config": "1.0.0",
"OpenArchival.DataAccess": "1.0.0" "OpenArchival.DataAccess": "1.0.0"
}, },
"runtime": { "runtime": {
@@ -616,6 +617,14 @@
} }
} }
}, },
"OpenArchival.Blazor.Config/1.0.0": {
"runtime": {
"OpenArchival.Blazor.Config.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"dependencies": { "dependencies": {
"EntityFramework": "6.5.1", "EntityFramework": "6.5.1",
@@ -1033,6 +1042,11 @@
"path": "system.windows.extensions/6.0.0", "path": "system.windows.extensions/6.0.0",
"hashPath": "system.windows.extensions.6.0.0.nupkg.sha512" "hashPath": "system.windows.extensions.6.0.0.nupkg.sha512"
}, },
"OpenArchival.Blazor.Config/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"OpenArchival.DataAccess/1.0.0": { "OpenArchival.DataAccess/1.0.0": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,

View File

@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor.CustomComponents")] [assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.Blazor.CustomComponents")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0e24ce207395fb1c32a87d10049c1d81dc4784fe")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b34449808fa29388ff6ca79b560f657d74738fdd")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor.CustomComponents")] [assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.Blazor.CustomComponents")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor.CustomComponents")] [assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.Blazor.CustomComponents")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

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