feat: Introduce memberIds for efficient group querying and management, updating related UI components and .gitignore.

This commit is contained in:
Van Leemput Dayron
2025-11-27 15:36:46 +01:00
parent 9198493dd5
commit cad9d42128
5 changed files with 435 additions and 157 deletions

View File

@@ -36,6 +36,37 @@ class _CalendarPageState extends State<CalendarPage> {
}).toList();
}
Future<void> _selectTimeAndSchedule(Activity activity, DateTime date) async {
final TimeOfDay? pickedTime = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
builder: (BuildContext context, Widget? child) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(alwaysUse24HourFormat: true),
child: child!,
);
},
);
if (pickedTime != null && mounted) {
final scheduledDate = DateTime(
date.year,
date.month,
date.day,
pickedTime.hour,
pickedTime.minute,
);
context.read<ActivityBloc>().add(
UpdateActivityDate(
tripId: widget.trip.id!,
activityId: activity.id,
date: scheduledDate,
),
);
}
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
@@ -172,7 +203,9 @@ class _CalendarPageState extends State<CalendarPage> {
selectedActivities[index];
return ListTile(
title: Text(activity.name),
subtitle: Text(activity.category),
subtitle: Text(
'${activity.category} - ${DateFormat('HH:mm').format(activity.date!)}',
),
trailing: IconButton(
icon: const Icon(Icons.close),
onPressed: () {
@@ -243,15 +276,10 @@ class _CalendarPageState extends State<CalendarPage> {
icon: const Icon(Icons.arrow_back),
onPressed: () {
if (_selectedDay != null) {
context
.read<ActivityBloc>()
.add(
UpdateActivityDate(
tripId: widget.trip.id!,
activityId: activity.id,
date: _selectedDay,
),
);
_selectTimeAndSchedule(
activity,
_selectedDay!,
);
}
},
),
@@ -260,6 +288,33 @@ class _CalendarPageState extends State<CalendarPage> {
},
),
),
// Zone de drop pour le calendrier
DragTarget<Activity>(
onWillAccept: (data) => true,
onAccept: (activity) {
if (_selectedDay != null) {
_selectTimeAndSchedule(activity, _selectedDay!);
}
},
builder: (context, candidateData, rejectedData) {
return Container(
height: 50,
color: candidateData.isNotEmpty
? theme.colorScheme.primary.withValues(
alpha: 0.1,
)
: null,
child: Center(
child: Text(
'Glisser ici pour planifier',
style: TextStyle(
color: theme.colorScheme.primary,
),
),
),
);
},
),
],
),
),