Skip to main content

5. Configuratie en contentbeheer

Deze sectie beschrijft configureerbare systeemcontent en sitebrede instellingen die door beheerders via Site Instellingen aangepast kunnen worden. Voor Site Instellingen geldt een scherp onderscheid tussen codegedreven records (zoals popups en systeemberichtsjablonen), UI-beheerbare tekstblokken voor frontpages, vaste pagina's en footerinhoud, herbruikbare URL-records, featuretoggles en planbare systeemnotificaties.

5.1 PopupDetails

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
PopupDetailsConfiguratie - Systeem PopupsBevat configureerbare popupdefinities die door beheerders via de GUI aangepast kunnen worden. Nieuwe popups worden uitsluitend via code en database-migraties toegevoegd.Users, PopupDetailsHistory, PopupDetailsHistoryItems
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel van de popupdefinitie. GUID wordt in de applicatiecode gegenereerd; geen database-default.
Keynvarchar(100)-NN-JNJTechnisch stabiele referentie; niet wijzigbaar via GUI.
Descriptionnvarchar(250)nullNN-NJNKorte beheeromschrijving voor herkenning in sitebeheer.
Typenvarchar(30)InfoNN-NNJVisueel type voor icoon/stijl: Info, Warning, Error of Critical.
ThemeKeynvarchar(100)nullNN-NJJDocumentatie- en seedreferentie naar het gekozen popup-thema. Wordt niet vrij via de GUI gewijzigd.
Variantnvarchar(30)InfoOnlyNN-NNJTechnische popupvorm, bijvoorbeeld InfoOnly, Confirm, InputText, InputEmail, InputTextarea of Custom.
Titlenvarchar(200)-NN-NNJTitel van de popup.
Textnvarchar(max)-NN-NNJHoofdtekst van de popup.
OverlayModenvarchar(20)DimmedNN-NNNWeergave van de achtergrond, bijvoorbeeld None of Dimmed.
CloseButtonEnabledbit1NN-NNNToont of verbergt het kruisje rechtsboven.
ShowLeftButtonbit0NN-NNNGeeft aan of een linker knop zichtbaar is.
LeftButtonTextnvarchar(100)nullNN-NJNTekst van de linker knop indien zichtbaar.
LeftButtonActionCallMethodnvarchar(100)nullNN-NJNTechnische actie-identificatie voor de linker knop; read only in de GUI.
LeftButtonThemenvarchar(30)nullNN-NJNButtonTheme van de linker knop, bijvoorbeeld Secondary of Danger.
ShowRightButtonbit0NN-NNNGeeft aan of een rechter knop zichtbaar is.
RightButtonTextnvarchar(100)nullNN-NJNTekst van de rechter knop indien zichtbaar.
RightButtonActionCallMethodnvarchar(100)nullNN-NJNTechnische actie-identificatie voor de rechter knop; read only in de GUI.
RightButtonThemenvarchar(30)nullNN-NJNButtonTheme van de rechter knop, bijvoorbeeld Primary of Danger.
InputKeynvarchar(100)nullNN-NJNTechnische sleutel van het ene ondersteunde inputveld, indien de variant dat ondersteunt.
InputTypenvarchar(30)nullNN-NJNInputtype, bijvoorbeeld Text, Email of Textarea. Alleen relevant bij inputvarianten.
InputLabelnvarchar(100)nullNN-NJNZichtbaar label van het inputveld.
InputRequiredbitnullNN-NJNGeeft aan of het inputveld verplicht is.
InputMaxLengthintnullNN-NJNMaximale invoerlengte voor het inputveld.
CustomRendererKeynvarchar(100)nullNN-NJJVerwijzing naar coded renderer wanneer Variant = Custom.
IsActivebit1NN-NNJMaakt popup beschikbaar of verborgen in het systeem.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment van het record, normaliter via migratie.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigingsmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de laatste wijziging via GUI heeft doorgevoerd.

Validaties / constraints

  • Key is uniek en niet wijzigbaar via GUI.
  • Type, ThemeKey, Variant, ButtonTheme en InputType worden beperkt tot centraal gedefinieerde code-enums of sleutelsets.
  • Title heeft max. 50 karakters, Text max. 1000 karakters en knopteksten max. 20 karakters, tenzij FO/TO/SRS voor een specifieke popup expliciet een strengere grens vastlegt.
  • Wanneer een knop niet actief is, moeten de bijbehorende tekst-, actie- en themavelden null of leeg zijn.
  • Niet-custom varianten ondersteunen maximaal één inputveld. Meer dan één inputveld vereist Variant = Custom en een CustomRendererKey.
  • Bij Variant = Custom is CustomRendererKey verplicht en bepaalt coded rendering de precieze layout en veldvalidatie.

Business rules

  • Beheerders mogen alleen bestaande popuprecords aanpassen.
  • Aanmaken en verwijderen van popuprecords gebeurt uitsluitend via code en database-migraties.
  • De beheer-GUI ondersteunt zoeken op Key, titel en tekst.
  • ActionCallMethod-velden blijven read only in de GUI, omdat de technische koppeling altijd in code is vastgelegd.
  • Voor normale dynamische popups is de popup-registerregel in de ontwerpbronnen de inhoudelijke source of truth voor titel, tekst, knopteksten, knopacties en inputlabel. PopupDetails is de runtime-/databaseweergave die via migratie of seed uit die bron kan worden gevuld.
  • ThemeKey en Variant leveren herbruikbare defaults voor Type, sluitgedrag, button themes en inputeigenschappen. Hiermee wordt dubbele vastlegging van popupdetails voorkomen.
  • Popupdetailtabellen in documentatie worden alleen gebruikt voor Custom popups. Niet-custom popups mogen niet dubbel worden uitgewerkt.

Lifecycle / gedrag

  • Popups worden niet via GUI uitgeschakeld.
  • Alle popuprecords blijven technisch actief en worden alleen functioneel aangestuurd via code.
  • Wijzigingen via de GUI moeten UpdatedAtUtc en UpdatedByUserId bijwerken en een historymoment registreren.
  • Wijzigingen via code en migratie kunnen eveneens historyrecords aanmaken wanneer auditbaarheid van seedwijzigingen gewenst is.

Designkeuzes

  • Key vervult de rol van stabiele technische referentie naar code en mag daarom niet via GUI veranderbaar zijn.
  • Popupinhoud is configureerbaar, maar aanmaken/verwijderen en de technische actiekoppeling blijven codegedreven.
  • ThemeKey + Variant + popup-registerregel vormen de basis voor importeerbare PopupDetails-records. Dit volgt het DRY-principe en voorkomt dat titel, tekst en knopdefinities op meerdere plekken onderhouden moeten worden.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden Key, Type, ThemeKey, Variant, ButtonTheme, ActionCallMethod, InputType en CustomRendererKey functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.2 PopupDetailsHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
PopupDetailsHistoryConfiguratie - Systeem PopupsRegistreert wijzigingsmomenten op popupniveau, inclusief actor, tijdstip en type wijziging.PopupDetails, PopupDetailsHistoryItems, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel van het historymoment. GUID wordt in de applicatiecode gegenereerd; geen database-default.
PopupDetailsIduniqueidentifier-NJPopupDetails.IdNNJPopuprecord waarop deze wijziging betrekking heeft.
ChangeTypenvarchar(50)-NN-NNJType wijziging, bijvoorbeeld Create, Update of TechnicalSeed.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment waarop de wijziging is vastgelegd.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de wijziging uitvoerde; bij codegedreven seed-actie kan dit naar een systeemactor verwijzen.
ChangeSetIduniqueidentifiernullNN-NJJOptionele set-identificatie om meerdere gelijktijdige wijzigingen logisch te groeperen.

