Refactor event type handling and add data management page (options and event types)

This commit is contained in:
ElPoyo
2025-10-15 19:01:09 +02:00
parent f10a608801
commit 5057bf9a77
16 changed files with 1561 additions and 61 deletions

View File

@@ -62,7 +62,7 @@ class EventDetailsDocuments extends StatelessWidget {
return ListTile(
leading: Icon(icon, color: Colors.blueGrey),
title: SelectableText(
title: Text(
fileName,
maxLines: 1,
textAlign: TextAlign.left,
@@ -70,6 +70,7 @@ class EventDetailsDocuments extends StatelessWidget {
),
trailing: IconButton(
icon: const Icon(Icons.download),
tooltip: 'Télécharger le fichier',
onPressed: () async {
if (await canLaunchUrl(Uri.parse(url))) {
await launchUrl(
@@ -81,10 +82,32 @@ class EventDetailsDocuments extends StatelessWidget {
),
onTap: () async {
if (await canLaunchUrl(Uri.parse(url))) {
await launchUrl(
Uri.parse(url),
mode: LaunchMode.externalApplication,
);
// Pour les fichiers visualisables, utiliser différentes stratégies
if (_isViewableInBrowser(ext)) {
if ([".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"].contains(ext)) {
// Pour les images, afficher dans un dialog intégré
_showImageDialog(context, url, fileName);
} else if (ext == ".pdf") {
// Pour les PDFs, utiliser Google Docs Viewer
final viewerUrl = 'https://docs.google.com/viewer?url=${Uri.encodeComponent(url)}';
await launchUrl(
Uri.parse(viewerUrl),
mode: LaunchMode.platformDefault,
);
} else {
// Pour les autres fichiers texte, ouvrir directement
await launchUrl(
Uri.parse(url),
mode: LaunchMode.platformDefault,
);
}
} else {
// Pour les autres fichiers, télécharger directement
await launchUrl(
Uri.parse(url),
mode: LaunchMode.externalApplication,
);
}
}
},
contentPadding: EdgeInsets.zero,
@@ -95,5 +118,93 @@ class EventDetailsDocuments extends StatelessWidget {
],
);
}
}
bool _isViewableInBrowser(String ext) {
// Extensions de fichiers qui peuvent être visualisées directement dans le navigateur
return [
".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", // Images
".pdf", // PDF
".txt", ".md", ".json", ".xml", ".csv" // Texte
].contains(ext);
}
void _showImageDialog(BuildContext context, String imageUrl, String fileName) {
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
child: Container(
width: MediaQuery.of(context).size.width * 0.9,
height: MediaQuery.of(context).size.height * 0.8,
child: Column(
children: [
// Header avec le nom du fichier
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: AppColors.rouge.withOpacity(0.1),
borderRadius: const BorderRadius.vertical(top: Radius.circular(4)),
),
child: Row(
children: [
Expanded(
child: Text(
fileName,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
),
),
),
IconButton(
icon: const Icon(Icons.close),
onPressed: () => Navigator.of(context).pop(),
),
],
),
),
// Image qui prend tout l'espace disponible
Expanded(
child: Container(
width: double.infinity,
padding: const EdgeInsets.all(8),
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
imageUrl,
fit: BoxFit.contain,
width: double.infinity,
height: double.infinity,
loadingBuilder: (context, child, loadingProgress) {
if (loadingProgress == null) return child;
return Center(
child: CircularProgressIndicator(
value: loadingProgress.expectedTotalBytes != null
? loadingProgress.cumulativeBytesLoaded /
loadingProgress.expectedTotalBytes!
: null,
),
);
},
errorBuilder: (context, error, stackTrace) {
return const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.error, size: 64, color: Colors.red),
Text('Erreur lors du chargement de l\'image'),
],
),
);
},
),
),
),
),
],
),
),
);
},
);
}
}