Improved news system

This commit is contained in:
Marcel Baumgartner
2023-04-13 01:38:24 +02:00
parent 631f54dd52
commit e0c9efd9a8
11 changed files with 284 additions and 229 deletions

View File

@@ -0,0 +1,78 @@
@page "/admin/system/news/edit/{Id:int}"
@using Moonlight.App.Database.Entities
@using Moonlight.App.Helpers
@using Moonlight.App.Repositories
@using Moonlight.App.Services
@using Moonlight.Shared.Components.FileManagerPartials
@inject SmartTranslateService SmartTranslateService
@inject NavigationManager NavigationManager
@inject NewsEntryRepository NewsEntryRepository
<OnlyAdmin>
<LazyLoader Load="Load">
@if (Entry == null)
{
<div class="alert bg-info d-flex flex-column flex-sm-row w-100 p-5">
<div class="d-flex flex-column pe-0 pe-sm-10">
<h4 class="fw-semibold">
<TL>No entry found</TL>
</h4>
<span>
<TL>We were not able to find the news entry with this id</TL>
</span>
</div>
</div>
}
else
{
<div class="card mb-6">
<div class="card-header">
<h3 class="card-title w-75">
<input type="text" @bind="Entry.Title" placeholder="@SmartTranslateService.Translate("Title...")" class="form-control form-control-flush"/>
</h3>
<div class="card-toolbar">
<span class="text-gray-600 fw-semibold">@(Formatter.FormatDateOnly(Entry.Date))</span>
</div>
</div>
<div class="card-body">
<FileEditor @ref="FileEditor" Language="markdown" HideControls="true" InitialData="@(Entry.Markdown)"/>
</div>
<div class="card-footer">
<WButton CssClasses="btn btn-primary text-end"
OnClick="Save"
Text="@SmartTranslateService.Translate("Save")"
WorkingText="@SmartTranslateService.Translate("Saving...")">
</WButton>
</div>
</div>
}
</LazyLoader>
</OnlyAdmin>
@code
{
[Parameter]
public int Id { get; set; }
private NewsEntry? Entry;
private FileEditor FileEditor;
private async Task Save()
{
Entry!.Markdown = await FileEditor.GetData();
NewsEntryRepository.Update(Entry);
NavigationManager.NavigateTo("/admin/system/news");
}
private Task Load(LazyLoader arg)
{
Entry = NewsEntryRepository.Get().FirstOrDefault(x => x.Id == Id);
return Task.CompletedTask;
}
}

View File

@@ -0,0 +1,84 @@
@page "/admin/system/news"
@using Moonlight.App.Repositories
@using Moonlight.App.Database.Entities
@using Markdig
@using Moonlight.App.Helpers
@using Moonlight.App.Services
@using Moonlight.App.Services.Interop
@using Moonlight.Shared.Components.Navigations
@using Moonlight.Shared.Components.FileManagerPartials
@inject NewsEntryRepository NewsEntryRepository
@inject SmartTranslateService SmartTranslateService
@inject AlertService AlertService
<OnlyAdmin>
<AdminSystemNavigation Index="7" />
<div class="card card-body mb-6">
<div class="text-end">
<a href="/admin/system/news/new" class="btn btn-success">
<TL>New entry</TL>
</a>
</div>
</div>
<LazyLoader @ref="LazyLoader" Load="Load">
@foreach (var entry in Entries)
{
<div class="card mb-6">
<div class="card-header">
<h3 class="card-title">@entry.Title</h3>
<div class="card-toolbar">
<a href="/admin/system/news/edit/@(entry.Id)">
<button class="btn btn-sm btn-light me-4">
<TL>Edit</TL>
</button>
</a>
<WButton CssClasses="btn btn-sm btn-light me-4"
Text="@SmartTranslateService.Translate("Delete")"
WorkingText="@SmartTranslateService.Translate("Deleting...")"
OnClick="() => Delete(entry)">
</WButton>
<span class="text-gray-600 fw-semibold">@(Formatter.FormatDateOnly(entry.Date))</span>
</div>
</div>
<div class="card-body">
@{
var html = (MarkupString)Markdown.ToHtml(entry.Markdown);
}
@(html)
</div>
</div>
}
</LazyLoader>
</OnlyAdmin>
@code
{
private NewsEntry[] Entries;
private LazyLoader LazyLoader;
private FileEditor FileEditor;
private Task Load(LazyLoader loader)
{
Entries = NewsEntryRepository.Get().OrderByDescending(x => x.Date).ToArray();
return Task.CompletedTask;
}
private async Task Delete(NewsEntry entry)
{
var confirm = await AlertService.ConfirmMath();
if (!confirm) return;
NewsEntryRepository.Delete(entry);
await LazyLoader.Reload();
}
}

View File

@@ -0,0 +1,52 @@
@page "/admin/system/news/new"
@using Moonlight.App.Database.Entities
@using Moonlight.App.Helpers
@using Moonlight.App.Repositories
@using Moonlight.App.Services
@using Moonlight.Shared.Components.FileManagerPartials
@inject SmartTranslateService SmartTranslateService
@inject NavigationManager NavigationManager
@inject NewsEntryRepository NewsEntryRepository
<OnlyAdmin>
<div class="card mb-6">
<div class="card-header">
<h3 class="card-title w-75">
<input type="text" @bind="Model.Title" placeholder="@SmartTranslateService.Translate("Title...")" class="form-control form-control-flush"/>
</h3>
<div class="card-toolbar">
<span class="text-gray-600 fw-semibold">@(Formatter.FormatDateOnly(Model.Date))</span>
</div>
</div>
<div class="card-body">
<FileEditor @ref="FileEditor" Language="markdown" HideControls="true" InitialData=""/>
</div>
<div class="card-footer">
<WButton CssClasses="btn btn-primary text-end"
OnClick="Save"
Text="@SmartTranslateService.Translate("Save")"
WorkingText="@SmartTranslateService.Translate("Saving...")">
</WButton>
</div>
</div>
</OnlyAdmin>
@code
{
private NewsEntry Model = new() //TODO: Smart form model
{
Date = DateTime.UtcNow
};
private FileEditor FileEditor;
private async Task Save()
{
Model.Markdown = await FileEditor.GetData();
NewsEntryRepository.Add(Model);
NavigationManager.NavigateTo("/admin/system/news");
}
}