Validaties / constraints

  • PopupDetailsId is verplicht.
  • ChangeType wordt beperkt tot centraal gedefinieerde waardes.
  • ChangeSetId mag null zijn wanneer de wijziging maar één veld omvat.

Business rules

  • De beheer-GUI toont historie op popupniveau.
  • Eén opslaan-actie op een popup levert precies één PopupDetailsHistory-record op, ook wanneer meerdere velden tegelijk aangepast worden.

Lifecycle / gedrag

  • Historyrecords worden niet aangepast of verwijderd.
  • Wijzigingen via code en migraties mogen eveneens een historyrecord aanmaken om auditability te behouden.

Designkeuzes

  • Popupniveau-history houdt de beheerdersweergave leesbaar.
  • De concrete van-naar-verschillen per veld worden in PopupDetailsHistoryItems opgeslagen.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: PopupDetailsId -> PopupDetails.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden ChangeType functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.3 PopupDetailsHistoryItems

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
PopupDetailsHistoryItemsConfiguratie - Systeem PopupsLegt per historymoment vast welke velden van een popup gewijzigd zijn en wat de oude en nieuwe waarde was.PopupDetailsHistory
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel van het detailrecord. GUID wordt in de applicatiecode gegenereerd; geen database-default.
PopupDetailsHistoryIduniqueidentifier-NJPopupDetailsHistory.IdNNJHistorymoment waaraan deze wijzigingsregel hangt.
ChangedFieldnvarchar(100)-NN-NNJNaam van het gewijzigde veld, bijvoorbeeld Title of RightButtonTheme.
OldValuenvarchar(max)nullNN-NJNVorige waarde van het veld.
NewValuenvarchar(max)nullNN-NJNNieuwe waarde van het veld.

Validaties / constraints

  • PopupDetailsHistoryId en ChangedField zijn verplicht.
  • ChangedField bevat de logische veldnaam uit PopupDetails.

Business rules

  • Bij een save-actie met meerdere wijzigingen worden meerdere PopupDetailsHistoryItems gekoppeld aan hetzelfde PopupDetailsHistory-record.
  • De GUI kan deze detailwijzigingen onder één popup-historymoment tonen.

Lifecycle / gedrag

  • Detailregels worden niet los aangepast of verwijderd.
  • Zij vormen samen de complete van-naar-audit van een popupwijziging.

Designkeuzes

  • Opsplitsing in een hoofdrecord en detailregels maakt het mogelijk historie op popupniveau te tonen, zonder de technische precisie van veldwijzigingen te verliezen.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: PopupDetailsHistoryId -> PopupDetailsHistory.Id.

Functionele / logische verwijzingen zonder harde FK

  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.4 SiteFeatureToggles

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SiteFeatureTogglesConfiguratieSitebrede feature toggles die door beheerders via site-instellingen aan- of uitgezet kunnen worden.Users, UserSettings
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default.
FeatureKeynvarchar(100)-NN-JNJTechnische sleutel van de featuretoggle, bijvoorbeeld RegistrationEnabled, LoginEnabled, FriendshipsEnabled, PrivateMessagesEnabled, LiveViewEnabled, SharingEnabled, TestExercisesEnabled, ReportProblemEnabled of AccessibilityEnabled.
IsEnabledbit1NN-NNNGeeft aan of de feature sitebreed actief is.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatst bijgewerkt op.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de toggle laatst wijzigde.

Validaties / constraints

  • FeatureKey is uniek.
  • Alleen vooraf bekende features worden gebruikt.
  • De minimale sleutelset voor Site Instellingen bevat: RegistrationEnabled, LoginEnabled, FriendshipsEnabled, PrivateMessagingEnabled, LiveViewingEnabled, ExerciseSharingEnabled, TestExercisesEnabled en IssueReportingEnabled.

Business rules

  • Feature toggles worden uitsluitend door beheerders aangepast via Site Instellingen of via database/migratie.
  • Alles buiten deze expliciete sleutelset geldt functioneel als must-have en hoort niet als uitschakelbare featuretoggle in deze tabel thuis.

Lifecycle / gedrag

  • Uitschakelen van een feature verwijdert geen gebruikersdata.
  • Bestaande waarden blijven bewaard en kunnen later opnieuw actief worden zodra de feature weer wordt ingeschakeld.

Designkeuzes

  • Een generieke toggle-tabel voorkomt aparte losse kolommen per feature en maakt beheer van sitebrede schakelaars uitbreidbaar.
  • De functionele lijst staat in FO/TO/SRS; de technische sleutelset staat in dit document.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden FeatureKey functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.5 SystemSettings

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SystemSettingsConfiguratieNiet-booleaanse systeembrede instellingen die door beheerders via site-instellingen beheerd worden, zoals PDF-bestandsnaamopbouw en bewaartermijnen.Users, SiteFeatureToggles
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default.
ValueTextnvarchar(500)-NN-NNNTekstwaarde voor systeeminstellingen die als string worden opgeslagen.
ValueBoolbitnullNN-NJNBooleaanse waarde voor systeeminstellingen.
ValueDatedatetime2nullNN-NJNDatum- of datum/tijdwaarde voor systeeminstellingen.
ValueIntintnullNN-NJNGehele numerieke waarde voor systeeminstellingen.
SettingKeynvarchar(100)-NN-JNJTechnische sleutel van de instelling, bijvoorbeeld PdfResultFileNamePattern of PrivateMessageRetentionDays.
ValueDecimaldecimal(10,2)nullNN-NJNDecimale waarde voor systeeminstellingen.
Descriptionnvarchar(500)nullNN-NJNOptionele toelichting voor beheerweergave of migratiecontext.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatst bijgewerkt op.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de instelling laatst wijzigde.

Validaties / constraints

  • SettingKey is uniek.
  • Alleen vooraf bekende systeemsleutels worden gebruikt. Per sleutel is in code bekend welke van de velden ValueText, ValueBool, ValueDate, ValueInt of ValueDecimal gebruikt wordt.
  • Waarden worden in de applicatie gevalideerd op basis van de sleutel, bijvoorbeeld positief geheel getal voor bewaartermijnen en een toegestaan patroonformaat voor PDF-bestandsnaamopbouw.

Business rules

  • Deze tabel is bedoeld voor niet-booleaanse systeeminstellingen.
  • Booleaanse aan/uit-schakelaars blijven in SiteFeatureToggles.
  • Beheerders mogen bestaande instellingen wijzigen, maar records worden alleen aangelegd voor vooraf bekende sleutels zodat de set bekende instellingen beheersbaar blijft.
  • Instellingen uit deze tabel moeten bij applicatiestart in cache geladen kunnen worden.

Lifecycle / gedrag

  • Een wijziging via de beheer-GUI werkt UpdatedAtUtc en UpdatedByUserId bij en moet direct leiden tot een cache refresh of expliciete cache invalidatie, zodat nieuwe waarden zonder herstart consistent actief worden.
  • Records worden in de praktijk niet hard verwijderd.

Designkeuzes

  • Door niet-booleaanse instellingen los te houden van SiteFeatureToggles blijft duidelijk onderscheid bestaan tussen feature-aan/uit-logica en configureerbare systeemwaarden.
  • Per bekende SettingKey is in code vastgelegd welke van de velden ValueText, ValueBool, ValueDate, ValueInt of ValueDecimal gebruikt wordt. Daarmee blijft de set instellingen beheersbaar zonder runtime typeconversie vanuit één generieke tekstkolom.

