4. Open bericht
4.1 Schermafbeelding

4.2 Scherm meta data
| Veld | Waarde |
|---|---|
| Scherm-ID | SCH-GEN-04-01 |
| Schermnaam | Berichten — geopend bericht / privégesprek |
| Doelgroep / onderdeel | Generiek |
| Bronbestand | oefenhub_generiek_03_open_bericht_v3_5.html |
| Mockupversie | V3.5 |
| Screenshotbestand | oefenhub_generiek_03_open_bericht_v3_5.png |
| Processtap / context | De ingelogde gebruiker opent vanuit het berichtenoverzicht een systeembericht of privéthread. Systeemberichten tonen één ontvangen bericht; privéthreads tonen een gesprekstimeline met berichten en threadgebeurtenissen. |
| Documentatiestatus | Uitgewerkt op basis van HTML-mockup, PNG-screenshot, Functioneel Ontwerp, Technisch Ontwerp, Software Requirements Specification en ondersteunende documentatie. |
| Opmerkingen | Header, navigatiepillen, profielknop en footer vallen buiten dit schermdocument. De zichtbare waarden in de mockup, waaronder namen, tijden, onderwerp, berichtinhoud en het aantal eerdere berichten, zijn dynamische voorbeeldwaarden. |
| Route / URL-patroon | /messages/system/{messageId} voor systeemberichten en /messages/thread/{threadId} voor privéthreads. Vanuit het overzicht kan eerst een /open-route worden gebruikt om readstate bij te werken en daarna naar deze detailroute te redirecten. |
| Autorisatie / vereiste rol-context | Ingelogde gebruiker met toegang tot het betreffende privébericht of systeembericht. Voor privéberichten moet de gebruiker deelnemer zijn aan de thread en mag de thread voor deze gebruiker niet uit de mailbox zijn verwijderd. |
| Primair domeinobject / hoofdentiteit | PrivateMessageThreads, PrivateMessageThreadParticipants, PrivateMessages, PrivateMessageThreadEvents en, voor de systeemberichtvariant, SystemMessages. |
| Gerelateerde schermen / navigatie | 02_berichten_overzicht, 03_nieuw_privebericht, 05_beantwoord_bericht. |
| Data-karakter | Uitlees- en lichte mutatiepagina. Het openen van het bericht kan de gebruikergebonden leesstatus aanpassen. Berichtinhoud, threadcontext, threadevents, knoppen en disabled states worden dynamisch bepaald. |
4.3 Functionele beschrijving
Het scherm Berichten — geopend bericht / privégesprek toont een geopend bericht binnen het centrale berichtensysteem van OefenHub. Voor systeemberichten blijft dit één ontvangen bericht met eventuele vervolgactie. Voor privéthreads wordt het scherm behandeld als gesprek: een vaste threadkop met threadicoon, onderwerp en menu, gevolgd door één chronologische timeline van oud naar nieuw.
De pagina is generiek, maar het getoonde bericht blijft altijd gebruikergebonden. Een gebruiker mag alleen berichten openen die voor die gebruiker zichtbaar zijn. Voor privéberichten betekent dit dat de gebruiker deelnemer moet zijn aan de betreffende thread. Voor systeemberichten betekent dit dat het systeembericht aan de ingelogde gebruiker gericht moet zijn.
4.3.1 Interpretatie van mockupwaarden
Alle zichtbare waarden in de mockup zijn voorbeeldwaarden. Namen zoals Sanne de Vries en Emma Jansen, het onderwerp Goed bezig met optellen, tijden zoals Vandaag · 12:08, berichtteksten en het aantal (3) bij Eerdere berichten mogen niet als vaste productiegegevens worden beschreven.
De waarden worden afgeleid uit de actuele gebruikercontext, berichtthread, berichtinhoud, deelnemers, leesstatus en threadevents. Datum- en tijdwaarden worden vanuit UTC-bronwaarden naar de lokale gebruikersweergave vertaald.
4.3.2 Afbakening header en footer
De algemene header, navigatiepillen, profielknop, logo, welkomsttekst en footer horen niet bij de functionele scope van dit schermdocument. Alleen de scherminhoud vanaf de breadcrumb en de berichtkaart wordt uitgewerkt.
Wanneer het openen van een bericht de leesstatus wijzigt, kan dat buiten dit scherm zichtbaar worden in de algemene berichtenteller. Die teller wordt functioneel bij het berichtenoverzicht en de generieke header-berichteningang beschreven, niet als afzonderlijk UI-element van dit scherm.
4.3.3 Systeemberichtkaart en privéthreadkop
Voor systeemberichten toont de berichtkaart de volledige inhoud van het geselecteerde bericht. De bovenste metaregel staat in een duidelijke titelbalk met type-aanduiding, afzender en ontvangstmoment. Systeemberichten hebben geen antwoordactie en zijn niet verwijderbaar door de gebruiker. Wanneer een systeembericht verwijst naar een onderliggend domeinobject, bepaalt de applicatie op basis van EntityType en EntityId welke vervolgroute of actie beschikbaar is.
Voor privéthreads toont de pagina bovenaan geen los Ontvangen bericht meer. In plaats daarvan staat bovenaan een sticky threadkop met:
- het stabiele threadicoon en de threadkleur;
- het actuele onderwerp;
- een subtiele type-/laatste-activiteitregel;
- een drie-puntjesknop voor Gespreksopties;
- in sticky-state een subtiele link ← Terug naar berichten.
De threadkop toont niet nog eens groot Privégesprek boven het onderwerp; het onderwerp is de primaire kop. Statusmeldingen na acties staan sticky onder de threadkop, met vaste niet-transparante fout-/succesachtergrond zodat zij zichtbaar blijven wanneer de gebruiker onderaan het gesprek zit.
Het menu Gespreksopties opent een modal met nu minimaal Onderwerp aanpassen en Gesprek verlaten. Later kunnen deelnemers toevoegen en threadafbeelding/icoon aanpassen op dezelfde UX-plek aansluiten. Een onderwerpwijziging wordt als PrivateMessageThreadEvents.EventType = SubjectChanged vastgelegd en niet als gewoon privébericht. Wanneer er geen andere actieve deelnemer meer is, wordt onderwerp aanpassen in de modal disabled getoond met een kindvriendelijke uitleg en zonder opslaanknoppen.
Bij het openen van een privéthread wordt eerst bepaald of er nieuwe activiteit voor de ingelogde participant was. Daarna wordt de threadactiviteit voor deze deelnemer als gelezen beschouwd. Deze mutatie mag uitsluitend plaatsvinden binnen de participantregel van de ingelogde gebruiker en mag geen leesstatus van andere deelnemers aanpassen.
4.3.4 Acties
De actie Terug naar berichten brengt de gebruiker terug naar het berichtenoverzicht. De bestaande zoek- of filtercontext hoeft niet verplicht behouden te blijven, tenzij dat als algemene navigatieregel voor het berichtenoverzicht wordt vastgelegd.
Beantwoorden gebeurt op de threaddetailpagina zelf via een compact inline blok Bericht onderaan de timeline. Er is geen aparte gebruikersflow meer waarin een gebruiker normaal naar een zelfstandige replypagina hoeft te gaan. De replyroute mag hoogstens als technische fallback bestaan en redirectt terug naar de normale threadpagina.
De actie Gesprek verlaten staat onder Gespreksopties en verwijdert het privégesprek alleen uit de eigen zichtbare mailboxweergave van de gebruiker. Dit is een gebruikergebonden mailboxhandeling via de participantlaag en geen fysieke verwijdering van de thread of berichten voor andere deelnemers. De eerste geldige verlaat-/verwijderactie schrijft een compact thread-event, zodat achterblijvende deelnemers zien wie het gesprek heeft verlaten. Als iemand alleen overblijft, wordt beantwoorden en onderwerp wijzigen geblokkeerd met vriendelijke uitleg. Voor systeemberichten is verwijderen niet toegestaan; de verwijderactie wordt dan niet getoond.
4.3.5 Privéthreadtimeline
Privéthreads tonen één timeline van oud naar nieuw binnen het geladen venster. De timeline bevat gewone privéberichten en threadgebeurtenissen in dezelfde tijdlijn. De gebruiker leest het gesprek van boven naar beneden, maar de pagina springt automatisch naar het relevante punt:
- naar de marker Nieuwe berichten wanneer er voor de ingelogde participant nieuwe activiteit was;
- naar
#latestwanneer er geen nieuwe activiteit was.
Berichten worden als compacte berichtballonnen getoond. Eigen berichten staan rechts; berichten van andere deelnemers staan links. Iedere participant gebruikt een threadspecifieke accentkleur zodat toekomstige groepsgesprekken herkenbaar blijven. De avatar staat in de berichtballon en maakt deel uit van de threadweergave. De titelregel van een berichtballon volgt het patroon <datum> · <tijd> (<naam>/Jij).
Boven de timeline kan een compacte marker Nieuwe berichten of Eerdere berichten staan. Dit is een visuele navigatiehulp, geen apart inhoudelijk hoofdblok. Als er geen zichtbare threaditems zijn, toont de pagina een compacte lege staat zonder technische identifiers.
4.3.6 Eerdere berichten laden
Wanneer een gesprek meer historie heeft dan het initiële venster, toont de pagina bovenaan de timeline een duidelijke knop Eerdere berichten laden. Deze knop heeft een herkenbare OefenHub-buttonstijl maar blijft subtiel, omdat hij ondersteunend is aan het gesprek.
Bij klikken wordt zonder volledige page refresh een beveiligde POST uitgevoerd naar de oudere-timeline-route. De request bevat een hidden, opaque cursor. Die cursor is niet leesbaar of betekenisvol voor de gebruiker en bevat geen aanpasbare pagina-, datum- of bericht-id. Conceptueel verwijst de cursor naar de oudste al geladen positie binnen deze thread voor deze gebruiker.
De server controleert bij iedere klik opnieuw de ingelogde gebruiker, de thread, de cursorcontext, de participantstatus en de batchlimieten. Als de cursor ontbreekt, gemanipuleerd is of niet bij deze gebruiker/thread hoort, toont de pagina een veilige foutmelding zonder extra inhoud te laden.
De nieuw opgehaalde oudere items worden bovenaan de bestaande timeline toegevoegd. De client bewaart en corrigeert de scrollpositie, zodat de gebruiker visueel op dezelfde plek in het gesprek blijft.
4.3.7 Threadgebeurtenissen binnen de thread
Binnen de threadcontext mogen systeemachtige tussenregels voorkomen. Deze regels zijn geen losse systeemberichten in de mailbox en ook geen gewone privéberichten. Zij zijn threadgebeurtenissen binnen dezelfde privéconversatie.
De mockup toont hiervan een voorbeeld: een deelnemer heeft het onderwerp gewijzigd van Lekker bezig naar Goed bezig met optellen. Functioneel wordt dit vastgelegd als een record in PrivateMessageThreadEvents, bijvoorbeeld met eventtype SubjectChanged, actor, oud onderwerp, nieuw onderwerp en tijdstip.
Threadgebeurtenissen worden als neutrale systeemballon tussen de gewone berichtballonnen getoond. Alleen relevante onderdelen, zoals de actor en oude/nieuwe onderwerpwaarde, mogen visueel nadruk krijgen. Wanneer een threadevent renderbare tekst bevat, moet de inhoud server-side veilig worden opgebouwd, gesanitized en geëncodeerd voordat deze wordt getoond.
Threadgebeurtenissen maken onderdeel uit van de threadtijdlijn. Een nieuw threadevent na de laatst bekende leespositie kan daarom bijdragen aan de ongelezenstatus van de thread, ook wanneer er geen nieuw handmatig privébericht is geplaatst. In de UI worden threadgebeurtenissen compact, gecentreerd en duidelijk anders gekleurd getoond, zonder avatar en zonder titelbalk.
4.3.8 Autorisatie en server-side controle
Alle toegang tot deze pagina moet server-side worden gecontroleerd. Frontend-zichtbaarheid of het verbergen van knoppen is geen beveiliging.
Voor privéberichten gelden minimaal de volgende controles:
- de ingelogde gebruiker heeft een participantregel bij de betreffende
PrivateMessageThreads.Id; - de thread is niet voor deze gebruiker verwijderd via de participantlaag;
- het geopende bericht hoort bij dezelfde thread;
- weergegeven berichten en threadevents horen bij dezelfde thread;
- leesstatus en verwijderstatus worden alleen voor de participantregel van de ingelogde gebruiker aangepast;
- beantwoorden is alleen toegestaan wanneer de gebruiker nog actief aan de thread mag deelnemen.
Voor systeemberichten gelden minimaal de volgende controles:
SystemMessages.RecipientUserIdis gelijk aan de ingelogde gebruiker;- eventuele
EntityTypeenEntityIdverwijzen naar een toegestaan vervolgdomein; - de actuele gebruiker heeft ook rechten op de vervolgactie of detailweergave waarnaar het systeembericht verwijst.
4.3.9 Foutstaten en disabled states
Wanneer het bericht of de thread niet bestaat, niet zichtbaar is voor de gebruiker of inmiddels uit de eigen mailbox is verwijderd, toont het systeem een nette fout- of niet-beschikbaarmelding. De pagina mag in dat geval geen technische id's, stacktraces of interne databasenaamgeving tonen.
Wanneer beantwoorden niet mogelijk is, bijvoorbeeld omdat de gebruiker geen actieve deelnemer meer is of omdat de thread functioneel gesloten is, wordt de antwoordactie verborgen of disabled weergegeven met een begrijpelijke toelichting.
Wanneer verwijderen niet is toegestaan, zoals bij systeemberichten, wordt de verwijderactie verborgen of disabled weergegeven. Bij een disabled weergave moet de gebruiker kunnen begrijpen waarom verwijderen niet mogelijk is.
4.4 UI-elementen en velddefinities
| Element-ID | Type | GUI-verwijzing | Omschrijving | Zichtbaar label | Opmerking | Technische naam |
|---|---|---|---|---|---|---|
| SCH-GEN-04-01-S01 | S | Hoofdkaart | Container voor systeemberichtdetail of privégesprektimeline. | Geopend bericht / Privégesprek | Header en footer vallen buiten scope. | OpenMessageShell |
| SCH-GEN-04-01-N01 | A | Breadcrumb | Navigatiepad naar de berichtencontext. | Home > Berichten > Bericht | Alleen functionele pagina-navigatie binnen de content. | OpenMessageBreadcrumb |
| SCH-GEN-04-01-S02 | S | Introblok | Titel en toelichting boven de detailweergave. | Geopend bericht / Privégesprek | Voor privéthreads beschrijft de tekst het gesprek en niet een los ontvangen bericht. | OpenMessageIntroSection |
| SCH-GEN-04-01-F01 | F | Introblok — titel | Titel van de pagina. | Ontvangen bericht of Privégesprek | Read-only weergavetekst afhankelijk van itemtype. | OpenMessagePageTitle |
| SCH-GEN-04-01-F02 | F | Introblok — toelichting | Korte uitleg over het geopende bericht en de threadcontext. | Bekijk een ontvangen privébericht. Onder het huidige bericht staan de eerdere berichten uit dezelfde conversatie. | Weergavetekst is codegedreven of contentgedreven afhankelijk van latere beheerkeuze. | OpenMessageIntroText |
| SCH-GEN-04-01-S03 | S | Berichtkaart | Hoofdkaart met metadata, onderwerp, inhoud en acties van het geopende bericht. | Bericht | Toont privéberichtvariant of systeemberichtvariant. | OpenMessageCard |
| SCH-GEN-04-01-F03 | F | Berichtmetadata — type | Type-aanduiding van het geopende bericht. | Privé | Bij systeembericht wordt het type als systeemvariant weergegeven. | OpenMessageTypeTag |
| SCH-GEN-04-01-F04 | F | Berichtmetadata — afzender | Naam of systeemweergave van de afzender. | Van: <naam afzender> | Bij namens-verzending moet afwijkende afzenderweergave ondersteund worden. | OpenMessageSenderDisplayName |
| SCH-GEN-04-01-F05 | F | Berichtmetadata — ontvanger | Naam van de ontvanger of relevante deelnemersweergave. | Aan: <naam ontvanger> | Dynamisch op basis van deelnemers en berichtcontext. | OpenMessageRecipientDisplayName |
| SCH-GEN-04-01-F06 | F | Berichtmetadata — ontvangstmoment | Datum en tijd waarop het bericht is ontvangen of verzonden. | Ontvangen: <datum> · <tijd> | UTC-bronwaarde lokaal weergeven. | OpenMessageReceivedAtDisplay |
| SCH-GEN-04-01-F07 | F | Berichtinhoud — onderwerp | Onderwerp van de thread of titel van het bericht. | <onderwerp> | Dynamisch, veilig geëncodeerd. | OpenMessageSubject |
| SCH-GEN-04-01-F08 | F | Berichtinhoud — body | Volledige berichtinhoud. | <berichtinhoud> | Rich text alleen renderen nadat deze veilig gesanitized is. | OpenMessageBody |
| SCH-GEN-04-01-B01 | B | Berichtacties | Laat de gebruiker het privégesprek verlaten en uit de eigen mailboxweergave verwijderen. | Gesprek verlaten | Alleen actief voor privéberichten waar gebruiker deelnemer is; niet voor systeemberichten. | DeletePrivateMessageAction |
| SCH-GEN-04-01-B02 | B | Berichtacties | Navigeert terug naar het berichtenoverzicht. | Terug naar berichten | Keert terug naar de centrale mailbox. | BackToMessagesButton |
| SCH-GEN-04-01-B03 | B | Berichtacties | Verplaatst de focus naar de inline replycomposer onderaan deze thread. | Beantwoorden | Alleen beschikbaar voor beantwoordbare privéthreads. | ReplyToMessageButton |
| SCH-GEN-04-01-M01 | M | Berichtacties — disabled state | Toelichting wanneer verwijderen niet is toegestaan. | Verwijderen niet mogelijk | Van toepassing bij systeemberichten of niet-verwijderbare contexten. | DeleteMessageDisabledMessage |
| SCH-GEN-04-01-S04 | S | Privéthreadtimeline | Eén chronologische gesprekstimeline met zichtbare berichten en threadevents. | Nieuwe berichten / Laatste bericht / Eerdere berichten | Alleen voor privéthreads; markerlabels zijn navigatiehulp binnen dezelfde timeline. | MessageThreadTimelineSection |
| SCH-GEN-04-01-F09 | F | Timeline-marker | Marker voor nieuwe activiteit of oudere zichtbare context. | Nieuwe berichten / Eerdere berichten (<aantal>) | Marker wordt afgeleid uit participant-readstate en zichtbaar timelinevenster. | ThreadTimelineMarker |
| SCH-GEN-04-01-T01 | T | Threadcontext — lijst | Tijdlijn met berichten en threadevents uit dezelfde thread. | <threadtijdlijn> | Sorteert volgens threadweergave; bevat alleen data uit dezelfde thread. | MessageThreadTimeline |
| SCH-GEN-04-01-M02 | M | Threadcontext — threadevent | Neutrale systeemballon voor een threadgebeurtenis. | <actor> veranderde het onderwerp van <oud> naar <nieuw> | Geen los systeembericht en geen gewoon privébericht; gebruikt een neutrale, van gewone berichtballonnen onderscheidbare weergave en staat in de tijdlijn bij de context waarop de gebeurtenis betrekking heeft. | ThreadEventSystemBubble |
| SCH-GEN-04-01-M03 | M | Threadcontext — bericht van ander | Berichtballon voor een bericht van een andere deelnemer. | <datum> · <tijd> (<naam>) | Links uitgelijnd in de mockup. | ThreadMessageBubbleOther |
| SCH-GEN-04-01-M04 | M | Threadcontext — eigen bericht | Berichtballon voor een bericht van de ingelogde gebruiker. | <datum> · <tijd> (Jij) | Rechts uitgelijnd in de mockup. | ThreadMessageBubbleSelf |
| SCH-GEN-04-01-M05 | M | Foutstaat | Melding wanneer het bericht niet beschikbaar of niet geautoriseerd is. | Bericht niet beschikbaar | Geen technische identifiers tonen. | OpenMessageUnavailableMessage |
4.5 Waardelagen
| Element-ID | GUI-verwijzing | Zichtbaar label | Technische naam | Databron | Waardebron | Datatype | Bewerkbaar | Validatie / regel |
|---|---|---|---|---|---|---|---|---|
| SCH-GEN-04-01-S01 | Hoofdkaart | Geopend bericht / Privégesprek | OpenMessageShell | Routecontext, ingelogde gebruiker, PrivateMessageThreadParticipants of SystemMessages | Samengesteld schermobject | Composite | Nee | Alleen tonen wanneer de gebruiker rechten heeft op het bericht of de thread. |
| SCH-GEN-04-01-N01 | Breadcrumb | Home > Berichten > Bericht | OpenMessageBreadcrumb | Routeconfiguratie | Afgeleid uit huidige route | Navigation label | Nee | Geen technische bericht- of thread-id tonen. |
| SCH-GEN-04-01-F01 | Introblok — titel | Ontvangen bericht / Privégesprek | OpenMessagePageTitle | Codegedreven schermtekst of contentblok indien later beheerbaar gemaakt | Weergavetekst | String | Nee | Moet passen bij itemtype: systeembericht of privéthread. |
| SCH-GEN-04-01-F02 | Introblok — toelichting | Bekijk een ontvangen privébericht. Onder het huidige bericht staan de eerdere berichten uit dezelfde conversatie. | OpenMessageIntroText | Codegedreven schermtekst of contentblok indien later beheerbaar gemaakt | Weergavetekst | String | Nee | Tekst mag niet suggereren dat systeemberichten beantwoordbaar of verwijderbaar zijn. |
| SCH-GEN-04-01-F03 | Berichtmetadata — type | Privé | OpenMessageTypeTag | PrivateMessages binnen PrivateMessageThreads, of SystemMessages.Type bij systeemberichtvariant | Afgeleid type | Enum/string | Nee | Type moet overeenkomen met het geopende bronobject. |
| SCH-GEN-04-01-F04 | Berichtmetadata — afzender | Van: <naam afzender> | OpenMessageSenderDisplayName | PrivateMessages.SenderUserId, PrivateMessages.SendAsUserId, Users, of SystemMessages.CreatedBySystemComponent | Databasewaarde en afgeleide displaynaam | String | Nee | Alleen namen tonen die binnen de berichtcontext toegestaan zijn; namens-weergave ondersteunen. |
| SCH-GEN-04-01-F05 | Berichtmetadata — ontvanger | Aan: <naam ontvanger> | OpenMessageRecipientDisplayName | PrivateMessageThreadParticipants.UserId, Users, of SystemMessages.RecipientUserId | Databasewaarde en afgeleide displaynaam | String | Nee | De ingelogde gebruiker moet ontvanger of threaddeelnemer zijn. |
| SCH-GEN-04-01-F06 | Berichtmetadata — ontvangstmoment | Ontvangen: <datum> · <tijd> | OpenMessageReceivedAtDisplay | PrivateMessages.SentAtUtc, SystemMessages.CreatedAtUtc | UTC-bronwaarde lokaal geformatteerd | DateTime display | Nee | Datum/tijd consistent lokaal weergeven. |
| SCH-GEN-04-01-F07 | Berichtinhoud — onderwerp | <onderwerp> | OpenMessageSubject | PrivateMessageThreads.Subject, SystemMessages.Title | Databasewaarde | String | Nee | Onderwerp veilig encoden; geen actieve HTML renderen. |
| SCH-GEN-04-01-F08 | Berichtinhoud — body | <berichtinhoud> | OpenMessageBody | PrivateMessages.Body, PrivateMessages.BodyFormat, SystemMessages.Body | Databasewaarde | Sanitized text/html | Nee | Rich text alleen tonen na server-side sanitizing en veilige encoding. |
| SCH-GEN-04-01-B01 | Berichtacties | Gesprek verlaten | DeletePrivateMessageAction | PrivateMessageThreadParticipants.DeletedAtUtc | User action / participantmutatie | Action | Ja | Alleen privéthread voor eigen participantregel soft-deleten; andere deelnemers behouden zichtbaarheid. |
| SCH-GEN-04-01-B02 | Berichtacties | Terug naar berichten | BackToMessagesButton | Routeconfiguratie | Navigatieactie | Action | Ja | Terug naar berichtenoverzicht zonder autorisatiecontext te lekken. |
| SCH-GEN-04-01-B03 | Berichtacties | Beantwoorden | ReplyToMessageButton | PrivateMessageThreadParticipants, PrivateMessageThreads | Actie beschikbaar op basis van deelnemerstatus en threadstatus | Action | Ja | Alleen tonen of activeren bij beantwoordbare privéthreads. |
| SCH-GEN-04-01-M01 | Berichtacties — disabled state | Verwijderen niet mogelijk | DeleteMessageDisabledMessage | Bronobjecttype en autorisatiestatus | Afgeleide disabled-state | Boolean/display | Nee | Systeemberichten mogen niet verwijderbaar worden gemaakt. |
| SCH-GEN-04-01-S04 | Privéthreadtimeline | Nieuwe berichten / Laatste bericht / Eerdere berichten | MessageThreadTimelineSection | PrivateMessageThreads, PrivateMessages, PrivateMessageThreadEvents, PrivateMessageThreadParticipants | Samengestelde threadtimeline | Composite | Nee | Alleen data uit dezelfde thread tonen; windowed laden rond #new of #latest. |
| SCH-GEN-04-01-F09 | Timeline-marker | Nieuwe berichten / Eerdere berichten (<aantal>) | ThreadTimelineMarker | Participant-readstate en zichtbaar timelinevenster | Berekend | String / Integer | Nee | Marker dynamisch bepalen; #new en #latest zijn echte pagina-ankers. |
| SCH-GEN-04-01-T01 | Threadcontext — lijst | <threadtijdlijn> | MessageThreadTimeline | PrivateMessages + PrivateMessageThreadEvents binnen dezelfde thread | Samengestelde collectie | Collection | Nee | Sorteer volgens functionele threadweergave; geen berichten uit andere threads tonen. |
| SCH-GEN-04-01-M02 | Threadcontext — threadevent | <actor> veranderde het onderwerp van <oud> naar <nieuw> | ThreadEventSystemBubble | PrivateMessageThreadEvents.EventType, ActorUserId, OldValue, NewValue, OccurredAtUtc, Users | Databasewaarde en afgeleide rendertekst | Event display | Nee | Event is geen SystemMessages-record en geen PrivateMessages-record; tekst veilig opbouwen en sanitizen. |
| SCH-GEN-04-01-M03 | Threadcontext — bericht van ander | <datum> · <tijd> (<naam>) | ThreadMessageBubbleOther | PrivateMessages.SenderUserId, PrivateMessages.SentAtUtc, PrivateMessages.Body, Users | Databasewaarde en afgeleide displaynaam | Sanitized text/html | Nee | Alleen zichtbaar wanneer bericht bij dezelfde thread hoort en gebruiker participant is. |
| SCH-GEN-04-01-M04 | Threadcontext — eigen bericht | <datum> · <tijd> (Jij) | ThreadMessageBubbleSelf | PrivateMessages.SenderUserId, PrivateMessages.SentAtUtc, PrivateMessages.Body | Databasewaarde en ingelogde gebruikerscontext | Sanitized text/html | Nee | Alleen als eigen bericht weergeven wanneer SenderUserId overeenkomt met ingelogde gebruiker of volgens namens-regel functioneel zo getoond moet worden. |
| SCH-GEN-04-01-M05 | Foutstaat | Bericht niet beschikbaar | OpenMessageUnavailableMessage | Autorisatieservice, berichtservice en routecontext | Afgeleide foutstaat | Message | Nee | Geen GUID's, thread-id's, databasefouten of stacktraces tonen. |
| SCH-GEN-04-01-A01 | Leesstatus bij openen | Geen zichtbaar label | MarkThreadReadOnOpenAction | PrivateMessageThreadParticipants.LastReadMessageId, PrivateMessageThreadParticipants.LastReadAtUtc, SystemMessages.ReadAtUtc | Runtime mutatie bij openen | Action | Ja | Alleen eigen leesstatus muteren; andere deelnemers niet beïnvloeden. |
4.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-04-01-01 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Een geopend privébericht als zelfstandige pagina tonen binnen de ingelogde berichtencontext |
REQ-SCH-GEN-04-01-02 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Het systeem mag een privébericht alleen tonen wanneer de ingelogde gebruiker deelnemer is aan de betreffende privébericht-thread |
REQ-SCH-GEN-04-01-03 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Het systeem mag een privébericht-thread niet tonen wanneer de thread voor de ingelogde gebruiker uit de eigen mailbox is verwijderd |
REQ-SCH-GEN-04-01-04 | SRS-MSG-002 SRS-MSG-003 AC-MSG-002 AC-MSG-003 | Bij een geopend privébericht minimaal type, afzender, ontvanger, ontvangstmoment, onderwerp en volledige berichtinhoud tonen |
REQ-SCH-GEN-04-01-05 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Zichtbare namen, tijden, onderwerpen en berichtinhoud dynamisch uit de bericht- en threadcontext afleiden en mag mockupwaarden niet hardcoded gebruiken |
REQ-SCH-GEN-04-01-06 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Het openen van een privébericht de leespositie van de ingelogde deelnemer bijwerken zonder leesstatus van andere deelnemers te wijzigen |
REQ-SCH-GEN-04-01-07 | SRS-MSG-002 SRS-MSG-007 AC-MSG-002 AC-MSG-007 | Het openen van een systeembericht uitsluitend SystemMessages.ReadAtUtc van het betreffende systeembericht voor de ingelogde ontvanger bijwerken |
REQ-SCH-GEN-04-01-08 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Berichtinhoud met rich text alleen gerenderd tonen nadat de inhoud server-side is gesanitized en veilig geëncodeerd |
REQ-SCH-GEN-04-01-09 | SRS-AUTH-004 SRS-MSG-001 AC-AUTH-004 AC-MSG-001 | Het systeem mag in het geopende bericht geen technische identifiers zoals GUID's, message-id's, thread-id's of entity-id's zichtbaar tonen |
REQ-SCH-GEN-04-01-10 | SRS-MSG-001 AC-MSG-001 | De actie Terug naar berichten de gebruiker terugbrengen naar het centrale berichtenoverzicht |
REQ-SCH-GEN-04-01-11 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | De actie Beantwoorden alleen beschikbaar zijn voor privéthreads waarin de gebruiker actief mag deelnemen en waarop functioneel nog gereageerd mag worden |
REQ-SCH-GEN-04-01-12 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | De actie Beantwoorden het scherm Beantwoord bericht openen met de juiste threadcontext |
REQ-SCH-GEN-04-01-13 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | De actie Gesprek verlaten bij privéberichten uitsluitend de zichtbaarheid voor de eigen participantregel verwijderen en mag de thread of berichten niet voor andere deelnemers verwijderen |
REQ-SCH-GEN-04-01-14 | SRS-MSG-001 SRS-MSG-007 AC-MSG-001 AC-MSG-007 | Systeemberichten geen door de gebruiker worden verwijderd en mogen daarom geen actieve verwijderactie krijgen |
REQ-SCH-GEN-04-01-15 | SRS-MSG-001 SRS-MSG-007 AC-MSG-001 AC-MSG-007 | Voor een systeembericht dezelfde leesweergave kunnen worden gebruikt, maar zonder antwoordactie en zonder actieve verwijderactie |
REQ-SCH-GEN-04-01-16 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Wanneer een systeembericht een EntityType en EntityId bevat, het systeem de vervolgactie uitsluitend op basis van toegestane domeinverwijzing en actuele autorisatie bepalen |
REQ-SCH-GEN-04-01-17 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Onder het geopende privébericht het systeem, indien aanwezig, de zichtbare threadcontext van dezelfde conversatie kunnen tonen |
REQ-SCH-GEN-04-01-18 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | De threadcontext mag uitsluitend berichten en threadevents tonen die bij dezelfde privébericht-thread horen |
REQ-SCH-GEN-04-01-19 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | De threadcontext berichten als compacte berichtballonnen kunnen weergeven met onderscheid tussen berichten van de ingelogde gebruiker en berichten van andere deelnemers |
REQ-SCH-GEN-04-01-20 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | De privéthreadtimeline van oud naar nieuw kunnen tonen binnen het geladen venster |
REQ-SCH-GEN-04-01-21 | 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 marker Nieuwe berichten of Eerdere berichten dynamisch bepalen vanuit participant-readstate en timelinevenster |
REQ-SCH-GEN-04-01-22 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Threadgebeurtenissen geen als gewone privéberichten worden geteld, tenzij later expliciet een afwijkende telregel wordt vastgesteld |
REQ-SCH-GEN-04-01-23 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Threadgebeurtenissen zoals onderwerpwijziging, deelnemer toegevoegd en deelnemer verlaten als neutrale systeemballon binnen de thread kunnen tonen, met visueel onderscheid ten opzichte van gewone linker- en rechterberichtballonnen, met visueel onderscheid ten opzichte van gewone linker- en rechterberichtballonnen |
REQ-SCH-GEN-04-01-24 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Threadgebeurtenissen binnen een privéthread geen worden opgeslagen of behandeld als losse mailbox-systeemberichten |
REQ-SCH-GEN-04-01-25 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Threadgebeurtenissen binnen een privéthread geen worden opgeslagen of behandeld als gewone privéberichten |
REQ-SCH-GEN-04-01-26 | SRS-NFR-AUD-001 SRS-MSG-001 AC-NFR-AUD-001 AC-MSG-001 | Bij een onderwerpwijziging de threadgebeurtenis minimaal de actor, oude waarde, nieuwe waarde en het gebeurtenismoment kunnen tonen |
REQ-SCH-GEN-04-01-27 | SRS-NFR-AUD-001 SRS-MSG-001 AC-NFR-AUD-001 AC-MSG-001 | Alleen relevante onderdelen van een threadgebeurtenis, zoals actor en oude of nieuwe onderwerpwaarde, mogen visueel nadruk krijgen |
REQ-SCH-GEN-04-01-28 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Renderbare tekst binnen threadgebeurtenissen server-side veilig worden opgebouwd, gesanitized en consistent gerenderd |
REQ-SCH-GEN-04-01-29 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Nieuwe threadgebeurtenissen na de laatst bekende leespositie kunnen bijdragen aan de ongelezenstatus van de thread |
REQ-SCH-GEN-04-01-30 | SRS-MSG-001 SRS-MSG-003 AC-MSG-001 AC-MSG-003 | Wanneer er geen zichtbare privéthreaditems zijn, een compacte lege staat tonen zonder technische details |
REQ-SCH-GEN-04-01-31 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Toegang tot bericht, thread, threadberichten, threadevents, antwoordactie, verwijderactie en vervolgactie server-side worden gecontroleerd |
REQ-SCH-GEN-04-01-32 | SRS-AUTH-001 SRS-MSG-001 AC-AUTH-001 AC-MSG-001 | Wanneer het bericht niet bestaat of de gebruiker geen toegang heeft, het systeem een nette niet-beschikbaarmelding tonen zonder technische foutdetails |
REQ-SCH-GEN-04-01-33 | SRS-MSG-001 AC-MSG-001 | Datum- en tijdwaarden uit UTC-bronwaarden lokaal en consistent worden weergegeven |
REQ-SCH-GEN-04-01-34 | SRS-MSG-001 AC-MSG-001 | Header, algemene navigatie, profielknop en footer geen als functionele UI-elementen van dit schermdocument worden beschouwd |
4.3.1 Relatie-uitnodiging als berichtactie
Wanneer een systeembericht naar een relatie-uitnodiging verwijst, staat het actieblok binnen de witte berichtkaart onder de berichttekst. Openstaande uitnodigingen tonen alleen de relevante beslissingacties. Is de uitnodiging al behandeld, ingetrokken of verlopen, dan verdwijnen de acceptatie- en weigerknoppen en toont het blok een duidelijke statusmelding zoals Deze uitnodiging is al behandeld of Deze uitnodiging is verlopen.
Het detail toont geen technische statusregel zoals Status: Openstaand, geen ontvangerregel en geen extra relatietypebadge wanneer de context al uit de berichttekst en actiekaart blijkt.
De helptekst bij een relatie-uitnodiging is relatietype-afhankelijk en kindvriendelijk. Voor vriendschap ligt de nadruk op oefeningen delen en privéberichten; andere relatietypen gebruiken hun eigen veilige uitleg.
4.7 Technische koppeling
Voor technische uitwerking zijn vooral relevant:
- 05 Autorisatie, policies en server-side contextcontrole voor het blokkeren van berichtdetails buiten de eigen deelnemers- of ontvangerscontext.
- 13 Berichten, systeemberichten, notificaties en privéberichten voor berichtdetails, threadcontext, leesstatus en threadgebeurtenissen.
- 17 Readmodels, tellers, badges, caching en materialisatie voor herberekening van ongelezenstatus en badgewaarden na openen.
- 19 Logging, audit, securitylogging en technische foutafhandeling voor veilige foutafhandeling zonder technische details in de UI.
- 24 Frontend, Blazor, routing, state en componentopbouw voor detailweergave, acties en routegedrag.