2. Berichten overzicht
2.1 Schermafbeelding

2.2 Scherm meta data
| Veld | Waarde |
|---|---|
| Scherm-ID | SCH-GEN-02-01 |
| Schermnaam | Berichten — overzicht |
| Doelgroep / onderdeel | Generiek |
| Bronbestand | oefenhub_generiek_01_berichten_overzicht_v3_3.html |
| Mockupversie | V3.3 |
| Screenshotbestand | oefenhub_generiek_01_berichten_overzicht_v3_3.png |
| Processtap / context | Ingelogde gebruiker opent het centrale berichtenoverzicht vanuit het berichtenicoon in de header of vanuit een berichtenroute. |
| Documentatiestatus | Uitgewerkt op basis van HTML-mockup, PNG-screenshot, Functioneel Ontwerp, Technisch Ontwerp, Software Requirements Specification en databasedocumentatie. |
| Opmerkingen | Dit scherm bevat uitsluitend het berichtenicoon met ongelezenbadge uit de header, omdat deze teller functioneel samenhangt met het berichtenoverzicht. Andere headeronderdelen, het profielmenu en de footer vallen buiten dit schermdocument. Alle zichtbare namen, datums, snippets, aantallen en berichtteksten in de mockup zijn dynamische voorbeeldwaarden. |
| Route / URL-patroon | /messages. Vanuit het overzicht kunnen items via /messages/system/{messageId}/open of /messages/thread/{threadId}/open openen, waarna de applicatie de readstate bijwerkt en naar de detailroute navigeert. |
| Autorisatie / vereiste rol-context | Ingelogde gebruiker. De gebruiker ziet uitsluitend eigen systeemberichten en privébericht-threads waarin de gebruiker deelnemer is en die niet voor deze gebruiker uit de mailbox zijn verwijderd. |
| Primair domeinobject / hoofdentiteit | SystemMessages, PrivateMessageThreads, PrivateMessageThreadParticipants, PrivateMessages en gebruikergebonden lees-/mailboxstatus. |
| Gerelateerde schermen / navigatie | 03_nieuw_privebericht, 04_open_bericht, 05_beantwoord_bericht. |
| Data-karakter | Uitlees-, filter- en lichte statusmutatiepagina; lijstregels, aantallen, previewteksten, het ongelezenaantal en de bewaartermijn zijn dynamisch of configureerbaar. |
2.3 Functionele beschrijving
2.3.0 Privéthreadregels en preview
Voor privéthreads toont het overzicht één regel per thread. Het label wordt dynamisch afgeleid uit het aantal zichtbare actieve deelnemers: Privégesprek bij twee deelnemers en Groepsgesprek bij meer dan twee deelnemers. Het label is dus geen vaste threadtypekolom.
De threadregel toont het stabiele threadicoon en de threadkleur die bij het aanmaken van de thread zijn gekozen. De preview is user-scoped: bij ongelezen activiteit toont de preview het eerste nieuwe bericht of threadevent voor de ingelogde gebruiker; zonder nieuwe activiteit toont de preview de laatste zichtbare activiteit.
Het scherm Berichten — overzicht is de centrale mailboxpagina binnen OefenHub. De pagina toont systeemberichten en privéberichten in één gecombineerd overzicht, zodat de gebruiker op één plek systeemmeldingen, relatie-uitnodigingen, voortgangsmeldingen, privégesprekken en andere relevante communicatie kan terugvinden.
De pagina bestaat uit:
- het berichtenicoon uit de header met badge voor het aantal ongelezen berichten;
- een breadcrumb Home > Berichten;
- een introductieblok met titel Berichten en korte toelichting;
- de actie Nieuw privébericht;
- een zoek- en filterbalk;
- een gecombineerde berichtenlijst;
- contextacties per berichtregel;
- paginering met configureerbare paginagroottes;
- een rechterkolom met dynamische samenvattingskaarten.
2.3.1 Interpretatie van mockupwaarden
Alle zichtbare berichtregels, afzenders, datums, tijden, onderwerpen, tekstfragmenten en aantallen in de mockup zijn voorbeelddata. Zij tonen hoe de pagina zich gedraagt, maar zijn geen vaste productiegegevens.
Voorbeelden zoals 3 ongelezen berichten, 12 systeemberichten, 8 privéberichten, 1–5 van 20 berichten en 3 mnd mogen dus niet hardcoded worden. De aantallen worden dynamisch berekend voor de ingelogde gebruiker en de bewaartermijn komt uit een sitebrede systeeminstelling.
2.3.2 Berichtenicoon en ongelezenbadge
Van de header valt uitsluitend het berichtenicoon met ongelezenbadge binnen de scope van dit schermdocument. Andere headeronderdelen, het profielmenu, rol-/navigatieknoppen en de footer worden in dit schermdocument niet functioneel beschreven.
Het berichtenicoon opent het berichtenoverzicht. Wanneer er geen ongelezen berichten of ongelezen privéthread-gebeurtenissen zijn, blijft het berichtenicoon zichtbaar zonder badge. Wanneer het ongelezenaantal groter is dan nul, toont het icoon een rode badge met het actuele aantal ongelezen items voor de ingelogde gebruiker.
Wanneer een nieuw ongelezen bericht of een nieuwe ongelezen threadgebeurtenis voor de gebruiker ontstaat, wordt het ongelezenaantal opnieuw bepaald. Was het vorige aantal nul, dan wordt de badge zichtbaar met de nieuwe waarde. Was er al een badge zichtbaar, dan wordt de waarde verhoogd of opnieuw weergegeven op basis van de actuele server-side ongelezenlogica. Voor privéthreads kan één zichtbare threadregel meerdere ongelezen berichten of threadgebeurtenissen vertegenwoordigen; de teller mag daarom niet uitsluitend worden afgeleid uit het aantal zichtbare lijstregels.
De badgewaarde moet dezelfde ongelezenlogica gebruiken als de samenvattingskaart Ongelezen, tenzij een bewuste caching- of timingreden tijdelijk verschil verklaart.
Wanneer een ongelezen item vanuit het overzicht wordt geopend, mag de applicatie de readstate eerst bijwerken en daarna de detailpagina tonen. Daardoor hoort de headerbadge na de detailnavigatie direct dezelfde tellerstand te gebruiken. Nieuwe mailboxitems die ontstaan terwijl de gebruiker op een andere pagina blijft, kunnen later via realtime invalidatie zichtbaar worden; zonder die invalidatie wordt de actuele teller bij navigatie, openen of refresh opnieuw bepaald.
Voor de rolcontext Leerling geldt aanvullend dat de ongelezenbadge tijdens een actieve oefenrun visueel verborgen wordt om afleiding tijdens het oefenen te voorkomen. Dit verbergen geldt alleen voor de badge/teller, niet voor de onderliggende ongelezenstatus. Nieuwe berichten, systeemberichten en threadgebeurtenissen blijven server-side normaal geregistreerd. Zodra de leerling de run afrondt, of een lopende run onderbreekt door naar een andere pagina te navigeren, wordt het actuele ongelezenaantal opnieuw bepaald en wordt de badge opnieuw getoond wanneer de waarde groter is dan nul.
2.3.3 Berichtenlijst
De berichtenlijst combineert twee berichtsoorten:
-
Systeemberichten
Systeemberichten worden door OefenHub aangemaakt voor functionele gebeurtenissen zoals relatie-uitnodigingen, wijzigingen, meldingen of doorverwijzingen naar een onderliggend domeinobject. Zij hebben een ontvanger, type, titel, body, aanmaakmoment, leesmoment en eventueel eenEntityType+EntityId-verwijzing naar een vervolgobject. Systeemberichten zijn niet verwijderbaar door de gebruiker. -
Privéberichten
Privéberichten zijn onderdeel van een privébericht-thread. Het overzicht toont niet elk individueel bericht los, maar een mailboxregel per zichtbare thread/deelnemercontext, met afzender, onderwerp, laatste relevante bericht- of threadactiviteit, previewtekst en leesstatus. Verwijderen van een privébericht/thread uit het overzicht is gebruikergebonden en verwijdert de thread of berichten niet voor andere deelnemers.
De lijst wordt standaard aflopend gesorteerd op meest recente bericht- of threadactiviteit. Ongelezen berichten worden visueel sterker weergegeven dan gelezen berichten. Een berichtregel is als geheel klikbaar en opent de detailweergave van het bericht of de thread. De preview of het tekstfragment in een berichtregel wordt compact op één regel weergegeven. Wanneer de beschikbare ruimte onvoldoende is, wordt de preview visueel afgekapt met een ellipsis of gelijkwaardige afbreekindicatie; de volledige inhoud blijft alleen in de detail- of threadweergave zichtbaar. De preview of het tekstfragment in een berichtregel wordt compact op één regel weergegeven. Wanneer de beschikbare ruimte onvoldoende is, wordt de preview visueel afgekapt met een ellipsis of gelijkwaardige afbreekindicatie; de volledige inhoud blijft alleen in de detail- of threadweergave zichtbaar.
2.3.4 Zoeken en filteren
Het zoekveld zoekt binnen de actieve filterselectie. De zoekactie ondersteunt minimaal zoeken op:
- afzender;
- onderwerp;
- tekstfragment / preview;
- relevante tekst binnen een privébericht-thread waar functioneel ondersteund.
De typefilters zijn:
- Alles;
- Systeem;
- Privé.
De statusfilters zijn:
- Alle statussen;
- Ongelezen.
Filters mogen gecombineerd worden. Bij openen van de pagina zijn Alles en Alle statussen actief.
2.3.5 Acties per berichtregel
Per berichtregel zijn rechtsboven contextacties beschikbaar. Actie-iconen staan op titelhoogte, hebben een toegankelijk label en tooltip, en laten rechts ruimte voor latere extra acties zoals verwijderen van privéthreads.
- bij ongelezen berichten: Markeer als gelezen;
- bij gelezen berichten: Markeer als ongelezen;
- bij privéberichten: Gesprek verlaten zodra UC-GEN-MSG-005 wordt gebouwd;
- bij systeemberichten: geen werkende verwijderactie.
Het openen van een bericht telt als leesactie. Binnen dit overzicht mag een leesstatuswijziging wel direct via de lijstactie plaatsvinden, zonder eerst de detailpagina te openen. Een succesvolle leesstatusactie is een verwachte actie en toont geen blijvende succesmelding; bij falen toont de pagina wel veilige feedback.
2.3.6 Samenvattingskaarten
De rechterkolom toont informatieve samenvattingskaarten:
- Ongelezen: totaal aantal ongelezen berichten voor de ingelogde gebruiker, eventueel uitgesplitst in systeemberichten en privéberichten;
- Systeemberichten: totaal aantal zichtbare systeemberichten;
- Privéberichten: totaal aantal zichtbare privébericht-threads of mailboxitems;
- Bewaartermijn: configureerbare bewaartermijn voor privéberichten.
Deze samenvattingen zijn dynamisch en gebruikergebonden. Zij hoeven niet per se door de actuele zoekterm of filterchips beperkt te worden; functioneel zijn dit overzichtsindicatoren voor de mailbox van de gebruiker. Als later gekozen wordt dat deze waarden wel filterafhankelijk moeten worden, moet die keuze expliciet en consequent voor alle kaarten worden vastgelegd.
2.3.7 Bewaartermijn
De bewaartermijnkaart toont een beheerbare systeeminstelling, bijvoorbeeld 3 mnd als weergave van PrivateMessageRetentionDays. Functioneel geldt dat privéberichten een bewaartermijn hebben en systeemberichten in de eerste versie geen functionele retentiegrens kennen, omdat systeemberichten ook als logging richting de gebruiker fungeren.
De waarde op dit scherm is dus geen hardcoded label. De waarde wordt afgeleid uit SystemSettings en vertaald naar een begrijpelijke tekst in de gebruikersinterface.
2.3.8 Responsief gedrag
Bij voldoende schermbreedte staan de samenvattingskaarten rechts van de berichtenlijst. Bij smallere schermen verplaatsen zij onder de lijst en paginering. De berichtenlijst en paginering blijven leidend. Filterknoppen blijven compact op tekstbreedte en de zoekplaceholder mag verkorten van Zoek op afzender, onderwerp of tekstfragment naar Zoeken.
2.4 UI-elementen en velddefinities
| Element-ID | Type | GUI-verwijzing | Omschrijving | Zichtbaar label | Opmerking | Technische naam |
|---|---|---|---|---|---|---|
| SCH-GEN-02-01-H01 | Button | Header — berichtenicoon | Envelop-icoon waarmee de gebruiker het berichtenoverzicht opent. | Berichten | Alleen dit headeronderdeel valt binnen scope van dit schermdocument; overige headeronderdelen blijven buiten beschouwing. | MessagesHeaderEntryButton |
| SCH-GEN-02-01-F01 | Field / badge | Header — berichtenicoon | Badge met het aantal ongelezen berichten, systeemberichten of privéthread-gebeurtenissen voor de ingelogde gebruiker. | <aantal ongelezen> | Zichtbaar wanneer het aantal groter is dan 0, behalve wanneer een leerling actief in een oefenrun zit. | UnreadMessagesHeaderBadge |
| SCH-GEN-02-01-F16 | Field / state | Header — berichtenicoon | Rol- en runafhankelijke zichtbaarheid van de ongelezenbadge. | <badge zichtbaar/verborgen> | Voor leerlingen wordt de badge tijdens een actieve oefenrun verborgen en na afronden of onderbreken opnieuw bepaald. | MessageBadgeVisibilityState |
| SCH-GEN-02-01-S01 | Section | Hoofdkaart | Hoofdcontainer van het berichtenoverzicht. | Berichten | Bevat intro, acties, filters, lijst, paginering en samenvattingen. | MessagesOverviewShell |
| SCH-GEN-02-01-N01 | Navigation | Breadcrumb | Breadcrumb voor de berichtenpagina. | Home > Berichten | Read-only navigatiecontext. | MessagesBreadcrumb |
| SCH-GEN-02-01-S02 | Section | Introblok | Titel en korte uitleg van de berichtenpagina. | Berichten | Tekst kan later eventueel via contentbeheer worden gestuurd, maar de schermstructuur blijft codegedreven. | MessagesIntroSection |
| SCH-GEN-02-01-F02 | Field | Introblok — titel | Titel van de pagina. | Berichten | Read-only weergavetekst. | MessagesPageTitle |
| SCH-GEN-02-01-F03 | Field | Introblok — toelichting | Korte uitleg over systeemberichten, privéberichten en filters. | Bekijk hier je systeemberichten en privéberichten. | Read-only begeleidende tekst. | MessagesIntroText |
| SCH-GEN-02-01-B01 | Button | Introblok rechts | Start de flow voor het maken van een nieuw privébericht. | Nieuw privébericht | Alleen bruikbaar wanneer privéberichten functioneel/sitebreed beschikbaar zijn en de gebruiker minimaal één toegestane ontvanger heeft. | CreatePrivateMessageButton |
| SCH-GEN-02-01-S03 | Section | Zoek- en filterbalk | Groepeert zoekveld, typefilter en statusfilter. | Berichten zoeken en filteren | Filtert de berichtenlijst. | MessagesSearchAndFilterSection |
| SCH-GEN-02-01-F04 | Field | Zoekveld | Vrij tekstveld voor zoeken binnen berichten. | Zoek op afzender, onderwerp of tekstfragment | Placeholder mag responsief verkorten naar Zoeken. | MessageSearchText |
| SCH-GEN-02-01-FILTER01 | Filter group | Typefilter | Filtert op berichttype. | Alles / Systeem / Privé | Standaard Alles. | MessageTypeFilter |
| SCH-GEN-02-01-FILTER02 | Filter group | Statusfilter | Filtert op leesstatus. | Alle statussen / Ongelezen | Standaard Alle statussen. | MessageStatusFilter |
| SCH-GEN-02-01-S04 | Section | Berichtenlijst | Lijst met systeemberichten en privébericht-threads die zichtbaar zijn voor de gebruiker. | Berichtenoverzicht | Dynamisch geladen, gefilterd en gepagineerd. | MessagesListSection |
| SCH-GEN-02-01-T01 | List / table | Berichtregels | Herhalende lijstregel voor één systeembericht of één privébericht-thread/mailboxitem. | <berichtregel> | Geen vaste tekst; volledig dynamisch. | MessageListItem |
| SCH-GEN-02-01-F05 | Field | Berichtregel — type | Visuele tag voor berichttype. | Systeem / Privé | Afgeleid uit bronobject. | MessageTypeTag |
| SCH-GEN-02-01-F06 | Field | Berichtregel — afzender | Afzenderweergave van het bericht of de thread. | Systeem / <naam afzender> | Bij systeembericht Systeem; bij privébericht de relevante afzender of threadweergave. | MessageSenderDisplayName |
| SCH-GEN-02-01-F07 | Field | Berichtregel — datum/tijd | Datum en tijd van bericht of laatste relevante activiteit. | <datum> · <tijd> | Lokaal weergegeven op basis van UTC-bronwaarde. | MessageDisplayDateTime |
| SCH-GEN-02-01-F08 | Field | Berichtregel — onderwerp | Onderwerp of titel van bericht/thread. | <onderwerp> | Dynamische titel. | MessageSubject |
| SCH-GEN-02-01-F09 | Field | Berichtregel — tekstfragment | Eénregelige preview van body of threadinhoud. | <tekstfragment> | Afkappen met ellipsis bij onvoldoende ruimte. | MessageSnippet |
| SCH-GEN-02-01-A01 | Action | Berichtregel | Opent het geselecteerde bericht of de geselecteerde privébericht-thread. | Open bericht | Volledige regel is aanklikbaar. | OpenMessageAction |
| SCH-GEN-02-01-A02 | Action | Berichtregel — actie | Markeert ongelezen bericht als gelezen. | Markeer als gelezen | Alleen bij ongelezen berichten. | MarkMessageAsReadAction |
| SCH-GEN-02-01-A03 | Action | Berichtregel — actie | Markeert gelezen bericht als ongelezen. | Markeer als ongelezen | Alleen bij gelezen berichten. | MarkMessageAsUnreadAction |
| SCH-GEN-02-01-A04 | Action | Berichtregel — actie | Laat de gebruiker het privégesprek verlaten en uit de eigen mailboxweergave verwijderen. | Gesprek verlaten | Alleen actief voor privéberichten; gebruikergebonden soft delete. | DeletePrivateMessageThreadAction |
| SCH-GEN-02-01-M01 | Message / disabled action | Berichtregel — systeembericht verwijderen | Uitgeschakelde verwijderactie voor systeemberichten met tooltip. | Een systeembericht kan niet verwijderd worden | Systeemberichten blijven niet-verwijderbaar. | SystemMessageDeleteDisabledMessage |
| SCH-GEN-02-01-S05 | Section | Paginering | Paginering onder de berichtenlijst. | Toon aantal berichten | Toont page size, reeks en navigatie. | MessagesPaginationSection |
| SCH-GEN-02-01-F10 | Field | Paginering — aantal | Keuzelijst voor aantal berichten per pagina. | 5 / 10 / 15 | Standaardwaarde volgt functionele keuze of persoonlijke voorkeur. | MessagesPageSize |
| SCH-GEN-02-01-F11 | Field | Paginering — reeks | Toont huidige zichtbare reeks en totaal. | <eerste>–<laatste> van <totaal> berichten | Dynamisch op basis van filterresultaat. | MessagesPaginationRange |
| SCH-GEN-02-01-A05 | Action group | Paginering — navigatie | Vorige/volgende en paginanummers. | ‹ 1 2 3 4 › | Alleen bruikbaar waar pagina bestaat. | MessagesPaginationNavigation |
| SCH-GEN-02-01-S06 | Section | Rechterkolom | Informatieve samenvattingskaarten bij het berichtenoverzicht. | Berichteninformatie | Verplaatst responsief onder lijst/paginering. | MessagesSummarySection |
| SCH-GEN-02-01-F12 | Field | Samenvatting — ongelezen | Aantal ongelezen berichten voor de ingelogde gebruiker. | Ongelezen | Dynamische teller. | UnreadMessagesCount |
| SCH-GEN-02-01-F13 | Field | Samenvatting — systeemberichten | Aantal zichtbare systeemberichten voor de ingelogde gebruiker. | Systeemberichten | Dynamische teller. | SystemMessagesCount |
| SCH-GEN-02-01-F14 | Field | Samenvatting — privéberichten | Aantal zichtbare privébericht-threads/mailboxitems voor de ingelogde gebruiker. | Privéberichten | Dynamische teller. | PrivateMessagesCount |
| SCH-GEN-02-01-F15 | Field | Samenvatting — bewaartermijn | Configureerbare bewaartermijn van privéberichten. | Bewaartermijn | Afgeleid uit systeeminstelling, niet hardcoded. | PrivateMessageRetentionDisplay |
2.5 Waardelagen
| Element-ID | GUI-verwijzing | Zichtbaar label | Technische naam | Databron | Waardebron | Datatype | Bewerkbaar | Validatie / regel |
|---|---|---|---|---|---|---|---|---|
| SCH-GEN-02-01-H01 | Header — berichtenicoon | Berichten | MessagesHeaderEntryButton | Generieke headercomponent + ingelogde gebruikerscontext | Route naar berichtenoverzicht | Action / navigation | Nee | Alleen het berichtenicoon valt binnen scope van dit schermdocument; overige headeronderdelen blijven buiten beschouwing. |
| SCH-GEN-02-01-F01 | Header — badge | <aantal ongelezen> | UnreadMessagesHeaderBadge | SystemMessages.ReadAtUtc, PrivateMessageThreadParticipants.LastReadMessageId, PrivateMessageThreadParticipants.LastReadAtUtc, PrivateMessages, PrivateMessageThreadEvents | Berekend aantal ongelezen systeemberichten, privéberichten en privéthreadgebeurtenissen voor de ingelogde gebruiker | Integer | Nee | Badge tonen wanneer waarde > 0; geen badge bij 0; bij nieuw ongelezen item van 0 naar >0 badge tonen en bij bestaande badge de actuele tellerwaarde bijwerken. |
| SCH-GEN-02-01-F16 | Header — badgezichtbaarheid | <badge zichtbaar/verborgen> | MessageBadgeVisibilityState | Actieve rolcontext, ExerciseRuns, runtime oefenrunstatus en ongelezenberichtstatus | Runtime state + database-afleiding | Boolean/display state | Nee | Voor leerlingen tijdens een actieve oefenrun de badge visueel verbergen; ongelezenstatus blijft server-side bewaard; na afronden of navigeren naar een andere pagina opnieuw bepalen en tonen wanneer waarde > 0. |
| SCH-GEN-02-01-S01 | Hoofdkaart | Berichten | MessagesOverviewShell | Codegedreven layout + berichtenservices | Samengesteld schermobject | Composite | Nee | Geen data van andere gebruikers tonen. |
| SCH-GEN-02-01-N01 | Breadcrumb | Home > Berichten | MessagesBreadcrumb | Routeconfiguratie | Afgeleid uit huidige route | Navigation label | Nee | Geen technische URL of ID tonen. |
| SCH-GEN-02-01-F02 | Introblok — titel | Berichten | MessagesPageTitle | Codegedreven schermlabel of ContentBlocks indien later beheerbaar gemaakt | Weergavetekst | String | Nee | Geen functionele data-afhankelijkheid. |
| SCH-GEN-02-01-F03 | Introblok — toelichting | Bekijk hier je systeemberichten en privéberichten. | MessagesIntroText | Codegedreven schermtekst of ContentBlocks indien later beheerbaar gemaakt | Weergavetekst | String | Nee | Tekst mag niet suggereren dat systeemberichten verwijderbaar zijn. |
| SCH-GEN-02-01-B01 | Introblok rechts | Nieuw privébericht | CreatePrivateMessageButton | SiteFeatureToggles.FeatureKey = PrivateMessagingEnabled, relaties/vriendschappen van gebruiker | Actie beschikbaar indien privéberichten aan toegestane ontvangers mogelijk zijn | Action | Ja | Bij klikken route naar nieuw privébericht; privébericht mag alleen naar gekoppelde gebruikers of vrienden. |
| SCH-GEN-02-01-F04 | Zoekveld | Zoek op afzender, onderwerp of tekstfragment | MessageSearchText | Gebruikersinput | User input voor lijstfilter | String | Ja | Zoeken werkt binnen actieve filters; invoer veilig behandelen en niet als HTML renderen. |
| SCH-GEN-02-01-FILTER01 | Typefilter | Alles / Systeem / Privé | MessageTypeFilter | Gebruikersselectie | User input voor lijstfilter | Enum | Ja | Alleen toegestane waarden All, System, Private; standaard All. |
| SCH-GEN-02-01-FILTER02 | Statusfilter | Alle statussen / Ongelezen | MessageStatusFilter | Gebruikersselectie | User input voor lijstfilter | Enum | Ja | Alleen toegestane waarden All, Unread; standaard All. |
| SCH-GEN-02-01-T01 | Berichtregels | <berichtregel> | MessageListItem | SystemMessages + PrivateMessageThreads + PrivateMessageThreadParticipants + PrivateMessages + Users | Samengestelde lijst van zichtbare mailboxitems | Collection | Nee | Alleen eigen systeemberichten en eigen deelnemerthreads zonder DeletedAtUtc tonen. |
| SCH-GEN-02-01-F05 | Berichtregel — type | Systeem / Privé | MessageTypeTag | Bronobject (SystemMessages of private thread mailboxitem) | Afgeleid type | Enum/string | Nee | Moet overeenkomen met filtertype. |
| SCH-GEN-02-01-F06 | Berichtregel — afzender | Systeem / <naam afzender> | MessageSenderDisplayName | SystemMessages.CreatedBySystemComponent, PrivateMessages.SenderUserId, PrivateMessages.SendAsUserId, Users | Afgeleid displaylabel | String | Nee | Bij systeembericht Systeem; bij namens-verzending afwijkende weergave ondersteunen. |
| SCH-GEN-02-01-F07 | Berichtregel — datum/tijd | <datum> · <tijd> | MessageDisplayDateTime | SystemMessages.CreatedAtUtc, PrivateMessageThreads.LastMessageAtUtc, PrivateMessages.SentAtUtc | Afgeleid en lokaal geformatteerd tijdstip | DateTime display | Nee | UTC-bronwaarden lokaal tonen. |
| SCH-GEN-02-01-F08 | Berichtregel — onderwerp | <onderwerp> | MessageSubject | SystemMessages.Title, PrivateMessageThreads.Subject | Databasewaarde | String | Nee | Onderwerp veilig encoden; geen vrije HTML renderen. |
| SCH-GEN-02-01-F09 | Berichtregel — tekstfragment | <tekstfragment> | MessageSnippet | SystemMessages.Body, laatste relevante PrivateMessages.Body of threadpreview | Afgeleid tekstfragment | String | Nee | Preview éénregelig tonen en afkappen; rich text eerst sanitizen/strippen voor preview. |
| SCH-GEN-02-01-A01 | Berichtregel | Open bericht | OpenMessageAction | Geselecteerd SystemMessages.Id of PrivateMessageThreads.Id binnen eigen autorisatiecontext | User action | Action | Ja | Openen markeert bericht/thread functioneel als gelezen voor de gebruiker. |
| SCH-GEN-02-01-A02 | Berichtregel — actie | Markeer als gelezen | MarkMessageAsReadAction | SystemMessages.ReadAtUtc of PrivateMessageThreadParticipants.LastReadMessageId / LastReadAtUtc | Mutatie van leesstatus | Action | Ja | Alleen toegestaan voor eigen ongelezen items. |
| SCH-GEN-02-01-A03 | Berichtregel — actie | Markeer als ongelezen | MarkMessageAsUnreadAction | SystemMessages.ReadAtUtc of PrivateMessageThreadParticipants.LastReadMessageId / LastReadAtUtc | Mutatie van leesstatus | Action | Ja | Alleen toegestaan voor eigen gelezen items; privéthreadstatus per deelnemer wijzigen. |
| SCH-GEN-02-01-A04 | Berichtregel — actie | Gesprek verlaten | DeletePrivateMessageThreadAction | PrivateMessageThreadParticipants.DeletedAtUtc | User input / soft delete per deelnemer | Action | Ja | Alleen voor privéberichten; verwijdert niet voor andere deelnemers. |
| SCH-GEN-02-01-M01 | Berichtregel — systeembericht verwijderen | Een systeembericht kan niet verwijderd worden | SystemMessageDeleteDisabledMessage | Type = System | Afgeleide disabled-state | Boolean/display | Nee | Systeemberichten nooit verwijderbaar maken. |
| SCH-GEN-02-01-F10 | Paginering — aantal | 5 / 10 / 15 | MessagesPageSize | Gebruikersselectie, eventueel gebruikersvoorkeur | User input voor paging | Integer | Ja | Alleen toegestane waarden 5, 10, 15. |
| SCH-GEN-02-01-F11 | Paginering — reeks | <eerste>–<laatste> van <totaal> berichten | MessagesPaginationRange | Gefilterde berichtquery | Berekend | String | Nee | Totaal is dynamisch binnen actieve zoek/filtercontext. |
| SCH-GEN-02-01-A05 | Paginering — navigatie | ‹ 1 2 3 4 › | MessagesPaginationNavigation | Gefilterde berichtquery + huidige pagina | Berekend | Action group | Ja | Vorige/volgende disabled wanneer geen pagina beschikbaar is. |
| SCH-GEN-02-01-F12 | Samenvatting — ongelezen | Ongelezen | UnreadMessagesCount | SystemMessages.ReadAtUtc, PrivateMessageThreadParticipants, PrivateMessages, PrivateMessageThreadEvents | Berekend aantal ongelezen berichten en threadgebeurtenissen | Integer | Nee | Moet gebruikergebonden zijn en dezelfde ongelezenlogica gebruiken als de headerbadge; voor leerlingen kan alleen de headerbadge tijdelijk verborgen zijn tijdens een actieve oefenrun. |
| SCH-GEN-02-01-F13 | Samenvatting — systeemberichten | Systeemberichten | SystemMessagesCount | SystemMessages.RecipientUserId | Berekend totaal zichtbare systeemberichten | Integer | Nee | Alleen berichten van ingelogde gebruiker tellen mee. |
| SCH-GEN-02-01-F14 | Samenvatting — privéberichten | Privéberichten | PrivateMessagesCount | PrivateMessageThreads + PrivateMessageThreadParticipants.UserId + DeletedAtUtc | Berekend totaal zichtbare privébericht-mailboxitems | Integer | Nee | Verwijderde participantthreads tellen niet mee in zichtbare mailbox. |
| SCH-GEN-02-01-F15 | Samenvatting — bewaartermijn | Bewaartermijn | PrivateMessageRetentionDisplay | SystemSettings.SettingKey = PrivateMessageRetentionDays, SystemSettings.ValueInt | Configuratiewaarde, geformatteerd als gebruikerslabel | String/integer display | Nee | Waarde mag niet hardcoded worden; cache moet na wijziging worden ververst. |
2.6 Schermtrace naar SRS en acceptatiecriteria
De onderstaande tabel legt per schermrequirement de koppeling naar het centrale schermrequirements-trace-register, SRS-requirements en acceptatiecriteria vast. De normatieve requirementtekst staat in de SRS; dit schermdocument beschrijft alleen de lokale schermcontext.
Deze tabel bevat alleen schermtraceability. De normatieve requirementtekst en acceptatiecriteria staan centraal in de SRS.
| Schermrequirement | Dekt | Schermcontext |
|---|---|---|
REQ-SCH-GEN-02-01-01 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Voor iedere ingelogde gebruiker een centraal berichtenoverzicht kunnen tonen met systeemberichten en privéberichten in één gecombineerde mailboxweergave |
REQ-SCH-GEN-02-01-02 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | In de header een berichtenicoon tonen dat toegang geeft tot het berichtenoverzicht; overige headeronderdelen vallen buiten dit schermdocument |
REQ-SCH-GEN-02-01-03 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Bij het berichtenicoon een badge tonen wanneer het actuele ongelezenaantal voor de ingelogde gebruiker groter is dan nul |
REQ-SCH-GEN-02-01-04 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Wanneer een nieuw ongelezen bericht of een nieuwe ongelezen threadgebeurtenis ontstaat, het systeem het ongelezenaantal opnieuw bepalen; bij overgang van 0 naar een positieve waarde de badge verschijnen en bij een bestaande badge de tellerwaarde worden bijgewerkt |
REQ-SCH-GEN-02-01-05 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | De headerbadge en de samenvattingswaarde Ongelezen dezelfde gebruikergebonden ongelezenlogica gebruiken |
REQ-SCH-GEN-02-01-06 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Voor de rolcontext Leerling het systeem de ongelezenbadge bij het berichtenicoon visueel verbergen zodra een actieve oefenrun wordt gestart |
REQ-SCH-GEN-02-01-07 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | Het tijdelijk verbergen van de ongelezenbadge tijdens een actieve leerling-oefenrun mag de onderliggende ongelezenstatus, berichtopslag of SignalR-/notificatieverwerking niet wijzigen |
REQ-SCH-GEN-02-01-08 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | Na afronden van de oefenrun of na onderbreken door naar een andere pagina te navigeren het systeem het actuele ongelezenaantal opnieuw bepalen en de badge opnieuw tonen wanneer de waarde groter is dan nul |
REQ-SCH-GEN-02-01-09 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Het berichtenoverzicht mag uitsluitend systeemberichten tonen waarvan RecipientUserId gelijk is aan de ingelogde gebruiker |
REQ-SCH-GEN-02-01-10 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Het berichtenoverzicht mag uitsluitend privébericht-threads tonen waarin de ingelogde gebruiker deelnemer is en waarvoor de participantregel niet uit de eigen mailbox is verwijderd |
REQ-SCH-GEN-02-01-11 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Systeemberichten en privéberichten visueel als afzonderlijke typen herkenbaar maken met de labels Systeem en Privé |
REQ-SCH-GEN-02-01-12 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Berichten standaard sorteren op meest recente systeemberichtdatum of privéthreadactiviteit |
REQ-SCH-GEN-02-01-13 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | Ongelezen berichten visueel onderscheidbaar zijn van gelezen berichten |
REQ-SCH-GEN-02-01-14 | SRS-MSG-002 SRS-MSG-003 AC-MSG-002 AC-MSG-003 | De gebruiker vanuit het overzicht een nieuw privébericht kunnen starten wanneer privéberichten beschikbaar zijn en er minimaal één toegestane ontvanger bestaat |
REQ-SCH-GEN-02-01-15 | SRS-AUTH-001 SRS-MSG-002 AC-AUTH-001 AC-MSG-002 | De actie Nieuw privébericht mag alleen berichten laten sturen naar gekoppelde gebruikers of vrienden die volgens de geldende relatie- en rolcontext benaderbaar zijn |
REQ-SCH-GEN-02-01-16 | SRS-MSG-001 AC-MSG-001 | Zoeken ondersteunen op afzender, onderwerp en tekstfragment binnen de actieve filterselectie |
REQ-SCH-GEN-02-01-17 | SRS-MSG-001 AC-MSG-001 | Het zoekveld responsief een uitgebreide placeholder of compacte placeholder kunnen tonen zonder de zoekfunctie inhoudelijk te wijzigen |
REQ-SCH-GEN-02-01-18 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Een typefilter ondersteunen met minimaal de waarden Alles, Systeem en Privé |
REQ-SCH-GEN-02-01-19 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | Een statusfilter ondersteunen met minimaal de waarden Alle statussen en Ongelezen |
REQ-SCH-GEN-02-01-20 | SRS-MSG-001 AC-MSG-001 | Typefilter, statusfilter en zoekterm gecombineerd kunnen worden en de berichtenlijst alleen items tonen die aan alle actieve criteria voldoen |
REQ-SCH-GEN-02-01-21 | SRS-MSG-001 AC-MSG-001 | Bij openen van het berichtenoverzicht de filters standaard op Alles en Alle statussen staan |
REQ-SCH-GEN-02-01-22 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Een berichtregel als geheel aanklikbaar zijn en de bijbehorende berichtdetailpagina of privéthread openen |
REQ-SCH-GEN-02-01-23 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Het openen van een bericht of thread de gebruikergebonden leesstatus bijwerken zodat het item daarna als gelezen geldt |
REQ-SCH-GEN-02-01-24 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | De gebruiker een ongelezen item vanuit de lijst direct als gelezen kunnen markeren |
REQ-SCH-GEN-02-01-25 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | De gebruiker een gelezen item vanuit de lijst direct als ongelezen kunnen markeren |
REQ-SCH-GEN-02-01-26 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | De gebruiker een privébericht-thread uit de eigen mailbox kunnen verwijderen zonder dat de thread of berichten voor andere deelnemers worden verwijderd |
REQ-SCH-GEN-02-01-27 | SRS-MSG-001 SRS-MSG-007 AC-MSG-001 AC-MSG-007 | Systeemberichten geen door de gebruiker verwijderd worden; de verwijderactie daarom disabled zijn met een begrijpelijke tooltip |
REQ-SCH-GEN-02-01-28 | SRS-MSG-001 AC-MSG-001 | Per berichtregel minimaal type, afzender, datum/tijd, onderwerp en tekstfragment tonen |
REQ-SCH-GEN-02-01-29 | SRS-MSG-001 AC-MSG-001 | Tekstfragmenten veilig worden opgebouwd uit gesanitized of veilig geëncodeerde berichtinhoud en mogen geen actieve HTML of JavaScript renderen |
REQ-SCH-GEN-02-01-30 | SRS-MSG-001 AC-MSG-001 | Datum- en tijdwaarden uit UTC-bronnen lokaal en consistent voor de gebruiker worden weergegeven |
REQ-SCH-GEN-02-01-31 | SRS-MSG-001 AC-MSG-001 | Het berichtenoverzicht paginering ondersteunen met de keuzewaarden 5, 10 en 15 berichten per pagina |
REQ-SCH-GEN-02-01-32 | SRS-RDM-007 SRS-RDM-008 SRS-RDM-002 SRS-RDM-001 SRS-MSG-001 AC-RDM-007 AC-RDM-008 AC-RDM-002 AC-RDM-001 AC-MSG-001 | De paginering de actuele reeks, het totaal aantal gefilterde berichten, vorige/volgende navigatie en afzonderlijke paginanummers tonen |
REQ-SCH-GEN-02-01-33 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | De samenvattingskaart Ongelezen het totaal aantal ongelezen mailboxitems van de ingelogde gebruiker tonen en mag mockupwaarden niet hardcoded gebruiken |
REQ-SCH-GEN-02-01-34 | SRS-RDM-007 SRS-RDM-002 SRS-RDM-001 SRS-AUTH-001 SRS-MSG-001 AC-RDM-007 AC-RDM-002 AC-RDM-001 AC-AUTH-001 AC-MSG-001 | De samenvattingskaart Systeemberichten het totaal aantal zichtbare systeemberichten van de ingelogde gebruiker tonen |
REQ-SCH-GEN-02-01-35 | SRS-RDM-007 SRS-RDM-002 SRS-RDM-001 SRS-AUTH-001 SRS-MSG-001 AC-RDM-007 AC-RDM-002 AC-RDM-001 AC-AUTH-001 AC-MSG-001 | De samenvattingskaart Privéberichten het totaal aantal zichtbare privébericht-mailboxitems van de ingelogde gebruiker tonen |
REQ-SCH-GEN-02-01-36 | SRS-RDM-007 SRS-RDM-002 SRS-RDM-001 SRS-MSG-001 SRS-MSG-003 AC-RDM-007 AC-RDM-002 AC-RDM-001 AC-MSG-001 AC-MSG-003 | De samenvattingskaart Bewaartermijn de bewaartermijn van privéberichten uit SystemSettings.PrivateMessageRetentionDays afleiden en niet als vaste tekst opslaan |
REQ-SCH-GEN-02-01-37 | SRS-NFR-PRV-001 SRS-MSG-001 AC-NFR-PRV-001 AC-MSG-001 | Systeemberichten buiten de privéberichtenretentie vallen en mogen in de eerste versie geen gebruikerbediende verwijder- of retentieactie krijgen |
REQ-SCH-GEN-02-01-38 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Bij privéberichten de lees- en verwijderstatus per deelnemer worden bepaald via de participantlaag en niet globaal op threadniveau alleen |
REQ-SCH-GEN-02-01-39 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Thread-events die na de laatst gelezen positie plaatsvinden, kunnen bijdragen aan de ongelezenstatus van een privéthread |
REQ-SCH-GEN-02-01-40 | SRS-MSG-001 AC-MSG-001 | Een lege staat tonen wanneer de actieve zoek- en filterselectie geen berichten oplevert |
REQ-SCH-GEN-02-01-41 | SRS-AUTH-004 SRS-MSG-001 AC-AUTH-004 AC-MSG-001 | Het systeem mag technische identifiers zoals GUID’s, thread-id’s, message-id’s of entity-id’s niet zichtbaar tonen in het berichtenoverzicht |
REQ-SCH-GEN-02-01-42 | SRS-RDM-007 SRS-RDM-008 SRS-RDM-002 SRS-RDM-001 SRS-MSG-001 AC-RDM-007 AC-RDM-008 AC-RDM-002 AC-RDM-001 AC-MSG-001 | Bij voldoende schermbreedte samenvattingskaarten rechts van de berichtenlijst kunnen staan; bij smallere schermen zij onder de berichtenlijst en paginering verplaatsen zonder de lijst te overlappen |
REQ-SCH-GEN-02-01-43 | SRS-MSG-001 SRS-MSG-006 AC-MSG-001 AC-MSG-006 | Zichtbare aantallen, datums, berichtteksten, previews, badges en filters dynamisch uit de actuele gebruikercontext, berichtenstatus en configuratie worden opgebouwd |
REQ-SCH-GEN-02-01-44 | SRS-MSG-001 AC-MSG-001 | De berichtpreview in het overzicht op één regel tonen en bij onvoldoende ruimte visueel afkappen met ellipsis of gelijkwaardige afbreekindicatie, zonder volledige berichtinhoud in de lijstregel te tonen |
2.7 Technische koppeling
Voor technische uitwerking zijn vooral relevant:
- 05 Autorisatie, policies en server-side contextcontrole voor het beperken van mailboxinhoud tot berichten van of voor de ingelogde gebruiker.
- 13 Berichten, systeemberichten, notificaties en privéberichten voor systeemberichten, privébericht-threads, deelnemers, leesstatus en mailboxzichtbaarheid.
- 17 Readmodels, tellers, badges, caching en materialisatie voor het ongelezenaantal, headerbadge en samenvattingswaarden.
- 24 Frontend, Blazor, routing, state en componentopbouw voor lijstweergave, filters, responsieve state en routegedrag.
- 25 Privacy, retentie, anonimisering en gegevensbescherming voor bewaartermijn, minimale gegevensweergave en privacybegrenzing.