Extracted some pages to their own assembly and finished the artifact display page code
This commit is contained in:
@@ -1,5 +1,85 @@
|
||||
<h3>ArchiveEntryDisplay</h3>
|
||||
@using OpenArchival.Blazor.FileViewer
|
||||
|
||||
<MudPaper Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<MudGrid Spacing="2">
|
||||
<MudItem lg="8" xs="12" Class="d-flex align-center justify-center flex-column">
|
||||
<MudText Class="d-flex" Typo=Typo.h6>@ArtifactEntry.Title</MudText>
|
||||
<FileViewerCarousel FilePathListings="ArtifactEntry.Files" MaxHeight="350" ShowUnsupportedFiles=true></FileViewerCarousel>
|
||||
</MudItem>
|
||||
|
||||
<MudItem lg="4" xs="12">
|
||||
<MudText Typo="Typo.h6">Artifact Identifier</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.caption">@ArtifactEntry.ArtifactIdentifier</MudText>
|
||||
|
||||
<MudText Typo="Typo.h6">Primary Artifact Type</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.caption">@ArtifactEntry.Type.Name</MudText>
|
||||
|
||||
@if (!string.IsNullOrEmpty(ArtifactEntry.StorageLocation.Location))
|
||||
{
|
||||
<MudText Typo="Typo.h6">Storage Location</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.caption">@ArtifactEntry.StorageLocation.Location</MudText>
|
||||
}
|
||||
|
||||
@if (ArtifactEntry.Tags.Count > 0)
|
||||
{
|
||||
<MudText Typo="Typo.h6">Tags</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<OpenArchival.Blazor.Components.CustomComponents.ChipContainer DeleteEnabled=false @bind-Items="ArtifactEntry.Tags"></OpenArchival.Blazor.Components.CustomComponents.ChipContainer>
|
||||
}
|
||||
|
||||
@if (ArtifactEntry.ListedNames.Count > 0)
|
||||
{
|
||||
<MudText Typo="Typo.h6">Listed Names</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<OpenArchival.Blazor.Components.CustomComponents.ChipContainer DeleteEnabled=false @bind-Items="ArtifactEntry.ListedNames"></OpenArchival.Blazor.Components.CustomComponents.ChipContainer>
|
||||
}
|
||||
|
||||
@if (ArtifactEntry.AssociatedDates.Count > 0)
|
||||
{
|
||||
<MudText Typo="Typo.h6">Associated Dates</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<OpenArchival.Blazor.Components.CustomComponents.ChipContainer DeleteEnabled=false @bind-Items="ArtifactEntry.AssociatedDates" DisplayFunc="@(date => date.ToString("d"))"></OpenArchival.Blazor.Components.CustomComponents.ChipContainer>
|
||||
}
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
|
||||
<MudText Class="mt-4" Typo="Typo.h6">Description</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.body1">@ArtifactEntry.Description</MudText>
|
||||
|
||||
<MudExpansionPanel Text="Downloads">
|
||||
<MudList T="string">
|
||||
@foreach (FilePathListing file in ArtifactEntry.Files)
|
||||
{
|
||||
<MudListItem Icon="@Icons.Material.Filled.Download" IconColor="Color.Primary" OnClick="() => OnFileDownloadClicked(file)">@file.OriginalName</MudListItem>
|
||||
}
|
||||
</MudList>
|
||||
</MudExpansionPanel>
|
||||
</MudPaper>
|
||||
|
||||
@inject IJSRuntime JSRuntime
|
||||
@inject ISnackbar Snackbar
|
||||
@code {
|
||||
[Parameter]
|
||||
public required ArtifactEntry ArtifactEntry { get; set; }
|
||||
|
||||
private async Task OnFileDownloadClicked(FilePathListing file)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] fileBytes = await File.ReadAllBytesAsync(file.Path);
|
||||
|
||||
string mimeType = "";
|
||||
|
||||
await JSRuntime.InvokeVoidAsync("downloadFileFromBytes", file.OriginalName, mimeType, Convert.ToBase64String(fileBytes));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add($"Failed to download file {file.OriginalName}", Severity.Error);
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,55 @@
|
||||
@page "/archive/{GroupingIdString}"
|
||||
@using OpenArchival.DataAccess;
|
||||
@using OpenArchival.Blazor.FileViewer
|
||||
|
||||
@inject IArtifactGroupingProvider GroupingProvider;
|
||||
@inject NavigationManager NavigationManager;
|
||||
|
||||
@if (_artifactGrouping is not null)
|
||||
{
|
||||
<MudText Typo="Typo.h1">@_artifactGrouping.Title</MudText>
|
||||
<MudContainer MaxWidth="MaxWidth.Large">
|
||||
<MudPaper Class="pa-4 ma-2 rounded d-flex justify-center" Elevation="3">
|
||||
<MudText Typo="Typo.h3">@_artifactGrouping.Title</MudText>
|
||||
</MudPaper>
|
||||
|
||||
<MudPaper Class="pa-4 ma-2 rounded d-flex justify-center" Elevation="3">
|
||||
@*<MudImage Class="d-flex justify-center" Src="https://dummyimage.com/600x400/000/fff"></MudImage>*@
|
||||
<FileViewerCarousel FilePathListings="_artifactGrouping.ChildFilePathListings" MaxHeight="500" ShowUnsupportedFiles=false></FileViewerCarousel>
|
||||
</MudPaper>
|
||||
|
||||
<MudGrid Spacing="2">
|
||||
<MudItem xs="8">
|
||||
<MudPaper Style="height: 100%;" Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<MudText Typo="Typo.h6">Description</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.body2">@_artifactGrouping.Description</MudText>
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
<MudItem xs="4">
|
||||
<MudPaper Style="height: 100%;" Class="pa-4 ma-2 rounded" Elevation="3">
|
||||
<MudText Typo="Typo.h6">Artifact Identifier</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.caption">@_artifactGrouping.ArtifactGroupingIdentifier</MudText>
|
||||
|
||||
<MudText Typo="Typo.h6">Primary Artifact Category</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.caption">@_artifactGrouping.Category.Name</MudText>
|
||||
|
||||
<MudText Typo="Typo.h6">Primary Artifact Type</MudText>
|
||||
<MudDivider></MudDivider>
|
||||
<MudText Typo="Typo.caption">@_artifactGrouping.Type.Name</MudText>
|
||||
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
|
||||
<MudPaper Class="pa-4 mt-8 ma-2 rounded" Elevation="3">
|
||||
@foreach (ArtifactEntry child in _artifactGrouping.ChildArtifactEntries) {
|
||||
<ArchiveEntryDisplay ArtifactEntry="child"></ArchiveEntryDisplay>
|
||||
}
|
||||
</MudPaper>
|
||||
|
||||
</MudContainer>
|
||||
}
|
||||
|
||||
@code {
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<h3>FileDisplayBase</h3>
|
||||
|
||||
@code {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
@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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using OpenArchival.Blazor.Components.Pages.ArchiveDisplay;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
<h3>FileDisplayImage</h3>
|
||||
@implements IFileDisplayComponent
|
||||
<h3>FileDisplayImage</h3>
|
||||
|
||||
@code {
|
||||
|
||||
[Parameter]
|
||||
public required FilePathListing FilePath { get; set; }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
namespace OpenArchival.Blazor;
|
||||
using OpenArchival.DataAccess;
|
||||
|
||||
namespace OpenArchival.Blazor;
|
||||
|
||||
public interface IFileDisplayComponent
|
||||
{
|
||||
public FilePathListing FilePath { get; set; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user