diff --git a/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Edit.razor b/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Edit.razor index c35864d..a7055fa 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Edit.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Edit.razor @@ -8,9 +8,9 @@ @inject IBlackBoardService BlackBoardService @inject NavigationManager NavigationManager @inject IStringLocalizer Localizer -@inject IReportUI ReportingComponent // TODO +@inject IReportUI ReportingComponent -
+
@@ -19,14 +19,14 @@
- +
- +
- +
@@ -40,7 +40,7 @@

@if (PageState.Action == "Edit") { - + }
@@ -53,20 +53,13 @@ public override string Title => "Manage BlackBoard"; - public override List Resources => new List() - { - new Stylesheet("_content/SZUAbsolventenverein.Module.BlackBoard/Module.css") - }; + public override List Resources => [new Stylesheet("_content/SZUAbsolventenverein.Module.BlackBoard/Module.css")]; private RichTextEditor RichTextEditorHtml; private ElementReference form; - private bool validated = false; + private bool validated; private int _id; - private string _createdby; - private DateTime _createdon; - private string _modifiedby; - private DateTime _modifiedon; // TODO private BlackBoard _blackBoard = new BlackBoard(); @@ -82,13 +75,8 @@ _blackBoard = await BlackBoardService.GetBlackBoardAsync(_id, ModuleState.ModuleId); if (_blackBoard != null) { - _createdby = _blackBoard.CreatedBy; - _createdon = _blackBoard.CreatedOn; - _modifiedby = _blackBoard.ModifiedBy; - _modifiedon = _blackBoard.ModifiedOn; + _parameters = ReportingComponent.ConstructParameterList(_blackBoard, RenderModeBoundary); } - - _parameters = ReportingComponent.ConstructParameterList(_blackBoard, RenderModeBoundary); } } catch (Exception ex) @@ -113,6 +101,7 @@ var interop = new Oqtane.UI.Interop(JSRuntime); if (await interop.FormValid(form)) { + _blackBoard.Description = await RichTextEditorHtml.GetHtml(); if (PageState.Action == "Add") { _blackBoard.ModuleId = ModuleState.ModuleId; @@ -138,4 +127,5 @@ AddModuleMessage(Localizer["Message.SaveError"], MessageType.Error); } } + } diff --git a/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Index.razor b/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Index.razor index c083080..cdbaa40 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Index.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.BlackBoard/Index.razor @@ -4,76 +4,100 @@ @namespace SZUAbsolventenverein.Module.BlackBoard @inherits ModuleBase @inject IBlackBoardService BlackBoardService -@inject NavigationManager NavigationManager @inject IStringLocalizer Localizer -@if (_BlackBoards == null) +@if (_blackBoards == null) { -

Loading...

+

+ Loading... +

} else { - -
-
- @if (@_BlackBoards.Count != 0) - { - -
-   -   - @Localizer["Name"] -
- - - - @context.Name - -
- } - else - { -

@Localizer["Message.DisplayNone"]

- } + +
+
+ + @if (_blackBoards.Count != 0) + { +
+ @foreach (var item in _blackBoards) + { +
+ @if (item.ImageID > 0) + { + @item.Name + } + else + { +
+ 📋 +
+ } + +
+
@item.Name
+ @if (!string.IsNullOrWhiteSpace(item.Description)) + { +
@((MarkupString)item.Description)
+ } +
+ +
+ +
+ + +
+ } +
+ } + else + { +

@Localizer["Message.DisplayNone"]

+ } } @code { - public override string RenderMode => RenderModes.Static; + public override string RenderMode => RenderModes.Static; - public override List Resources => new List() + public override List Resources => + [ + new Stylesheet("_content/SZUAbsolventenverein.Module.BlackBoard/Module.css"), + new Script("_content/SZUAbsolventenverein.Module.BlackBoard/Module.js") + ]; + + List _blackBoards; + + protected override async Task OnInitializedAsync() + { + try { - new Stylesheet("_content/SZUAbsolventenverein.Module.BlackBoard/Module.css"), - new Script("_content/SZUAbsolventenverein.Module.BlackBoard/Module.js") - }; - - List _BlackBoards; - - protected override async Task OnInitializedAsync() - { - try - { - _BlackBoards = await BlackBoardService.GetBlackBoardsAsync(ModuleState.ModuleId); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading BlackBoard {Error}", ex.Message); - AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error); - } + _blackBoards = await BlackBoardService.GetBlackBoardsAsync(ModuleState.ModuleId); } - - private async Task Delete(BlackBoard BlackBoard) + catch (Exception ex) { - try - { - await BlackBoardService.DeleteBlackBoardAsync(BlackBoard.BlackBoardId, ModuleState.ModuleId); - await logger.LogInformation("BlackBoard Deleted {BlackBoard}", BlackBoard); - _BlackBoards = await BlackBoardService.GetBlackBoardsAsync(ModuleState.ModuleId); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Deleting BlackBoard {BlackBoard} {Error}", BlackBoard, ex.Message); - AddModuleMessage(Localizer["Message.DeleteError"], MessageType.Error); - } + await logger.LogError(ex, "Error Loading BlackBoard {Error}", ex.Message); + AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error); } + } + + private async Task Delete(BlackBoard blackBoard) + { + try + { + await BlackBoardService.DeleteBlackBoardAsync(blackBoard.BlackBoardId, ModuleState.ModuleId); + await logger.LogInformation("BlackBoard Deleted {BlackBoard}", blackBoard); + _blackBoards = await BlackBoardService.GetBlackBoardsAsync(ModuleState.ModuleId); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Deleting BlackBoard {BlackBoard} {Error}", blackBoard, ex.Message); + AddModuleMessage(Localizer["Message.DeleteError"], MessageType.Error); + } + } } \ No newline at end of file diff --git a/Server/wwwroot/Module.css b/Server/wwwroot/Module.css index 0856a26..257812f 100644 --- a/Server/wwwroot/Module.css +++ b/Server/wwwroot/Module.css @@ -1 +1,79 @@ -/* Module Custom Styles */ \ No newline at end of file +/* Module Custom Styles */ + +/* ── Blackboard Card Grid ── */ +.bb-card-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 1.5rem; +} + +.bb-card { + display: flex; + flex-direction: column; + border: 1px solid #dee2e6; + border-radius: 0.75rem; + overflow: hidden; + background: #fff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + transition: + box-shadow 0.2s ease, + transform 0.2s ease; +} + +.bb-card:hover { + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12); + transform: translateY(-2px); +} + +.bb-card-img { + width: 100%; + height: 200px; + object-fit: cover; +} + +.bb-card-img-placeholder { + width: 100%; + height: 200px; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%); + color: #adb5bd; + font-size: 2.5rem; +} + +.bb-card-body { + padding: 1.25rem; + flex: 1 1 auto; +} + +.bb-card-body h5 { + margin: 0 0 0.5rem; + font-size: 1.15rem; + font-weight: 600; + color: #212529; +} + +.bb-card-desc { + font-size: 0.9rem; + color: #495057; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + line-height: 1.5; +} + +.bb-card-meta { + padding: 0 1.25rem 0.75rem; + font-size: 0.8rem; + color: #6c757d; +} + +.bb-card-footer { + display: flex; + gap: 0.5rem; + padding: 0.75rem 1.25rem; + border-top: 1px solid #e9ecef; + background: #f8f9fa; +}