Move company view to Blazor.

This commit is contained in:
2020-05-21 22:24:57 +01:00
parent 307bb245ac
commit 667ae13046
6 changed files with 550 additions and 392 deletions

View File

@@ -75,19 +75,6 @@ namespace Marechai.Controllers
}).ToList());
}
public IActionResult View(int id)
{
ViewBag.WebRootPath = hostingEnvironment.WebRootPath;
Company company = _context.Companies.FirstOrDefault(c => c.Id == id);
if(company == null)
return Index();
ViewBag.CompanyDescription = company.Description?.Html ?? company.Description?.Text;
return View(company);
}
public IActionResult ByCountry(short id)
{
ViewBag.Iso3166 = _context.Iso31661Numeric.FirstOrDefault(i => i.Id == id);

View File

@@ -2,7 +2,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Version>3.0.99.944</Version>
<Version>3.0.99.948</Version>
<Company>Canary Islands Computer Museum</Company>
<Copyright>Copyright © 2003-2020 Natalia Portillo</Copyright>
<Product>Canary Islands Computer Museum Website</Product>

View File

@@ -0,0 +1,412 @@
@{
/******************************************************************************
// MARECHAI: Master repository of computing history artifacts information
// ----------------------------------------------------------------------------
//
// Filename : ByLetter.cshtml
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// --[ Description ] ----------------------------------------------------------
//
// Lists computers by company
//
// --[ License ] --------------------------------------------------------------
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2003-2020 Natalia Portillo
*******************************************************************************/
}
@page "/companies/{Id:int}"
@using Marechai.Database.Models
@using Marechai.Database
@inherits OwningComponentBase<CompaniesService>
@inject IStringLocalizer<CompaniesService> L
@inject IWebHostEnvironment Host
@if (!_loaded)
{
<p align="center">@L["Loading..."]</p>
return;
}
@if (_company is null)
{
<p align="center">@L["Company not found."]</p>
return;
}
<div class="container-fluid">
<p align=center>
@if (_company.LastLogo != null &&
File.Exists(Path.Combine(Host.WebRootPath, "assets/logos", _company.LastLogo.Guid + ".svg")))
{
<picture>
<source type="image/svg+xml" srcset="/assets/logos/@(_company.LastLogo.Guid).svg">
<source type="image/webp" srcset="/assets/logos/webp/1x/@(_company.LastLogo.Guid).webp,
/assets/logos/webp/2x/@(_company.LastLogo.Guid).webp 2x,
/assets/logos/webp/3x/@(_company.LastLogo.Guid).webp 3x">
<img srcset="/assets/logos/png/1x/@(_company.LastLogo.Guid).png,
/assets/logos/png/2x/@(_company.LastLogo.Guid).png 2x,
/assets/logos/png/3x/@(_company.LastLogo.Guid).png 3x" src="/assets/logos/png/1x@(_company.LastLogo.Guid).png" alt="" height="auto" width="auto" style="max-height: 256px; max-width: 256px" />
</picture>
}
</p>
<div class="row">
@{
_carrouselActive = "active";
}
@if (_company.Logos != null &&
_company.Logos.Count > 1)
{
// TODO: Carousel
<div class="col-3">
<div class="carousel slide" data-ride="carousel" id="logosCarousel">
<div class="carousel-inner">
@foreach (var logo in _company.Logos.Where(logo => File.Exists(Path.Combine(Host.WebRootPath, "assets/logos", logo.Guid + ".svg"))))
{
<div class="carousel-item @_carrouselActive">
<picture>
<source type="image/svg+xml" srcset="/assets/logos/@(logo.Guid).svg">
<source type="image/webp" srcset="/assets/logos/webp/1x/@(logo.Guid).webp,
/assets/logos/webp/1x/@(logo.Guid).webp 2x,
/assets/logos/webp/1x/@(logo.Guid).webp 3x">
<img class="d-block w-100" srcset="/assets/logos/png/1x/@(logo.Guid).png,
/assets/logos/png/1x/@(logo.Guid).png 2x,
/assets/logos/png/1x/@(logo.Guid).webp 3x" src="/assets/logos/png/1x@(logo.Guid).png" alt="" height="auto" width="auto" style="max-height: 256px; max-width: 256px" />
</picture>
</div>
_carrouselActive = null;
}
</div>
<a class="carousel-control-prev" data-slide="prev" href="#logosCarousel" role="button">
<span aria-hidden="true" class="carousel-control-prev-icon">
</span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" data-slide="next" href="#logosCarousel" role="button">
<span aria-hidden="true" class="carousel-control-next-icon">
</span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
}
<div class="col-md">
<table>
<tr>
<th colspan="2">
<b>@_company.Name</b>
</th>
</tr>
@if (_company.Founded.HasValue)
{
<tr>
<th>@L["Founded"]</th>
<td>@_company.Founded.Value.ToLongDateString().</td>
</tr>
}
<tr>
<th>@L["Country"]</th>
<td>
<a href="/companies/country/@_company.Country.Id">
@if (File.Exists(Path.Combine(Host.WebRootPath, "assets/flags/countries", _company.Country.Id + ".svg")))
{
<picture>
<source type="image/svg+xml" srcset="/assets/flags/countries/@(_company.Country.Id).svg">
<source type="image/webp" srcset="/assets/flags/countries/webp/1x/@(_company.Country.Id).webp,
/assets/flags/countries/webp/1x/@(_company.Country.Id).webp 2x,
/assets/flags/countries/webp/1x/@(_company.Country.Id).webp 3x">
<img srcset="/assets/flags/countries/png/1x/@(_company.Country.Id).png,
/assets/flags/countries/png/1x/@(_company.Country.Id).png 2x,
/assets/flags/countries/png/1x/@(_company.Country.Id).webp 3x" src="/assets/flags/countries/png/1x@(_company.Country.Id).png" alt="" height="32" />
</picture>
}
@L[_company.Country.Name]
</a>
</td>
</tr>
<tr>
<th>@L["Status"]</th>
@switch (_company.Status)
{
case CompanyStatus.Unknown:
<td>@L["Current company status is unknown."]</td>
break;
case CompanyStatus.Active:
<td>@L["Company is active."]</td>
break;
case CompanyStatus.Sold:
if (_company.Sold != null)
{
if (_soldTo != null)
{
<td>
<a href="/companies/@_soldTo.Id">
@string.Format(L["Company sold to {0} on {1}."], _soldTo.Name, _company.Sold.Value.ToLongDateString())</a>
</td>
}
else
{
<td>@string.Format(L["Company sold on {0} to an unknown company."], _company.Sold.Value.ToLongDateString())</td>
}
}
else
{
if (_soldTo != null)
{
<td>
<a href="/companies/@_soldTo.Id">
@string.Format(L["Company sold to {0} on an unknown date."], _soldTo.Name)</a>
</td>
}
else
{
<td>@L["Company was sold to an unknown company on an unknown date."]</td>
}
}
break;
case CompanyStatus.Merged:
if (_company.Sold != null)
{
if (_soldTo != null)
{
<td>
<a href="/companies/@_soldTo.Id">@string.Format(L["Company merged on {0} to form {1}."], _company.Sold.Value.ToLongDateString(), _soldTo.Name)</a>
</td>
}
else
{
<td>@string.Format(L["Company merged on {0} to form an unknown company."], _company.Sold.Value.ToLongDateString())</td>
}
}
else
{
if (_soldTo != null)
{
<td>
<a href="/companies/@_soldTo.Id">@string.Format(L["Company merged on an unknown date to form {0}."], _soldTo.Name)</a>
</td>
}
else
{
<td>@L["Company merged to form an unknown company on an unknown date."]</td>
}
}
break;
case CompanyStatus.Bankrupt:
if (_company.Sold != null)
{
<td>@string.Format(L["Company declared bankruptcy on {0}."], _company.Sold.Value.ToLongDateString())</td>
}
else
{
<td>@L["Company declared bankruptcy on an unknown date."]</td>
}
break;
case CompanyStatus.Defunct:
if (_company.Sold != null)
{
<td>@string.Format(L["Company ceased operations on {0}."], _company.Sold.Value.ToLongDateString())</td>
}
else
{
<td>@L["Company ceased operations on an unknown date."]</td>
}
break;
case CompanyStatus.Renamed:
if (_company.Sold != null)
{
if (_soldTo != null)
{
<td>
<a href="/companies/@_soldTo.Id">@string.Format(L["Company renamed to {0} on {1}."], _soldTo.Name, _company.Sold.Value.ToLongDateString())</a>
</td>
}
else
{
<td>@string.Format(L["Company was renamed on {0} to an unknown name."], _company.Sold.Value.ToLongDateString())</td>
}
}
else
{
if (_soldTo != null)
{
<td>
<a href="/companies/@_soldTo.Id">
@string.Format(L["Company renamed to {0} on an unknown date."], _soldTo.Name)</a>
</td>
}
else
{
<td>@L["Company renamed to an unknown name on an unknown date."]</td>
}
}
break;
default:
throw new ArgumentOutOfRangeException();
}
</tr>
<tr>
<th>@L["Address"]</th>
<td>
@_company.Address<br>
@if (_company.City != _company.Province)
{
@_company.City<br>
}
@_company.PostalCode @_company.Province</td>
</tr>
@if (!string.IsNullOrEmpty(_company.Website) ||
!string.IsNullOrEmpty(_company.Twitter) ||
!string.IsNullOrEmpty(_company.Facebook))
{
<tr>
<th>@L["Links"]</th>
<td>
@if (!string.IsNullOrEmpty(_company.Website))
{
<a href="@_company.Website">@L["Website"]</a>
<br />
}
@if (!string.IsNullOrEmpty(_company.Twitter))
{
<a href="https://www.twitter.com/@_company.Twitter">Twitter</a>
<br />
}
@if (!string.IsNullOrEmpty(_company.Facebook))
{
<a href="https://www.facebook.com/@_company.Facebook">Facebook</a>
<br />
}
</td>
</tr>
}
</table>
</div>
</div>
@{
// TODO: Accordion
}
<div class="row" id="itemsAccordion">
<div class="card">
@if (_computers.Count > 0)
{
<div class="card-header" id="headingComputers">
<h5 class="mb-0">
<button aria-controls="collapseComputers" aria-expanded="false" class="btn btn-info" data-target="#collapseComputers" data-toggle="collapse">
@((MarkupString)string.Format(@L["<ok>{0}</ok> computers known."], _computers.Count).Replace("<ok>", "<span class=\"badge badge-success\">").Replace("</ok>","</span>"))
</button>
</h5>
</div>
<div aria-labelledby="headingComputers" class="collapse" data-parent="#itemsAccordion" id="collapseComputers">
<div class="card-body">
@foreach (var computer in _computers)
{
<a href="/machines/@computer.Id">
@computer.Name</a>
<br />
}
</div>
</div>
}
else
{
<div class="card-header" id="headingComputers">
<h5 class="mb-0">
<button class="btn btn-info">
@((MarkupString)L["<red>No</red> computers known."].ToString().Replace("<red>", "<span class=\"badge badge-danger\">").Replace("</red>","</span>"))
</button>
</h5>
</div>
}
@if (_consoles.Count > 0)
{
<div class="card-header" id="headingConsoles">
<h5 class="mb-0">
<button aria-controls="collapseConsoles" aria-expanded="false" class="btn btn-info" data-target="#collapseConsoles" data-toggle="collapse">
@((MarkupString)string.Format(@L["<ok>{0}</ok> videogame consoles known."], _consoles.Count).Replace("<ok>", "<span class=\"badge badge-success\">").Replace("</ok>","</span>"))
</button>
</h5>
</div>
<div aria-labelledby="headingConsoles" class="collapse" data-parent="#itemsAccordion" id="collapseConsoles">
<div class="card-body">
@foreach (var console in _consoles)
{
<a href="/machines/@console.Id">
@console.Name</a>
<br />
}
</div>
</div>
}
else
{
<div class="card-header" id="headingComputers">
<h5 class="mb-0">
<button class="btn btn-info">
@((MarkupString)L["<red>No</red> videogame consoles known."].ToString().Replace("<red>", "<span class=\"badge badge-danger\">").Replace("</red>","</span>"))
</button>
</h5>
</div>
}
</div>
</div>
@if (_description != null)
{
<div class="container-fluid row">
@((MarkupString)_description)
</div>
}
</div>
@code
{
[Parameter]
public int Id { get; set; }
bool _loaded;
Company _company;
string _carrouselActive;
List<Machine> _computers;
List<Machine> _consoles;
string _description;
Company _soldTo;
protected override async Task OnInitializedAsync()
{
if(Id <= 0)
{
_loaded = true;
return;
}
_company = await Service.GetCompanyAsync(Id);
var machines = await Service.GetMachinesAsync(Id);
_computers = machines.Where(m => m.Type == MachineType.Computer).ToList();
_consoles = machines.Where(m => m.Type == MachineType.Console).ToList();
_description = await Service.GetDescriptionAsync(Id);
_soldTo = await Service.GetSoldToAsync(_company.SoldToId);
_loaded = true;
}
}

View File

@@ -126,4 +126,120 @@
<value>{0} compañías en la base de datos.</value>
<comment>How many companies are in the database, {0} is a number</comment>
</data>
<data name="Company not found." xml:space="preserve">
<value>Compañía no encontrada</value>
<comment>Cannot find the requested company id</comment>
</data>
<data name="Founded" xml:space="preserve">
<value>Fundación</value>
<comment>Date of company foundation</comment>
</data>
<data name="Country" xml:space="preserve">
<value>País</value>
<comment>Country where the company was established</comment>
</data>
<data name="Status" xml:space="preserve">
<value>Estado</value>
<comment>Company status</comment>
</data>
<data name="Current company status is unknown." xml:space="preserve">
<value>Estado actual desconocido.</value>
<comment>Current status unknown.</comment>
</data>
<data name="Company is active." xml:space="preserve">
<value>Activa</value>
<comment>Company is active</comment>
</data>
<data name="Company sold to {0} on {1}." xml:space="preserve">
<value>Vendida a {0} el {1}.</value>
<comment>Sold to, {0} buyer company name, {1} date</comment>
</data>
<data name="Company sold on {0} to an unknown company." xml:space="preserve">
<value>Vendida el {0} a una compañía desconocida.</value>
<comment>Sold to an unknown company, {0} date</comment>
</data>
<data name="Company sold to {0} on an unknown date." xml:space="preserve">
<value>Vendida a {0} en una fecha desconocida.</value>
<comment>Sold to on an unknown date, {0} buyer company name.</comment>
</data>
<data name="Company was sold to an unknown company on an unknown date." xml:space="preserve">
<value>Vendida a una compañía desconocida en una fecha desconocida.</value>
<comment>Sold, unknown company or date</comment>
</data>
<data name="Company merged on {0} to form {1}." xml:space="preserve">
<value>Fusionada el {0} para formar {1}.</value>
<comment>Merged, {0} date, {1} resulting company</comment>
</data>
<data name="Company merged on {0} to form an unknown company." xml:space="preserve">
<value>Fusionada el {0} para formar una compañía desconocida.</value>
<comment>Merged, unknown resulting company, {0} date</comment>
</data>
<data name="Company merged on an unknown date to form {0}." xml:space="preserve">
<value>Fusionada para format {0} en una fecha desconocida.</value>
<comment>Merged, {0} resulting company, date unknown</comment>
</data>
<data name="Company merged to form an unknown company on an unknown date." xml:space="preserve">
<value>Fusionada en una fecha desconocida para format una compañía desconocida.</value>
<comment>Merged, unknown resulting company or date</comment>
</data>
<data name="Company declared bankruptcy on {0}." xml:space="preserve">
<value>Declaró bancarrota el {0}.</value>
<comment>Declared bankruptcy, {0} date</comment>
</data>
<data name="Company declared bankruptcy on an unknown date." xml:space="preserve">
<value>Declaró bancarrota en una fecha desconocida.</value>
<comment>Declared bankruptcy, unknown date</comment>
</data>
<data name="Company ceased operations on {0}." xml:space="preserve">
<value>Cesó las operaciones el {0}.</value>
<comment>Ceased operations, {0} date</comment>
</data>
<data name="Company ceased operations on an unknown date." xml:space="preserve">
<value>Cesó las operaciones en una fecha desconocida.</value>
<comment>Ceased operations, unknown date</comment>
</data>
<data name="Company renamed to {0} on {1}." xml:space="preserve">
<value>Cambió el nombre a {0} el {1}.</value>
<comment>Renamed, {0} new name, {1} date</comment>
</data>
<data name="Company was renamed on {0} to an unknown name." xml:space="preserve">
<value>Cambió el nombre en {0} a uno desconocido..</value>
<comment>Renamed, {0} date, unknown new name</comment>
</data>
<data name="Company renamed to {0} on an unknown date." xml:space="preserve">
<value>Cambió el nombre a {0} en una fecha desconocida.</value>
<comment>Renamed, {0} new name, unknown date</comment>
</data>
<data name="Company renamed to an unknown name on an unknown date." xml:space="preserve">
<value>Cambió el nombre a uno desconocido en una fecha desconocida.</value>
<comment>Renamed, unknown date, unknown new name</comment>
</data>
<data name="Address" xml:space="preserve">
<value>Dirección</value>
<comment>Postal address</comment>
</data>
<data name="Links" xml:space="preserve">
<value>Enlaces</value>
<comment>Web links</comment>
</data>
<data name="Website" xml:space="preserve">
<value>Página web</value>
<comment>Main web link</comment>
</data>
<data name="&lt;ok&gt;{0}&lt;/ok&gt; computers known." xml:space="preserve">
<value>&lt;ok&gt;{0}&lt;/ok&gt; ordenadores conocidos.</value>
<comment>Known computers, {0} number. Do not translate &lt;ok&gt; neither &lt;/ok&gt; and keep number in between.</comment>
</data>
<data name="&lt;ok&gt;{0}&lt;/ok&gt; videogame consoles known." xml:space="preserve">
<value>&lt;ok&gt;{0}&lt;/ok&gt; videoconsolas conocidas.</value>
<comment>Known video game consoles, {0} number. Do not translate &lt;ok&gt; neither &lt;/ok&gt; and keep number in between.</comment>
</data>
<data name="&lt;red&gt;No&lt;/red&gt; computers known." xml:space="preserve">
<value>&lt;red&gt;Ningún&lt;/red&gt; ordenador conocido.</value>
<comment>There are no known computers. Do not translate &lt;red&gt; neither &lt;/red&gt; and keep negation in between.</comment>
</data>
<data name="&lt;red&gt;No&lt;/red&gt; videogame consoles known." xml:space="preserve">
<value>&lt;red&gt;Ninguna&lt;/red&gt; videoconsola conocida.</value>
<comment>There are no known computers. Do not translate &lt;red&gt; neither &lt;/red&gt; and keep negation in between.</comment>
</data>
</root>

View File

@@ -59,5 +59,26 @@ namespace Marechai.Services
FirstOrDefault().Guid,
Name = c.Name
}).ToListAsync();
public Task<Company> GetCompanyAsync(int id) => _context.Companies.FirstOrDefaultAsync(c => c.Id == id);
public async Task<List<Machine>> GetMachinesAsync(int id) =>
await _context.Machines.Where(m => m.CompanyId == id).OrderBy(m => m.Name).Select(m => new Machine
{
Id = m.Id, Name = m.Name, Type = m.Type
}).ToListAsync();
public async Task<string> GetDescriptionAsync(int id)
{
CompanyDescription description =
await _context.CompanyDescriptions.FirstOrDefaultAsync(d => d.CompanyId == id);
return description?.Html ?? description?.Text;
}
public async Task<Company> GetSoldToAsync(int? id) => await _context.Companies.Select(c => new Company
{
Id = c.Id, Name = c.Name
}).FirstOrDefaultAsync(c => c.Id == id);
}
}

