Specifikation: Återkommande kalenderhändelser
Variant
Vklass V2 (vklassv2). Källa: run-prompt (Variant: Vklass V2) och 1/mockup-context.json ("variant": "vklassv2", "screenshotMatchingStrategy": "replicate-then-extend", "isExistingFeature": true).
Roller
- Lärare (
teacher.html) — Kerstin Berg (T5004-002). Skapar återkommande kalenderhändelser för klass, undervisningsgrupp och samarbetsgrupp. Ser personlig kalender (veckovy), gruppkalendrar (månadsvy) och klassens översikt med kalender-widget. Redigerar/raderar egna händelser. - Rektor (
rektor.html) — Magnus Widén (T5004-007). Skapar återkommande skolhändelser (målgrupp skola), ser skolkalenderns månadsvy och skolans översikt med kalender-widget. - Administratör (
admin.html) — Anders Bergman (T5000-001), kommunadministratör. Administrerar skolkalendern: lista över kommande händelser med serietillhörighet, skapar återkommande skolhändelse, raderar hel serie. - Elev (
student.html) — Anna Andersson (S5004-701). Ser förekomsterna i sin kalender (veckovy) och i "Kommande händelser"-listan. Endast läsläge. - Vårdnadshavare (
custodian.html) — Eva Andersson (C5004-701A). Ser barnets kalenderhändelser (veckovy + kommande händelser) via relationen till Anna. Endast läsläge.
Användningsfall (UC)
UC-1: Skapa återkommande kalenderhändelse
- Aktör: Lärare, Rektor, Administratör
- Förutsättning: Användaren har befintlig skrivbehörighet (RequireStaff) i minst en målgruppskontext. Läraren kan välja klass/undervisningsgrupp/samarbetsgrupp; rektor/administratör kan även välja skola.
- Flöde:
- Användaren öppnar "Skapa kalenderhändelse" från kalendervyn (FAB).
- Formuläret visar befintliga fält: Rubrik, Text, Startdatum + starttid, Slutdatum + sluttid, Heldag, "Visas för" (chip-input med målgrupper).
- En ny sektion Upprepning visas efter datum/tid och före "Visas för": frekvensval Upprepas inte / Varje vecka / Varannan vecka samt fältet Antal förekomster (1–25) som visas endast när frekvens ≠ "Upprepas inte".
- Hjälptext förklarar att upprepningen skapar vanliga kalenderhändelser — inte uppgifter, prov eller inlämningar.
- Användaren sparar. Systemet validerar och genererar en förekomst per intervall: samma rubrik, text, målgrupper, skapare och tidslängd men förskjuten start-/sluttid. Förekomsterna grupperas med en serieidentifierare.
- Användaren återförs till kalendern med success-alert som anger antal skapade förekomster, t.ex. "Kalenderhändelserna har sparats. 6 förekomster skapades."
- Resultat: Serien syns som separata vanliga kalenderhändelser i berörda kalendrar.
- Acceptanskriterier:
- Frekvensvalet innehåller exakt: Upprepas inte, Varje vecka, Varannan vecka.
- "Antal förekomster" är dolt vid "Upprepas inte" och visas (obligatoriskt) vid Varje vecka/Varannan vecka.
- Serien kan inte sparas utan giltigt antal förekomster; antal > 25 avvisas med fältnära fel.
- Slutdatum/sluttid får inte ligga före startdatum/starttid; fel visas fältnära + i valideringssammanfattning.
- Vid "Upprepas inte" sparas exakt en händelse med befintlig kvittens "Kalenderhändelsen har sparats."
- Vid upprepning anger kvittensen antal skapade förekomster (plural).
- Hjälptexten om kalenderhändelse ≠ uppgift/prov/inlämning är synlig i formuläret.
UC-2: Visa förekomster i befintliga kalendervyer
- Aktör: Alla roller
- Förutsättning: En serie är skapad (demodata: "Läxläsning" varje tisdag, klass 7A, 6 förekomster; "Öppet bibliotek" varannan vecka, skola, 4 förekomster; "Elevrådsmöte" varje vecka, samarbetsgrupp, 5 förekomster).
- Flöde:
- Användaren öppnar personlig kalender (veckovy) eller en gruppkalender (månadsvy: skola, klass, undervisningsgrupp eller samarbetsgrupp).
- Varje förekomst renderas som en vanlig kalenderhändelse (egen post) — ingen uppgiftsikon, ingen bedömningsstatus.
- Gruppsidornas kalender-widget ("Kommande händelser") listar förekomsterna datumgrupperat.
- Resultat: Förekomsterna syns i alla befintliga läsvyer utan runtime-expansion.
- Acceptanskriterier:
- Personlig veckovy (lärare/elev/vårdnadshavare) visar tisdagsförekomsten av "Läxläsning".
- Gruppkalenderns månadsvy visar samtliga förekomster i månaden för vald grupp (skola/klass/kurs/samarbetsgrupp).
- Kalender-widgeten på gruppöversikten visar kommande förekomster som vanliga kalenderhändelser.
- Ingen förekomst visar poäng-, omdömes- eller bedömningskoppling.
UC-3: Visa detalj för en förekomst
- Aktör: Alla roller
- Förutsättning: Förekomster finns i kalendern.
- Flöde:
- Användaren klickar på en förekomst i valfri kalendervy.
- Detaljvyn visar målgruppskontext, rubrik, "När" (datum + tid), beskrivning.
- För händelser som ingår i en serie visas serieinformation (t.ex. "Ingår i serie: Varje vecka, 6 förekomster").
- Personal med skrivrätt når Redigera och Ta bort via åtgärdsknappen (FAB). Elev/vårdnadshavare ser inga åtgärder (läsläge).
- Resultat: Användaren förstår händelsens innehåll och serietillhörighet.
- Acceptanskriterier:
- Detaljvyn följer nulägeslayouten (kontextrad, rubrik, När-block, beskrivning).
- Serietillhörighet visas för serieförekomster, inte för fristående händelser.
- Elev och vårdnadshavare ser inga redigerings-/raderingsåtgärder.
UC-4: Redigera enskild förekomst
- Aktör: Lärare, Rektor, Administratör
- Förutsättning: Användaren har skrivrätt till händelsens målgrupper.
- Flöde:
- Från detaljvyn väljer användaren Redigera.
- Redigeringsformuläret (samma formulär som skapa, förifyllt) öppnas för den enskilda förekomsten.
- En informationstext förklarar att ändringen endast gäller den valda förekomsten — inte hela serien.
- Användaren sparar; kvittensen "Kalenderhändelsen har sparats." visas och detaljen/kalendern uppdateras.
- Resultat: Endast den valda förekomsten ändras.
- Acceptanskriterier:
- Formuläret är förifyllt med förekomstens värden (inkl. "Visas för"-chips).
- Informationstext om att endast denna förekomst ändras visas för serieförekomster.
- Övriga förekomster i serien påverkas inte (verifierbart i kalendervyn).
UC-5: Radera förekomst eller hel serie
- Aktör: Lärare, Rektor, Administratör
- Förutsättning: Användaren har skrivrätt. Händelsen är fristående eller ingår i en serie.
- Flöde:
- Från detaljvyn väljer användaren Ta bort.
- Fristående händelse: enkel bekräftelsedialog "Vill du ta bort denna kalenderhändelse?" med Avbryt / Ta bort.
- Serieförekomst: dialog med valen Radera denna händelse och Radera hela serien (radioval) + Avbryt / Ta bort.
- Efter borttagning visas kvittens och kalendern uppdateras: en förekomst eller hela serien försvinner beroende på valet.
- Resultat: Rätt poster tas bort.
- Acceptanskriterier:
- Serieförekomst visar båda omfattningsvalen; fristående händelse visar endast enkel bekräftelse.
- "Radera denna händelse" tar bort exakt en förekomst; övriga i serien finns kvar.
- "Radera hela serien" tar bort samtliga förekomster i serien.
- Kvittens efter borttagning ("Kalenderhändelsen har tagits bort." respektive "Serien har tagits bort. N förekomster togs bort.").
Datamodell
- Kalenderhändelse (
calendarEvent— materialiserad förekomst)calendarEventID(number)title(string),info(string),place(string, kan vara tom)startDate/endDate(ISO-datum + tid),isAllDay(boolean)linkedObjects: [{type: "SCHOOL" | "CLASS" | "COURSE" | "COLLABORATION_GROUP",typeID,label}] (motsvararCalendarEventLinking)createdBy(userID, ref personnel)seriesID(number | null) — grupperar förekomster i en serie
- Kalenderhändelseserie (
calendarEventSeries)seriesID(number)recurrence: "EveryWeek" | "EveryOtherWeek" (enligt befintligCalendarEventRecurrence-enum, begränsad till MVP-valen)occurrenceCount(number, 1–25)firstStartDate,lastStartDatecreatedBy(userID)
- Målgrupper ur
consolidated-demo-data.json: skola Proximaskolan (5004), klass 7A (7019), kursgrupp Svenska 7A (8004) samt feature-definierad samarbetsgrupp Elevrådet (9501).
Navigation
- Lärare: menyval "KALENDER OCH SCHEMA" → personlig kalender (veckovy). Vyväxlare för Min kalender / gruppkalendrar. FAB "Skapa kalenderhändelse" öppnar formuläret. Klick på händelse → detaljvy → Redigera/Ta bort.
- Rektor: samma kalenderingång; skolkalender (månadsvy) för Proximaskolan + skolans översikt med kalender-widget.
- Administratör: kalenderingång med listvy över kommande skolhändelser + månadsvy; skapa och radera serie.
- Elev/Vårdnadshavare: menyval "KALENDER OCH SCHEMA" → veckovy + "Kommande händelser"-lista. Klick på händelse → detaljvy i läsläge.
- Alla vyer: användarmenyn "Byt vy" →
index.html(rollväljare).
Tillgänglighetskontrakt (a11y baseline)
- Dialogmodaler i flödet:
dialog-delete-event(radera fristående/serie, med radioval för omfattning),dialog-not-implemented(ej implementerade funktioner). Alla via deladewindow.vklassDialogManager.openDialog(id, opener)— fokus flyttas in,inertsätts på.vk-layout, Escape stänger, fokus återgår till öppnaren.role="dialog",aria-modal="true",aria-labelledby. Ingen lokal DialogManager-klass. - Tabs/sub-tabs i flödet: kalendervyväxlaren (Min kalender/gruppkalendrar per roll) och vylägesknapparna (VECKA/MÅNAD m.fl.) hanteras som in-page-vyväxling med
aria-pressed/aria-currenteller tabs-mönster medrole="tablist"+ roving tabindex enligtmockup-accessible-dynamic-ui. - Filter/sök i flödet: gruppväljaren i gruppkalendern är en nativ V2-stylad
<select>(exakt en grupp åt gången, fast lista). Resultatuppdatering annonseras i polite live-region. - Toolbar flyouts:
#search-toggle,#snabbvalsmeny-toggle,#notifications-toggle,#user-menu-togglesynkararia-expandedi samma kodväg som klass-toggle (_syncFlyoutAria). - Form validation: skapa-/redigeringsformuläret följer
mockup-accessible-form-validation: synliga labels,aria-describedbytill hjälp/fel,aria-invalidendast i felläge, valideringssammanfattning med länkar vid misslyckad sparning, submit-lås medaria-busy. - Skip-link:
<a class="skip-link" href="#main-menu">+<a class="skip-link" href="#main-content">+<main id="main-content" tabindex="-1">. - Live-regioner: kvittenser via delade
window.vklassNotificationManager+ statusradrole="status"för kalenderuppdateringar. - Keyboard test scope: UC-1 (formulär + validering + dynamiskt antal-fält), UC-3 (öppna detalj från kalender), UC-5 (raderingsdialog med omfattningsval, fokusfälla + Escape + fokusåtergång).
Bilder/sketcher
- V2 design references att följa: samtliga tolv PNG i feature-nivå
epic-files/— seepic-files/CLASSIFICATION.mdoch1/design-reference-log.md. - Inga V1-referenser och inga designskisser.
Funktionalitet i scope
Speglar REQUIRED-tabellen i intake.md § Kravklassificering (R-01–R-13). Inga funktioner utöver dessa får implementeras.
Öppna frågor
Inga blockerande öppna frågor. Intent-specifikationens öppna frågor är avgjorda med dess egna rekommendationer (se intake.md § Tolkningar): endast Varje vecka/Varannan vecka, slutvillkor = antal förekomster med tak 25, "radera hela serien" ingår, "ändra hela serien" ingår inte, APL ingår inte.