feat: Ajout de la gestion de la quantité pour les options d'événement

This commit is contained in:
ElPoyo
2025-12-16 19:23:48 +01:00
parent 08f046c89c
commit 28d9e008af
6 changed files with 240 additions and 28 deletions

View File

@@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:em2rp/models/event_model.dart';
import 'package:em2rp/utils/colors.dart';
import 'package:provider/provider.dart';
import 'package:em2rp/providers/local_user_provider.dart';
import 'package:em2rp/views/event_add_page.dart';
class EventDetailsHeader extends StatelessWidget {
class EventDetailsHeader extends StatefulWidget {
final EventModel event;
const EventDetailsHeader({
@@ -13,6 +14,52 @@ class EventDetailsHeader extends StatelessWidget {
required this.event,
});
@override
State<EventDetailsHeader> createState() => _EventDetailsHeaderState();
}
class _EventDetailsHeaderState extends State<EventDetailsHeader> {
String? _eventTypeName;
bool _isLoadingEventType = true;
@override
void initState() {
super.initState();
_fetchEventTypeName();
}
Future<void> _fetchEventTypeName() async {
try {
if (widget.event.eventTypeId.isEmpty) {
setState(() => _isLoadingEventType = false);
return;
}
final doc = await FirebaseFirestore.instance
.collection('eventTypes')
.doc(widget.event.eventTypeId)
.get();
if (doc.exists) {
setState(() {
_eventTypeName = doc.data()?['name'] as String? ?? widget.event.eventTypeId;
_isLoadingEventType = false;
});
} else {
setState(() {
_eventTypeName = widget.event.eventTypeId;
_isLoadingEventType = false;
});
}
} catch (e) {
print('Erreur lors du chargement du type d\'événement: $e');
setState(() {
_eventTypeName = widget.event.eventTypeId;
_isLoadingEventType = false;
});
}
}
@override
Widget build(BuildContext context) {
return Row(
@@ -25,7 +72,7 @@ class EventDetailsHeader extends StatelessWidget {
Container(
constraints: const BoxConstraints(maxHeight: 80),
child: SelectableText(
event.name,
widget.event.name,
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
color: AppColors.noir,
fontWeight: FontWeight.bold,
@@ -34,7 +81,9 @@ class EventDetailsHeader extends StatelessWidget {
),
const SizedBox(height: 4),
Text(
event.eventTypeId,
_isLoadingEventType
? 'Chargement...'
: _eventTypeName ?? widget.event.eventTypeId,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: AppColors.rouge,
),
@@ -43,7 +92,7 @@ class EventDetailsHeader extends StatelessWidget {
),
),
const SizedBox(width: 12),
_buildStatusIcon(event.status),
_buildStatusIcon(widget.event.status),
if (Provider.of<LocalUserProvider>(context, listen: false)
.hasPermission('edit_event')) ...[
const SizedBox(width: 8),
@@ -53,7 +102,7 @@ class EventDetailsHeader extends StatelessWidget {
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => EventAddEditPage(event: event),
builder: (context) => EventAddEditPage(event: widget.event),
),
);
},

View File

@@ -55,7 +55,11 @@ class EventDetailsInfo extends StatelessWidget {
final total = event.basePrice +
event.options.fold<num>(
0,
(sum, opt) => sum + (opt['price'] ?? 0.0),
(sum, opt) {
final price = opt['price'] ?? 0.0;
final quantity = opt['quantity'] ?? 1;
return sum + (price * quantity);
},
);
return Padding(
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),