View File

@@ -1,378 +0,0 @@
@{
/******************************************************************************
// MARECHAI: Master repository of computing history artifacts information
// ----------------------------------------------------------------------------
//
// Filename : ByLetter.cshtml
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// --[ Description ] ----------------------------------------------------------
//
// Lists computers by company
//
// --[ License ] --------------------------------------------------------------
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2003-2020 Natalia Portillo
*******************************************************************************/
ViewData["Title"] = "Companies";
}
@using System.IO
@using Marechai.Database
@model Marechai.Database.Models.Company
@if (Model != null)
{
<div class="container-fluid">
<p align=center>
@if (Model.LastLogo != null &&
File.Exists(System.IO.Path.Combine(ViewBag.WebRootPath, "assets/logos", Model.LastLogo.Guid + ".svg")))
{
<picture>
<source type="image/svg+xml" srcset="/assets/logos/@(Model.LastLogo.Guid).svg">
<source type="image/webp" srcset="/assets/logos/webp/1x/@(Model.LastLogo.Guid).webp,
/assets/logos/webp/2x/@(Model.LastLogo.Guid).webp 2x,
/assets/logos/webp/3x/@(Model.LastLogo.Guid).webp 3x">
<img srcset="/assets/logos/png/1x/@(Model.LastLogo.Guid).png,
/assets/logos/png/2x/@(Model.LastLogo.Guid).png 2x,
/assets/logos/png/3x/@(Model.LastLogo.Guid).png 3x" src="/assets/logos/png/1x@(Model.LastLogo.Guid).png" ) alt="" height="auto" width="auto" style="max-height: 256px; max-width: 256px" />
</picture>
}
</p>
<div class="row">
@{
var carrouselActive = "active";
}
@if (Model.Logos != null &&
Model.Logos.Count > 1)
{
<div class="col-3">
<div class="carousel slide" data-ride="carousel" id="logosCarousel">
<div class="carousel-inner">
@foreach (var logo in Model.Logos)
{
if (File.Exists(System.IO.Path.Combine(ViewBag.WebRootPath, "assets/logos", logo.Guid + ".svg")))
{
<div class="carousel-item @carrouselActive">
<picture>
<source type="image/svg+xml" srcset="/assets/logos/@(logo.Guid).svg">
<source type="image/webp" srcset="/assets/logos/webp/1x/@(logo.Guid).webp,
/assets/logos/webp/1x/@(logo.Guid).webp 2x,
/assets/logos/webp/1x/@(logo.Guid).webp 3x">
<img class="d-block w-100" srcset="/assets/logos/png/1x/@(logo.Guid).png,
/assets/logos/png/1x/@(logo.Guid).png 2x,
/assets/logos/png/1x/@(logo.Guid).webp 3x" src="/assets/logos/png/1x@(logo.Guid).png" ) alt="" height="auto" width="auto" style="max-height: 256px; max-width: 256px" />
</picture>
</div>
carrouselActive = null;
}
}
</div>
<a class="carousel-control-prev" data-slide="prev" href="#logosCarousel" role="button">
<span aria-hidden="true" class="carousel-control-prev-icon">
</span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" data-slide="next" href="#logosCarousel" role="button">
<span aria-hidden="true" class="carousel-control-next-icon">
</span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
}
<div class="col-md">
<table>
<tr>
<th colspan="2">
<b>@Model.Name</b>
</th>
</tr>
@if (Model.Founded.HasValue)
{
<tr>
<th>Founded</th>
<td>@Model.Founded.Value.ToLongDateString().</td>
</tr>
}
<tr>
<th>Country</th>
<td>
<a asp-action="ByCountry" asp-controller="Company" asp-route-id="@Model.Country.Id">
@if (File.Exists(System.IO.Path.Combine(ViewBag.WebRootPath, "assets/flags/countries", Model.Country.Id + ".svg")))
{
<picture>
<source type="image/svg+xml" srcset="/assets/flags/countries/@(Model.Country.Id).svg">
<source type="image/webp" srcset="/assets/flags/countries/webp/1x/@(Model.Country.Id).webp,
/assets/flags/countries/webp/1x/@(Model.Country.Id).webp 2x,
/assets/flags/countries/webp/1x/@(Model.Country.Id).webp 3x">
<img srcset="/assets/flags/countries/png/1x/@(Model.Country.Id).png,
/assets/flags/countries/png/1x/@(Model.Country.Id).png 2x,
/assets/flags/countries/png/1x/@(Model.Country.Id).webp 3x" src="/assets/flags/countries/png/1x@(Model.Country.Id).png" ) alt="" height="32" />
</picture>
}
@Model.Country.Name
</a>
</td>
</tr>
<tr>
<th>Status</th>
@switch (Model.Status)
{
case CompanyStatus.Unknown:
<td>Current company status is unknown.</td>
break;
case CompanyStatus.Active:
<td>Company is active.</td>
break;
case CompanyStatus.Sold:
if (Model.Sold != DateTime.MinValue)
{
if (Model.SoldTo != null)
{
<td>
Company was sold to
<a asp-controller="Company" asp-action="View" asp-route-id="@Model.SoldTo.Id">
@Model.SoldTo.Name</a> on @Model.Sold.Value.ToLongDateString().
</td>
}
else
{
<td>Company was sold on @Model.Sold.Value.ToLongDateString() to an unknown company.</td>
}
}
else
{
if (Model.SoldTo != null)
{
<td>
Company was sold to
<a asp-controller="Company" asp-action="View" asp-route-id="@Model.SoldTo.Id">
@Model.SoldTo.Name</a> on an unknown date.
</td>
}
else
{
<td>Company was sold to an unknown company on an unknown date.</td>
}
}
break;
case CompanyStatus.Merged:
if (Model.Sold != DateTime.MinValue)
{
if (Model.SoldTo != null)
{
<td>
Company was merged on @Model.Sold.Value.ToLongDateString() to form
<a asp-controller="Company" asp-action="View" asp-route-id="@Model.SoldTo.Id">
@Model.SoldTo.Name</a>.
</td>
}
else
{
<td>Company was merge on @Model.Sold.Value.ToLongDateString() to form an unknown company.</td>
}
}
else
{
if (Model.SoldTo != null)
{
<td>
Company was merged on an unknown date to form
<a asp-controller="Company" asp-action="View" asp-route-id="@Model.SoldTo.Id">
@Model.SoldTo.Name</a>.
</td>
}
else
{
<td>Company was merged to form an unknown company on an unknown date.</td>
}
}
break;
case CompanyStatus.Bankrupt:
if (Model.Sold != DateTime.MinValue)
{
<td>Company declared bankruptcy on @Model.Sold.Value.ToLongDateString().</td>
}
else
{
<td>Company declared bankruptcy on an unknown date.</td>
}
break;
case CompanyStatus.Defunct:
if (Model.Sold != DateTime.MinValue)
{
<td>Company ceased operations on @Model.Sold.Value.ToLongDateString().</td>
}
else
{
<td>Company ceased operations on an unknown date.</td>
}
break;
case CompanyStatus.Renamed:
if (Model.Sold != DateTime.MinValue)
{
if (Model.SoldTo != null)
{
<td>
Company was renamed to
<a asp-controller="Company" asp-action="View" asp-route-id="@Model.SoldTo.Id">
@Model.SoldTo.Name</a> on @Model.Sold.Value.ToLongDateString().
</td>
}
else
{
<td>Company was renamed on @Model.Sold.Value.ToLongDateString() to an unknown name.</td>
}
}
else
{
if (Model.SoldTo != null)
{
<td>
Company was renamed to
<a asp-controller="Company" asp-action="View" asp-route-id="@Model.SoldTo.Id">
@Model.SoldTo.Name</a> on an unknown date.
</td>
}
else
{
<td>Company was renamed to an unknown name on an unknown date.</td>
}
}
break;
default:
throw new ArgumentOutOfRangeException();
}
</tr>
<tr>
<th>Address</th>
<td>
@Model.Address<br>
@if (Model.City != Model.Province)
{
@Model.City<br>
}
@Model.PostalCode @Model.Province</td>
</tr>
@if (!string.IsNullOrEmpty(Model.Website) ||
!string.IsNullOrEmpty(Model.Twitter) ||
!string.IsNullOrEmpty(Model.Facebook))
{
<tr>
<th>Links</th>
<td>
@if (!string.IsNullOrEmpty(Model.Website))
{
<a href="@Model.Website">Website</a>
<br />
}
@if (!string.IsNullOrEmpty(Model.Twitter))
{
<a href="https://www.twitter.com/@Model.Twitter">Twitter</a>
<br />
}
@if (!string.IsNullOrEmpty(Model.Facebook))
{
<a href="https://www.facebook.com/@Model.Facebook">Facebook</a>
<br />
}
</td>
</tr>
}
</table>
</div>
</div>
<div class="row" id="itemsAccordion">
<div class="card">
@if (Model.Machines.Any(t => t.Type == MachineType.Computer))
{
<div class="card-header" id="headingComputers">
<h5 class="mb-0">
<button aria-controls="collapseComputers" aria-expanded="false" class="btn btn-info" data-target="#collapseComputers" data-toggle="collapse">
<span class="badge badge-success">@Model.Machines.Count(t => t.Type == MachineType.Computer)</span> computers known.
</button>
</h5>
</div>
<div aria-labelledby="headingComputers" class="collapse" data-parent="#itemsAccordion" id="collapseComputers">
<div class="card-body">
@foreach (var computer in Model.Machines.Where(t => t.Type == MachineType.Computer))
{
<a asp-controller="Machine" asp-action="View" asp-route-id="@computer.Id">
@computer.Name</a>
<br />
}
</div>
</div>
}
else
{
<div class="card-header" id="headingComputers">
<h5 class="mb-0">
<button class="btn btn-info">
<span class="badge badge-danger">No</span> computers known.
</button>
</h5>
</div>
}
@if (Model.Machines.Any(t => t.Type == MachineType.Console))
{
<div class="card-header" id="headingConsoles">
<h5 class="mb-0">
<button aria-controls="collapseConsoles" aria-expanded="false" class="btn btn-info" data-target="#collapseConsoles" data-toggle="collapse">
<span class="badge badge-success">@Model.Machines.Count(t => t.Type == MachineType.Console)</span> videogame consoles known.
</button>
</h5>
</div>
<div aria-labelledby="headingConsoles" class="collapse" data-parent="#itemsAccordion" id="collapseConsoles">
<div class="card-body">
@foreach (var console in Model.Machines.Where(t => t.Type == MachineType.Console))
{
<a asp-controller="Machine" asp-action="View" asp-route-id="@console.Id">
@console.Name</a>
<br />
}
</div>
</div>
}
else
{
<div class="card-header" id="headingComputers">
<h5 class="mb-0">
<button class="btn btn-info">
<span class="badge badge-danger">No</span> videogame consoles known.
</button>
</h5>
</div>
}
</div>
</div>
@if (ViewBag.CompanyDescription != null)
{
<div class="container-fluid row">
@Html.Raw(ViewBag.CompanyDescription)
</div>
}
</div>
}
else
{
<p>Company not found!</p>
}