Initiële SettingKey-catalogus

SettingKeyWaardeveldWaardetypeValidatie / gebruik
PrivateMessageRetentionDaysValueIntPositief geheel getalFunctionele bewaartermijn voor privéberichten en bijbehorende gebruikersweergave.
PdfResultFileNamePatternValueTextPatroonstringToegestaan bestandsnaampatroon voor resultaat-PDF's; mag geen padsegmenten, scripts of onveilige tekens bevatten.
TicketReopenDeadlineDaysValueIntNiet-negatief geheel getalAantal dagen dat een door beheer gesloten melding nog als heropenbaar/opgelost wordt beschouwd. 0 betekent geen actieve heropenperiode.
RelationshipInvitationReminderCooldownHoursValueIntPositief geheel getal, standaard 24Aantal uren dat moet verstrijken na de initiële uitnodiging of laatste herinnering voordat een pending relatie-uitnodiging opnieuw herinnerd mag worden.

Nieuwe SettingKey-waarden ontstaan via code en migratie. De beheerinterface mag alleen bestaande keys wijzigen binnen het vastgelegde waardeveld, invoervorm en validatieregel.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden SettingKey, ValueText, ValueBool, ValueDate, ValueInt en ValueDecimal bevatten sleutel- en waardegegevens en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.6 ContentBlocks

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
ContentBlocksConfiguratie en contentbeheerUniform contentblokmodel voor frontpagecontent, vaste pagina-inhoud en tekstuele footerinhoud die door beheerders via de GUI aangepast mag worden.Users, ContentBlockHistory
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default.
DomainTypenvarchar(30)-NN-NNJCode-enum, binnen de huidige baseline beperkt tot FrontPage, StaticPage en Footer.
ContextTypenvarchar(30)-NN-NNJContext waarin het blok geladen wordt, bijvoorbeeld Public, NoRole, Teacher, Student, Guardian of Admin.
ReferenceKeynvarchar(100)-NN-NNJCodevaste unieke verwijzing waarmee de applicatie weet welk blok waar getoond moet worden.
Titlenvarchar(200)nullNN-NJNOptionele titel van het contentblok.
Textnvarchar(max)nullNN-NJNOptionele tekstuele inhoud van het contentblok.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment van het blokrecord.
CreatedByUserIduniqueidentifier-NNUsers.IdNNNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Actor die het record oorspronkelijk heeft aangemaakt. Omdat deze data actor-gebonden beheerdata is, wordt dit niet anoniem via systeemseed gevuld.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de laatste inhoudelijke wijziging heeft uitgevoerd.

Validaties / constraints

  • DomainType, ContextType en ReferenceKey vormen samen een unieke functionele sleutel.
  • DomainType is binnen de V1.0-baseline beperkt tot FrontPage, StaticPage en Footer.
  • ContextType is binnen de V1.0-baseline beperkt tot Public, NoRole, Admin, Teacher, Student en Guardian.
  • ReferenceKey bevat de vaste technische referentie naar het blok dat in code op een specifieke plek wordt gerenderd.
  • Title en Text zijn tekstueel beheerbaar; IsVisible wordt voor dit model bewust nog niet opgenomen.

Business rules

  • Deze tabel vormt het uniforme contentblokmodel voor tekstuele beheerinhoud van frontpages, vaste pagina's en footertekstblokken.
  • Frontpagecontent, pagina-inhoud en footer linkerkolom/copyright worden dus niet meer als losse, domeinspecifieke teksttabellen gemodelleerd.
  • ContentBlocks is actor-gebonden beheerdata en geen anonieme systeem-seeddata. Een productieomgeving mag functioneel zonder vooraf aangemaakte contentblokken starten.

Lifecycle / gedrag

  • Records worden niet hard verwijderd vanuit de GUI.
  • ContentBlocks worden functioneel via de beheerinterface aangemaakt en beheerd. Ontbrekende blocks worden door de frontend niet geladen en leiden niet automatisch tot seed- of migratierecords.
  • Wijzigingen via GUI werken UpdatedAtUtc en UpdatedByUserId bij.

Designkeuzes

  • Eén generiek contentblokmodel voorkomt overbodige tabellen voor inhoud die technisch hetzelfde gedrag heeft: een codevast blok met titel en/of tekst dat per domein en context wordt geladen.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden DomainType, ContextType, ReferenceKey functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.7 ContentBlockHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
ContentBlockHistoryAudit en historieVeldniveau-history voor contentblokken, zodat per domein, context en referentie herleidbaar blijft wie wat gewijzigd heeft.ContentBlocks, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
ContentBlockIduniqueidentifier-NJContentBlocks.IdNNJVerwijzing naar het contentblok waarop de wijziging betrekking heeft.
DomainTypenvarchar(30)-NN-NNJSnapshot van DomainType op het moment van wijziging.
ContextTypenvarchar(30)-NN-NNJSnapshot van ContextType op het moment van wijziging.
ReferenceKeynvarchar(100)-NN-NNJSnapshot van de codevaste blokreferentie.
ChangedFieldnvarchar(100)-NN-NNJNaam van het veld dat gewijzigd is, bijvoorbeeld Title of Text.
OldValuenvarchar(max)nullNN-NJNVorige waarde.
NewValuenvarchar(max)nullNN-NJNNieuwe waarde.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment waarop de wijziging is vastgelegd.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de wijziging heeft uitgevoerd.

Validaties / constraints

  • ContentBlockId, DomainType, ContextType, ReferenceKey en ChangedField zijn verplicht.
  • OldValue en NewValue worden als tekst opgeslagen om veldniveau-history per wijziging mogelijk te maken.

Business rules

  • Elke individuele veldwijziging binnen een save-actie wordt als afzonderlijke historyregel vastgelegd. Wanneer één bewerking meerdere velden wijzigt, ontstaan dus meerdere historyregels met hetzelfde wijzigingsmoment en dezelfde actor.
  • De beheer-GUI moet geschiedenis laagdrempelig per frontpage, pagina of footeronderdeel kunnen tonen.

Lifecycle / gedrag

  • Historyrecords worden niet aangepast of verwijderd, behalve in uitzonderlijke technische herstelprocedures.

Designkeuzes

  • Door DomainType, ContextType en ReferenceKey ook in de history op te nemen, kan historie eenvoudig per frontpagecontext of vaste pagina worden opgehaald zonder steeds terug te hoeven joinen op de hoofdtafel.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: ContentBlockId -> ContentBlocks.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden DomainType, ContextType, ReferenceKey functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.
TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SiteLinksConfiguratie en contentbeheerHerbruikbare URL-records voor footerlinks en andere beheerde linkverwijzingen.Users, SiteLinkHistory, FooterLinkAssignments
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
LinkTypenvarchar(20)-NN-NNJCode-enum Internal of External.
DisplayNamenvarchar(150)-NN-NNNNaam zoals de beheerder de link wil tonen.
Urlnvarchar(1000)-NN-NNNInterne route of externe URL.
OpenInNewTabbit0NN-NNNBepaalt of de link in een nieuw tabblad geopend moet worden.
IsDeletedbit0NN-NNJSoft delete vlag voor administratieve verwijdering met behoud van historie.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment.
CreatedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de URL heeft aangemaakt.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de laatste wijziging heeft uitgevoerd.
DeletedAtUtcdatetime2nullNN-NJNMoment van soft delete.
DeletedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de URL soft deleted heeft.

