Die Höhe des Aufmachers ist jetzt einstellbar
Vier Stufen unter Einstellungen → Verwaltung → Übersicht: niedrig, mittel, hoch, sehr hoch. Mittel ist, was gestern fest verdrahtet war. **Keine Pixelzahl.** Eine einzustellen hiesse, sie an jedem Bildschirm neu einzustellen — der Aufmacher misst sich an der Fensterhöhe, nicht an einer festen Grösse. Gemessen bei 800 Bildpunkten Fensterhöhe: 496, 576, 656, 736. Oben ist Schluss, bevor von der ersten Plakatreihe nichts mehr übrig bleibt; sie soll zeigen, dass unten noch etwas kommt. Am Telefon bleibt es flacher, dort wäre auch das weg. **Sie reist mit der Systemauskunft mit**, nicht in einer eigenen Abfrage. Die holt der Client ohnehin als Erstes, noch vor der Anmeldung; käme die Höhe später, stünde der Aufmacher einen Augenblick in der Vorgabe und spränge dann — genau das, was eine einstellbare Höhe vermeiden soll. Gesetzt wird sie als Marke am `<html>`, das Regelwerk hängt vier Werte daran. Serverweit und nur für Admins, dieselbe Linie wie bei den Wiedergaberegeln: eine Entscheidung des Gastgebers, nicht des Gastes. Unbekanntes in der Spalte wird zur Vorgabe statt zu einem Fehler — eine Startseite, die an einem alten Eintrag scheitert, wäre die schlechtere Antwort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
a7a4419626
commit
cdea8e3b0a
@@ -0,0 +1,47 @@
|
||||
namespace Flaro.Api;
|
||||
|
||||
/// <summary>Wie hoch der Aufmacher auf der Startseite steht.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>Vier Stufen, keine Zahl.</b> Eine Pixelzahl einzustellen hiesse, sie
|
||||
/// für jeden Bildschirm neu einzustellen — der Aufmacher misst sich an der
|
||||
/// Fensterhöhe, nicht an einer festen Grösse. Vier Wörter sind das, was man
|
||||
/// dazu zu sagen hat.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Was die Stufen bedeuten, steht im Regelwerk</b>, nicht hier: der Server
|
||||
/// weiss nichts von Bildpunkten, er merkt sich nur die Wahl. Nachzulesen bei
|
||||
/// <c>.hero</c> in <c>style.css</c>.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Serverweit.</b> Dieselbe Linie wie bei den Wiedergaberegeln: eine
|
||||
/// Entscheidung des Gastgebers, nicht des Gastes.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
public static class Aufmacherhoehe
|
||||
{
|
||||
public const string Schlüssel = "darstellung.aufmacher.hoehe";
|
||||
|
||||
/// <summary>Die Mitte — das, was vorher fest verdrahtet war.</summary>
|
||||
public const string Vorgabe = "mittel";
|
||||
|
||||
private static readonly string[] Stufen = ["niedrig", "mittel", "hoch", "sehrhoch"];
|
||||
|
||||
/// <summary>Macht aus dem Gespeicherten eine der vier Stufen.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// Unbekanntes wird zur Vorgabe statt zu einem Fehler: in der Spalte
|
||||
/// steht, was irgendwann einmal hineingeschrieben wurde, und eine
|
||||
/// Startseite, die daran scheitert, wäre die schlechtere Antwort.
|
||||
/// </remarks>
|
||||
public static string Lesen(string? wert)
|
||||
{
|
||||
var blank = wert?.Trim().ToLowerInvariant() ?? "";
|
||||
return Stufen.Contains(blank) ? blank : Vorgabe;
|
||||
}
|
||||
|
||||
/// <summary>Ob das eine Stufe ist, die es gibt.</summary>
|
||||
public static bool Kennt(string? wert) =>
|
||||
wert is not null && Stufen.Contains(wert.Trim().ToLowerInvariant());
|
||||
}
|
||||
@@ -6,7 +6,16 @@ namespace Flaro.Api.Endpoints;
|
||||
|
||||
public sealed record SystemInfo(
|
||||
string Version, string Build, string ServerName, bool NeedsSetup,
|
||||
IReadOnlyList<AttributionResponse> Attributions);
|
||||
IReadOnlyList<AttributionResponse> Attributions,
|
||||
/// <summary>Wie hoch der Aufmacher steht: „niedrig", „mittel", „hoch", „sehrhoch".</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <b>Hier und nicht in einer eigenen Abfrage.</b> Diese Auskunft holt
|
||||
/// der Client ohnehin als Erstes, noch vor der Anmeldung. Käme die Höhe
|
||||
/// später, stünde der Aufmacher einen Augenblick in der Vorgabe und
|
||||
/// spränge dann — genau das, was eine einstellbare Höhe vermeiden soll.
|
||||
/// </remarks>
|
||||
string HeroHeight = "mittel");
|
||||
|
||||
/// <summary>Ein Ablageort des Servers, mitsamt Belegung.</summary>
|
||||
///
|
||||
@@ -121,6 +130,9 @@ public sealed record CreateUserRequest(string UserName, string Password, bool Is
|
||||
/// <summary>Adminrecht geben oder nehmen.</summary>
|
||||
public sealed record RechtRequest(bool IsAdministrator);
|
||||
|
||||
/// <summary>Eine der vier Stufen für den Aufmacher.</summary>
|
||||
public sealed record HoeheRequest(string Height);
|
||||
|
||||
/// <summary>Eine Bibliothek, wie die Oberfläche sie zeigt.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
|
||||
@@ -48,7 +48,9 @@ public static class SystemEndpoints
|
||||
Attributions:
|
||||
[
|
||||
new AttributionResponse(Attribution.Tmdb, Attribution.TmdbLogoUrl, Attribution.TmdbUrl),
|
||||
])))
|
||||
],
|
||||
HeroHeight: Aufmacherhoehe.Lesen((await db.Settings.AsNoTracking()
|
||||
.FirstOrDefaultAsync(e => e.Key == Aufmacherhoehe.Schlüssel))?.Value))))
|
||||
.AllowAnonymous();
|
||||
|
||||
// **Wer schaut gerade was.**
|
||||
@@ -190,6 +192,26 @@ public static class SystemEndpoints
|
||||
return Results.NoContent();
|
||||
}).RequireAuthorization(FlaroPolicies.Administrator);
|
||||
|
||||
// **Wie hoch der Aufmacher steht.** Gelesen wird er mit der
|
||||
// Systemauskunft weiter oben — die holt der Client ohnehin als
|
||||
// Erstes, und so steht die Höhe schon beim ersten Zeichnen fest.
|
||||
app.MapPut("/api/v1/system/hero-height", async (
|
||||
HoeheRequest anfrage, FlaroContext db, CancellationToken ct) =>
|
||||
{
|
||||
if (!Aufmacherhoehe.Kennt(anfrage.Height))
|
||||
return Einwand.Bitte("Unbekannte Stufe. Möglich sind: niedrig, mittel, hoch, sehrhoch.");
|
||||
|
||||
var wert = anfrage.Height.Trim().ToLowerInvariant();
|
||||
var vorhanden = await db.Settings
|
||||
.FirstOrDefaultAsync(e => e.Key == Aufmacherhoehe.Schlüssel, ct);
|
||||
if (vorhanden is null)
|
||||
db.Settings.Add(new ServerSetting { Key = Aufmacherhoehe.Schlüssel, Value = wert });
|
||||
else vorhanden.Value = wert;
|
||||
|
||||
await db.SaveChangesAsync(ct);
|
||||
return Results.NoContent();
|
||||
}).RequireAuthorization(FlaroPolicies.Administrator);
|
||||
|
||||
app.MapPost("/api/v1/system/setup", async (SetupRequest anfrage, FlaroContext db) =>
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(anfrage.UserName) || anfrage.Password.Length < 8)
|
||||
|
||||
Reference in New Issue
Block a user