diff --git a/assets/job.json b/assets/job.json deleted file mode 100644 index 6850fc4..0000000 --- a/assets/job.json +++ /dev/null @@ -1,343 +0,0 @@ -{ - "recv": "sb", - "id": "0", - "payload": { - "jobs": [ - { - "id": 21084648, - "ver": 1685440133, - "state": 1, - "ordertime": "2023-05-30T07:51Z", - "offs_warn": 15, - "global": false, - "vht_id": 3, - "rem": [ - "Fuhrlohn: 41,70 EUR", - "Filter: SK", - "-------------------", - "30625 Hannover", - "30161 Hannover", - "30625 Hannover", - "30161 Hannover" - ], - "tours": [ - { - "id": 19002821, - "sort": 1, - "state": 1, - "mode": "pu", - "comp": "GHOTEL", - "person": "", - "phone": "040 000000", - "street": "Lathusenstr. 35", - "city": "30625 Hannover", - "com": "", - "pos": { - "lat": 52.3799, - "long": 9.79572 - }, - "rem": [], - "tasks": [ - { - "s_id": 1900282100, - "type": 3, - "topic": "Ankunft bestätigen", - "rt": true, - "track": true - }, - { - "s_id": 1900282101, - "type": 9, - "topic": "Kommissionsnummer", - "opt": true, - "reenter": true - }, - { - "s_id": 1900282102, - "type": 5, - "topic": "Barcodes scannen", - "opt": true, - "reenter": true, - "min": 0, - "max": 4, - "max_len": 30 - }, - { - "s_id": 1900282103, - "type": 4, - "topic": "Fotos", - "opt": false, - "reenter": false, - "min": 1, - "max": 3 - }, - { - "s_id": 1900282104, - "type": 3, - "topic": "Arbeit fertig", - "track": true - }, - { - "s_id": 1900282105, - "type": 8, - "topic": "Hinweis zur Station", - "opt": true, - "reenter": true - }, - { - "s_id": 1900282106, - "type": 7, - "topic": "Quittungsgeber" - }, - { - "s_id": 1900282107, - "type": 2, - "topic": "Unterschrift", - "txt": [ - "%comp% / %person%", - "%street%, %city%", - "Komm-#: %com%", - "Servicezeit: %service_time%", - "Quittungsgeber: %task_val#1900282106%" - ], - "term": true, - "task_arrival": 1900282100, - "task_fin_work": 1900282104 - } - ] - }, - { - "id": 19002822, - "sort": 2, - "state": 1, - "mode": "pu/del", - "comp": "KURS-Institut fuer betriebliche", - "person": "Herr Rosenthal 51516525", - "phone": "05115151650", - "street": "Roscherstr. 13a", - "city": "30161 Hannover", - "com": "", - "pos": { - "lat": 52.3775, - "long": 9.7475 - }, - "rem": [], - "tasks": [ - { - "s_id": 1900282200, - "type": 3, - "topic": "Ankunft bestätigen", - "rt": true, - "track": true - }, - { - "s_id": 1900282201, - "type": 9, - "topic": "Kommissionsnummer", - "opt": true, - "reenter": true - }, - { - "s_id": 1900282202, - "type": 5, - "topic": "Barcodes scannen", - "opt": true, - "reenter": true, - "min": 0, - "max": 4, - "max_len": 30 - }, - { - "s_id": 1900282203, - "type": 3, - "topic": "Arbeit fertig", - "track": true - }, - { - "s_id": 1900282204, - "type": 8, - "topic": "Hinweis zur Station", - "opt": true, - "reenter": true - }, - { - "s_id": 1900282205, - "type": 7, - "topic": "Quittungsgeber" - }, - { - "s_id": 1900282206, - "type": 2, - "topic": "Unterschrift", - "txt": [ - "%comp% / %person%", - "%street%, %city%", - "Komm-#: %com%", - "Servicezeit: %service_time%", - "Quittungsgeber: %task_val#1900282205%" - ], - "term": true, - "task_arrival": 1900282200, - "task_fin_work": 1900282203 - } - ] - }, - { - "id": 19003721, - "sort": 3, - "state": 1, - "mode": "del", - "comp": "GHOTEL", - "person": "", - "phone": "040 000000", - "street": "Lathusenstr. 35", - "city": "30625 Hannover", - "com": "", - "pos": { - "lat": 52.3799, - "long": 9.79572 - }, - "rem": [], - "tasks": [ - { - "s_id": 1900372100, - "type": 3, - "topic": "Ankunft bestätigen", - "rt": true, - "track": true - }, - { - "s_id": 1900372101, - "type": 9, - "topic": "Kommissionsnummer", - "opt": true, - "reenter": true - }, - { - "s_id": 1900372102, - "type": 5, - "topic": "Barcodes scannen", - "opt": true, - "reenter": true, - "min": 0, - "max": 4, - "max_len": 30 - }, - { - "s_id": 1900372103, - "type": 3, - "topic": "Arbeit fertig", - "track": true - }, - { - "s_id": 1900372104, - "type": 8, - "topic": "Hinweis zur Station", - "opt": true, - "reenter": true - }, - { - "s_id": 1900372105, - "type": 7, - "topic": "Quittungsgeber" - }, - { - "s_id": 1900372106, - "type": 2, - "topic": "Unterschrift", - "txt": [ - "%comp% / %person%", - "%street%, %city%", - "Komm-#: %com%", - "Servicezeit: %service_time%", - "Quittungsgeber: %task_val#1900372105%" - ], - "term": true, - "task_arrival": 1900372100, - "task_fin_work": 1900372103 - } - ] - }, - { - "id": 19003726, - "sort": 4, - "state": 0, - "mode": "del", - "comp": "KURS-Institut fuer betriebliche", - "person": "", - "phone": "05115151650", - "street": "Roscherstr. 13a", - "city": "30161 Hannover", - "com": "", - "pos": { - "lat": 52.3775, - "long": 9.7475 - }, - "rem": [ - "EUR2,50 Parkgebuehren es kann direkt vor der Schranke geparkt werden, Sackkarre erforderlich" - ], - "tasks": [ - { - "s_id": 1900372600, - "type": 3, - "topic": "Ankunft bestätigen", - "rt": true, - "track": true - }, - { - "s_id": 1900372601, - "type": 9, - "topic": "Kommissionsnummer", - "opt": true, - "reenter": true - }, - { - "s_id": 1900372602, - "type": 5, - "topic": "Barcodes scannen", - "opt": true, - "reenter": true, - "min": 0, - "max": 4, - "max_len": 30 - }, - { - "s_id": 1900372603, - "type": 3, - "topic": "Arbeit fertig", - "track": true - }, - { - "s_id": 1900372604, - "type": 8, - "topic": "Hinweis zur Station", - "opt": true, - "reenter": true - }, - { - "s_id": 1900372605, - "type": 7, - "topic": "Quittungsgeber" - }, - { - "s_id": 1900372606, - "type": 2, - "topic": "Unterschrift", - "txt": [ - "%comp% / %person%", - "%street%, %city%", - "Komm-#: %com%", - "Servicezeit: %service_time%", - "Quittungsgeber: %task_val#1900372605%" - ], - "term": true, - "task_arrival": 1900372600, - "task_fin_work": 1900372603 - } - ] - } - ] - } - ] - } -} diff --git a/lib/content_views/main_page.dart b/lib/content_views/main_page.dart index a147f1a..5faed33 100644 --- a/lib/content_views/main_page.dart +++ b/lib/content_views/main_page.dart @@ -1,21 +1,19 @@ -import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; import 'package:isar/isar.dart'; -import 'package:stadtbote/content_views/accepted_jobs_page.dart'; import 'package:stadtbote/content_views/assigned_jobs_page.dart'; import 'package:stadtbote/content_views/finished_jobs_page.dart'; import 'package:stadtbote/content_views/messages_page.dart'; import 'package:stadtbote/content_views/utils/content_view_widget.dart'; import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:stadtbote/model/job.dart'; import 'package:stadtbote/model/status.dart'; import 'package:stadtbote/popups/infos_popup.dart'; import 'package:stadtbote/tools/session_info_update.dart'; +import 'package:badges/badges.dart' as badges; import '../main.dart'; -import '../model/job.dart'; import '../tools/constants.dart'; import '../tools/util.dart'; @@ -78,10 +76,16 @@ class MainPage extends ContentViewWidget { } class _MainPageState extends State { + final ValueNotifier _assignedJobsValueNotifier = ValueNotifier(0); + final ValueNotifier _acceptedJobsValueNotifier = ValueNotifier(0); + final ValueNotifier _messagesValueNotifier = ValueNotifier(0); + @override void initState() { super.initState(); + _initBadges(); + _initMessages(); } @@ -96,25 +100,94 @@ class _MainPageState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - getDefaultButton( - 'Zugewiesene Aufträge', - image: Image.asset('assets/zugewiesene_auftraege.png', width: 30, height: 30), - () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())}), + ValueListenableBuilder( + valueListenable: _assignedJobsValueNotifier, + builder: (context, value, child) { + return badges.Badge( + showBadge: value > 0, + position: badges.BadgePosition.topEnd(top: 0, end: -5), + badgeContent: Text( + value.toString(), + style: const TextStyle( + color: Colors.white, + fontSize: 13.0, + ), + ), + badgeStyle: badges.BadgeStyle( + badgeColor: Colors.red, + padding: const EdgeInsets.all(10), + borderRadius: BorderRadius.circular(4), + borderSide: const BorderSide(color: Colors.white, width: 0), + elevation: 0, + ), + child: getDefaultButton( + 'Zugewiesene Aufträge', + image: Image.asset('assets/zugewiesene_auftraege.png', width: 30, height: 30), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())}) + ); + }, + ), const SizedBox(height: 10), - getDefaultButton( - 'Angenommene Aufträge', - image: Image.asset('assets/angenommene_auftraege.png', width: 30, height: 30), - () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const AcceptedJobsPage())}), + ValueListenableBuilder( + valueListenable: _acceptedJobsValueNotifier, + builder: (context, value, child) { + return badges.Badge( + showBadge: value > 0, + position: badges.BadgePosition.topEnd(top: 0, end: -5), + badgeContent: Text( + value.toString(), + style: const TextStyle( + color: Colors.white, + fontSize: 13.0, + ), + ), + badgeStyle: badges.BadgeStyle( + badgeColor: Colors.red, + padding: const EdgeInsets.all(10), + borderRadius: BorderRadius.circular(4), + borderSide: const BorderSide(color: Colors.white, width: 0), + elevation: 0, + ), + child: getDefaultButton( + 'Angenommene Aufträge', + image: Image.asset('assets/angenommene_auftraege.png', width: 30, height: 30), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())}) + ); + }, + ), const SizedBox(height: 10), getDefaultButton( 'Erledigte Aufträge', image: Image.asset('assets/erledigte_auftraege.png', width: 30, height: 30), () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())}), const SizedBox(height: 10), - getDefaultButton( - 'Nachrichten', - image: Image.asset('assets/nachrichten.png', width: 30, height: 30), - () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const MessagesPage())}), + ValueListenableBuilder( + valueListenable: _messagesValueNotifier, + builder: (context, value, child) { + return badges.Badge( + showBadge: value > 0, + position: badges.BadgePosition.topEnd(top: 0, end: -5), + badgeContent: Text( + value.toString(), + style: const TextStyle( + color: Colors.white, + fontSize: 13.0, + ), + ), + badgeStyle: badges.BadgeStyle( + badgeColor: Colors.red, + padding: const EdgeInsets.all(10), + borderRadius: BorderRadius.circular(4), + borderSide: const BorderSide(color: Colors.white, width: 0), + elevation: 0, + ), + child: getDefaultButton( + 'Nachrichten', + image: Image.asset('assets/nachrichten.png', width: 30, height: 30), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const MessagesPage())}) + ); + }, + ), const SizedBox(height: 10), getDefaultButton( 'Anfahrtsbereich', @@ -126,10 +199,7 @@ class _MainPageState extends State { getDefaultButton( 'Abmelden', image: Image.asset('assets/abmelden.png', width: 30, height: 30), - () => { - _test() - //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage()) - }), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())}), Expanded( child: Container( decoration: BoxDecoration( @@ -153,7 +223,7 @@ class _MainPageState extends State { ); } - _test() async { + /*_test() async { var json = await rootBundle.loadString('assets/job.json'); var jsonMap = jsonDecode(json); var payload = jsonMap["payload"]; @@ -167,11 +237,16 @@ class _MainPageState extends State { } }); } - } + }*/ _initMessages() { BroadcastReceiver().subscribe(Constants.messageTopicStatusInfoUpdate, (statusInfoUpdate) { widget._sidValueNotifier.value = statusInfoUpdate.status.sid; }); } + + void _initBadges() async { + _assignedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).count(); + _acceptedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(1).count(); + } } diff --git a/lib/content_views/task_list_page.dart b/lib/content_views/task_list_page.dart index 27f312f..6c536bb 100644 --- a/lib/content_views/task_list_page.dart +++ b/lib/content_views/task_list_page.dart @@ -8,6 +8,7 @@ import 'package:stadtbote/content_views/utils/header_info.dart'; import 'package:stadtbote/model/job_tour.dart'; import 'package:stadtbote/popups/tasks_popups/arrived_popup.dart'; import 'package:stadtbote/popups/tasks_popups/commision_number_popup.dart'; +import 'package:stadtbote/popups/tasks_popups/pickup_delivery_status_popup.dart'; import 'package:stadtbote/popups/tasks_popups/receipt_giver_popup.dart'; import 'package:stadtbote/popups/tasks_popups/scan_barcodes_popup.dart'; import 'package:stadtbote/popups/tasks_popups/signature_popup.dart'; @@ -217,6 +218,10 @@ class _TaskListPageState extends State { case 9: _processCommissionNumber(taskInfo); break; + + case 11: + _processPickupDeliveryStatusTask(taskInfo); + break; } } @@ -312,6 +317,16 @@ class _TaskListPageState extends State { setState(() {}); } + void _processPickupDeliveryStatusTask(TaskInfo taskInfo) { + Future.delayed(const Duration(seconds: 1), () async { + _popup = showPickupDeliveryStatusPopup(context, taskInfo, () => { + _popup.dismiss(context), + + taskInfo.completed = true, + }); + }); + } + void _processSignature(TaskInfo taskInfo) { SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]); diff --git a/lib/content_views/tour_list_page.dart b/lib/content_views/tour_list_page.dart index 909fee1..41e582b 100644 --- a/lib/content_views/tour_list_page.dart +++ b/lib/content_views/tour_list_page.dart @@ -64,7 +64,7 @@ class _TourListPageState extends State { late List jobWidgets = _createjobWidgets(); return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(18.0), child: Column( children: [ Container( diff --git a/lib/model/tour_task.dart b/lib/model/tour_task.dart index 9bdc6f2..101b703 100644 --- a/lib/model/tour_task.dart +++ b/lib/model/tour_task.dart @@ -23,6 +23,7 @@ class TourTask { late int? taskArrival; @JsonKey(name: 'task_fin_work') late int? taskFinWork; + late List? entries; TourTask(); diff --git a/lib/model/tour_task.g.dart b/lib/model/tour_task.g.dart index c87f620..bfbcbb9 100644 --- a/lib/model/tour_task.g.dart +++ b/lib/model/tour_task.g.dart @@ -13,68 +13,73 @@ const TourTaskSchema = Schema( name: r'TourTask', id: -3019997418839113825, properties: { - r'max': PropertySchema( + r'entries': PropertySchema( id: 0, + name: r'entries', + type: IsarType.stringList, + ), + r'max': PropertySchema( + id: 1, name: r'max', type: IsarType.long, ), r'maxLen': PropertySchema( - id: 1, + id: 2, name: r'maxLen', type: IsarType.long, ), r'min': PropertySchema( - id: 2, + id: 3, name: r'min', type: IsarType.long, ), r'opt': PropertySchema( - id: 3, + id: 4, name: r'opt', type: IsarType.bool, ), r'reenter': PropertySchema( - id: 4, + id: 5, name: r'reenter', type: IsarType.bool, ), r'rt': PropertySchema( - id: 5, + id: 6, name: r'rt', type: IsarType.bool, ), r'sId': PropertySchema( - id: 6, + id: 7, name: r'sId', type: IsarType.long, ), r'taskArrival': PropertySchema( - id: 7, + id: 8, name: r'taskArrival', type: IsarType.long, ), r'taskFinWork': PropertySchema( - id: 8, + id: 9, name: r'taskFinWork', type: IsarType.long, ), r'topic': PropertySchema( - id: 9, + id: 10, name: r'topic', type: IsarType.string, ), r'track': PropertySchema( - id: 10, + id: 11, name: r'track', type: IsarType.bool, ), r'txt': PropertySchema( - id: 11, + id: 12, name: r'txt', type: IsarType.stringList, ), r'type': PropertySchema( - id: 12, + id: 13, name: r'type', type: IsarType.long, ) @@ -91,6 +96,18 @@ int _tourTaskEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; + { + final list = object.entries; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } bytesCount += 3 + object.topic.length * 3; { final list = object.txt; @@ -113,19 +130,20 @@ void _tourTaskSerialize( List offsets, Map> allOffsets, ) { - writer.writeLong(offsets[0], object.max); - writer.writeLong(offsets[1], object.maxLen); - writer.writeLong(offsets[2], object.min); - writer.writeBool(offsets[3], object.opt); - writer.writeBool(offsets[4], object.reenter); - writer.writeBool(offsets[5], object.rt); - writer.writeLong(offsets[6], object.sId); - writer.writeLong(offsets[7], object.taskArrival); - writer.writeLong(offsets[8], object.taskFinWork); - writer.writeString(offsets[9], object.topic); - writer.writeBool(offsets[10], object.track); - writer.writeStringList(offsets[11], object.txt); - writer.writeLong(offsets[12], object.type); + writer.writeStringList(offsets[0], object.entries); + writer.writeLong(offsets[1], object.max); + writer.writeLong(offsets[2], object.maxLen); + writer.writeLong(offsets[3], object.min); + writer.writeBool(offsets[4], object.opt); + writer.writeBool(offsets[5], object.reenter); + writer.writeBool(offsets[6], object.rt); + writer.writeLong(offsets[7], object.sId); + writer.writeLong(offsets[8], object.taskArrival); + writer.writeLong(offsets[9], object.taskFinWork); + writer.writeString(offsets[10], object.topic); + writer.writeBool(offsets[11], object.track); + writer.writeStringList(offsets[12], object.txt); + writer.writeLong(offsets[13], object.type); } TourTask _tourTaskDeserialize( @@ -135,19 +153,20 @@ TourTask _tourTaskDeserialize( Map> allOffsets, ) { final object = TourTask(); - object.max = reader.readLongOrNull(offsets[0]); - object.maxLen = reader.readLongOrNull(offsets[1]); - object.min = reader.readLongOrNull(offsets[2]); - object.opt = reader.readBoolOrNull(offsets[3]); - object.reenter = reader.readBoolOrNull(offsets[4]); - object.rt = reader.readBoolOrNull(offsets[5]); - object.sId = reader.readLong(offsets[6]); - object.taskArrival = reader.readLongOrNull(offsets[7]); - object.taskFinWork = reader.readLongOrNull(offsets[8]); - object.topic = reader.readString(offsets[9]); - object.track = reader.readBoolOrNull(offsets[10]); - object.txt = reader.readStringList(offsets[11]); - object.type = reader.readLong(offsets[12]); + object.entries = reader.readStringList(offsets[0]); + object.max = reader.readLongOrNull(offsets[1]); + object.maxLen = reader.readLongOrNull(offsets[2]); + object.min = reader.readLongOrNull(offsets[3]); + object.opt = reader.readBoolOrNull(offsets[4]); + object.reenter = reader.readBoolOrNull(offsets[5]); + object.rt = reader.readBoolOrNull(offsets[6]); + object.sId = reader.readLong(offsets[7]); + object.taskArrival = reader.readLongOrNull(offsets[8]); + object.taskFinWork = reader.readLongOrNull(offsets[9]); + object.topic = reader.readString(offsets[10]); + object.track = reader.readBoolOrNull(offsets[11]); + object.txt = reader.readStringList(offsets[12]); + object.type = reader.readLong(offsets[13]); return object; } @@ -159,30 +178,32 @@ P _tourTaskDeserializeProp