Validaties / constraints

  • LinkType wordt beperkt tot de code-enum Internal of External.
  • DisplayName is verplicht.
  • Url is verplicht en moet bij opslaan gevalideerd worden.
  • Voor interne routes en externe URLs geldt dat opslaan geblokkeerd wordt wanneer validatie mislukt; een foutieve URL mag dus nooit opgeslagen worden.

Business rules

  • SiteLinks bevat herbruikbare URL-records die door beheerders via de GUI mogen worden aangemaakt, aangepast en soft verwijderd.
  • SiteLinks is gewone beheerdata met verplichte actorvelden en valt daarom niet onder anonieme initiële migratie-seed. Een productieomgeving mag zonder vooraf gevulde site links starten.
  • Een ReferenceName is hier bewust niet nodig; DisplayName is de functionele weergavenaam.

Lifecycle / gedrag

  • Verwijderen gebeurt via soft delete op databaseniveau, zodat historie behouden blijft.
  • Verwijderde URL-records zijn niet meer zichtbaar in de GUI.

Designkeuzes

  • Deze tabel modelleert alleen de URL-records zelf.
  • Waar en in welke volgorde een URL getoond wordt, wordt vastgelegd in FooterLinkAssignments.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden LinkType functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key. De velden Url bevatten inhoudelijke of technische contextwaarden en zijn daarom logische samenhang zonder harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.9 SiteLinkHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SiteLinkHistoryAudit en historieVeldniveau-history voor URL-records die door beheerders via de GUI beheerd worden.SiteLinks, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
SiteLinkIduniqueidentifier-NJSiteLinks.IdNNJVerwijzing naar het URL-record.
ChangedFieldnvarchar(100)-NN-NNJGewijzigd veld, bijvoorbeeld DisplayName, Url of OpenInNewTab.
OldValuenvarchar(max)nullNN-NJNVorige waarde.
NewValuenvarchar(max)nullNN-NJNNieuwe waarde.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment waarop de wijziging is vastgelegd.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de wijziging heeft uitgevoerd.

Validaties / constraints

  • SiteLinkId, ChangedField, ChangedAtUtc en ChangedByUserId zijn verplicht.

Business rules

  • Geschiedenis wordt op veldniveau bijgehouden, inclusief create-, update- en soft-delete-acties.
  • Voor user-managed records worden dus CreatedByUserId, UpdatedByUserId en DeletedByUserId vastgelegd.

Lifecycle / gedrag

  • Historyrecords worden niet aangepast of verwijderd.

Designkeuzes

  • Aparte historytafel voorkomt dat de hoofdtafel vervuild raakt met auditdetails en houdt de GUI-history leesbaar.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: SiteLinkId -> SiteLinks.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.10 FooterSections

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
FooterSectionsConfiguratie en contentbeheerBeheerbare secties binnen de footer per context en kolom, inclusief sectietitel en auditinformatie.FooterLinkAssignments, SiteLinks, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default.
ContextTypenvarchar(30)-NN-NNJContext waarvoor deze footersectie geldt, bijvoorbeeld Public, Student, Teacher, Guardian of Admin.
ColumnTypenvarchar(20)-NN-NNJCode-enum Middle of Right. Bepaalt in welke beheerbare footerkolom deze sectie valt.
Titlenvarchar(150)-NN-NNNBeheerbare sectietitel zoals zichtbaar in de footer, bijvoorbeeld Handige links of Snel naar.
IsDeletedbit0NN-NNJSoft delete-vlag voor administratieve verwijdering met behoud van historie.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment.
CreatedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de sectie heeft aangemaakt.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de laatste wijziging heeft uitgevoerd.
DeletedAtUtcdatetime2nullNN-NJNMoment van soft delete.
DeletedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de sectie soft deleted heeft.

Validaties / constraints

  • Actieve combinatie ContextType + ColumnType is uniek. Binnen één context en kolom mag dus slechts één beheerbare footersectie bestaan.
  • ColumnType is binnen de V1.0-baseline beperkt tot Middle en Right. ContextType gebruikt dezelfde functionele sleutelset als de overige contextgebonden contenttabellen.

Business rules

  • De titel van een footersectie is via de GUI beheerbaar en vormt de bovenliggende container waaronder FooterLinkAssignments de concrete links koppelt.
  • FooterSections is actor-gebonden beheerdata en geen verplichte initiële seedset. Een productieomgeving mag zonder vooraf aangemaakte footersecties starten.
  • De context- en kolomkeuze horen functioneel bij de sectie zelf en niet bij iedere afzonderlijke linkplaatsing. Daardoor blijven sectietitels, context en kolom logisch bij elkaar.

Lifecycle / gedrag

  • Footersecties worden via soft delete administratief verwijderd zodat historie en bestaande verwijzingen herleidbaar blijven.
  • Wijzigingen aan titel, context of kolom moeten auditbaar zijn via de gekoppelde beheerhistorie van onderliggende plaatsingen en algemene auditvelden.

Designkeuzes

  • Een aparte sectietabel voorkomt dat ContextType en ColumnType op iedere footerlinkplaatsing herhaald moeten worden en maakt beheerbare sectietitels expliciet onderdeel van het datamodel.
  • Door FooterSections als parentlaag te introduceren kan FooterLinkAssignments zich beperken tot plaatsing en volgorde van links binnen een bestaande sectie.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden ContextType, ColumnType functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.11 FooterLinkAssignments

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
FooterLinkAssignmentsConfiguratie en contentbeheerKoppelt SiteLinks aan een beheerbare footersectie en legt de volgorde binnen die sectie vast.FooterSections, SiteLinks, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
FooterSectionIduniqueidentifier-NJFooterSections.IdNNJVerwijzing naar de footersectie waaronder de link getoond wordt.
SiteLinkIduniqueidentifier-NJSiteLinks.IdNNJVerwijzing naar de gekoppelde URL.
DisplayOrderint0NN-NNNVolgorde van weergave binnen de sectie.
IsDeletedbit0NN-NNJSoft delete-vlag voor administratieve verwijdering van de koppeling met behoud van historie.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment.
CreatedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de koppeling heeft aangemaakt.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de laatste wijziging heeft uitgevoerd.
DeletedAtUtcdatetime2nullNN-NJNMoment van soft delete.
DeletedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de koppeling soft deleted heeft.

Validaties / constraints

  • Actieve combinatie FooterSectionId + SiteLinkId is uniek. Dezelfde URL mag binnen dezelfde footersectie functioneel slechts één keer voorkomen.
  • DisplayOrder moet binnen één footersectie eenduidig zijn zodat de sorteervolgorde deterministisch blijft.

Business rules

  • Deze tabel bepaalt welke SiteLinks binnen een bestaande footersectie zichtbaar zijn en in welke volgorde zij worden getoond.
  • FooterLinkAssignments is actor-gebonden runtime-/beheerdata en wordt niet als anonieme migratie-seed beschouwd. De footer mag in een nieuwe omgeving leeg starten totdat een beheerder expliciet secties en koppelingen aanmaakt.
  • Context en kolom worden niet meer op iedere plaatsing zelf vastgelegd, maar komen via FooterSectionId uit de bovenliggende sectie.

Lifecycle / gedrag

  • Wijzigingen aan volgorde of koppeling moeten auditbaar zijn. Soft delete verwijdert de plaatsing administratief zonder historie te verliezen.
  • Een SiteLink mag niet hard verwijderd worden zolang er actieve footerplaatsingen naar verwijzen.

