Skip to content

feat: Implementazione CalendarView e VisitFormView - Issue #75#98

Merged
artcava merged 31 commits intodevelopfrom
feat/issue-75-calendar-visit-views
Feb 14, 2026
Merged

feat: Implementazione CalendarView e VisitFormView - Issue #75#98
artcava merged 31 commits intodevelopfrom
feat/issue-75-calendar-visit-views

Conversation

@artcava
Copy link
Copy Markdown
Owner

@artcava artcava commented Feb 14, 2026

📅 Implementazione Calendario Mensile e Registrazione Visite - Issue #75

🎯 Obiettivo

Implementare la vista calendario mensile per la gestione degli appuntamenti programmati e il form di registrazione delle visite effettive.


✨ Funzionalità Implementate

1️⃣ CalendarView - Vista Calendario Mensile

  • ✅ Grid calendario 6x7 (42 giorni) con navigazione mese precedente/successivo/oggi
  • ✅ Badge colorati sui giorni con appuntamenti (colore = stato progetto dominante)
  • ✅ Evidenziazione giorno corrente e giorno selezionato
  • ✅ Selezione giorno → visualizzazione appuntamenti del giorno nel pannello destro
  • ✅ Legenda stati progetto (Active/Suspended/Completed/Deceased)
  • ✅ Filtri avanzati:
    • Tipo appuntamento (Prima Apertura, Verifiche, Dimissioni)
    • Educatore specifico
    • Stato progetto
  • ✅ Azioni per ogni appuntamento:
    • Registra Visita → Apre VisitFormView
    • Riprogramma → Permette cambio data/ora
    • Segna Mancato → Marca appuntamento come non presentato
  • ✅ Permessi: solo educatori assegnati possono gestire l'appuntamento

2️⃣ VisitFormView - Form Registrazione Visite

  • ✅ Form completo con validazione real-time (ObservableValidator + Data Annotations)
  • ✅ Campi obbligatori con validazione:
    • Data Effettiva (non può essere futura)
    • Ora Inizio / Ora Fine (fine > inizio)
    • Operatori Presenti (minimo 1, checkbox multipli)
    • Note Cliniche (minimo 10 caratteri)
    • Presenza Paziente (4 opzioni: Presente Collaborativo, Presente Non Collaborativo, Assente Giustificato, Assente Non Giustificato)
  • ✅ Campi opzionali:
    • Esiti e Obiettivi raggiunti
  • ✅ Campi read-only con info appuntamento programmato
  • ✅ Messaggi errore inline con bordi rossi su campi invalidi
  • ✅ Banner errori globale in cima al form
  • ✅ Pulsante Salva disabilitato se validazione fallisce

🏗️ Architettura Implementata

ViewModels (5 nuovi)

  1. CalendarViewModel (src/PTRP.ViewModels/Calendar/CalendarViewModel.cs)

    • Gestisce navigazione mese, filtri, selezione giorno
    • Comandi: GoToPreviousMonth, GoToNextMonth, GoToToday, SelectDay, ApplyFilters, RegisterVisit, Reschedule, MarkAsMissed
    • Proprietà: CurrentDate, Days (42), SelectedDayAppointments, Filtri
  2. DayViewModel (src/PTRP.ViewModels/Calendar/DayViewModel.cs)

    • Rappresenta singola cella calendario
    • Badge colorato per appuntamenti, evidenziazione giorno corrente/selezionato
  3. AppointmentSummaryViewModel (src/PTRP.ViewModels/Calendar/AppointmentSummaryViewModel.cs)

    • Summary appuntamento per lista giornaliera
    • Display formattato: tipo/orario/paziente/educatori/stato
  4. VisitFormViewModel (src/PTRP.ViewModels/Visits/VisitFormViewModel.cs)

    • Form registrazione visita con validazione completa
    • Eredita da ObservableValidator per supporto Data Annotations
    • Custom validation: ValidateActualDate, ValidateEndTime
    • Metodo pubblico Validate() per testing
  5. OperatorCheckboxViewModel (src/PTRP.ViewModels/Visits/OperatorCheckboxViewModel.cs)

    • Helper per checkbox operatori presenti
    • Distingue utente corrente (pre-selezionato)

Views XAML (2 nuove)

  1. CalendarView.xaml (src/PTRP.App/Views/Calendar/CalendarView.xaml)

    • Layout 2 colonne: calendario + appuntamenti giorno
    • Converters: BoolToColor, BoolToFontWeight, InverseBoolToVisibility
    • MaterialDesign styling completo
  2. VisitFormView.xaml (src/PTRP.App/Views/Visits/VisitFormView.xaml)

    • Form layout con validazione visiva
    • DatePicker, TimePicker, ComboBox, CheckBox, TextArea

Converters (3 nuovi)

  • BoolToColorConverter.cs - Converte bool → Color con parametro
  • BoolToFontWeightConverter.cs - Converte bool → FontWeight (Bold/Normal)
  • InverseBooleanToVisibilityConverter.cs - Già esistente, riutilizzato

Dependency Injection

  • Registrati CalendarViewModel, VisitFormViewModel, CalendarView, VisitFormView in App.xaml.cs
  • ViewLocator aggiornato con mapping CalendarViewModel → CalendarView

MainViewModel Integration

  • Aggiunto NavigateToCalendarCommand (async)
  • Menu laterale con voce "Calendario"
  • Auto-inizializzazione dati tramite OnCurrentViewModelChanged

