Erweiterungen

This commit is contained in:
Sven committed 2024-01-16 14:17:51 +01:00
1 parent e0d66ce3b1
commit 5c095fb969
10 files changed
+501 -409

No files matched your search

-343
View File
@@ -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
}
]
}
]
}
]
}
}
+91 -16
View File
@@ -1,21 +1,19 @@
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart';
import 'package:isar/isar.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/assigned_jobs_page.dart';
import 'package:stadtbote/content_views/finished_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/messages_page.dart';
import 'package:stadtbote/content_views/utils/content_view_widget.dart'; import 'package:stadtbote/content_views/utils/content_view_widget.dart';
import 'package:stadtbote/content_views/utils/header_info.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/model/status.dart';
import 'package:stadtbote/popups/infos_popup.dart'; import 'package:stadtbote/popups/infos_popup.dart';
import 'package:stadtbote/tools/session_info_update.dart'; import 'package:stadtbote/tools/session_info_update.dart';
import 'package:badges/badges.dart' as badges;
import '../main.dart'; import '../main.dart';
import '../model/job.dart';
import '../tools/constants.dart'; import '../tools/constants.dart';
import '../tools/util.dart'; import '../tools/util.dart';
@@ -78,10 +76,16 @@ class MainPage extends ContentViewWidget {
} }
class _MainPageState extends State<MainPage> { class _MainPageState extends State<MainPage> {
final ValueNotifier<int> _assignedJobsValueNotifier = ValueNotifier<int>(0);
final ValueNotifier<int> _acceptedJobsValueNotifier = ValueNotifier<int>(0);
final ValueNotifier<int> _messagesValueNotifier = ValueNotifier<int>(0);
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_initBadges();
_initMessages(); _initMessages();
} }
@@ -96,25 +100,94 @@ class _MainPageState extends State<MainPage> {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
getDefaultButton( ValueListenableBuilder<int>(
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', 'Zugewiesene Aufträge',
image: Image.asset('assets/zugewiesene_auftraege.png', width: 30, height: 30), image: Image.asset('assets/zugewiesene_auftraege.png', width: 30, height: 30),
() => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())}), () => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())})
);
},
),
const SizedBox(height: 10), const SizedBox(height: 10),
getDefaultButton( ValueListenableBuilder<int>(
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', 'Angenommene Aufträge',
image: Image.asset('assets/angenommene_auftraege.png', width: 30, height: 30), image: Image.asset('assets/angenommene_auftraege.png', width: 30, height: 30),
() => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AcceptedJobsPage())}), () => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())})
);
},
),
const SizedBox(height: 10), const SizedBox(height: 10),
getDefaultButton( getDefaultButton(
'Erledigte Aufträge', 'Erledigte Aufträge',
image: Image.asset('assets/erledigte_auftraege.png', width: 30, height: 30), image: Image.asset('assets/erledigte_auftraege.png', width: 30, height: 30),
() => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())}), () => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())}),
const SizedBox(height: 10), const SizedBox(height: 10),
getDefaultButton( ValueListenableBuilder<int>(
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', 'Nachrichten',
image: Image.asset('assets/nachrichten.png', width: 30, height: 30), image: Image.asset('assets/nachrichten.png', width: 30, height: 30),
() => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const MessagesPage())}), () => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const MessagesPage())})
);
},
),
const SizedBox(height: 10), const SizedBox(height: 10),
getDefaultButton( getDefaultButton(
'Anfahrtsbereich', 'Anfahrtsbereich',
@@ -126,10 +199,7 @@ class _MainPageState extends State<MainPage> {
getDefaultButton( getDefaultButton(
'Abmelden', 'Abmelden',
image: Image.asset('assets/abmelden.png', width: 30, height: 30), image: Image.asset('assets/abmelden.png', width: 30, height: 30),
() => { () => {BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())}),
_test()
//BroadcastReceiver().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())
}),
Expanded( Expanded(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -153,7 +223,7 @@ class _MainPageState extends State<MainPage> {
); );
} }
_test() async { /*_test() async {
var json = await rootBundle.loadString('assets/job.json'); var json = await rootBundle.loadString('assets/job.json');
var jsonMap = jsonDecode(json); var jsonMap = jsonDecode(json);
var payload = jsonMap["payload"]; var payload = jsonMap["payload"];
@@ -167,11 +237,16 @@ class _MainPageState extends State<MainPage> {
} }
}); });
} }
} }*/
_initMessages() { _initMessages() {
BroadcastReceiver().subscribe<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdate, (statusInfoUpdate) { BroadcastReceiver().subscribe<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdate, (statusInfoUpdate) {
widget._sidValueNotifier.value = statusInfoUpdate.status.sid; 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();
}
} }
+15
View File
@@ -8,6 +8,7 @@ import 'package:stadtbote/content_views/utils/header_info.dart';
import 'package:stadtbote/model/job_tour.dart'; import 'package:stadtbote/model/job_tour.dart';
import 'package:stadtbote/popups/tasks_popups/arrived_popup.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/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/receipt_giver_popup.dart';
import 'package:stadtbote/popups/tasks_popups/scan_barcodes_popup.dart'; import 'package:stadtbote/popups/tasks_popups/scan_barcodes_popup.dart';
import 'package:stadtbote/popups/tasks_popups/signature_popup.dart'; import 'package:stadtbote/popups/tasks_popups/signature_popup.dart';
@@ -217,6 +218,10 @@ class _TaskListPageState extends State<TaskListPage> {
case 9: case 9:
_processCommissionNumber(taskInfo); _processCommissionNumber(taskInfo);
break; break;
case 11:
_processPickupDeliveryStatusTask(taskInfo);
break;
} }
} }
@@ -312,6 +317,16 @@ class _TaskListPageState extends State<TaskListPage> {
setState(() {}); 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) { void _processSignature(TaskInfo taskInfo) {
SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]); SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]);
+1 -1
View File
@@ -64,7 +64,7 @@ class _TourListPageState extends State<TourListPage> {
late List<Widget> jobWidgets = _createjobWidgets(); late List<Widget> jobWidgets = _createjobWidgets();
return Padding( return Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(18.0),
child: Column( child: Column(
children: [ children: [
Container( Container(
+1
View File
@@ -23,6 +23,7 @@ class TourTask {
late int? taskArrival; late int? taskArrival;
@JsonKey(name: 'task_fin_work') @JsonKey(name: 'task_fin_work')
late int? taskFinWork; late int? taskFinWork;
late List<String>? entries;
TourTask(); TourTask();
+307 -47
View File
@@ -13,68 +13,73 @@ const TourTaskSchema = Schema(
name: r'TourTask', name: r'TourTask',
id: -3019997418839113825, id: -3019997418839113825,
properties: { properties: {
r'max': PropertySchema( r'entries': PropertySchema(
id: 0, id: 0,
name: r'entries',
type: IsarType.stringList,
),
r'max': PropertySchema(
id: 1,
name: r'max', name: r'max',
type: IsarType.long, type: IsarType.long,
), ),
r'maxLen': PropertySchema( r'maxLen': PropertySchema(
id: 1, id: 2,
name: r'maxLen', name: r'maxLen',
type: IsarType.long, type: IsarType.long,
), ),
r'min': PropertySchema( r'min': PropertySchema(
id: 2, id: 3,
name: r'min', name: r'min',
type: IsarType.long, type: IsarType.long,
), ),
r'opt': PropertySchema( r'opt': PropertySchema(
id: 3, id: 4,
name: r'opt', name: r'opt',
type: IsarType.bool, type: IsarType.bool,
), ),
r'reenter': PropertySchema( r'reenter': PropertySchema(
id: 4, id: 5,
name: r'reenter', name: r'reenter',
type: IsarType.bool, type: IsarType.bool,
), ),
r'rt': PropertySchema( r'rt': PropertySchema(
id: 5, id: 6,
name: r'rt', name: r'rt',
type: IsarType.bool, type: IsarType.bool,
), ),
r'sId': PropertySchema( r'sId': PropertySchema(
id: 6, id: 7,
name: r'sId', name: r'sId',
type: IsarType.long, type: IsarType.long,
), ),
r'taskArrival': PropertySchema( r'taskArrival': PropertySchema(
id: 7, id: 8,
name: r'taskArrival', name: r'taskArrival',
type: IsarType.long, type: IsarType.long,
), ),
r'taskFinWork': PropertySchema( r'taskFinWork': PropertySchema(
id: 8, id: 9,
name: r'taskFinWork', name: r'taskFinWork',
type: IsarType.long, type: IsarType.long,
), ),
r'topic': PropertySchema( r'topic': PropertySchema(
id: 9, id: 10,
name: r'topic', name: r'topic',
type: IsarType.string, type: IsarType.string,
), ),
r'track': PropertySchema( r'track': PropertySchema(
id: 10, id: 11,
name: r'track', name: r'track',
type: IsarType.bool, type: IsarType.bool,
), ),
r'txt': PropertySchema( r'txt': PropertySchema(
id: 11, id: 12,
name: r'txt', name: r'txt',
type: IsarType.stringList, type: IsarType.stringList,
), ),
r'type': PropertySchema( r'type': PropertySchema(
id: 12, id: 13,
name: r'type', name: r'type',
type: IsarType.long, type: IsarType.long,
) )
@@ -91,6 +96,18 @@ int _tourTaskEstimateSize(
Map<Type, List<int>> allOffsets, Map<Type, List<int>> allOffsets,
) { ) {
var bytesCount = offsets.last; 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; bytesCount += 3 + object.topic.length * 3;
{ {
final list = object.txt; final list = object.txt;
@@ -113,19 +130,20 @@ void _tourTaskSerialize(
List<int> offsets, List<int> offsets,
Map<Type, List<int>> allOffsets, Map<Type, List<int>> allOffsets,
) { ) {
writer.writeLong(offsets[0], object.max); writer.writeStringList(offsets[0], object.entries);
writer.writeLong(offsets[1], object.maxLen); writer.writeLong(offsets[1], object.max);
writer.writeLong(offsets[2], object.min); writer.writeLong(offsets[2], object.maxLen);
writer.writeBool(offsets[3], object.opt); writer.writeLong(offsets[3], object.min);
writer.writeBool(offsets[4], object.reenter); writer.writeBool(offsets[4], object.opt);
writer.writeBool(offsets[5], object.rt); writer.writeBool(offsets[5], object.reenter);
writer.writeLong(offsets[6], object.sId); writer.writeBool(offsets[6], object.rt);
writer.writeLong(offsets[7], object.taskArrival); writer.writeLong(offsets[7], object.sId);
writer.writeLong(offsets[8], object.taskFinWork); writer.writeLong(offsets[8], object.taskArrival);
writer.writeString(offsets[9], object.topic); writer.writeLong(offsets[9], object.taskFinWork);
writer.writeBool(offsets[10], object.track); writer.writeString(offsets[10], object.topic);
writer.writeStringList(offsets[11], object.txt); writer.writeBool(offsets[11], object.track);
writer.writeLong(offsets[12], object.type); writer.writeStringList(offsets[12], object.txt);
writer.writeLong(offsets[13], object.type);
} }
TourTask _tourTaskDeserialize( TourTask _tourTaskDeserialize(
@@ -135,19 +153,20 @@ TourTask _tourTaskDeserialize(
Map<Type, List<int>> allOffsets, Map<Type, List<int>> allOffsets,
) { ) {
final object = TourTask(); final object = TourTask();
object.max = reader.readLongOrNull(offsets[0]); object.entries = reader.readStringList(offsets[0]);
object.maxLen = reader.readLongOrNull(offsets[1]); object.max = reader.readLongOrNull(offsets[1]);
object.min = reader.readLongOrNull(offsets[2]); object.maxLen = reader.readLongOrNull(offsets[2]);
object.opt = reader.readBoolOrNull(offsets[3]); object.min = reader.readLongOrNull(offsets[3]);
object.reenter = reader.readBoolOrNull(offsets[4]); object.opt = reader.readBoolOrNull(offsets[4]);
object.rt = reader.readBoolOrNull(offsets[5]); object.reenter = reader.readBoolOrNull(offsets[5]);
object.sId = reader.readLong(offsets[6]); object.rt = reader.readBoolOrNull(offsets[6]);
object.taskArrival = reader.readLongOrNull(offsets[7]); object.sId = reader.readLong(offsets[7]);
object.taskFinWork = reader.readLongOrNull(offsets[8]); object.taskArrival = reader.readLongOrNull(offsets[8]);
object.topic = reader.readString(offsets[9]); object.taskFinWork = reader.readLongOrNull(offsets[9]);
object.track = reader.readBoolOrNull(offsets[10]); object.topic = reader.readString(offsets[10]);
object.txt = reader.readStringList(offsets[11]); object.track = reader.readBoolOrNull(offsets[11]);
object.type = reader.readLong(offsets[12]); object.txt = reader.readStringList(offsets[12]);
object.type = reader.readLong(offsets[13]);
return object; return object;
} }
@@ -159,30 +178,32 @@ P _tourTaskDeserializeProp<P>(
) { ) {
switch (propertyId) { switch (propertyId) {
case 0: case 0:
return (reader.readLongOrNull(offset)) as P; return (reader.readStringList(offset)) as P;
case 1: case 1:
return (reader.readLongOrNull(offset)) as P; return (reader.readLongOrNull(offset)) as P;
case 2: case 2:
return (reader.readLongOrNull(offset)) as P; return (reader.readLongOrNull(offset)) as P;
case 3: case 3:
return (reader.readBoolOrNull(offset)) as P; return (reader.readLongOrNull(offset)) as P;
case 4: case 4:
return (reader.readBoolOrNull(offset)) as P; return (reader.readBoolOrNull(offset)) as P;
case 5: case 5:
return (reader.readBoolOrNull(offset)) as P; return (reader.readBoolOrNull(offset)) as P;
case 6: case 6:
return (reader.readLong(offset)) as P; return (reader.readBoolOrNull(offset)) as P;
case 7: case 7:
return (reader.readLongOrNull(offset)) as P; return (reader.readLong(offset)) as P;
case 8: case 8:
return (reader.readLongOrNull(offset)) as P; return (reader.readLongOrNull(offset)) as P;
case 9: case 9:
return (reader.readString(offset)) as P; return (reader.readLongOrNull(offset)) as P;
case 10: case 10:
return (reader.readBoolOrNull(offset)) as P; return (reader.readString(offset)) as P;
case 11: case 11:
return (reader.readStringList(offset)) as P; return (reader.readBoolOrNull(offset)) as P;
case 12: case 12:
return (reader.readStringList(offset)) as P;
case 13:
return (reader.readLong(offset)) as P; return (reader.readLong(offset)) as P;
default: default:
throw IsarError('Unknown property with id $propertyId'); throw IsarError('Unknown property with id $propertyId');
@@ -191,6 +212,242 @@ P _tourTaskDeserializeProp<P>(
extension TourTaskQueryFilter extension TourTaskQueryFilter
on QueryBuilder<TourTask, TourTask, QFilterCondition> { on QueryBuilder<TourTask, TourTask, QFilterCondition> {
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'entries',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'entries',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesElementEqualTo(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'entries',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition>
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<TourTask, TourTask, QAfterFilterCondition>
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<TourTask, TourTask, QAfterFilterCondition> 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<TourTask, TourTask, QAfterFilterCondition>
entriesElementStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'entries',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition>
entriesElementEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'entries',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition>
entriesElementContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'entries',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesElementMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'entries',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition>
entriesElementIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'entries',
value: '',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition>
entriesElementIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'entries',
value: '',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesLengthEqualTo(
int length) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'entries',
length,
true,
length,
true,
);
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'entries',
0,
true,
0,
true,
);
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'entries',
0,
false,
999999,
true,
);
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> entriesLengthLessThan(
int length, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'entries',
0,
true,
length,
include,
);
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition>
entriesLengthGreaterThan(
int length, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.listLength(
r'entries',
length,
include,
999999,
true,
);
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> 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<TourTask, TourTask, QAfterFilterCondition> maxIsNull() { QueryBuilder<TourTask, TourTask, QAfterFilterCondition> maxIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull( return query.addFilterCondition(const FilterCondition.isNull(
@@ -1132,7 +1389,9 @@ TourTask _$TourTaskFromJson(Map<String, dynamic> json) => TourTask()
..track = json['track'] as bool? ..track = json['track'] as bool?
..txt = (json['txt'] as List<dynamic>?)?.map((e) => e as String).toList() ..txt = (json['txt'] as List<dynamic>?)?.map((e) => e as String).toList()
..taskArrival = json['task_arrival'] as int? ..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<dynamic>?)?.map((e) => e as String).toList();
Map<String, dynamic> _$TourTaskToJson(TourTask instance) => <String, dynamic>{ Map<String, dynamic> _$TourTaskToJson(TourTask instance) => <String, dynamic>{
's_id': instance.sId, 's_id': instance.sId,
@@ -1148,4 +1407,5 @@ Map<String, dynamic> _$TourTaskToJson(TourTask instance) => <String, dynamic>{
'txt': instance.txt, 'txt': instance.txt,
'task_arrival': instance.taskArrival, 'task_arrival': instance.taskArrival,
'task_fin_work': instance.taskFinWork, 'task_fin_work': instance.taskFinWork,
'entries': instance.entries,
}; };
@@ -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<String>(
onSelected: (String? value) {
},
/*dropdownMenuEntries: list.map<DropdownMenuEntry<String>>((String value) {
return DropdownMenuEntry<String>(value: value, label: value);
}).toList(),*/
),*/
getDefaultButton('Übernehmen', buttonHeight: 50, () => {
onFinished()
})
],
),
),
)
);
},
);
}
/*
*/
+5 -2
View File
@@ -46,6 +46,9 @@ class MqttCore {
String clientId = await Util.getAppUuid(); String clientId = await Util.getAppUuid();
Util.logInfo("client id: $clientId"); Util.logInfo("client id: $clientId");
Util.logInfo("broker uri: $_brokerUri");
Util.logInfo("broker port: $_brokerPort");
_mqttClient = MqttServerClient.withPort(_brokerUri, clientId, _brokerPort); _mqttClient = MqttServerClient.withPort(_brokerUri, clientId, _brokerPort);
_mqttClient.logging(on: false); _mqttClient.logging(on: false);
_mqttClient.keepAlivePeriod = 20; _mqttClient.keepAlivePeriod = 20;
@@ -55,8 +58,8 @@ class MqttCore {
_mqttClient.connectionMessage = MqttConnectMessage() _mqttClient.connectionMessage = MqttConnectMessage()
.withClientIdentifier('clientId') .withClientIdentifier('clientId')
.withWillQos(MqttQos.atMostOnce) .withWillQos(MqttQos.atMostOnce)
.withWillTopic('willTopic') //.withWillTopic('willTopic')
.withWillMessage('willMessage') //.withWillMessage('willMessage')
.authenticateAs("app", "apppwd"); .authenticateAs("app", "apppwd");
await _mqttClient.connect(); await _mqttClient.connect();
+8
View File
@@ -57,6 +57,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.11.0" 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: boolean_selector:
dependency: transitive dependency: transitive
description: description:
+1
View File
@@ -49,6 +49,7 @@ dependencies:
json_serializable: ^6.6.2 json_serializable: ^6.6.2
json_annotation: ^4.8.1 json_annotation: ^4.8.1
shared_preferences: ^2.1.1 shared_preferences: ^2.1.1
badges: ^3.1.1
flutter_broadcast_receiver: ^1.0.0+2 flutter_broadcast_receiver: ^1.0.0+2
intl: ^0.18.0 intl: ^0.18.0
another_stepper: ^1.2.2 another_stepper: ^1.2.2