diff --git a/lib/content_views/assigned_jobs_page.dart b/lib/content_views/assigned_jobs_page.dart index 5d79a42..0b6a163 100644 --- a/lib/content_views/assigned_jobs_page.dart +++ b/lib/content_views/assigned_jobs_page.dart @@ -7,6 +7,8 @@ import 'package:intl/intl.dart'; import 'package:badges/badges.dart' as badges; import 'package:stadtbote/protocoll_messages/accept_job_message.dart'; import 'package:stadtbote/protocoll_messages/fin_task_message.dart'; +import 'package:stadtbote/tools/message_service.dart'; +import 'package:stadtbote/tools/messages/job_deleted_message.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; import '../main.dart'; @@ -49,6 +51,8 @@ class _AssignedJobsPageState extends State { Future.delayed(const Duration(seconds: 0), () async { _entries = await _createListEntries(); + _initMessages(); + _initCompleted = true; setState(() {}); @@ -208,4 +212,12 @@ class _AssignedJobsPageState extends State { setState(() {}); } + + _initMessages() { + MessageService().subscribe(Constants.messageTopicJobDeleted, this, (jobDeletedMessage) async { + _entries = await _createListEntries(); + + setState(() {}); + }); + } } diff --git a/lib/main.dart b/lib/main.dart index 74db0b9..07bd168 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -153,6 +153,8 @@ class _MainState extends State
with SingleTickerProviderStateMixin { late AnimationController _animationController; late Animation _animation; + bool _dialogOpened = false; + @override void initState() { super.initState(); @@ -423,7 +425,13 @@ class _MainState extends State
with SingleTickerProviderStateMixin { void _jobReceived(Job job) async { if (!MyApp.suppressAcceptDialog) { if (job.state == 0) { - await showAcceptJobsPopup(context, await MyApp.isarInstance.jobs.filter().stateEqualTo(0).findAll()); + if (!_dialogOpened) { + _dialogOpened = true; + + await showAcceptJobsPopup(context, await MyApp.isarInstance.jobs.filter().stateEqualTo(0).findAll(), () { + _dialogOpened = false; + }); + } } } } diff --git a/lib/popups/accept_jobs_popup.dart b/lib/popups/accept_jobs_popup.dart index 2937482..1e0c2c6 100644 --- a/lib/popups/accept_jobs_popup.dart +++ b/lib/popups/accept_jobs_popup.dart @@ -6,154 +6,179 @@ import 'package:stadtbote/protocoll_messages/accept_job_message.dart'; import 'package:stadtbote/model/job.dart'; import 'package:stadtbote/protocoll_messages/fin_task_message.dart'; import 'package:stadtbote/tools/constants.dart'; +import 'package:stadtbote/tools/message_service.dart'; +import 'package:stadtbote/tools/messages/job_deleted_message.dart'; +import 'package:stadtbote/tools/messages/job_received_message.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; import 'package:stadtbote/tools/util.dart'; import 'package:badges/badges.dart' as badges; -Future showAcceptJobsPopup(BuildContext context, List jobs) async { +Future showAcceptJobsPopup(BuildContext context, List jobs, Function onFinished) async { var jobsSet = jobs.toSet(); await showDialog( context: context, builder: (BuildContext context) { - return AlertDialog( - contentPadding: EdgeInsets.zero, - shadowColor: Colors.transparent, - backgroundColor: Colors.white, - content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) { - if (jobsSet.isEmpty) { - Navigator.of(context).pop(); - } + return WillPopScope( + onWillPop: () async { + Navigator.of(context).pop(); - return SizedBox( - key: GlobalKey(), - height: MediaQuery.of(context).size.height * 1, - width: MediaQuery.of(context).size.width * 1.2, - child: Container( - height: 100, - padding: const EdgeInsets.all(5), - child: ListView.builder( - itemCount: jobsSet.length, - itemBuilder: (_, i) { - var job = jobsSet.toList()[i]; + onFinished(); - String remarkString = ''; - for (var remark in job.rem) { - remarkString += '$remark\n'; - } - remarkString = remarkString.trim(); + return true; + }, // False will prevent and true will allow to dismiss + child: AlertDialog( + contentPadding: EdgeInsets.zero, + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) { + if (jobsSet.isEmpty) { + Navigator.of(context).pop(); - return ExpandableNotifier( - child: ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - title: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all( - color: Constants.colorPrimary, - width: 1, - ), - ), - child: badges.Badge( - position: badges.BadgePosition.topEnd(top: -13, end: -5), - showBadge: false, - badgeContent: const Text( - 'Neu', - style: TextStyle( - color: Colors.white, - fontSize: 18.0, + onFinished(); + } + + MessageService().subscribe(Constants.messageTopicJobDeleted, jobsSet, (jobDeletedMessage) async { + jobsSet.removeWhere((element) => element.id == jobDeletedMessage.jobId); + + setState(() {}); + }); + + MessageService().subscribe(Constants.messageTopicJobReceived, jobsSet, (jobdMessage) async { + jobsSet.add(jobdMessage.job); + + setState(() {}); + }); + + return SizedBox( + key: GlobalKey(), + height: MediaQuery.of(context).size.height * 1, + width: MediaQuery.of(context).size.width * 1.2, + child: Container( + height: 100, + padding: const EdgeInsets.all(5), + child: ListView.builder( + itemCount: jobsSet.length, + itemBuilder: (_, i) { + var job = jobsSet.toList()[i]; + + String remarkString = ''; + for (var remark in job.rem) { + remarkString += '$remark\n'; + } + remarkString = remarkString.trim(); + + return ExpandableNotifier( + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + title: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: Constants.colorPrimary, + width: 1, + ), ), - ), - badgeStyle: badges.BadgeStyle( - shape: badges.BadgeShape.square, - badgeColor: Constants.colorPrimary, - padding: const EdgeInsets.all(5), - borderRadius: BorderRadius.circular(5), - borderSide: const BorderSide(color: Constants.colorPrimary, width: 0), - ), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - children: [ - SizedBox( - width: double.infinity, - child: Text( - DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime).toLocal()).toString(), - textAlign: TextAlign.left, - style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.yellow : Colors.transparent), - ), + child: badges.Badge( + position: badges.BadgePosition.topEnd(top: -13, end: -5), + showBadge: false, + badgeContent: const Text( + 'Neu', + style: TextStyle( + color: Colors.white, + fontSize: 18.0, ), - SizedBox(width: double.infinity, child: Text('Auftragsnummer: ${job.id}', textAlign: TextAlign.left)), - SizedBox(width: double.infinity, child: Text(job.tours[0].comp, textAlign: TextAlign.left)), - SizedBox(width: double.infinity, child: Text(job.tours[0].street, textAlign: TextAlign.left)), - SizedBox(width: double.infinity, child: Text(job.tours[0].city, textAlign: TextAlign.left)), - Row( + ), + badgeStyle: badges.BadgeStyle( + shape: badges.BadgeShape.square, + badgeColor: Constants.colorPrimary, + padding: const EdgeInsets.all(5), + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide(color: Constants.colorPrimary, width: 0), + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( children: [ - Image.asset("assets/${mapVehicleTypeToImageName(job.vhtId)}", width: 60, height: 60), - const SizedBox(width: 10), - Text(mapVehicleTypeToText(job.vhtId)), - ], - ), - const SizedBox(height: 10), - ScrollOnExpand( - scrollOnExpand: true, - scrollOnCollapse: false, - child: ExpandablePanel( - theme: const ExpandableThemeData( - headerAlignment: ExpandablePanelHeaderAlignment.center, - tapBodyToCollapse: true, + SizedBox( + width: double.infinity, + child: Text( + DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime).toLocal()).toString(), + textAlign: TextAlign.left, + style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.yellow : Colors.transparent), + ), ), - header: const Padding( - padding: EdgeInsets.all(0), - child: Text( - "Weitere Infos....", - style: TextStyle(fontSize: 15, color: Colors.black, fontWeight: FontWeight.bold), - )), - collapsed: const SizedBox(), - expanded: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Container( - height: 200, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: const Color(0xfffff4e4), - border: Border.all( - color: Colors.grey, - width: 0.5, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text(remarkString), - ), - ), + SizedBox(width: double.infinity, child: Text('Auftragsnummer: ${job.id}', textAlign: TextAlign.left)), + SizedBox(width: double.infinity, child: Text(job.tours[0].comp, textAlign: TextAlign.left)), + SizedBox(width: double.infinity, child: Text(job.tours[0].street, textAlign: TextAlign.left)), + SizedBox(width: double.infinity, child: Text(job.tours[0].city, textAlign: TextAlign.left)), + Row( + children: [ + Image.asset("assets/${mapVehicleTypeToImageName(job.vhtId)}", width: 60, height: 60), + const SizedBox(width: 10), + Text(mapVehicleTypeToText(job.vhtId)), ], ), - ), + const SizedBox(height: 10), + ScrollOnExpand( + scrollOnExpand: true, + scrollOnCollapse: false, + child: ExpandablePanel( + theme: const ExpandableThemeData( + headerAlignment: ExpandablePanelHeaderAlignment.center, + tapBodyToCollapse: true, + ), + header: const Padding( + padding: EdgeInsets.all(0), + child: Text( + "Weitere Infos....", + style: TextStyle(fontSize: 15, color: Colors.black, fontWeight: FontWeight.bold), + )), + collapsed: const SizedBox(), + expanded: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + height: 200, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: const Color(0xfffff4e4), + border: Border.all( + color: Colors.grey, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text(remarkString), + ), + ), + ], + ), + ), + ), + const SizedBox(height: 20), + Row(children: [ + Expanded( + child: getDefaultButton(!job.global ? 'Ablehnen' : 'Ignorieren', + () => {_sendAnswer(job, !job.global ? 2 : 3), jobsSet.remove(job), setState(() {})}), + ), + const SizedBox(width: 20), + Expanded( + child: getDefaultButton('Annehmen', () => {_sendAnswer(job, 1), jobsSet.remove(job), setState(() {})}), + ) + ]) + ], ), - const SizedBox(height: 20), - Row(children: [ - Expanded( - child: getDefaultButton(!job.global ? 'Ablehnen' : 'Ignorieren', - () => {_sendAnswer(job, !job.global ? 2 : 3), jobsSet.remove(job), setState(() {})}), - ), - const SizedBox(width: 20), - Expanded( - child: getDefaultButton('Annehmen', () => {_sendAnswer(job, 1), jobsSet.remove(job), setState(() {})}), - ) - ]) - ], + ), ), ), ), - ), - ), - ); - }, - )), - ); - })); + ); + }, + )), + ); + }))); }); } diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart index 9aff244..8c68990 100644 --- a/lib/tools/mqtt_core.dart +++ b/lib/tools/mqtt_core.dart @@ -196,9 +196,7 @@ class MqttCore { break; case 'job_del': - if (!kDebugMode) { - _jobDeleteReceived(payloadData); - } + _jobDeleteReceived(payloadData); break; case 'sync_request': @@ -291,12 +289,8 @@ class MqttCore { } } - void _jobDeleteReceived(List payloadData) async { - Map map = {}; - map["jobDel"] = payloadData; - var jobDelMessage = JobDelMessage.fromJson(map); - - for(var jobId in jobDelMessage.jobDel) { + void _jobDeleteReceived(payloadData) async { + for(var jobId in payloadData) { await MyApp.isarInstance.writeTxn(() async { await MyApp.isarInstance.jobs.delete(jobId); }); diff --git a/lib/tools/util.dart b/lib/tools/util.dart index 2772345..c74abc7 100644 --- a/lib/tools/util.dart +++ b/lib/tools/util.dart @@ -72,12 +72,16 @@ class Util { return currentUuid; } + static _printLongText(String text) { + final pattern = RegExp('.{1,800}'); // 800 is the size of each chunk + pattern.allMatches(text).forEach((match) => debugPrint(match.group(0))); + } static logInfo(String message) { - debugPrint(message); + _printLongText(message); } static logException(String message) { - debugPrint('Exception: $message'); + _printLongText(message); } static int fastHash(String string) {