🧪 Test Unitari

CalendarViewModelTests.cs - 26 test

  • Constructor Tests (2)
  • Month Loading Tests (3)
  • Month Navigation Tests (5)
  • Day Selection Tests (4)
  • Filter Tests (5)
  • Appointment Actions Tests (4)
  • Helper Tests (3)

VisitFormViewModelTests.cs - 23 test

  • Constructor Tests (2)
  • ActualDate Validation (3)
  • Time Validation (3)
  • ClinicalNotes Validation (3)
  • Operators Validation (3)
  • Presence Status Tests (4)
  • Commands + Integration (5)

Totale: 49 unit test, tutti passano ✅


🔧 Fix Applicati Durante Sviluppo

# Commit Problema Soluzione
1-22 Vari Feature implementation ViewModels + Views + Tests
23 07e5398 Validazione esplicita test ValidateAllProperties chiamata
24 c412fec ValidateAllProperties protected Aggiunto metodo pubblico Validate()
25 a4442b0 Test usavano metodo protected Usato Validate() pubblico
26 09304bb NavigateToCalendar non async Cambiato in async Task
27 f08040f ViewLocator mapping mancante Aggiunto CalendarViewModel → CalendarView
28 030e9fb Converter XAML mancanti Aggiunti tutti i converter
29 a62f187 Nome converter errato InverseBooleanToVisibilityConverter

📊 Statistiche

File Creati: 12

  • 5 ViewModels
  • 2 Views XAML + Code-behind
  • 3 Converters
  • 2 Test Files

File Modificati: 3

  • App.xaml.cs (DI)
  • MainViewModel.cs (navigazione)
  • ViewLocator.cs (mapping)
  • PTRP.Tests.csproj (FluentAssertions)

Codice

  • ~1.500 righe ViewModels
  • ~600 righe Views XAML
  • ~1.200 righe Tests
  • ~150 righe Converters
  • Totale: ~3.500 righe

Commit: 29


✅ Checklist

Funzionalità

  • ✅ CalendarView navigazione mese
  • ✅ Badge colorati appuntamenti
  • ✅ Filtri avanzati
  • ✅ Selezione giorno + lista appuntamenti
  • ✅ Azioni: Registra/Riprogramma/Mancato
  • ✅ VisitFormView con validazione completa
  • ✅ Permessi basati su educatore assegnato

Qualità

  • ✅ 49 unit test (100% passano)
  • ✅ Validazione Data Annotations
  • ✅ Nessun errore compilazione
  • ✅ Nessun errore XAML
  • ✅ Code coverage >80%

Integrazione

  • ✅ Dependency Injection configurato
  • ✅ ViewLocator mapping
  • ✅ MainViewModel navigazione
  • ✅ Menu voce "Calendario"

Documentazione


🎨 Screenshots

CalendarView

┌──────────────────────────────────────────────────────────────┐
│  📅 Calendario Appuntamenti    ◀ Feb 2026 ▶  [Oggi]         │
├─────────────────────────┬────────────────────────────────────┤
│ CALENDARIO MENSILE      │ APPUNTAMENTI DEL 14/02/2026        │
│ ┌─────────────────────┐ │ ┌────────────────────────────────┐ │
│ │ L M M G V S D      │ │ │ 🟢 Verifica - 09:30            │ │
│ │ 1 2 3 4 5 6 7      │ │ │ Rossi Mario                    │ │
│ │ • •         🔵     │ │ │ [Registra] [Riprogramma]       │ │
│ │ ...                │ │ └────────────────────────────────┘ │
│ └─────────────────────┘ │                                    │
│ LEGENDA | FILTRI        │                                    │
└─────────────────────────┴────────────────────────────────────┘

VisitFormView

┌────────────────────────────────────────┐
│ Registrazione Visita             [✕]   │
├────────────────────────────────────────┤
│ Paziente: Rossi Mario                  │
│ Programmata: 14/02/2026 09:30          │
├────────────────────────────────────────┤
│ Data Effettiva: [__________] 📅        │
│ Ora: [09:30] - [10:30] 🕐              │
│                                        │
│ Operatori: ☑ Bianchi M. (io)          │
│            ☐ Verdi L.                  │
│                                        │
│ Note Cliniche: [____________]          │
│ Presenza: [Presente Collaborativo ▼]   │
│                                        │
│        [Annulla]  [Salva Visita]      │
└────────────────────────────────────────┘

🚀 Prossimi Step (Non in questa PR)


📝 Note per i Reviewer

  1. Testing: Tutti i 49 test unitari passano. Per testare manualmente, cliccare su "Calendario" nel menu laterale.

  2. Validazione: Il form VisitFormView implementa validazione completa con Data Annotations. I campi invalidi mostrano bordi rossi e messaggi di errore.

  3. Permessi: Solo gli educatori assegnati a un appuntamento vedono i pulsanti di azione (CanManage).

  4. Dati: Se il calendario appare vuoto, significa che non ci sono appuntamenti programmati nel database seed. La funzionalità è comunque completa e testata.

  5. Performance: La generazione del calendario (42 giorni) è ottimizzata con binding XAML efficiente.


Closes #75

@artcava artcava merged commit 307ecb6 into develop Feb 14, 2026
2 checks passed
@artcava artcava deleted the feat/issue-75-calendar-visit-views branch February 14, 2026 18:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant