Files
Aaru.Server/Aaru.Server.New/Components/Pages/Report/View.razor

838 lines
30 KiB
Plaintext

@page "/Report/View/{Id:int}"
@using Aaru.CommonTypes.Metadata
@using Aaru.Server.Database
@using Blazorise
@rendermode InteractiveServer
@inject Microsoft.EntityFrameworkCore.IDbContextFactory<DbContext> DbContextFactory
<PageTitle>@_pageTitle</PageTitle>
<style>
.list-group-item {
background-color: #212529; color: white; border-color: #373b3e;
}
</style>
@if(_notFound)
{
<div class="stats-section">
<h1 style="color: red; align-content: center; padding: 2rem">The requested device report has not been found...</h1>
</div>
return;
}
@if(!_initialized)
{
<div class="stats-section">
<h1 style="color: red; align-content: center; padding: 2rem">Loading...</h1>
</div>
return;
}
<div class="stats-section">
<h1 style="color: #e18fdc; align-content: center; padding: 2rem">@_pageTitle</h1>
</div>
<div class="stats-section">
<h3 style="font-weight: bold;">
@lblDeviceType<br/>
</h3>
<Accordion>
@if(UsbItem is not null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>USB characteristics</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table FullWidth>
<TableBody>
<TableRow>
<TableRowHeader class="text-end">Manufacturer</TableRowHeader>
<TableRowCell>@UsbItem.Manufacturer</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Product</TableRowHeader>
<TableRowCell>@UsbItem.Product</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Vendor ID</TableRowHeader>
<TableRowCell>@UsbItem.VendorDescription</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Product ID</TableRowHeader>
<TableRowCell>@UsbItem.ProductDescription</TableRowCell>
</TableRow>
</TableBody>
</Table>
</AccordionBody>
</AccordionItem>
}
@if(FireWireItem is not null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>FireWire characteristics</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table FullWidth>
<TableBody>
<TableRow>
<TableRowHeader class="text-end">Manufacturer</TableRowHeader>
<TableRowCell>@FireWireItem.Manufacturer</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Product</TableRowHeader>
<TableRowCell>@FireWireItem.Product</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Vendor ID</TableRowHeader>
<TableRowCell>@FireWireItem.VendorDescription</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Product ID</TableRowHeader>
<TableRowCell>@FireWireItem.ProductDescription</TableRowCell>
</TableRow>
</TableBody>
</Table>
</AccordionBody>
</AccordionItem>
}
@if(PcmciaItem != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>PCMCIA characteristics</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table FullWidth>
<TableBody>
<TableRow>
<TableRowHeader class="text-end">Manufacturer</TableRowHeader>
<TableRowCell>@PcmciaItem.Manufacturer</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Product</TableRowHeader>
<TableRowCell>@PcmciaItem.Product</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Manufacturer code</TableRowHeader>
<TableRowCell>@PcmciaItem.VendorDescription</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Card code</TableRowHeader>
<TableRowCell>@PcmciaItem.ProductDescription</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader class="text-end">Compliance</TableRowHeader>
<TableRowCell>@PcmciaItem.Compliance</TableRowCell>
</TableRow>
@if(PcmciaTuples != null)
{
foreach(KeyValuePair<string, string> kvp in PcmciaTuples)
{
<TableRow>
<TableRowHeader class="text-end">@kvp.Key</TableRowHeader>
<TableRowCell>@kvp.Value</TableRowCell>
</TableRow>
}
}
</TableBody>
</Table>
</AccordionBody>
</AccordionItem>
}
@if(DeviceIdentification != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Device identification</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table class="table-borderless table-dark" FullWidth>
<TableBody>
@foreach(KeyValuePair<string, string> kvp in DeviceIdentification)
{
<TableRow>
<TableRowHeader>@kvp.Key</TableRowHeader>
<TableRowCell>@kvp.Value</TableRowCell>
</TableRow>
}
</TableBody>
</Table>
</AccordionBody>
</AccordionItem>
}
@if(SupportedAtaVersions != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Supported ATA versions</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string version in SupportedAtaVersions)
{
<ListGroupItem>@version</ListGroupItem>
}
</ListGroup>
@if(MaximumAtaRevision is not null)
{
<span style="font-style: italic">Maximum ATA revision supported:</span>
<span> @MaximumAtaRevision</span>
}
</AccordionBody>
</AccordionItem>
}
@if(AtaTransport != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>@AtaTransport</AccordionToggle>
</Heading>
</AccordionHeader>
@if(AtaTransportVersions is not null)
{
<AccordionBody>
<ListGroup>
@foreach(string version in AtaTransportVersions)
{
<ListGroupItem>@version</ListGroupItem>
}
</ListGroup>
</AccordionBody>
}
</AccordionItem>
}
@if(GeneralConfiguration != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>General configuration</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cfg in GeneralConfiguration)
{
<ListGroupItem>@cfg</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(SpecificConfiguration != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Specific configuration</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cfg in SpecificConfiguration)
{
<ListGroupItem>@cfg</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(DeviceCapabilities != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Device capabilities</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cap in DeviceCapabilities)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(PioTransferModes != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Programmed I/O (PIO) transfer modes</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cap in PioTransferModes)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(DmaTransferModes != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Single-word DMA (DMA) transfer modes</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cap in DmaTransferModes)
{
if(cap.Contains("active"))
{
<ListGroupItem class="active">@cap</ListGroupItem>
}
else
{
<ListGroupItem>@cap</ListGroupItem>
}
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(MDmaTransferModes != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Multi-word DMA (MDMA) transfer modes</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cap in MDmaTransferModes)
{
if(cap.Contains("active"))
{
<ListGroupItem class="active">@cap</ListGroupItem>
}
else
{
<ListGroupItem>@cap</ListGroupItem>
}
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(UltraDmaTransferModes != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Ultra DMA transfer modes</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cap in UltraDmaTransferModes)
{
if(cap.Contains("active"))
{
<ListGroupItem class="active">@cap</ListGroupItem>
}
else
{
<ListGroupItem>@cap</ListGroupItem>
}
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(CommandSetAndFeatures != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Command set and features</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string feature in CommandSetAndFeatures)
{
<ListGroupItem>@feature</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(Security != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Security</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string feature in Security)
{
<ListGroupItem>@feature</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(Streaming != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Streaming</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string feature in Streaming)
{
<ListGroupItem>@feature</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(SmartCommandTransport != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>S.M.A.R.T. Command Transport (SCT)</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string feature in SmartCommandTransport)
{
<ListGroupItem>@feature</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(NvCache != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Non-Volatile Cache</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string feature in NvCache)
{
<ListGroupItem>@feature</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(Cid != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Card Identification Register</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@((MarkupString)Cid)
</AccordionBody>
</AccordionItem>
}
@if(Csd != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Card Specific Data Register</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@((MarkupString)Csd)
</AccordionBody>
</AccordionItem>
}
@if(ExtendedCsd != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Extended Device Specific Data Register</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@((MarkupString)ExtendedCsd)
</AccordionBody>
</AccordionItem>
}
@if(Scr != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Card configuration register</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@((MarkupString)Scr)
</AccordionBody>
</AccordionItem>
}
@if(Ocr != null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Operation Conditions Register</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@((MarkupString)Ocr)
</AccordionBody>
</AccordionItem>
}
@if(ReadCapabilitiesDictionary is not null && ReadCapabilitiesList is not null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Read capabilities</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table class="table-borderless table-dark" FullWidth>
<TableBody>
@foreach(KeyValuePair<string, string> kvp in ReadCapabilitiesDictionary)
{
<TableRow>
<TableRowHeader>@kvp.Key</TableRowHeader>
<TableRowCell>@kvp.Value</TableRowCell>
</TableRow>
}
</TableBody>
</Table>
<ListGroup>
@foreach(string cap in ReadCapabilitiesList)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(DeviceInquiry is not null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Device inquiry</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table class="table-borderless table-dark" FullWidth>
<TableBody>
@foreach(KeyValuePair<string, string> kvp in DeviceInquiry)
{
<TableRow>
<TableRowHeader>@kvp.Key</TableRowHeader>
<TableRowCell>@kvp.Value</TableRowCell>
</TableRow>
}
</TableBody>
</Table>
@if(InquiryCapabilities is not null)
{
<ListGroup>
@foreach(string cap in InquiryCapabilities)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
}
</AccordionBody>
</AccordionItem>
}
@if(ModeSenseCapabilities is not null || ModeSensePages is not null)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>MODE SENSE pages</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@if(ModeSenseCapabilities is not null)
{
<ListGroup>
@foreach(string cap in ModeSenseCapabilities)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
}
@if(BlockDescriptors is not null)
{
<Accordion>
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is6">
<AccordionToggle>Block descriptors</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string descriptor in BlockDescriptors)
{
<ListGroupItem>@descriptor</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
</Accordion>
}
@if(ModeSensePages is not null)
{
foreach(KeyValuePair<string, List<string>> kvp in ModeSensePages)
{
<Accordion>
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is6">
<AccordionToggle>@kvp.Key</AccordionToggle>
</Heading>
</AccordionHeader>
@if(kvp.Value.Count > 0)
{
<AccordionBody>
<ListGroup>
@foreach(string cap in kvp.Value)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
</AccordionBody>
}
</AccordionItem>
</Accordion>
}
}
</AccordionBody>
</AccordionItem>
}
@if(EvpdPages?.Count > 0)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>Extended Vital Product Data pages</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
@foreach(KeyValuePair<string, List<string>> kvp in EvpdPages)
{
<Accordion>
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is6">
<AccordionToggle>@kvp.Key</AccordionToggle>
</Heading>
</AccordionHeader>
@if(kvp.Value.Count > 0)
{
<AccordionBody>
<ListGroup>
@foreach(string cap in kvp.Value)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
</AccordionBody>
}
</AccordionItem>
</Accordion>
}
</AccordionBody>
</AccordionItem>
}
@if(MmcModeList?.Count > 0)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>CD-ROM capabilities</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string cap in MmcModeList)
{
<ListGroupItem>@cap</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(MmcFeaturesList?.Count > 0)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>MMC features</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<ListGroup>
@foreach(string feature in MmcFeaturesList)
{
<ListGroupItem>@feature</ListGroupItem>
}
</ListGroup>
</AccordionBody>
</AccordionItem>
}
@if(ScsiSscVisible)
{
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is5">
<AccordionToggle>SCSI Streaming device capabilities:</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table class="table-borderless table-dark" FullWidth>
<TableBody>
<TableRow>
<TableRowHeader>Block size granularity</TableRowHeader>
<TableRowCell>@ScsiSscGranularity</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Maximum block length</TableRowHeader>
<TableRowCell>@ScsiSscMaxBlock bytes</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Minimum block length</TableRowHeader>
<TableRowCell>@ScsiSscMinBlock bytes</TableRowCell>
</TableRow>
</TableBody>
</Table>
@if(ScsiSscDensities?.Count > 0)
{
foreach(SupportedDensity density in ScsiSscDensities)
{
<Accordion>
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is6">
<AccordionToggle>Information for supported density with primary code @($"{density.PrimaryCode:X2}h") and secondary code @($"{density.SecondaryCode:X2}h")</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table class="table-borderless table-dark" FullWidth>
<TableBody>
<TableRow>
<TableRowHeader>Drive can write this density</TableRowHeader>
<TableRowCell>@density.Writable</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Duplicate density</TableRowHeader>
<TableRowCell>@density.Duplicate</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Default density</TableRowHeader>
<TableRowCell>@density.DefaultDensity</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Name</TableRowHeader>
<TableRowCell>@density.Name</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Organization</TableRowHeader>
<TableRowCell>@density.Organization</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Description</TableRowHeader>
<TableRowCell>@density.Description</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Maximum capacity</TableRowHeader>
<TableRowCell>@density.Capacity megabytes</TableRowCell>
</TableRow>
<TableRow>
<TableRowCell ColumnSpan="2">Density has @density.BitsPerMm bits per mm, with @density.Tracks tracks in a @density.Width mm width tape</TableRowCell>
</TableRow>
</TableBody>
</Table>
</AccordionBody>
</AccordionItem>
</Accordion>
}
}
@if(ScsiSscMedias?.Count > 0)
{
foreach(SscSupportedMedia media in ScsiSscMedias)
{
<Accordion>
<AccordionItem>
<AccordionHeader>
<Heading Size="HeadingSize.Is6">
<AccordionToggle>Information for supported media with type code @($"{media.MediumType:X2}h")</AccordionToggle>
</Heading>
</AccordionHeader>
<AccordionBody>
<Table class="table-borderless table-dark" FullWidth>
<TableBody>
<TableRow>
<TableRowCell ColumnSpan="2">Media is @media.Length m long in a @media.Width mm width tape</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Name</TableRowHeader>
<TableRowCell>@media.Name</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Organization</TableRowHeader>
<TableRowCell>@media.Organization</TableRowCell>
</TableRow>
<TableRow>
<TableRowHeader>Description</TableRowHeader>
<TableRowCell>@media.Description</TableRowCell>
</TableRow>
</TableBody>
</Table>
</AccordionBody>
</AccordionItem>
</Accordion>
}
}
</AccordionBody>
</AccordionItem>
}
</Accordion>
</div>