Designkeuzes

  • Door URL-definities los te koppelen van footerplaatsing blijven links herbruikbaar en kan de GUI per sectie de selectie en volgorde beheren.
  • De aparte parentlaag FooterSections voorkomt redundantie van context- en kolomgegevens en maakt beheerbare sectietitels expliciet.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: FooterSectionId -> FooterSections.Id; SiteLinkId -> SiteLinks.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.12 FooterLinkAssignmentHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
FooterLinkAssignmentHistoryAudit en historieVeldniveau-history voor footerlinkplaatsingen en volgordewijzigingen.FooterLinkAssignments, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
FooterLinkAssignmentIduniqueidentifier-NJFooterLinkAssignments.IdNNJVerwijzing naar de footerplaatsing.
ChangedFieldnvarchar(100)-NN-NNJGewijzigd veld, bijvoorbeeld SiteLinkId, FooterSectionId of DisplayOrder.
OldValuenvarchar(max)nullNN-NJNVorige waarde.
NewValuenvarchar(max)nullNN-NJNNieuwe waarde.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment van wijziging.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de wijziging heeft uitgevoerd.

Validaties / constraints

  • FooterLinkAssignmentId, ChangedField, ChangedAtUtc en ChangedByUserId zijn verplicht.

Business rules

  • Geschiedenis legt wijzigingen vast in koppeling, kolom en volgorde, inclusief van- en naarwaarden waar relevant.

Lifecycle / gedrag

  • Historyrecords worden niet gewijzigd of verwijderd.

Designkeuzes

  • Een aparte historytafel ondersteunt beheerweergaven die per footercontext compact willen tonen wat wanneer in de linkopbouw gewijzigd is.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: FooterLinkAssignmentId -> FooterLinkAssignments.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.13 SystemMessageTemplates

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SystemMessageTemplatesConfiguratie en contentbeheerCodegedreven systeemberichtsjablonen waarvan inhoud en beperkte metadata via de GUI aangepast mogen worden.Users, SystemMessageTemplateHistory
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
ReferenceNamenvarchar(100)-NN-JNJCodevaste technische referentie; read only in de GUI.
Domainnvarchar(50)-NN-NNJCode-enum van het functionele domein.
MessageTypenvarchar(30)-NN-NNJCode-enum, bijvoorbeeld Info, Warning, Error of Critical.
Subjectnvarchar(50)-NN-NNNOnderwerp van het systeembericht.
BodyTextnvarchar(1000)-NN-NNNTekstuele inhoud van het berichtsjabloon.
ActionButtonTextnvarchar(20)nullNN-NJNOptionele knoptekst wanneer een codegestuurde actie beschikbaar is.
ActionNamenvarchar(100)nullNN-NJNTechnische actie-identificatie; read only in de GUI.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment via code/migratie.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de laatste inhoudelijke wijziging heeft uitgevoerd.

Validaties / constraints

  • ReferenceName is uniek en niet wijzigbaar via GUI.
  • MessageType en Domain worden beperkt tot centraal gedefinieerde code-enums.
  • Subject heeft max. 50 karakters, BodyText max. 1000 karakters en optionele ActionButtonText max. 20 karakters.
  • Er is geen RowVersion vereist; templategebruik gebeurt op verzendmoment en bestaande gerenderde systeemberichten worden niet aangepast door latere templatewijzigingen.

Business rules

Domain geeft het functionele domein aan waarin een systeemberichtsjabloon wordt gebruikt. De precieze betekenis van deze domeinen wordt functioneel uitgewerkt in FO/TO/SRS.

  • Beheerders mogen alleen bestaande systeemberichtsjablonen aanpassen.
  • Aanmaken en verwijderen van records gebeurt uitsluitend via code en database-migraties.
  • Eventuele ActionName of vergelijkbare technische actievelden zijn zichtbaar maar read only in de GUI.
  • Placeholder-ondersteuning wordt verwacht, maar de concrete set placeholder-keys blijft codegedreven en is nog niet definitief.
  • Per ReferenceName geldt een codegedreven placeholder-allowlist. Onbekende placeholders of ontbrekende verplichte placeholders moeten server-side worden geweigerd voordat een template wordt opgeslagen of gebruikt voor rendering.
  • SystemMessageTemplates leveren inhoud voor toekomstige SystemMessages; runtimeberichten bewaren de gerenderde titel/body en krijgen geen verplichte FK naar template of templateversie.
  • Voor relatie-uitnodigingsfeedback aan de uitnodiger gebruikt de templatecontext bij oorspronkelijk externe/openstaande uitnodigingen primair het uitgenodigde e-mailadres en niet automatisch de profielnaam van de ontvanger.

Lifecycle / gedrag

  • Sjablonen worden niet hard verwijderd in de GUI.
  • Wijzigingen via GUI werken UpdatedAtUtc en UpdatedByUserId bij en registreren history op veldniveau.

Designkeuzes

  • Een aparte template-tafel houdt configuratie van mailbox- en systeemberichten gescheiden van de runtime-berichten die daadwerkelijk naar gebruikers gestuurd worden.
  • De tabel is de runtimebron voor nieuwe systeemberichtinhoud én de latere beheerbron voor Feature 17. Beheer-UI wijzigt bestaande templates, maar maakt geen nieuwe technische referenties aan.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden MessageType functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.14 SystemMessageTemplateHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SystemMessageTemplateHistoryAudit en historieVeldniveau-history van systeemberichtsjablonen.SystemMessageTemplates, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
SystemMessageTemplateIduniqueidentifier-NJSystemMessageTemplates.IdNNJVerwijzing naar het systeemberichtsjabloon.
ChangedFieldnvarchar(100)-NN-NNJGewijzigd veld, bijvoorbeeld Subject, BodyText of ActionButtonText.
OldValuenvarchar(max)nullNN-NJNVorige waarde.
NewValuenvarchar(max)nullNN-NJNNieuwe waarde.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment van wijziging.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de wijziging heeft uitgevoerd.

Validaties / constraints

  • SystemMessageTemplateId, ChangedField, ChangedAtUtc en ChangedByUserId zijn verplicht.

Business rules

  • Elke individuele veldwijziging binnen een save-actie wordt als afzonderlijke historyregel vastgelegd. Wanneer één bewerking meerdere velden wijzigt, ontstaan dus meerdere historyregels met hetzelfde wijzigingsmoment en dezelfde actor.
  • Er wordt geen snapshotrecord per save-actie vereist en geen verplichte batchheader toegevoegd. Een latere beheer-UI mag regels met hetzelfde wijzigingsmoment en dezelfde actor gegroepeerd tonen.
  • History beschrijft templatewijzigingen. Verzonden SystemMessages hoeven niet naar een historyregel te verwijzen.

Lifecycle / gedrag

  • Historyrecords worden niet aangepast of verwijderd.

Designkeuzes

  • Veldniveau-history maakt het mogelijk om beheerwijzigingen op onderwerp, tekst en knoptekst nauwkeurig te reconstrueren zonder technische runtime-berichten te hoeven inspecteren.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: SystemMessageTemplateId -> SystemMessageTemplates.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.14.1 Runtime display- en pagineringsconfiguratie

Niet alle runtimeconfiguratie is beheerbare databasecontent. Voor Batch 4 zijn de volgende applicatieconfiguraties code-/appsettings-gedreven:

ConfiguratiepadStandaardDoelBeheerbaarheid
OefenHub:Display:PageTitleOefenHubCentrale basis voor browserpaginatitels.Appconfiguratie, geen databasecontent.
OefenHub:Display:PageTitleSeperator-Separator tussen sitebasis en paginanaam.Appconfiguratie, geen databasecontent.
OefenHub:Messages:PageSizes[5, 10, 15]Toegestane paginagroottes voor het berichtenoverzicht.Appconfiguratie, geen databasecontent.

