Versiehistorie in een tabel, voor site en app

De versiehistorie stond als tekst in zowel de app als de website. Nu staat hij in
tabel version_history, met een beheerpagina (Beheer > Versiehistorie) op de site.
De site leest de tabel rechtstreeks, de app via de nieuwe actie app.versiehistorie.
Startrijen: db/handmatig/22b_versiehistorie_startrijen.sql (als root).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MGLqt1uKfNARQHut9ifcx
This commit is contained in:
jf
2026-10-20 11:47:06 +00:00
co-authored by Claude Sonnet 5.5
parent 90c58fc42e
commit 5446dd4170
28 changed files with 996 additions and 108 deletions
+22
View File
@@ -27,6 +27,7 @@ public class Store
public List<CampagneUur> CampagneUren = new();
public List<VaultCategoryDefinition> Soorten = VaultCategorySaatgoed.Maak();
public List<VaultCategoryField> SoortVelden = new();
public List<VersieRegel> VersieRegels = new();
private long _seq;
public long NextId() => ++_seq;
@@ -533,6 +534,27 @@ public class TestPush : IPushSender
/// <summary>De startrijen uit db/21_kluissoorten.sql, zodat de tests met dezelfde soorten beginnen als de echte database.</summary>
public class VersiehistorieRepo : IVersiehistorieRepository
{
private readonly Store _s; public VersiehistorieRepo(Store s) => _s = s;
private int _volgende = 1;
public Task<IReadOnlyList<VersieRegel>> ListAsync(bool alleenZichtbaar, CancellationToken ct = default) =>
Task.FromResult<IReadOnlyList<VersieRegel>>(
_s.VersieRegels.Where(r => !alleenZichtbaar || r.Zichtbaar)
.OrderByDescending(r => r.Datum).ThenBy(r => r.Id).ToList());
public Task<VersieRegel?> FindAsync(int id, CancellationToken ct = default) =>
Task.FromResult(_s.VersieRegels.FirstOrDefault(r => r.Id == id));
// Hoofdletterongevoelig, zoals de database (utf8mb4_unicode_ci) ook doet.
public Task<bool> BestaatAsync(DateOnly datum, string kop, int? behalveId, CancellationToken ct = default) =>
Task.FromResult(_s.VersieRegels.Any(r => r.Datum == datum && string.Equals(r.Kop, kop, StringComparison.OrdinalIgnoreCase) && (behalveId == null || r.Id != behalveId)));
public void Add(VersieRegel regel) { if (regel.Id == 0) regel.Id = _volgende++; _s.VersieRegels.Add(regel); }
public void Remove(VersieRegel regel) => _s.VersieRegels.Remove(regel);
}
public static class VaultCategorySaatgoed
{
public static List<VaultCategoryDefinition> Maak()