Compare commits

...

1 Commits

Author SHA1 Message Date
325a06e6b0 BB: Card Styling 2026-04-11 18:18:10 +02:00
5 changed files with 259 additions and 2 deletions

View File

@@ -0,0 +1,138 @@
@using SZUAbsolventenverein.Module.BlackBoard.Services
@using SZUAbsolventenverein.Module.BlackBoard.Models
@using Interfaces
@namespace SZUAbsolventenverein.Module.BlackBoard
@inherits ModuleBase
@inject IBlackBoardService BlackBoardService
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Details> Localizer
@inject IReportUI ReportingComponent
@if (_item == null)
{
<p><em>Loading...</em></p>
}
else
{
<div class="row g-0">
<div class="col-lg-5 position-relative d-flex align-items-center justify-content-center p-4" style="min-height: 400px;">
@if (_item.ImageID > 0)
{
<div class="bb-detail-image-bg" style="background-image: url('@ImageUrl(_item.ImageID, 800, 600)');"></div>
<img src="@ImageUrl(_item.ImageID, 800, 600)" class="img-fluid rounded-3 shadow position-relative" style="max-height: 450px; z-index: 1; border: 8px solid white; object-fit: cover;" alt="@_item.Name">
}
else
{
<div class="text-muted position-relative" style="z-index: 1;">
<span style="font-size: 8rem; opacity: 0.2;">📋</span>
</div>
}
</div>
<div class="col-lg-7">
<div class="card-body p-4 p-md-5">
<div class="mb-4">
<h1 class="display-4 fw-bold text-dark mb-0">@_item.Name</h1>
</div>
<hr class="my-4" style="width: 100px; height: 3px; background-color: var(--primary); opacity: 1;">
<div class="bb-description-section mb-5">
<h5 class="text-uppercase fw-bold text-muted mb-3" style="letter-spacing: 1px; font-size: 0.9rem;">Beschreibung</h5>
<div class="lead text-dark mb-4" style="line-height: 1.7; font-size: 1.1rem;">
@((MarkupString)(_item.Description ?? ""))
</div>
</div>
<div class="bb-detail-audit mb-4">
<AuditInfo CreatedBy="@_item.CreatedBy" CreatedOn="@_item.CreatedOn" ModifiedBy="@_item.ModifiedBy" ModifiedOn="@_item.ModifiedOn"></AuditInfo>
</div>
<div class="d-flex flex-wrap gap-3 mt-5">
<NavLink class="btn btn-outline-secondary btn-lg px-4" href="@NavigateUrl()">
<i class="oi oi-arrow-left me-2"></i> Zurück
</NavLink>
<div class="ms-auto d-flex gap-2">
<ActionLink Action="Edit" Parameters="@("id=" + _item.BlackBoardId.ToString())" Class="btn btn-primary btn-lg px-4" Security="SecurityAccessLevel.Edit" Text="Bearbeiten" ResourceKey="Edit" />
<ActionDialog Header="Delete BlackBoard" Message="@Localizer["Message.DeleteConfirm"]" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger btn-lg px-4" ConfirmClass="absolute" OnClick="@(async () => await DeleteEntry())" ResourceKey="Delete" Id="@_item.BlackBoardId.ToString()" />
@if (ReportingComponent != null)
{
<DynamicComponent Type="@ReportingComponent.ReportType" Parameters="@_parameters" />
}
</div>
</div>
</div>
</div>
</div>
}
<style>
.bb-detail-image-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-size: cover;
background-position: center;
filter: blur(30px) brightness(1.1);
opacity: 0.15;
z-index: 0;
}
.bb-details .card {
background: #ffffff;
}
.bb-details .breadcrumb-item a {
text-decoration: none;
color: var(--primary);
}
</style>
@code {
public override string Actions => "Details";
public override List<Resource> Resources => [
new Stylesheet("_content/SZUAbsolventenverein.Module.BlackBoard/Module.css")
];
private BlackBoard _item;
private int _id;
private Dictionary<string, object> _parameters = new Dictionary<string, object>();
protected override async Task OnInitializedAsync()
{
try
{
_id = Int32.Parse(PageState.QueryString["id"]);
_item = await BlackBoardService.GetBlackBoardAsync(_id, ModuleState.ModuleId);
if (_item != null && ReportingComponent != null)
{
_parameters = ReportingComponent.ConstructParameterList(_item, RenderModeBoundary);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading BlackBoard {BlackBoardId} {Error}", _id, ex.Message);
AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error);
}
}
private async Task DeleteEntry()
{
try
{
await BlackBoardService.DeleteBlackBoardAsync(_item.BlackBoardId, ModuleState.ModuleId);
await logger.LogInformation("BlackBoard Deleted {BlackBoard}", _item);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting BlackBoard {Error}", ex.Message);
AddModuleMessage(Localizer["Message.DeleteError"], MessageType.Error);
}
}
}

