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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| PopupDetails | Configuratie - Systeem Popups | Bevat configureerbare popupdefinities die door beheerders via de GUI aangepast kunnen worden. Nieuwe popups worden uitsluitend via code en database-migraties toegevoegd. | Users, PopupDetailsHistory, PopupDetailsHistoryItems |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel van de popupdefinitie. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| Key | nvarchar(100) | - | N | N | - | J | N | J | Technisch stabiele referentie; niet wijzigbaar via GUI. |
| Description | nvarchar(250) | null | N | N | - | N | J | N | Korte beheeromschrijving voor herkenning in sitebeheer. |
| Type | nvarchar(30) | Info | N | N | - | N | N | J | Visueel type voor icoon/stijl: Info, Warning, Error of Critical. |
| ThemeKey | nvarchar(100) | null | N | N | - | N | J | J | Documentatie- en seedreferentie naar het gekozen popup-thema. Wordt niet vrij via de GUI gewijzigd. |
| Variant | nvarchar(30) | InfoOnly | N | N | - | N | N | J | Technische popupvorm, bijvoorbeeld InfoOnly, Confirm, InputText, InputEmail, InputTextarea of Custom. |
| Title | nvarchar(200) | - | N | N | - | N | N | J | Titel van de popup. |
| Text | nvarchar(max) | - | N | N | - | N | N | J | Hoofdtekst van de popup. |
| OverlayMode | nvarchar(20) | Dimmed | N | N | - | N | N | N | Weergave van de achtergrond, bijvoorbeeld None of Dimmed. |
| CloseButtonEnabled | bit | 1 | N | N | - | N | N | N | Toont of verbergt het kruisje rechtsboven. |
| ShowLeftButton | bit | 0 | N | N | - | N | N | N | Geeft aan of een linker knop zichtbaar is. |
| LeftButtonText | nvarchar(100) | null | N | N | - | N | J | N | Tekst van de linker knop indien zichtbaar. |
| LeftButtonActionCallMethod | nvarchar(100) | null | N | N | - | N | J | N | Technische actie-identificatie voor de linker knop; read only in de GUI. |
| LeftButtonTheme | nvarchar(30) | null | N | N | - | N | J | N | ButtonTheme van de linker knop, bijvoorbeeld Secondary of Danger. |
| ShowRightButton | bit | 0 | N | N | - | N | N | N | Geeft aan of een rechter knop zichtbaar is. |
| RightButtonText | nvarchar(100) | null | N | N | - | N | J | N | Tekst van de rechter knop indien zichtbaar. |
| RightButtonActionCallMethod | nvarchar(100) | null | N | N | - | N | J | N | Technische actie-identificatie voor de rechter knop; read only in de GUI. |
| RightButtonTheme | nvarchar(30) | null | N | N | - | N | J | N | ButtonTheme van de rechter knop, bijvoorbeeld Primary of Danger. |
| InputKey | nvarchar(100) | null | N | N | - | N | J | N | Technische sleutel van het ene ondersteunde inputveld, indien de variant dat ondersteunt. |
| InputType | nvarchar(30) | null | N | N | - | N | J | N | Inputtype, bijvoorbeeld Text, Email of Textarea. Alleen relevant bij inputvarianten. |
| InputLabel | nvarchar(100) | null | N | N | - | N | J | N | Zichtbaar label van het inputveld. |
| InputRequired | bit | null | N | N | - | N | J | N | Geeft aan of het inputveld verplicht is. |
| InputMaxLength | int | null | N | N | - | N | J | N | Maximale invoerlengte voor het inputveld. |
| CustomRendererKey | nvarchar(100) | null | N | N | - | N | J | J | Verwijzing naar coded renderer wanneer Variant = Custom. |
| IsActive | bit | 1 | N | N | - | N | N | J | Maakt popup beschikbaar of verborgen in het systeem. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment van het record, normaliter via migratie. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigingsmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | J | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| PopupDetailsHistory | Configuratie - Systeem Popups | Registreert wijzigingsmomenten op popupniveau, inclusief actor, tijdstip en type wijziging. | PopupDetails, PopupDetailsHistoryItems, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel van het historymoment. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| PopupDetailsId | uniqueidentifier | - | N | J | PopupDetails.Id | N | N | J | Popuprecord waarop deze wijziging betrekking heeft. |
| ChangeType | nvarchar(50) | - | N | N | - | N | N | J | Type wijziging, bijvoorbeeld Create, Update of TechnicalSeed. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment waarop de wijziging is vastgelegd. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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. |
| ChangeSetId | uniqueidentifier | null | N | N | - | N | J | J | Optionele 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| PopupDetailsHistoryItems | Configuratie - Systeem Popups | Legt per historymoment vast welke velden van een popup gewijzigd zijn en wat de oude en nieuwe waarde was. | PopupDetailsHistory |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel van het detailrecord. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| PopupDetailsHistoryId | uniqueidentifier | - | N | J | PopupDetailsHistory.Id | N | N | J | Historymoment waaraan deze wijzigingsregel hangt. |
| ChangedField | nvarchar(100) | - | N | N | - | N | N | J | Naam van het gewijzigde veld, bijvoorbeeld Title of RightButtonTheme. |
| OldValue | nvarchar(max) | null | N | N | - | N | J | N | Vorige waarde van het veld. |
| NewValue | nvarchar(max) | null | N | N | - | N | J | N | Nieuwe 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SiteFeatureToggles | Configuratie | Sitebrede feature toggles die door beheerders via site-instellingen aan- of uitgezet kunnen worden. | Users, UserSettings |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| FeatureKey | nvarchar(100) | - | N | N | - | J | N | J | Technische sleutel van de featuretoggle, bijvoorbeeld RegistrationEnabled, LoginEnabled, FriendshipsEnabled, PrivateMessagesEnabled, LiveViewEnabled, SharingEnabled, TestExercisesEnabled, ReportProblemEnabled of AccessibilityEnabled. |
| IsEnabled | bit | 1 | N | N | - | N | N | N | Geeft aan of de feature sitebreed actief is. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatst bijgewerkt op. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SystemSettings | Configuratie | Niet-booleaanse systeembrede instellingen die door beheerders via site-instellingen beheerd worden, zoals PDF-bestandsnaamopbouw en bewaartermijnen. | Users, SiteFeatureToggles |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| ValueText | nvarchar(500) | - | N | N | - | N | N | N | Tekstwaarde voor systeeminstellingen die als string worden opgeslagen. |
| ValueBool | bit | null | N | N | - | N | J | N | Booleaanse waarde voor systeeminstellingen. |
| ValueDate | datetime2 | null | N | N | - | N | J | N | Datum- of datum/tijdwaarde voor systeeminstellingen. |
| ValueInt | int | null | N | N | - | N | J | N | Gehele numerieke waarde voor systeeminstellingen. |
| SettingKey | nvarchar(100) | - | N | N | - | J | N | J | Technische sleutel van de instelling, bijvoorbeeld PdfResultFileNamePattern of PrivateMessageRetentionDays. |
| ValueDecimal | decimal(10,2) | null | N | N | - | N | J | N | Decimale waarde voor systeeminstellingen. |
| Description | nvarchar(500) | null | N | N | - | N | J | N | Optionele toelichting voor beheerweergave of migratiecontext. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatst bijgewerkt op. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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
| SettingKey | Waardeveld | Waardetype | Validatie / gebruik |
|---|---|---|---|
PrivateMessageRetentionDays | ValueInt | Positief geheel getal | Functionele bewaartermijn voor privéberichten en bijbehorende gebruikersweergave. |
PdfResultFileNamePattern | ValueText | Patroonstring | Toegestaan bestandsnaampatroon voor resultaat-PDF's; mag geen padsegmenten, scripts of onveilige tekens bevatten. |
TicketReopenDeadlineDays | ValueInt | Niet-negatief geheel getal | Aantal dagen dat een door beheer gesloten melding nog als heropenbaar/opgelost wordt beschouwd. 0 betekent geen actieve heropenperiode. |
RelationshipInvitationReminderCooldownHours | ValueInt | Positief geheel getal, standaard 24 | Aantal 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| ContentBlocks | Configuratie en contentbeheer | Uniform contentblokmodel voor frontpagecontent, vaste pagina-inhoud en tekstuele footerinhoud die door beheerders via de GUI aangepast mag worden. | Users, ContentBlockHistory |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| DomainType | nvarchar(30) | - | N | N | - | N | N | J | Code-enum, binnen de huidige baseline beperkt tot FrontPage, StaticPage en Footer. |
| ContextType | nvarchar(30) | - | N | N | - | N | N | J | Context waarin het blok geladen wordt, bijvoorbeeld Public, NoRole, Teacher, Student, Guardian of Admin. |
| ReferenceKey | nvarchar(100) | - | N | N | - | N | N | J | Codevaste unieke verwijzing waarmee de applicatie weet welk blok waar getoond moet worden. |
| Title | nvarchar(200) | null | N | N | - | N | J | N | Optionele titel van het contentblok. |
| Text | nvarchar(max) | null | N | N | - | N | J | N | Optionele tekstuele inhoud van het contentblok. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment van het blokrecord. |
| CreatedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | N | Soft 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. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| ContentBlockHistory | Audit en historie | Veldniveau-history voor contentblokken, zodat per domein, context en referentie herleidbaar blijft wie wat gewijzigd heeft. | ContentBlocks, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| ContentBlockId | uniqueidentifier | - | N | J | ContentBlocks.Id | N | N | J | Verwijzing naar het contentblok waarop de wijziging betrekking heeft. |
| DomainType | nvarchar(30) | - | N | N | - | N | N | J | Snapshot van DomainType op het moment van wijziging. |
| ContextType | nvarchar(30) | - | N | N | - | N | N | J | Snapshot van ContextType op het moment van wijziging. |
| ReferenceKey | nvarchar(100) | - | N | N | - | N | N | J | Snapshot van de codevaste blokreferentie. |
| ChangedField | nvarchar(100) | - | N | N | - | N | N | J | Naam van het veld dat gewijzigd is, bijvoorbeeld Title of Text. |
| OldValue | nvarchar(max) | null | N | N | - | N | J | N | Vorige waarde. |
| NewValue | nvarchar(max) | null | N | N | - | N | J | N | Nieuwe waarde. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment waarop de wijziging is vastgelegd. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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.Idzijn 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.8 SiteLinks
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SiteLinks | Configuratie en contentbeheer | Herbruikbare URL-records voor footerlinks en andere beheerde linkverwijzingen. | Users, SiteLinkHistory, FooterLinkAssignments |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| LinkType | nvarchar(20) | - | N | N | - | N | N | J | Code-enum Internal of External. |
| DisplayName | nvarchar(150) | - | N | N | - | N | N | N | Naam zoals de beheerder de link wil tonen. |
| Url | nvarchar(1000) | - | N | N | - | N | N | N | Interne route of externe URL. |
| OpenInNewTab | bit | 0 | N | N | - | N | N | N | Bepaalt of de link in een nieuw tabblad geopend moet worden. |
| IsDeleted | bit | 0 | N | N | - | N | N | J | Soft delete vlag voor administratieve verwijdering met behoud van historie. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment. |
| CreatedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de URL heeft aangemaakt. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de laatste wijziging heeft uitgevoerd. |
| DeletedAtUtc | datetime2 | null | N | N | - | N | J | N | Moment van soft delete. |
| DeletedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SiteLinkHistory | Audit en historie | Veldniveau-history voor URL-records die door beheerders via de GUI beheerd worden. | SiteLinks, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| SiteLinkId | uniqueidentifier | - | N | J | SiteLinks.Id | N | N | J | Verwijzing naar het URL-record. |
| ChangedField | nvarchar(100) | - | N | N | - | N | N | J | Gewijzigd veld, bijvoorbeeld DisplayName, Url of OpenInNewTab. |
| OldValue | nvarchar(max) | null | N | N | - | N | J | N | Vorige waarde. |
| NewValue | nvarchar(max) | null | N | N | - | N | J | N | Nieuwe waarde. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment waarop de wijziging is vastgelegd. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| FooterSections | Configuratie en contentbeheer | Beheerbare secties binnen de footer per context en kolom, inclusief sectietitel en auditinformatie. | FooterLinkAssignments, SiteLinks, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. GUID wordt in de applicatiecode gegenereerd; geen database-default. |
| ContextType | nvarchar(30) | - | N | N | - | N | N | J | Context waarvoor deze footersectie geldt, bijvoorbeeld Public, Student, Teacher, Guardian of Admin. |
| ColumnType | nvarchar(20) | - | N | N | - | N | N | J | Code-enum Middle of Right. Bepaalt in welke beheerbare footerkolom deze sectie valt. |
| Title | nvarchar(150) | - | N | N | - | N | N | N | Beheerbare sectietitel zoals zichtbaar in de footer, bijvoorbeeld Handige links of Snel naar. |
| IsDeleted | bit | 0 | N | N | - | N | N | J | Soft delete-vlag voor administratieve verwijdering met behoud van historie. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment. |
| CreatedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de sectie heeft aangemaakt. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de laatste wijziging heeft uitgevoerd. |
| DeletedAtUtc | datetime2 | null | N | N | - | N | J | N | Moment van soft delete. |
| DeletedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| FooterLinkAssignments | Configuratie en contentbeheer | Koppelt SiteLinks aan een beheerbare footersectie en legt de volgorde binnen die sectie vast. | FooterSections, SiteLinks, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| FooterSectionId | uniqueidentifier | - | N | J | FooterSections.Id | N | N | J | Verwijzing naar de footersectie waaronder de link getoond wordt. |
| SiteLinkId | uniqueidentifier | - | N | J | SiteLinks.Id | N | N | J | Verwijzing naar de gekoppelde URL. |
| DisplayOrder | int | 0 | N | N | - | N | N | N | Volgorde van weergave binnen de sectie. |
| IsDeleted | bit | 0 | N | N | - | N | N | J | Soft delete-vlag voor administratieve verwijdering van de koppeling met behoud van historie. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment. |
| CreatedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de koppeling heeft aangemaakt. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Gebruiker die de laatste wijziging heeft uitgevoerd. |
| DeletedAtUtc | datetime2 | null | N | N | - | N | J | N | Moment van soft delete. |
| DeletedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| FooterLinkAssignmentHistory | Audit en historie | Veldniveau-history voor footerlinkplaatsingen en volgordewijzigingen. | FooterLinkAssignments, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| FooterLinkAssignmentId | uniqueidentifier | - | N | J | FooterLinkAssignments.Id | N | N | J | Verwijzing naar de footerplaatsing. |
| ChangedField | nvarchar(100) | - | N | N | - | N | N | J | Gewijzigd veld, bijvoorbeeld SiteLinkId, FooterSectionId of DisplayOrder. |
| OldValue | nvarchar(max) | null | N | N | - | N | J | N | Vorige waarde. |
| NewValue | nvarchar(max) | null | N | N | - | N | J | N | Nieuwe waarde. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment van wijziging. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SystemMessageTemplates | Configuratie en contentbeheer | Codegedreven systeemberichtsjablonen waarvan inhoud en beperkte metadata via de GUI aangepast mogen worden. | Users, SystemMessageTemplateHistory |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| ReferenceName | nvarchar(100) | - | N | N | - | J | N | J | Codevaste technische referentie; read only in de GUI. |
| Domain | nvarchar(50) | - | N | N | - | N | N | J | Code-enum van het functionele domein. |
| MessageType | nvarchar(30) | - | N | N | - | N | N | J | Code-enum, bijvoorbeeld Info, Warning, Error of Critical. |
| Subject | nvarchar(50) | - | N | N | - | N | N | N | Onderwerp van het systeembericht. |
| BodyText | nvarchar(1000) | - | N | N | - | N | N | N | Tekstuele inhoud van het berichtsjabloon. |
| ActionButtonText | nvarchar(20) | null | N | N | - | N | J | N | Optionele knoptekst wanneer een codegestuurde actie beschikbaar is. |
| ActionName | nvarchar(100) | null | N | N | - | N | J | N | Technische actie-identificatie; read only in de GUI. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment via code/migratie. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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
RowVersionvereist; 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
ReferenceNamegeldt een codegedreven placeholder-allowlist. Onbekende placeholders of ontbrekende verplichte placeholders moeten server-side worden geweigerd voordat een template wordt opgeslagen of gebruikt voor rendering. SystemMessageTemplatesleveren inhoud voor toekomstigeSystemMessages; 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SystemMessageTemplateHistory | Audit en historie | Veldniveau-history van systeemberichtsjablonen. | SystemMessageTemplates, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| SystemMessageTemplateId | uniqueidentifier | - | N | J | SystemMessageTemplates.Id | N | N | J | Verwijzing naar het systeemberichtsjabloon. |
| ChangedField | nvarchar(100) | - | N | N | - | N | N | J | Gewijzigd veld, bijvoorbeeld Subject, BodyText of ActionButtonText. |
| OldValue | nvarchar(max) | null | N | N | - | N | J | N | Vorige waarde. |
| NewValue | nvarchar(max) | null | N | N | - | N | J | N | Nieuwe waarde. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment van wijziging. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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
SystemMessageshoeven 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.Idzijn 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:
| Configuratiepad | Standaard | Doel | Beheerbaarheid |
|---|---|---|---|
OefenHub:Display:PageTitle | OefenHub | Centrale 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SiteNotifications | Configuratie en contentbeheer | Beheerder-gedreven, planbare en tijdelijke sitebrede of doelgroepgerichte notificaties die als eigen notificatiecomponent boven de reeds geladen frontpage getoond kunnen worden. | Users, SiteNotificationHistory |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| AudienceType | nvarchar(30) | - | N | N | - | N | N | J | Doelgroep: Public, Authenticated, Teacher, Student, Guardian of Admin. |
| NotificationType | nvarchar(20) | - | N | N | - | N | N | J | Code-enum Info of Warning. |
| Title | nvarchar(50) | - | N | N | - | N | N | N | Titel van de systeemnotificatie. |
| BodyText | nvarchar(1000) | - | N | N | - | N | N | N | Berichtinhoud van de notificatie. |
| StartAtUtc | datetime2 | - | N | N | - | N | N | J | UTC-startmoment waarop de notificatie zichtbaar mag worden. |
| EndAtUtc | datetime2 | null | N | N | - | N | J | J | Optioneel UTC-eindmoment; null betekent geen geplande einddatum. |
| DisplayRule | nvarchar(30) | - | N | N | - | N | N | N | Code-enum Always of OncePerBrowser. |
| CreatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Aanmaakmoment. |
| CreatedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft link naar Users.Id; geen harde database-FK vanwege modulegrens. Beheerder die de notificatie heeft aangemaakt. |
| UpdatedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | N | Laatste wijzigmoment. |
| UpdatedByUserId | uniqueidentifier | null | N | N | Users.Id | N | J | N | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SiteNotificationHistory | Audit en historie | Veldniveau-history voor systeemnotificaties, inclusief inhoud, planning, doelgroep en weergaveregel. | SiteNotifications, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| SiteNotificationId | uniqueidentifier | - | N | J | SiteNotifications.Id | N | N | J | Verwijzing naar de site-notificatie waarop de wijziging betrekking heeft. |
| ChangedField | nvarchar(100) | - | N | N | - | N | N | J | Gewijzigd veld, bijvoorbeeld Title, StartAtUtc, EndAtUtc of AudienceType. |
| OldValue | nvarchar(max) | null | N | N | - | N | J | N | Vorige waarde. |
| NewValue | nvarchar(max) | null | N | N | - | N | J | N | Nieuwe waarde. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment van wijziging. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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.Idzijn 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
| Tabelnaam | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| SiteFeatureToggleHistory | Audit en historie | Historische vastlegging van alle wijzigingen aan sitebrede featuretoggles. | SiteFeatureToggles, Users |
| Veldnaam | Type | Default | PK | FK | Verwijst naar | Unique | Nullable | Index | Opmerking |
|---|---|---|---|---|---|---|---|---|---|
| Id | uniqueidentifier | - | J | N | - | J | N | J | Primaire sleutel. |
| SiteFeatureToggleId | uniqueidentifier | - | N | J | SiteFeatureToggles.Id | N | N | J | Verwijzing naar de featuretoggle. |
| OldValue | bit | - | N | N | - | N | N | N | Vorige booleaanse waarde van de featuretoggle. |
| NewValue | bit | - | N | N | - | N | N | N | Nieuwe booleaanse waarde van de featuretoggle. |
| ChangedAtUtc | datetime2 | sysutcdatetime() | N | N | - | N | N | J | Moment van wijziging. |
| ChangedByUserId | uniqueidentifier | - | N | N | Users.Id | N | N | J | Soft 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.Idzijn 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> | Categorie | Doel / verantwoordelijkheid | Gerelateerde tabellen |
|---|---|---|---|
| Centrale code-enums en sleutelsets | Technische sleutelsets | Overzicht van centraal vastgelegde code-enums en sleutelsets voor site-instellingen en contentbeheer binnen de V1.0-baseline. | ContentBlocks, SiteLinks, FooterLinkAssignments, SystemMessageTemplates, SiteNotifications, SiteFeatureToggles |
| Sleutelset | Waarden | Toepassing | Opmerking |
| --- | --- | --- | --- |
| DomainType | FrontPage, StaticPage, Footer | ContentBlocks | Uniform contentblokmodel voor frontpages, vaste pagina's en footertekst. |
| ContextType | Public, NoRole, Admin, Teacher, Student, Guardian | ContentBlocks / footer-context | Rendercontext voor frontpages en footeropbouw. |
| AudienceType | Public, Authenticated, Teacher, Student, Guardian, Admin | SiteNotifications | Doelgroep van systeemnotificaties. |
| NotificationType | Info, Warning | SiteNotifications | Visueel en functioneel type van een notificatie. |
| DisplayRule | Always, OncePerBrowser | SiteNotifications | Weergaveregel voor systeemnotificaties. |
| LinkType | Internal, External | SiteLinks | Type URL-record. |
| FooterColumnType | Middle, Right | FooterLinkAssignments | Doelkolom binnen de footer. |
| PopupType | Info, Warning, Error, Critical | PopupDetails | Popupsoort. |
| PopupVariant | InfoOnly, Confirm, InputText, InputEmail, InputTextarea, Custom | PopupDetails | Technische popupvorm en inputgedrag. |
| PopupInputType | Text, Email, Textarea | PopupDetails | Type van het ene ondersteunde inputveld bij niet-custom inputvarianten. |
| SystemMessageType | Info, Success, Warning, Error, Critical | SystemMessageTemplates | Type systeemberichtsjabloon. |
| ButtonTheme | Primary, Secondary, Success, Warning, Danger, Neutral | PopupDetails / SystemMessageTemplates | V1.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.
PopupDetailsbevat 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
CustomRendererKeyen waar nodig een aparte functionele detailuitwerking.
5.19.2 Relatiepopups
De relatie-usecases introduceren of bevestigen onder meer deze popupcategorieën:
| PopupKey | Variant | Doel |
|---|---|---|
POP-GEN-REL-INVITE-FRIEND | InputEmail | E-mailadres invoeren voor vrienduitnodiging. |
POP-GEN-REL-INVITE-GUARDIAN | InputEmail | E-mailadres invoeren voor ouder/voogd-uitnodiging. |
POP-GEN-REL-INVITE-OEFENHUB | Confirm | Onbekend e-mailadres controleren en externe OefenHub-uitnodiging bevestigen. |
POP-GEN-REL-INVITE-DUPLICATE | InfoOnly | Bestaande relatie of openstaande uitnodiging blokkeert nieuwe uitnodiging. |
POP-GEN-REL-INVITE-NOT-ALLOWED | InfoOnly | Rolcontext of relatietype staat uitnodigen niet toe. |
POP-GEN-REL-INVITE-SEND-FAILED | InfoOnly | Technische fout bij opslaan, systeembericht of externe e-mail. |
POP-GEN-REL-INVITE-DECLINE-CONFIRM | Confirm | Afwijzen van een relatie-uitnodiging bevestigen. |
POP-GEN-REL-DISCONNECT-CONFIRM | Confirm | Ontkoppelen van een relatie bevestigen. |
5.19.3 Centrale sleutelsets voor popups
| Sleutelset | Waarden | Toepassing |
|---|---|---|
| PopupVariant | InfoOnly, Confirm, InputText, InputEmail, InputTextarea, Custom | Bepaalt standaardvorm en inputgedrag van de popup. |
| PopupType | Info, Warning, Error, Critical | Visuele en functionele popupsoort. |
| ButtonTheme | Primary, Secondary, Success, Warning, Danger, Neutral | Knopstijl zonder losse kleurvelden. |
| PopupInputType | Text, Email, Textarea | Eé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
PopupDetailsworden gemigreerd of geseed. - Niet-custom popups krijgen geen aparte dubbele detailuitwerking in de database-informatiedocumentatie.
- Custom popups blijven de uitzondering en vereisen een
CustomRendererKeywanneer meer dan de standaardvariant nodig is.
Voor generiek/berichten zijn onder meer deze popupcategorieën relevant:
| PopupKey | Variant | Doel |
|---|---|---|
POP-GEN-MSG-NO-RELATION | InfoOnly | Verzenden of beantwoorden blokkeren wanneer relatie- of deelnemerscontext niet meer geldig is. |
POP-GEN-MSG-SEND-FAILED | InfoOnly | Veilige foutmelding bij technische of transactionele verzendfout. |
POP-GEN-MSG-NOT-AVAILABLE | InfoOnly | Mailboxitem, systeembericht of privéthread bestaat niet, is niet toegankelijk, verwijderd of niet meer beschikbaar. |
POP-GEN-MSG-DELETE-CONFIRM | Confirm | Bevestiging vóór participantgebonden verwijderen van een privéthread uit de eigen mailbox. |
POP-GEN-MSG-DELETED | InfoOnly | Terugkoppeling na succesvolle participantgebonden verwijdering. |
POP-GEN-MSG-DELETE-FAILED | InfoOnly | Veilige 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
SiteNotificationszijn geenSystemMessagesen geenPopupDetails.- 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 = Alwayswordt niet permanent als gezien geregistreerd, maar mag binnen dezelfde notificatiereeks niet direct opnieuw verschijnen.DisplayRule = OncePerBrowserwordt 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
AccessibilityEnabledbepaalt of toegankelijkheidsinstellingen functioneel toegepast worden; opgeslagen waarden blijven bewaard wanneer de feature is uitgeschakeld.PrivateMessagingEnabledbepaalt of nieuwe privéberichtacties functioneel beschikbaar zijn; bestaande berichtenhistorie wordt daardoor niet verwijderd.IssueReportingEnabledbepaalt 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
| Onderwerp | Aanscherping |
|---|---|
| Beheerder-frontpage | De beheerder-frontpage is een read-only overzichts- en oriëntatiepagina met vaste blokstructuur: introblok, attentieblok, Contentbeheer, Accounts & rollen en Recente beheerwijzigingen. |
| Frontpagebeheer | Frontpagebeheer beheert tekstuele contentblokken per context. Layout, volgorde, rendergedrag en structurele blokopbouw blijven codegedreven; het model is geen pagebuilder. |
| Gecombineerde frontpages | Gecombineerde rolfrontpages worden runtime samengesteld uit basiscontexten. Er wordt geen persistent ontwerp per rolcombinatie opgeslagen. |
| Handige links en vaste pagina's | De beheerpagina beheert URL-records, footerinhoud en vaste publieke pagina’s zoals Over OefenHub, Privacybeleid en Contact. Het contactformulier zelf blijft buiten scope. |
| URL-validatie | Interne en externe URL-records moeten server-side gevalideerd worden voordat opslag slaagt. Een URL die in footerplaatsingen gebruikt wordt mag niet verwijderd worden. |
| Popupbeheer | Popupbeheer beheert bestaande popuprecords. Technische sleutel, variant, theme, knopacties en custom renderer blijven read-only of codegedreven. |
| Systeemberichtbeheer | Systeemberichtbeheer beheert bestaande templates. Referentienaam en technische actie blijven read-only; onderwerp, tekst, domein/type en ondersteunde knoptekst zijn beheerbaar binnen validatiegrenzen. |
| Features | Featuretoggles zijn sitebrede schakelaars voor expliciet togglebare functies. Verplichte kernonderdelen worden niet als featuretoggle gemodelleerd. |
| Systeeminstellingen | Systeeminstellingen worden beheerd als bestaande sleutels met type, invoervorm en validatie. Nieuwe sleutels worden niet via de GUI aangemaakt. |
| Configuratiecache | Na relevante systeeminstellingswijzigingen wordt de configuratiecache gecontroleerd ververst zonder dat bestaande sessies stilzwijgend andere autorisaties krijgen. |
| Categoriebeheer | Centraal categoriebeheer beheert naam, kleur, icoon, status, migratie en geschiedenis van centrale categorie-identiteit. Historische runs worden door migratie niet herschreven. |
| Modulebeheer | Modulebeheer beheert ExerciseModules, actiefstatus, testzichtbaarheid, connectiviteitstest, migratie en geschiedenis. Concrete docent-oefenconfiguratie blijft buiten de centrale modulebeheerpagina. |