Deze waarden worden server-side genormaliseerd. Querystringwaarden buiten de toegestane paginagroottes vallen terug op een veilige standaardwaarde.

5.15 SiteNotifications

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SiteNotificationsConfiguratie en contentbeheerBeheerder-gedreven, planbare en tijdelijke sitebrede of doelgroepgerichte notificaties die als eigen notificatiecomponent boven de reeds geladen frontpage getoond kunnen worden.Users, SiteNotificationHistory
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
AudienceTypenvarchar(30)-NN-NNJDoelgroep: Public, Authenticated, Teacher, Student, Guardian of Admin.
NotificationTypenvarchar(20)-NN-NNJCode-enum Info of Warning.
Titlenvarchar(50)-NN-NNNTitel van de systeemnotificatie.
BodyTextnvarchar(1000)-NN-NNNBerichtinhoud van de notificatie.
StartAtUtcdatetime2-NN-NNJUTC-startmoment waarop de notificatie zichtbaar mag worden.
EndAtUtcdatetime2nullNN-NJJOptioneel UTC-eindmoment; null betekent geen geplande einddatum.
DisplayRulenvarchar(30)-NN-NNNCode-enum Always of OncePerBrowser.
CreatedAtUtcdatetime2sysutcdatetime()NN-NNNAanmaakmoment.
CreatedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de notificatie heeft aangemaakt.
UpdatedAtUtcdatetime2sysutcdatetime()NN-NNNLaatste wijzigmoment.
UpdatedByUserIduniqueidentifiernullNNUsers.IdNJNSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de laatste wijziging heeft uitgevoerd.

Validaties / constraints

  • AudienceType is binnen de V1.0-baseline beperkt tot Public, Authenticated, Teacher, Student, Guardian en Admin.
  • NotificationType is binnen de V1.0-baseline beperkt tot Info en Warning.
  • DisplayRule is binnen de V1.0-baseline beperkt tot Always en OncePerBrowser.
  • Title heeft max. 50 karakters en BodyText max. 1000 karakters.

Business rules

Title en BodyText gebruiken bewust afgebakende invoergrenzen. Bij DisplayRule OncePerBrowser onthoudt de browser op basis van de notificatie-id dat de notificatie al is getoond. Zolang die lokale browserinformatie bestaat, wordt dezelfde notificatie niet opnieuw getoond, ook niet na inhoudelijke wijziging. Gewijzigde of belangrijkere informatie moet daarom via een nieuwe notificatie worden gepubliceerd en de oude notificatie moet worden beëindigd.

  • Site-notificaties zijn beheerder-gedreven, planbare en tijdelijke sitebrede of doelgroepgerichte meldingen en verschillen daarmee expliciet van popupdefinities en mailbox-systeemberichten.
  • Opslag en verwerking van start- en eindmomenten gebeurt in UTC; presentatie in de GUI gebeurt in de lokale tijdzone van de gebruiker, inclusief zomer- en wintertijd.
  • Overlap tussen notificaties is toegestaan.
  • Wanneer meerdere notificaties tegelijk geldig zijn, worden zij in volgorde van aanmaken getoond, oudste eerst.
  • Na het sluiten van een notificatie moet direct gecontroleerd worden of nog een volgende actieve notificatie getoond moet worden, zonder de reeds geladen frontpage opnieuw te laden.

Lifecycle / gedrag

  • De view Actief & gepland toont alleen nog geldige site-notificaties.
  • De view Afgelopen 31 dagen toont recent verlopen site-notificaties die nog bewerkbaar of opnieuw inzetbaar zijn.
  • De view Alle verlopen is read only.
  • Een handmatige uitschakelactie vult EndAtUtc met de huidige UTC-timestamp.
  • 'Bijna verlopen' is geen opgeslagen status, maar een UI-afleiding voor site-notificaties met EndAtUtc binnen 24 uur in de toekomst.

Designkeuzes

  • AudienceType en niet ContextType wordt gebruikt, omdat notificaties doelgroepgestuurd zijn en niet gekoppeld aan één specifieke rendercontext.
  • De weergaveregel OncePerBrowser wordt clientside afgedwongen via een cookie of vergelijkbare browseropslag; server-side wordt niet bijgehouden of een gebruiker de melding al gezien heeft.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: niet van toepassing binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • De velden AudienceType, NotificationType, DisplayRule functioneren als code-, enum- of sleutelwaarden en verwijzen bewust niet via een harde foreign key.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.16 SiteNotificationHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SiteNotificationHistoryAudit en historieVeldniveau-history voor systeemnotificaties, inclusief inhoud, planning, doelgroep en weergaveregel.SiteNotifications, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
SiteNotificationIduniqueidentifier-NJSiteNotifications.IdNNJVerwijzing naar de site-notificatie waarop de wijziging betrekking heeft.
ChangedFieldnvarchar(100)-NN-NNJGewijzigd veld, bijvoorbeeld Title, StartAtUtc, EndAtUtc of AudienceType.
OldValuenvarchar(max)nullNN-NJNVorige waarde.
NewValuenvarchar(max)nullNN-NJNNieuwe waarde.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment van wijziging.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de wijziging heeft uitgevoerd.

Validaties / constraints

  • SiteNotificationId, ChangedField, ChangedAtUtc en ChangedByUserId zijn verplicht.

Business rules

  • History legt per wijziging vast wie welke actie op welk veld heeft uitgevoerd, inclusief van- en naarwaarde.
  • Zowel inhoudswijzigingen als planning, doelgroep, weergaveregel en handmatige uitschakeling worden auditbaar vastgelegd.

Lifecycle / gedrag

  • Historyrecords worden niet aangepast of verwijderd.

Designkeuzes

  • Aparte history maakt het mogelijk om laagdrempelig per notificatie de volledige planning- en inhoudslifecycle terug te zien.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: SiteNotificationId -> SiteNotifications.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.17 SiteFeatureToggleHistory

TabelnaamCategorieDoel / verantwoordelijkheidGerelateerde tabellen
SiteFeatureToggleHistoryAudit en historieHistorische vastlegging van alle wijzigingen aan sitebrede featuretoggles.SiteFeatureToggles, Users
VeldnaamTypeDefaultPKFKVerwijst naarUniqueNullableIndexOpmerking
Iduniqueidentifier-JN-JNJPrimaire sleutel.
SiteFeatureToggleIduniqueidentifier-NJSiteFeatureToggles.IdNNJVerwijzing naar de featuretoggle.
OldValuebit-NN-NNNVorige booleaanse waarde van de featuretoggle.
NewValuebit-NN-NNNNieuwe booleaanse waarde van de featuretoggle.
ChangedAtUtcdatetime2sysutcdatetime()NN-NNJMoment van wijziging.
ChangedByUserIduniqueidentifier-NNUsers.IdNNJSoft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de wijziging heeft uitgevoerd.

Validaties / constraints

  • SiteFeatureToggleId, ChangedAtUtc, ChangedByUserId, OldValue en NewValue zijn verplicht.

Business rules

  • Iedere wijziging aan een featuretoggle wordt historisch vastgelegd, inclusief wie de wijziging uitvoerde en welke oude en nieuwe waarde daarbij hoorde.

Lifecycle / gedrag

  • Historyrecords worden niet aangepast of verwijderd.

Designkeuzes

  • Omdat featuretoggles sitebreed gedrag kunnen wijzigen, is een aparte auditlaag noodzakelijk en onvoldoende afgedekt met alleen UpdatedAtUtc op de hoofdtafel.

Foreign keys op databaseniveau

  • Harde foreign keys op databaseniveau: SiteFeatureToggleId -> SiteFeatureToggles.Id.

Functionele / logische verwijzingen zonder harde FK

  • Actorvelden naar Users.Id zijn soft links; beheerders, systeemactoren en history-actoren worden functioneel gevalideerd via identity/authorization en niet via een harde database-FK.
  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.18 Centrale code-enums en sleutelsets

Let op: Onderstaande is geen tabel, maar een verzameling enums tbv de code. Hier vastgelegd ivm de relaties in de tabellen.

<Geen Tabel>CategorieDoel / verantwoordelijkheidGerelateerde tabellen
Centrale code-enums en sleutelsetsTechnische sleutelsetsOverzicht van centraal vastgelegde code-enums en sleutelsets voor site-instellingen en contentbeheer binnen de V1.0-baseline.ContentBlocks, SiteLinks, FooterLinkAssignments, SystemMessageTemplates, SiteNotifications, SiteFeatureToggles
SleutelsetWaardenToepassingOpmerking
------------
DomainTypeFrontPage, StaticPage, FooterContentBlocksUniform contentblokmodel voor frontpages, vaste pagina's en footertekst.
ContextTypePublic, NoRole, Admin, Teacher, Student, GuardianContentBlocks / footer-contextRendercontext voor frontpages en footeropbouw.
AudienceTypePublic, Authenticated, Teacher, Student, Guardian, AdminSiteNotificationsDoelgroep van systeemnotificaties.
NotificationTypeInfo, WarningSiteNotificationsVisueel en functioneel type van een notificatie.
DisplayRuleAlways, OncePerBrowserSiteNotificationsWeergaveregel voor systeemnotificaties.
LinkTypeInternal, ExternalSiteLinksType URL-record.
FooterColumnTypeMiddle, RightFooterLinkAssignmentsDoelkolom binnen de footer.
PopupTypeInfo, Warning, Error, CriticalPopupDetailsPopupsoort.
PopupVariantInfoOnly, Confirm, InputText, InputEmail, InputTextarea, CustomPopupDetailsTechnische popupvorm en inputgedrag.
PopupInputTypeText, Email, TextareaPopupDetailsType van het ene ondersteunde inputveld bij niet-custom inputvarianten.
SystemMessageTypeInfo, Success, Warning, Error, CriticalSystemMessageTemplatesType systeemberichtsjabloon.
ButtonThemePrimary, Secondary, Success, Warning, Danger, NeutralPopupDetails / SystemMessageTemplatesV1.0-themaset voor knoppen; uitbreiding vereist code-/migratieaanpassing.

Validaties / constraints

  • De volgende sleutelsets worden binnen de V1.0-baseline als centrale code-enums behandeld en niet als vrij invoerbare UI-waardes opgeslagen: DomainType = FrontPage, StaticPage, Footer; ContextType = Public, NoRole, Admin, Teacher, Student, Guardian; AudienceType = Public, Authenticated, Teacher, Student, Guardian, Admin; NotificationType = Info, Warning; DisplayRule = Always, OncePerBrowser; LinkType = Internal, External; FooterColumnType = Middle, Right; PopupType = Info, Warning, Error, Critical; SystemMessageType = Info, Success, Warning, Error, Critical; SystemMessageEntityType = RelationshipInvitation, Ticket, PrivateMessageThread, SharedExercise; ButtonTheme = Primary, Secondary, Success, Warning, Danger, Neutral; PopupVariant = InfoOnly, Confirm, InputText, InputEmail, InputTextarea, Custom; PopupInputType = Text, Email, Textarea.

Business rules

  • De functionele betekenis van deze waarden wordt in FO/TO/SRS vastgelegd; de technische sleutelset en exacte schrijfwijze worden in dit document beheerd.

Lifecycle / gedrag

  • Uitbreiding van deze enumsets gebeurt gecontroleerd via codewijziging en waar nodig database-migraties.

Designkeuzes

  • Door functionele lijsten in FO/TO/SRS en technische sleutelsets in Database Information parallel vast te leggen, worden interpretatieverschillen tussen ontwerp en implementatie voorkomen.

Foreign keys op databaseniveau

  • Geen harde foreign keys op databaseniveau binnen deze tabel.

Functionele / logische verwijzingen zonder harde FK

  • Buiten de expliciete foreign keys bevat deze tabel geen afzonderlijke functionele verwijzingen die als harde foreign key gemodelleerd hoeven te worden; overige velden zijn inhouds-, status- of auditwaarden.

FK + snapshot

  • FK + snapshot: niet van toepassing binnen deze tabel.

5.19 Relatiepopups en hergebruik van popupdefinities

5.19.1 PopupDetails als runtimeweergave van ontwerpbronnen

  • Voor normale dynamische popups is niet de detailtabel in documentatie, maar de combinatie van popup-registerregel, ThemeKey en Variant de source of truth.
  • PopupDetails bevat de databaseweergave die door code/migratie uit die source of truth gevuld kan worden.
  • Titel, tekst, knoptekst en knopactie worden niet op meerdere documentatieplekken herhaald.
  • Custom popups vormen de enige uitzondering; deze krijgen een CustomRendererKey en waar nodig een aparte functionele detailuitwerking.

5.19.2 Relatiepopups

De relatie-usecases introduceren of bevestigen onder meer deze popupcategorieën:

PopupKeyVariantDoel
POP-GEN-REL-INVITE-FRIENDInputEmailE-mailadres invoeren voor vrienduitnodiging.
POP-GEN-REL-INVITE-GUARDIANInputEmailE-mailadres invoeren voor ouder/voogd-uitnodiging.
POP-GEN-REL-INVITE-OEFENHUBConfirmOnbekend e-mailadres controleren en externe OefenHub-uitnodiging bevestigen.
POP-GEN-REL-INVITE-DUPLICATEInfoOnlyBestaande relatie of openstaande uitnodiging blokkeert nieuwe uitnodiging.
POP-GEN-REL-INVITE-NOT-ALLOWEDInfoOnlyRolcontext of relatietype staat uitnodigen niet toe.
POP-GEN-REL-INVITE-SEND-FAILEDInfoOnlyTechnische fout bij opslaan, systeembericht of externe e-mail.
POP-GEN-REL-INVITE-DECLINE-CONFIRMConfirmAfwijzen van een relatie-uitnodiging bevestigen.
POP-GEN-REL-DISCONNECT-CONFIRMConfirmOntkoppelen van een relatie bevestigen.

5.19.3 Centrale sleutelsets voor popups

SleutelsetWaardenToepassing
PopupVariantInfoOnly, Confirm, InputText, InputEmail, InputTextarea, CustomBepaalt standaardvorm en inputgedrag van de popup.
PopupTypeInfo, Warning, Error, CriticalVisuele en functionele popupsoort.
ButtonThemePrimary, Secondary, Success, Warning, Danger, NeutralKnopstijl zonder losse kleurvelden.
PopupInputTypeText, Email, TextareaEén inputveld bij niet-custom inputvarianten.

5.20 Generieke configuratie- en contentregels

5.20.1 PopupDetails en popupregisters voor generieke domeinen

  • Berichten, meldingen en profiel gebruiken popupkeys als stabiele verwijzing vanuit usecases en code.
  • Popupteksten, knopteksten, knopacties, inputvelden en themekeuzes worden inhoudelijk centraal vastgelegd in de ontwerpbronnen en kunnen daaruit naar PopupDetails worden gemigreerd of geseed.
  • Niet-custom popups krijgen geen aparte dubbele detailuitwerking in de database-informatiedocumentatie.
  • Custom popups blijven de uitzondering en vereisen een CustomRendererKey wanneer meer dan de standaardvariant nodig is.

Voor generiek/berichten zijn onder meer deze popupcategorieën relevant:

PopupKeyVariantDoel
POP-GEN-MSG-NO-RELATIONInfoOnlyVerzenden of beantwoorden blokkeren wanneer relatie- of deelnemerscontext niet meer geldig is.
POP-GEN-MSG-SEND-FAILEDInfoOnlyVeilige foutmelding bij technische of transactionele verzendfout.
POP-GEN-MSG-NOT-AVAILABLEInfoOnlyMailboxitem, systeembericht of privéthread bestaat niet, is niet toegankelijk, verwijderd of niet meer beschikbaar.
POP-GEN-MSG-DELETE-CONFIRMConfirmBevestiging vóór participantgebonden verwijderen van een privéthread uit de eigen mailbox.
POP-GEN-MSG-DELETEDInfoOnlyTerugkoppeling na succesvolle participantgebonden verwijdering.
POP-GEN-MSG-DELETE-FAILEDInfoOnlyVeilige foutmelding bij technische of transactionele verwijderfout.

Voor generiek/meldingen zijn popupcategorieën relevant voor minimaal melding indienen, niet-beschikbaarheid, reageren, sluiten, oplossing accepteren, heropenen, beheerder koppelen/ontkoppelen, extern/interne berichtfouten, oplossen/sluiten en doorzetten naar docent. De exacte PopupKey-set blijft centraal in het popupregister leidend.

Voor generiek/profiel zijn popupcategorieën relevant voor opgeslagen profielgegevens, validatiefouten, verplichte niveaukeuze, verlaten zonder verplicht niveau, profielfoto kiezen, toegankelijkheidsinstellingen en voorkeuren opslaan. De exacte PopupKey-set blijft centraal in het popupregister leidend.

5.20.2 SiteNotifications als eigen notificatiedomein

  • SiteNotifications zijn geen SystemMessages en geen PopupDetails.
  • De frontpage of rolgerichte startpagina wordt eerst normaal geladen; daarna controleert de applicatie of een actieve site-notificatie boven de pagina moet worden getoond.
  • Er wordt steeds maximaal één systeemnotificatie tegelijk getoond.
  • Wanneer meerdere notificaties relevant en actief zijn, wordt de oudste aangemaakte notificatie eerst getoond.
  • Na sluiten van een notificatie controleert de applicatie direct of een volgende relevante notificatie beschikbaar is.
  • DisplayRule = Always wordt niet permanent als gezien geregistreerd, maar mag binnen dezelfde notificatiereeks niet direct opnieuw verschijnen.
  • DisplayRule = OncePerBrowser wordt clientside afgedwongen via cookie of vergelijkbare browseropslag op basis van de notificatie-id.
  • Er wordt geen server-side gebruikersgebonden gezienlog en geen aparte seen-tabel voor site-notificaties geïntroduceerd.
  • Wijziging van een bestaande notificatie doorbreekt een bestaande OncePerBrowser-browsermarker niet automatisch. Wanneer informatie opnieuw getoond moet worden, moet beheer een nieuwe notificatie publiceren.
  • De browsermarker mag geen persoonsgegevens, autorisatiedata of profielcontext bevatten.

5.20.3 Featuretoggles en sleutelconsistentie

  • AccessibilityEnabled bepaalt of toegankelijkheidsinstellingen functioneel toegepast worden; opgeslagen waarden blijven bewaard wanneer de feature is uitgeschakeld.
  • PrivateMessagingEnabled bepaalt of nieuwe privéberichtacties functioneel beschikbaar zijn; bestaande berichtenhistorie wordt daardoor niet verwijderd.
  • IssueReportingEnabled bepaalt of nieuwe meldingen kunnen worden ingediend; bestaande meldingen en beheerflows blijven volgens hun eigen regels beschikbaar.
  • Voor featurekeys wordt de centrale sleutelset uit dit document gevolgd; afwijkende schrijfwijzen in oudere documentatie moeten worden geconsolideerd naar de actuele sleutelset.

5.21 Account-lifecycle binnen configuratiebeheer

5.21.1 Accountverwijdering-popups

De accountverwijderen-flow gebruikt gewone dynamische popupregister-popups voor de definitieve bevestiging, blokkade en foutafhandeling. Hiervoor zijn geen nieuwe popupdetailtabellen nodig. De popupregisterregel blijft de enige inhoudelijke bron voor titel, tekst, knopteksten, acties en themakeuze.

Login, sessieverwerking, ongeldige identity-context, gedeactiveerd account, geen rol, onvolledige accountcontext en logout gebruiken geen domeinspecifieke popupregister-popups. Deze situaties worden afgehandeld via identity-providerflow, routeguard, beperkte frontpagecontext, profielvervolgflow of generieke toegangafhandeling.

5.22 Beheerderregels voor configuratiebeheer

OnderwerpAanscherping
Beheerder-frontpageDe beheerder-frontpage is een read-only overzichts- en oriëntatiepagina met vaste blokstructuur: introblok, attentieblok, Contentbeheer, Accounts & rollen en Recente beheerwijzigingen.
FrontpagebeheerFrontpagebeheer beheert tekstuele contentblokken per context. Layout, volgorde, rendergedrag en structurele blokopbouw blijven codegedreven; het model is geen pagebuilder.
Gecombineerde frontpagesGecombineerde rolfrontpages worden runtime samengesteld uit basiscontexten. Er wordt geen persistent ontwerp per rolcombinatie opgeslagen.
Handige links en vaste pagina'sDe beheerpagina beheert URL-records, footerinhoud en vaste publieke pagina’s zoals Over OefenHub, Privacybeleid en Contact. Het contactformulier zelf blijft buiten scope.
URL-validatieInterne en externe URL-records moeten server-side gevalideerd worden voordat opslag slaagt. Een URL die in footerplaatsingen gebruikt wordt mag niet verwijderd worden.
PopupbeheerPopupbeheer beheert bestaande popuprecords. Technische sleutel, variant, theme, knopacties en custom renderer blijven read-only of codegedreven.
SysteemberichtbeheerSysteemberichtbeheer beheert bestaande templates. Referentienaam en technische actie blijven read-only; onderwerp, tekst, domein/type en ondersteunde knoptekst zijn beheerbaar binnen validatiegrenzen.
FeaturesFeaturetoggles zijn sitebrede schakelaars voor expliciet togglebare functies. Verplichte kernonderdelen worden niet als featuretoggle gemodelleerd.
SysteeminstellingenSysteeminstellingen worden beheerd als bestaande sleutels met type, invoervorm en validatie. Nieuwe sleutels worden niet via de GUI aangemaakt.
ConfiguratiecacheNa relevante systeeminstellingswijzigingen wordt de configuratiecache gecontroleerd ververst zonder dat bestaande sessies stilzwijgend andere autorisaties krijgen.
CategoriebeheerCentraal categoriebeheer beheert naam, kleur, icoon, status, migratie en geschiedenis van centrale categorie-identiteit. Historische runs worden door migratie niet herschreven.
ModulebeheerModulebeheer beheert ExerciseModules, actiefstatus, testzichtbaarheid, connectiviteitstest, migratie en geschiedenis. Concrete docent-oefenconfiguratie blijft buiten de centrale modulebeheerpagina.