( ) { switch (propertyId) { case 0: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 1: return (reader.readLongOrNull(offset)) as P; case 2: return (reader.readLongOrNull(offset)) as P; case 3: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 4: return (reader.readBoolOrNull(offset)) as P; case 5: return (reader.readBoolOrNull(offset)) as P; case 6: - return (reader.readLong(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 7: - return (reader.readLongOrNull(offset)) as P; + return (reader.readLong(offset)) as P; case 8: return (reader.readLongOrNull(offset)) as P; case 9: - return (reader.readString(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 10: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readString(offset)) as P; case 11: - return (reader.readStringList(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 12: + return (reader.readStringList(offset)) as P; + case 13: return (reader.readLong(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -191,6 +212,242 @@ P _tourTaskDeserializeProp

( extension TourTaskQueryFilter on QueryBuilder { + QueryBuilder entriesIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'entries', + )); + }); + } + + QueryBuilder entriesIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'entries', + )); + }); + } + + QueryBuilder entriesElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + entriesElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'entries', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + entriesElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'entries', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder entriesElementBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'entries', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + entriesElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + entriesElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + entriesElementContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'entries', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder entriesElementMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'entries', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + entriesElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'entries', + value: '', + )); + }); + } + + QueryBuilder + entriesElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'entries', + value: '', + )); + }); + } + + QueryBuilder entriesLengthEqualTo( + int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'entries', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder entriesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'entries', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder entriesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'entries', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder entriesLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'entries', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + entriesLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'entries', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder entriesLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'entries', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + QueryBuilder maxIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -1132,7 +1389,9 @@ TourTask _$TourTaskFromJson(Map json) => TourTask() ..track = json['track'] as bool? ..txt = (json['txt'] as List?)?.map((e) => e as String).toList() ..taskArrival = json['task_arrival'] as int? - ..taskFinWork = json['task_fin_work'] as int?; + ..taskFinWork = json['task_fin_work'] as int? + ..entries = + (json['entries'] as List?)?.map((e) => e as String).toList(); Map _$TourTaskToJson(TourTask instance) => { 's_id': instance.sId, @@ -1148,4 +1407,5 @@ Map _$TourTaskToJson(TourTask instance) => { 'txt': instance.txt, 'task_arrival': instance.taskArrival, 'task_fin_work': instance.taskFinWork, + 'entries': instance.entries, }; diff --git a/lib/popups/tasks_popups/pickup_delivery_status_popup.dart b/lib/popups/tasks_popups/pickup_delivery_status_popup.dart new file mode 100644 index 0000000..2dd4c37 --- /dev/null +++ b/lib/popups/tasks_popups/pickup_delivery_status_popup.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:kumi_popup_window/kumi_popup_window.dart'; +import 'package:stadtbote/model/task_info.dart'; +import 'package:stadtbote/tools/util.dart'; + +KumiPopupWindow showPickupDeliveryStatusPopup(BuildContext context, TaskInfo taskInfo, Function() onFinished) { + return showPopupWindow( + context, + //childSize:Size(240, MediaQuery.of(context).size.width * 0.8), + gravity: KumiPopupGravity.center, + //curve: Curves.elasticOut, + bgColor: Colors.grey.withOpacity(0.5), + clickOutDismiss: false, + clickBackDismiss: true, + customAnimation: false, + customPop: false, + customPage: false, + // targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox), + //needSafeDisplay: true, + underStatusBar: false, + underAppBar: false, + //offsetX: -180, + //offsetY: 50, + duration: const Duration(milliseconds: 200), + onShowStart: (pop) {}, + onShowFinish: (pop) {}, + onDismissStart: (pop) {}, + onDismissFinish: (pop) {}, + onClickOut: (pop) {}, + onClickBack: (pop) {}, + childFun: (pop) { + return SizedBox( + key: GlobalKey(), + height: MediaQuery.of(context).size.height * 0.2, + width: MediaQuery.of(context).size.width * 0.8, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white, + border: Border.all( + color: Colors.grey, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + children: [ + Text(taskInfo.task.topic), + const SizedBox(height: 20), + /*DropdownMenu( + onSelected: (String? value) { + }, + /*dropdownMenuEntries: list.map>((String value) { + return DropdownMenuEntry(value: value, label: value); + }).toList(),*/ + ),*/ + getDefaultButton('Übernehmen', buttonHeight: 50, () => { + onFinished() + }) + ], + ), + ), + ) + ); + }, + ); +} + +/* + + */ \ No newline at end of file diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart index e2bceb2..6238485 100644 --- a/lib/tools/mqtt_core.dart +++ b/lib/tools/mqtt_core.dart @@ -46,6 +46,9 @@ class MqttCore { String clientId = await Util.getAppUuid(); Util.logInfo("client id: $clientId"); + Util.logInfo("broker uri: $_brokerUri"); + Util.logInfo("broker port: $_brokerPort"); + _mqttClient = MqttServerClient.withPort(_brokerUri, clientId, _brokerPort); _mqttClient.logging(on: false); _mqttClient.keepAlivePeriod = 20; @@ -55,8 +58,8 @@ class MqttCore { _mqttClient.connectionMessage = MqttConnectMessage() .withClientIdentifier('clientId') .withWillQos(MqttQos.atMostOnce) - .withWillTopic('willTopic') - .withWillMessage('willMessage') + //.withWillTopic('willTopic') + //.withWillMessage('willMessage') .authenticateAs("app", "apppwd"); await _mqttClient.connect(); diff --git a/pubspec.lock b/pubspec.lock index aff0a57..6ec6b95 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + badges: + dependency: "direct main" + description: + name: badges + sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84 + url: "https://pub.dev" + source: hosted + version: "3.1.2" boolean_selector: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7bda0d3..dd8fe77 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -49,6 +49,7 @@ dependencies: json_serializable: ^6.6.2 json_annotation: ^4.8.1 shared_preferences: ^2.1.1 + badges: ^3.1.1 flutter_broadcast_receiver: ^1.0.0+2 intl: ^0.18.0 another_stepper: ^1.2.2