diff --git a/em2rp/lib/views/calendar_page.dart b/em2rp/lib/views/calendar_page.dart index 1ec53d7..327e818 100644 --- a/em2rp/lib/views/calendar_page.dart +++ b/em2rp/lib/views/calendar_page.dart @@ -71,6 +71,7 @@ class _CalendarPageState extends State { } Widget _buildDesktopLayout() { + final eventProvider = Provider.of(context); return Row( children: [ // Calendrier (65% de la largeur) @@ -82,7 +83,17 @@ class _CalendarPageState extends State { Expanded( flex: 35, child: _selectedEvent != null - ? EventDetails(event: _selectedEvent!) + ? EventDetails( + event: _selectedEvent!, + selectedDate: _selectedDay, + events: eventProvider.events, + onSelectEvent: (event, date) { + setState(() { + _selectedEvent = event; + _selectedDay = date; + }); + }, + ) : const Center( child: Text('Sélectionnez un événement pour voir les détails'), @@ -93,6 +104,7 @@ class _CalendarPageState extends State { } Widget _buildMobileLayout() { + final eventProvider = Provider.of(context); return Column( children: [ // Calendrier @@ -102,7 +114,17 @@ class _CalendarPageState extends State { // Détails de l'événement if (_selectedEvent != null) Expanded( - child: EventDetails(event: _selectedEvent!), + child: EventDetails( + event: _selectedEvent!, + selectedDate: _selectedDay, + events: eventProvider.events, + onSelectEvent: (event, date) { + setState(() { + _selectedEvent = event; + _selectedDay = date; + }); + }, + ), ), ], ); diff --git a/em2rp/lib/views/widgets/calendar_widgets/month_view.dart b/em2rp/lib/views/widgets/calendar_widgets/month_view.dart index f3695b9..b8f5a51 100644 --- a/em2rp/lib/views/widgets/calendar_widgets/month_view.dart +++ b/em2rp/lib/views/widgets/calendar_widgets/month_view.dart @@ -124,24 +124,43 @@ class MonthView extends StatelessWidget { selectedBuilder: (context, day, focusedDay) { return _buildDayCell(day, true); }, + todayBuilder: (context, day, focusedDay) { + return _buildDayCell(day, false, isToday: true); + }, ); } - Widget _buildDayCell(DateTime day, bool isSelected) { + Widget _buildDayCell(DateTime day, bool isSelected, {bool isToday = false}) { final dayEvents = CalendarUtils.getEventsForDay(day, events); - final textColor = isSelected ? Colors.white : null; + final textColor = + isSelected ? Colors.white : (isToday ? AppColors.rouge : null); final badgeColor = isSelected ? Colors.white : AppColors.rouge; final badgeTextColor = isSelected ? AppColors.rouge : Colors.white; + BoxDecoration decoration; + if (isSelected) { + decoration = BoxDecoration( + color: AppColors.rouge, + border: Border.all(color: AppColors.rouge), + borderRadius: BorderRadius.circular(4), + ); + } else if (isToday) { + decoration = BoxDecoration( + color: AppColors.rouge.withAlpha(26), + border: Border.all(color: AppColors.rouge), + borderRadius: BorderRadius.circular(4), + ); + } else { + decoration = BoxDecoration( + color: null, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(4), + ); + } + return Container( margin: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: isSelected ? AppColors.rouge : null, - border: Border.all( - color: isSelected ? AppColors.rouge : Colors.grey.shade300, - ), - borderRadius: BorderRadius.circular(4), - ), + decoration: decoration, child: Stack( children: [ Positioned( diff --git a/em2rp/lib/widgets/event_details.dart b/em2rp/lib/widgets/event_details.dart index ef56549..d7a6eba 100644 --- a/em2rp/lib/widgets/event_details.dart +++ b/em2rp/lib/widgets/event_details.dart @@ -5,16 +5,27 @@ import 'package:intl/intl.dart'; class EventDetails extends StatelessWidget { final EventModel event; + final DateTime? selectedDate; + final List events; + final void Function(EventModel, DateTime) onSelectEvent; const EventDetails({ super.key, required this.event, + required this.selectedDate, + required this.events, + required this.onSelectEvent, }); @override Widget build(BuildContext context) { final dateFormat = DateFormat('dd/MM/yyyy HH:mm'); final currencyFormat = NumberFormat.currency(locale: 'fr_FR', symbol: '€'); + final fullDateFormat = DateFormat('EEEE d MMMM y', 'fr_FR'); + // Trie les événements par date de début + final sortedEvents = List.from(events) + ..sort((a, b) => a.startDateTime.compareTo(b.startDateTime)); + final currentIndex = sortedEvents.indexWhere((e) => e.id == event.id); return Card( margin: const EdgeInsets.all(16), @@ -23,6 +34,44 @@ class EventDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: currentIndex > 0 + ? () { + final prevEvent = sortedEvents[currentIndex - 1]; + onSelectEvent(prevEvent, prevEvent.startDateTime); + } + : null, + icon: const Icon(Icons.arrow_back), + color: AppColors.rouge, + ), + if (selectedDate != null) + Expanded( + child: Center( + child: Text( + fullDateFormat.format(selectedDate!), + style: Theme.of(context).textTheme.titleLarge?.copyWith( + color: AppColors.rouge, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + IconButton( + onPressed: currentIndex < sortedEvents.length - 1 + ? () { + final nextEvent = sortedEvents[currentIndex + 1]; + onSelectEvent(nextEvent, nextEvent.startDateTime); + } + : null, + icon: const Icon(Icons.arrow_forward), + color: AppColors.rouge, + ), + ], + ), + const SizedBox(height: 16), Text( event.name, style: Theme.of(context).textTheme.headlineMedium?.copyWith(