diff --git a/Wave/Components/Layout/NavMenu.razor b/Wave/Components/Layout/NavMenu.razor index 8207bbc..20f5e91 100644 --- a/Wave/Components/Layout/NavMenu.razor +++ b/Wave/Components/Layout/NavMenu.razor @@ -44,6 +44,7 @@
  • @Localizer["ManageApi_Label"]
  • @Localizer["Newsletter_Label"]
  • +
  • @Localizer["Subscribers_Label"]
  • diff --git a/Wave/Components/Pages/Subscribers.razor b/Wave/Components/Pages/Subscribers.razor new file mode 100644 index 0000000..667a20e --- /dev/null +++ b/Wave/Components/Pages/Subscribers.razor @@ -0,0 +1,114 @@ +@page "/Subscribers" +@using Microsoft.EntityFrameworkCore +@using Microsoft.Extensions.Options +@using Wave.Data +@using Wave.Utilities + +@attribute [Authorize(Roles = "Admin")] + +@inject IStringLocalizer Localizer +@inject IDbContextFactory ContextFactory +@inject ILogger Logger +@inject IMessageDisplay Message +@inject IOptions Features + +@(Localizer["Title"] + TitlePostfix) + +

    @Localizer["Title"]

    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    @Localizer["Header_Email"]@Localizer["Header_Name"]@Localizer["Header_LastReceived"]@Localizer["Header_LastOpen"]@Localizer["Header_UnsubscribeReason"]@Localizer["Header_Subscribed"]
    @context.Email@context.Name@context.LastMailReceived?.ToString("g")@context.LastMailOpened?.ToString("g")@context.UnsubscribeReason
    @Localizer["Newsletter_Footer_Timezone"] @TimeZoneInfo.Local
    +
    + +
    +
    + @if (Page < 1) { + + } else { + + + + + + } + + @if (Page >= TotalPages - 1) { + + } else { + + + + + + } +
    +
    +
    + +@code { + [CascadingParameter(Name = "TitlePostfix")] + private string TitlePostfix { get; set; } = default!; + [SupplyParameterFromQuery] + public int Page { get; set; } = 0; + + private const int ItemsPerPage = 10; + private int TotalPages { get; set; } + + protected override async Task OnInitializedAsync() { + await using var context = await ContextFactory.CreateDbContextAsync(); + var query = context.Set(); + TotalPages = (int)Math.Max(Math.Ceiling((await query.CountAsync() - 1) / (double)ItemsPerPage), 1); + } + + private async ValueTask> LoadSubscribers(int page, int count) { + try { + await using var context = await ContextFactory.CreateDbContextAsync(); + return await context.Set() + .IgnoreAutoIncludes().IgnoreQueryFilters() + .OrderBy(s => s.Email).ThenBy(s => s.Id) + .Skip(page + 1).Take(count).ToListAsync(); + } catch (Exception ex) { + Logger.LogError(ex, "Failed to load subscribers on page {Page} with count {Count}.", page, count); + Message.ShowError(Localizer["Subscriber_Load_Error"]); + return []; + } + } +} diff --git a/Wave/Resources/Components/Layout/NavMenu.de-DE.resx b/Wave/Resources/Components/Layout/NavMenu.de-DE.resx index 447346b..a509eea 100644 --- a/Wave/Resources/Components/Layout/NavMenu.de-DE.resx +++ b/Wave/Resources/Components/Layout/NavMenu.de-DE.resx @@ -134,4 +134,7 @@ Gelöscht + + Abonnenten + \ No newline at end of file diff --git a/Wave/Resources/Components/Layout/NavMenu.resx b/Wave/Resources/Components/Layout/NavMenu.resx index 1871de4..a2c8616 100644 --- a/Wave/Resources/Components/Layout/NavMenu.resx +++ b/Wave/Resources/Components/Layout/NavMenu.resx @@ -137,4 +137,7 @@ Deleted + + Subscribers + \ No newline at end of file diff --git a/Wave/Resources/Components/Pages/Subscribers.de-DE.resx b/Wave/Resources/Components/Pages/Subscribers.de-DE.resx new file mode 100644 index 0000000..3640b33 --- /dev/null +++ b/Wave/Resources/Components/Pages/Subscribers.de-DE.resx @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Abonnenten + + + Nächste Seite + + + Seite + + + Vorherige Seite + + + Unerwarteter Fehler beim laden der Abonnenten + + + E-Mail + + + Notiz + + + Angemeldet + + + Zuletzt Zugestellt + + + Zuletzt Geöffnet + + + Alle Uhrzeiten sind in der folgenden Zeitzone: + + \ No newline at end of file diff --git a/Wave/Resources/Components/Pages/Subscribers.en-GB.resx b/Wave/Resources/Components/Pages/Subscribers.en-GB.resx new file mode 100644 index 0000000..4fdb1b6 --- /dev/null +++ b/Wave/Resources/Components/Pages/Subscribers.en-GB.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Wave/Resources/Components/Pages/Subscribers.resx b/Wave/Resources/Components/Pages/Subscribers.resx new file mode 100644 index 0000000..7419ca6 --- /dev/null +++ b/Wave/Resources/Components/Pages/Subscribers.resx @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Subscribers + + + Next page + + + Page + + + Previous page + + + Unknown error loading subscribers + + + Email + + + Name + + + Note + + + Subscribed + + + Last Received + + + Last Open + + + All times are using this timezone: + + \ No newline at end of file