View File

@@ -39,7 +39,7 @@ else
<h5>@item.Name</h5>
@if (!string.IsNullOrWhiteSpace(item.Description))
{
<div class="bb-card-desc">@((MarkupString)item.Description)</div>
<div class="bb-card-desc">@(item.Description)</div>
}
</div>
@@ -48,6 +48,7 @@ else
</div>
<div class="bb-card-footer">
<ActionLink Action="Details" Parameters="@("id=" + item.BlackBoardId.ToString())" Class="btn btn-primary" Text="Details" ResourceKey="Details"/>
<ActionLink Action="Edit" Parameters="@("id=" + item.BlackBoardId.ToString())" ResourceKey="Edit"/>
<ActionDialog Header="Delete BlackBoard" Message="Are You Sure You Wish To Delete This BlackBoard?" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" ConfirmClass="absolute" OnClick="@(async () => await Delete(item))" ResourceKey="Delete" Id="@item.BlackBoardId.ToString()"/>
</div>

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Edit.Text" xml:space="preserve">
<value>Bearbeiten</value>
</data>
<data name="Delete.Text" xml:space="preserve">
<value>Löschen</value>
</data>
<data name="Delete.Header" xml:space="preserve">
<value>BlackBoard löschen</value>
</data>
<data name="Message.DeleteConfirm" xml:space="preserve">
<value>Möchten Sie diesen BlackBoard-Eintrag wirklich löschen?</value>
</data>
<data name="Message.LoadError" xml:space="preserve">
<value>Fehler beim Laden des BlackBoard-Eintrags</value>
</data>
<data name="Message.DeleteError" xml:space="preserve">
<value>Fehler beim Löschen des BlackBoard-Eintrags</value>
</data>
</root>

View File

@@ -1,6 +1,6 @@
<Solution>
<Project Path="..\oqtane.framework\Oqtane.Server\Oqtane.Server.csproj" DefaultStartup="true">
<Build Solution="Debug|*" Project="false" />
<Build Project="false" />
</Project>
<Project Path="Client\SZUAbsolventenverein.Module.BlackBoard.Client.csproj" />
<Project Path="Server\SZUAbsolventenverein.Module.BlackBoard.Server.csproj" />

View File

@@ -77,3 +77,42 @@
border-top: 1px solid #e9ecef;
background: #f8f9fa;
}
/* ── Blackboard Details View ── */
.bb-details .card {
background: #ffffff;
}
.bb-details .breadcrumb-item a {
text-decoration: none;
color: var(--primary);
}
.bb-detail-image-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-size: cover;
background-position: center;
filter: blur(30px) brightness(1.1);
opacity: 0.15;
z-index: 0;
}
.bb-description-section .lead {
word-wrap: break-word;
overflow-wrap: break-word;
}
.bb-description-section .lead img {
max-width: 100%;
height: auto;
border-radius: 0.5rem;
}
.bb-detail-audit {
font-size: 0.85rem;
color: #6c757d;
}