From 5687670e361f0bc1ea01ae096df2f0140f17a294 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Sat, 13 May 2023 19:39:10 +0200 Subject: [PATCH] implemented item selection + button to print a list of issues/news etc(Button has no functionality yet). --- lib/UserDefinedList.dart | 265 ++++++++++++++++++++++++++++----------- lib/home.dart | 1 + 2 files changed, 191 insertions(+), 75 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 357cb00..6658078 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -3,14 +3,19 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:printing/printing.dart'; import 'DetailPage.dart'; import 'package:intl/intl.dart'; +import 'package:pdf/widgets.dart' as pdfWidgets; +import 'package:http/http.dart' as http; class UserDefinedItem extends StatelessWidget { final String title; final String datum; final String description; final String imageUrl; + final Function onLongPress; + final bool isSelected; const UserDefinedItem({ Key? key, @@ -18,43 +23,62 @@ class UserDefinedItem extends StatelessWidget { required this.description, required this.datum, required this.imageUrl, + required this.onLongPress, + required this.isSelected, }) : super(key: key); + @override Widget build(BuildContext context) { - return Card( - child: InkWell( - onTap: () { - // Open a new screen when the user taps on the list item - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DetailPage( - title: title, - datum: datum, - description: description, - imageUrl: imageUrl, - ), + return InkWell( + onTap: () { + // Open a new screen when the user taps on the list item + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DetailPage( + title: title, + datum: datum, + description: description, + imageUrl: imageUrl, ), - ); - }, + ), + ); + }, + onLongPress: onLongPress as void Function()?, + child: Card( child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - width: 120, - height: 120, - child: CachedNetworkImage( - imageUrl: imageUrl, - placeholder: (context, url) => const Center( - child: SizedBox( - width: 50, - height: 50, - child: CircularProgressIndicator(), + Stack( + children: [ + SizedBox( + width: 120, + height: 120, + child: CachedNetworkImage( + imageUrl: imageUrl, + placeholder: (context, url) => const Center( + child: SizedBox( + width: 50, + height: 50, + child: CircularProgressIndicator(), + ), + ), + errorWidget: (context, url, error) => const Icon(Icons.error), ), ), - errorWidget: (context, url, error) => const Icon(Icons.error), - ), + if (isSelected) // Wenn das Element ausgewählt ist, zeigen Sie die Checkbox an + Positioned( + top: 0, + left: 0, + child: Checkbox( + value: isSelected, + onChanged: (bool? value) { + onLongPress(); // Wenn die Checkbox angeklickt wird, rufen Sie die onLongPress-Funktion auf + }, + ), + ), + ], ), Flexible( flex: 1, @@ -104,6 +128,8 @@ class UserDefinedItem extends StatelessWidget { } } + + class GenericList extends StatefulWidget { final String collectionName; const GenericList({Key? key, required this.collectionName}) : super(key: key); @@ -114,6 +140,7 @@ class GenericList extends StatefulWidget { class _GenericListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; + Map selectedItems = {}; @override void initState() { @@ -122,7 +149,7 @@ class _GenericListState extends State { firestore.enablePersistence(); // Enable network firestore.settings = - const Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + const Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); } Stream getDocumentStream() { @@ -139,7 +166,9 @@ class _GenericListState extends State { await FirebaseStorage.instance.refFromURL(imageUrl).delete(); } // Löschen Sie das Dokument von der Firestore-Kollektion - await firestore.collection(widget.collectionName).doc(documentId).delete(); + await firestore.collection(widget.collectionName) + .doc(documentId) + .delete(); } catch (e) { if (kDebugMode) { print('Error deleting document: $e'); @@ -149,53 +178,139 @@ class _GenericListState extends State { @override Widget build(BuildContext context) { - return StreamBuilder( - stream: getDocumentStream(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } - switch (snapshot.connectionState) { - case ConnectionState.waiting: - return const Text('Loading...'); - default: - final List documents = snapshot.data!.docs; - return ListView.builder( - itemCount: documents.length, - itemBuilder: (BuildContext context, int index) { - final Map data = - documents[index].data()! as Map; - final String documentId = documents[index].id; - final DateTime createdDate = data['createdDate'].toDate(); - final formattedDate = - DateFormat('dd.MM.yyyy').format(createdDate); - return Dismissible( - key: UniqueKey(), - direction: DismissDirection.endToStart, - onDismissed: (direction) { - _deleteDocument(documentId, data['imageUrl']); + return Scaffold( + body: Stack( + children: [ + StreamBuilder( + stream: getDocumentStream(), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return const Text('Loading...'); + default: + final List documents = snapshot.data! + .docs; + return ListView.builder( + itemCount: documents.length, + itemBuilder: (BuildContext context, int index) { + final Map data = + documents[index].data()! as Map; + final String documentId = documents[index].id; + final DateTime createdDate = data['createdDate'].toDate(); + final formattedDate = + DateFormat('dd.MM.yyyy').format(createdDate); + return Dismissible( + key: UniqueKey(), + direction: DismissDirection.endToStart, + onDismissed: (direction) { + _deleteDocument(documentId, data['imageUrl']); + }, + background: Container( + color: Colors.red, + child: const Align( + alignment: Alignment.centerRight, + child: Padding( + padding: EdgeInsets.only(right: 16), + child: Icon(Icons.delete, color: Colors.white), + ), + ), + ), + child: UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + imageUrl: data['imageUrl'] ?? '', + isSelected: selectedItems.containsKey(documentId) + ? selectedItems[documentId]! + : false, + onLongPress: () { + // Aktualisieren Sie den ausgewählten Zustand des Elements + setState(() { + selectedItems[documentId] = + !selectedItems.containsKey(documentId) + ? true + : !selectedItems[documentId]!; + }); + }, + ), + ); + }, + ); + } + }, + ), + if (selectedItems.containsValue(true)) + Align( + alignment: Alignment.bottomLeft, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: FloatingActionButton( + onPressed: () { + // Führen Sie hier die gewünschte Aktion aus }, - background: Container( - color: Colors.red, - child: const Align( - alignment: Alignment.centerRight, - child: Padding( - padding: EdgeInsets.only(right: 16), - child: Icon(Icons.delete, color: Colors.white), - ), - ), - ), - child: UserDefinedItem( - title: data['title'] ?? '', - datum: formattedDate, - description: data['description'] ?? '', - imageUrl: data['imageUrl'] ?? '', - ), - ); - }, - ); - } - }, + backgroundColor: Colors.red, + child: const Icon(Icons.picture_as_pdf), + ), + ), + ), + ], + ), ); } + /* + Future _loadNetworkImage(String url) async { + final response = await http.get(Uri.parse(url)); + + if (response.statusCode != 200) { + throw Exception('Failed to load network image.'); + } + + final Uint8List bytes = response.bodyBytes; + final imageProvider = pdfWidgets.MemoryImage(bytes); + + return imageProvider; + } + Future _printPdf() async { + final pdf = pdfWidgets.Document(); + + for (var docId in selectedItems.keys) { + final title = selectedItems[docId]!['title']; + final datum = selectedItems[docId]!['datum']; + final description = selectedItems[docId]!['description']; + final imageUrl = selectedItems[docId]!['imageUrl']; + + final image = await _loadNetworkImage(imageUrl); + + pdf.addPage( + pdfWidgets.MultiPage( + build: (context) => [ + pdfWidgets.Center( + child: pdfWidgets.SizedBox( + width: double.infinity, + child: pdfWidgets.AspectRatio( + aspectRatio: 1, + child: pdfWidgets.Image(image), + ), + ), + ), + pdfWidgets.Text( + title, + style: pdfWidgets.TextStyle( + fontSize: 20, + fontWeight: pdfWidgets.FontWeight.bold + ) + ), + pdfWidgets.Text(datum, style: const pdfWidgets.TextStyle(fontSize: 14, )), + pdfWidgets.Paragraph(text: description, style: const pdfWidgets.TextStyle(fontSize: 12)), + ], + ), + ); + } + + await Printing.sharePdf(bytes: await pdf.save(), filename: 'selectedItems.pdf'); + }*/ } diff --git a/lib/home.dart b/lib/home.dart index aa89715..552fdcb 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -30,6 +30,7 @@ class _MyHomePageState extends State { }); } + @override Widget build(BuildContext context) { final List widgetOptions = [