From 163a8ac183521a63d5f752521e4a2dc6f88e0452 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 27 Apr 2023 16:32:11 +0200 Subject: [PATCH 1/3] =?UTF-8?q?Vorhandene=20News=20k=C3=B6nnen=20mit=20swi?= =?UTF-8?q?pe=20nach=20rechts=20gel=C3=B6scht=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UserDefinedList.dart | 121 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 117 insertions(+), 4 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 2a1547e..73eecee 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -94,9 +94,6 @@ class UserDefinedItem extends StatelessWidget { } - - - class NewsList extends StatefulWidget { const NewsList({Key? key}) : super(key: key); @@ -114,6 +111,122 @@ class _NewsListState extends State { newsStream = firestore.collection('News').snapshots(); } + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: newsStream, + 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 DateTime createdDate = data['createdDate'].toDate(); + final formattedDate = DateFormat('dd.MM.yyyy').format(createdDate); + return Dismissible( + key: Key(documents[index].id), + direction: DismissDirection.endToStart, + onDismissed: (direction) async { + await firestore.collection('News').doc(documents[index].id).delete(); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text("News wurde gelöscht"), + )); + }, + background: Container( + color: Colors.red, + alignment: Alignment.centerRight, + child: const Icon( + Icons.delete, + color: Colors.white, + ), + ), + child: UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + image: Image.network((data['imageUrl'])), + ), + ); + }, + ); + } + }, + ); + } +} + + +/* +class NewsList extends StatefulWidget { + const NewsList({Key? key}) : super(key: key); + + @override + _NewsListState createState() => _NewsListState(); +} + +class _NewsListState extends State { + final FirebaseFirestore firestore = FirebaseFirestore.instance; + late Stream newsStream; + + @override + void initState() { + super.initState(); + newsStream = firestore.collection('News').snapshots(); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: newsStream, + 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 DateTime createdDate = data['createdDate'].toDate(); + final formattedDate = DateFormat('dd.MM.yyyy').format( + createdDate); + return Dismissible( + key: UniqueKey(), + onDismissed: (direction) { + setState(() { + documents.removeAt(index); + }); + }, + child: UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + image: Image.network((data['imageUrl'])), + ), + ); + }, + ); + } + }, + ); + } +} +*/ + + + /* @override Widget build(BuildContext context) { return StreamBuilder( @@ -146,7 +259,7 @@ class _NewsListState extends State { ); } } - +*/ class IssueList extends StatefulWidget { const IssueList({Key? key}) : super(key: key); From fe448299cbf0712ef30acefea5ea99dd38dce413 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 4 May 2023 15:30:21 +0200 Subject: [PATCH 2/3] =?UTF-8?q?Vorhandene=20News=20k=C3=B6nnen=20mit=20swi?= =?UTF-8?q?pe=20nach=20rechts=20gel=C3=B6scht=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UserDefinedList.dart | 42 ++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 92b25cc..c8dd809 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -118,7 +118,6 @@ class NewsList extends StatefulWidget { @override _NewsListState createState() => _NewsListState(); } - class _NewsListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; late Stream newsStream; @@ -140,6 +139,14 @@ class _NewsListState extends State { .snapshots(includeMetadataChanges: true); } + Future _deleteNews(String newsId) async { + try { + await firestore.collection('News').doc(newsId).delete(); + } catch (e) { + print('Error deleting news: $e'); + } + } + @override Widget build(BuildContext context) { return StreamBuilder( @@ -158,15 +165,32 @@ class _NewsListState extends State { itemBuilder: (BuildContext context, int index) { final Map data = documents[index].data()! as Map; - final DateTime createdDate = - data['createdDate'].toDate(); + final String newsId = documents[index].id; + final DateTime createdDate = data['createdDate'].toDate(); final formattedDate = DateFormat('dd.MM.yyyy').format(createdDate); - return UserDefinedItem( - title: data['title'] ?? '', - datum: formattedDate, - description: data['description'] ?? '', - imageUrl: data['imageUrl'] ?? '', + return Dismissible( + key: UniqueKey(), + direction: DismissDirection.endToStart, + onDismissed: (direction) { + _deleteNews(newsId); + }, + background: Container( + color: Colors.red, + child: 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'] ?? '', + ), ); }, ); @@ -175,6 +199,8 @@ class _NewsListState extends State { ); } } + + class IssueList extends StatefulWidget { const IssueList({Key? key}) : super(key: key); From b59147e27fddd8555826046992a39dff9f289533 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 4 May 2023 16:42:47 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Vorhandene=20News=20&=20B=C3=BCrgerforumnew?= =?UTF-8?q?s=20&=20M=C3=A4ngel=20k=C3=B6nnen=20mit=20einem=20swipe=20nach?= =?UTF-8?q?=20rechts=20gel=C3=B6scht=20werden,=20es=20werden=20nun=20auch?= =?UTF-8?q?=20die=20Bilder=20aus=20den=20jeweilligen=20Firebase=20Ordnern?= =?UTF-8?q?=20gel=C3=B6scht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UserDefinedList.dart | 138 +++++++++++++++++++++++++++------------ 1 file changed, 98 insertions(+), 40 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index c8dd809..4a7a10b 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; import 'DetailPage.dart'; import 'package:intl/intl.dart'; @@ -27,13 +28,12 @@ class UserDefinedItem extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => - DetailPage( - title: title, - datum: datum, - description: description, - imageUrl: imageUrl, - ), + builder: (context) => DetailPage( + title: title, + datum: datum, + description: description, + imageUrl: imageUrl, + ), ), ); }, @@ -54,8 +54,6 @@ class UserDefinedItem extends StatelessWidget { ), errorWidget: (context, url, error) => Icon(Icons.error), ), - - ), Flexible( flex: 1, @@ -72,8 +70,7 @@ class UserDefinedItem extends StatelessWidget { title, overflow: TextOverflow.ellipsis, style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold), + fontSize: 20, fontWeight: FontWeight.bold), ), ), Text( @@ -110,14 +107,13 @@ class UserDefinedItem extends StatelessWidget { // Ändern Sie die Verwendung von Image.network in UserDefinedItem-Widgets in Ihren ListView.builder-Aufrufen: - - class NewsList extends StatefulWidget { const NewsList({Key? key}) : super(key: key); @override _NewsListState createState() => _NewsListState(); } + class _NewsListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; late Stream newsStream; @@ -130,7 +126,8 @@ class _NewsListState extends State { firestore.enablePersistence(); // Enable network - firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + firestore.settings = + Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); // Configure the stream to use the cache first and then the server newsStream = firestore @@ -139,8 +136,13 @@ class _NewsListState extends State { .snapshots(includeMetadataChanges: true); } - Future _deleteNews(String newsId) async { + Future _deleteNews(String newsId, String? imageUrl) async { try { + if (imageUrl != null) { + // Löschen Sie das Bild vom Firebase Storage + await FirebaseStorage.instance.refFromURL(imageUrl).delete(); + } + // Löschen Sie das Dokument von der Firestore-Kollektion await firestore.collection('News').doc(newsId).delete(); } catch (e) { print('Error deleting news: $e'); @@ -164,20 +166,20 @@ class _NewsListState extends State { itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = - documents[index].data()! as Map; + documents[index].data()! as Map; final String newsId = documents[index].id; final DateTime createdDate = data['createdDate'].toDate(); final formattedDate = - DateFormat('dd.MM.yyyy').format(createdDate); + DateFormat('dd.MM.yyyy').format(createdDate); return Dismissible( key: UniqueKey(), direction: DismissDirection.endToStart, onDismissed: (direction) { - _deleteNews(newsId); + _deleteNews(newsId, data['imageUrl']); }, background: Container( color: Colors.red, - child: Align( + child: const Align( alignment: Alignment.centerRight, child: Padding( padding: EdgeInsets.only(right: 16), @@ -200,13 +202,13 @@ class _NewsListState extends State { } } - class IssueList extends StatefulWidget { const IssueList({Key? key}) : super(key: key); @override _IssueListState createState() => _IssueListState(); } + class _IssueListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; late Stream issueStream; @@ -219,7 +221,8 @@ class _IssueListState extends State { firestore.enablePersistence(); // Enable network - firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + firestore.settings = + Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); // Configure the stream to use the cache first and then the server issueStream = firestore @@ -228,6 +231,16 @@ class _IssueListState extends State { .snapshots(includeMetadataChanges: true); } + Future _deleteIssue(String issueId, String imageUrl) async { + try { + final Reference ref = FirebaseStorage.instance.refFromURL(imageUrl); + await ref.delete(); + await firestore.collection('Issues').doc(issueId).delete(); + } catch (e) { + print('Error deleting issue: $e'); + } + } + @override Widget build(BuildContext context) { return StreamBuilder( @@ -245,16 +258,33 @@ class _IssueListState extends State { itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = - documents[index].data()! as Map; - final DateTime createdDate = - data['createdDate'].toDate(); + documents[index].data()! as Map; + final String issueId = documents[index].id; + final DateTime createdDate = data['createdDate'].toDate(); final formattedDate = - DateFormat('dd.MM.yyyy').format(createdDate); - return UserDefinedItem( - title: data['title'] ?? '', - datum: formattedDate, - description: data['description'] ?? '', - imageUrl: data['imageUrl'] ?? '', + DateFormat('dd.MM.yyyy').format(createdDate); + return Dismissible( + key: UniqueKey(), + direction: DismissDirection.endToStart, + onDismissed: (direction) { + _deleteIssue(issueId, 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'] ?? '', + ), ); }, ); @@ -263,6 +293,7 @@ class _IssueListState extends State { ); } } + class CitizensForum extends StatefulWidget { const CitizensForum({Key? key}) : super(key: key); @@ -282,7 +313,8 @@ class _CitizensForumState extends State { firestore.enablePersistence(); // Enable network - firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + firestore.settings = + Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); // Configure the stream to use the cache first and then the server citizenStream = firestore @@ -291,11 +323,22 @@ class _CitizensForumState extends State { .snapshots(includeMetadataChanges: true); } + Future deleteDocument(String documentId, String? imageUrl) async { + // Delete document + await firestore.collection('CitizensForum').doc(documentId).delete(); + + // Delete image file + if (imageUrl != null) { + await FirebaseStorage.instance.refFromURL(imageUrl).delete(); + } + } + @override Widget build(BuildContext context) { return StreamBuilder>>( stream: citizenStream, - builder: (BuildContext context, AsyncSnapshot>> snapshot) { + builder: (BuildContext context, + AsyncSnapshot>> snapshot) { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } @@ -303,18 +346,33 @@ class _CitizensForumState extends State { case ConnectionState.waiting: return const Text('Loading...'); default: - final List>> documents = snapshot.data!.docs; + final List>> documents = + snapshot.data!.docs; return ListView.builder( itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = documents[index].data(); + final String documentId = documents[index].id; final DateTime createdDate = data['createdDate'].toDate(); - final formattedDate = DateFormat('dd.MM.yyyy').format(createdDate); - return UserDefinedItem( - title: data['title'] ?? '', - datum: formattedDate, - description: data['description'] ?? '', - imageUrl: data['imageUrl'] ?? '', + final formattedDate = + DateFormat('dd.MM.yyyy').format(createdDate); + return Dismissible( + key: Key(documentId), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: const EdgeInsets.only(right: 16.0), + color: Colors.red, + child: const Icon(Icons.delete, color: Colors.white), + ), + onDismissed: (_) => + deleteDocument(documentId, data['imageUrl']), + child: UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + imageUrl: data['imageUrl'] ?? '', + ), ); }, ); @@ -322,4 +380,4 @@ class _CitizensForumState extends State { }, ); } -} \ No newline at end of file +}