Specifikation

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:
    1. Användaren öppnar "Skapa kalenderhändelse" från kalendervyn (FAB).
    2. Formuläret visar befintliga fält: Rubrik, Text, Startdatum + starttid, Slutdatum + sluttid, Heldag, "Visas för" (chip-input med målgrupper).
    3. 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".
    4. Hjälptext förklarar att upprepningen skapar vanliga kalenderhändelser — inte uppgifter, prov eller inlämningar.
    5. 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.
    6. 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:
    1. Användaren öppnar personlig kalender (veckovy) eller en gruppkalender (månadsvy: skola, klass, undervisningsgrupp eller samarbetsgrupp).
    2. Varje förekomst renderas som en vanlig kalenderhändelse (egen post) — ingen uppgiftsikon, ingen bedömningsstatus.
    3. 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:
    1. Användaren klickar på en förekomst i valfri kalendervy.
    2. Detaljvyn visar målgruppskontext, rubrik, "När" (datum + tid), beskrivning.
    3. För händelser som ingår i en serie visas serieinformation (t.ex. "Ingår i serie: Varje vecka, 6 förekomster").
    4. 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:
    1. Från detaljvyn väljer användaren Redigera.
    2. Redigeringsformuläret (samma formulär som skapa, förifyllt) öppnas för den enskilda förekomsten.
    3. En informationstext förklarar att ändringen endast gäller den valda förekomsten — inte hela serien.
    4. 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:
    1. Från detaljvyn väljer användaren Ta bort.
    2. Fristående händelse: enkel bekräftelsedialog "Vill du ta bort denna kalenderhändelse?" med Avbryt / Ta bort.
    3. Serieförekomst: dialog med valen Radera denna händelse och Radera hela serien (radioval) + Avbryt / Ta bort.
    4. 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 }] (motsvarar CalendarEventLinking)
    • createdBy (userID, ref personnel)
    • seriesID (number | null) — grupperar förekomster i en serie
  • Kalenderhändelseserie (calendarEventSeries)
    • seriesID (number)
    • recurrence: "EveryWeek" | "EveryOtherWeek" (enligt befintlig CalendarEventRecurrence-enum, begränsad till MVP-valen)
    • occurrenceCount (number, 1–25)
    • firstStartDate, lastStartDate
    • createdBy (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).
  • 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 delade window.vklassDialogManager.openDialog(id, opener) — fokus flyttas in, inert sä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-current eller tabs-mönster med role="tablist" + roving tabindex enligt mockup-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-toggle synkar aria-expanded i samma kodväg som klass-toggle (_syncFlyoutAria).
  • Form validation: skapa-/redigeringsformuläret följer mockup-accessible-form-validation: synliga labels, aria-describedby till hjälp/fel, aria-invalid endast i felläge, valideringssammanfattning med länkar vid misslyckad sparning, submit-lås med aria-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 + statusrad role="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/ — se epic-files/CLASSIFICATION.md och 1/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.