Erweiterungen

This commit is contained in:
Sven committed 2023-11-17 10:50:04 +01:00
1 parent 3dab4025e7
commit 3d7ae9de2a
16 files changed
+438 -327

No files matched your search

+51 -16
View File
@@ -3,13 +3,16 @@ 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/status.dart';
import 'package:stadtbote/popups/infos_popup.dart';
import 'package:stadtbote/tools/session_info_update.dart';
import '../main.dart';
import '../model/job.dart';
@@ -17,7 +20,16 @@ import '../tools/constants.dart';
import '../tools/util.dart';
class MainPage extends ContentViewWidget {
const MainPage({super.key});
final ValueNotifier<String> _zipValueNotifier = ValueNotifier("----");
final ValueNotifier<String> _sidValueNotifier = ValueNotifier("----");
MainPage({super.key}) {
Status? status = MyApp.isarInstance.status.where().findFirstSync();
if (status != null) {
_zipValueNotifier.value = status.locZip;
_sidValueNotifier.value = status.sid;
}
}
@override
State<MainPage> createState() => _MainPageState();
@@ -27,21 +39,31 @@ class MainPage extends ContentViewWidget {
return HeaderInfo(
titleWidget: Container(
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 3),
child: const Column(children: [
Text(
'Zeile 1',
style: TextStyle(
color: Colors.white,
fontSize: 18.0,
),
child: Column(children: [
ValueListenableBuilder<String>(
valueListenable: _zipValueNotifier,
builder: (context, value, child) {
return Text(
value,
style: const TextStyle(
color: Colors.white,
fontSize: 18.0,
),
);
},
),
SizedBox(height: 5),
Text(
'Zeile 2',
style: TextStyle(
color: Colors.white,
fontSize: 18.0,
),
const SizedBox(height: 5),
ValueListenableBuilder<String>(
valueListenable: _sidValueNotifier,
builder: (context, value, child) {
return Text(
value,
style: const TextStyle(
color: Colors.white,
fontSize: 18.0,
),
);
},
),
]),
),
@@ -55,6 +77,13 @@ class MainPage extends ContentViewWidget {
}
class _MainPageState extends State<MainPage> {
@override
void initState() {
super.initState();
_initMessages();
}
@override
Widget build(BuildContext context) {
return Stack(
@@ -123,7 +152,7 @@ class _MainPageState extends State<MainPage> {
);
}
void _test() async {
_test() async {
var json = await rootBundle.loadString('assets/job.json');
var jsonMap = jsonDecode(json);
var payload = jsonMap["payload"];
@@ -138,4 +167,10 @@ class _MainPageState extends State<MainPage> {
});
}
}
_initMessages() {
BroadcastReceiver().subscribe<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdate, (statusInfoUpdate) {
widget._sidValueNotifier.value = statusInfoUpdate.status.sid;
});
}
}
+44 -15
View File
@@ -13,6 +13,7 @@ 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/station_notice_popup.dart';
import 'package:stadtbote/popups/tasks_popups/take_photos_popup.dart';
import 'package:stadtbote/tools/constants.dart';
import '../main.dart';
import '../model/task_info.dart';
@@ -105,11 +106,11 @@ class _TaskListPageState extends State<TaskListPage> {
children: [
Positioned(
left: 16.5,
top: i == 0 ? 5 : 0,
top: i == 0 ? 40 : 40,
child: Container(
height: i == widget.tour.tasks.length - 1 ? 1: 60,
height: i == widget.tour.tasks.length - 1 ? 0 : 20,
width: 6,
color: Colors.green
color: isTaskActive(i) ? Constants.colorPrimary : Constants.colorPrimaryOpaque,
),
),
Column(
@@ -117,9 +118,9 @@ class _TaskListPageState extends State<TaskListPage> {
Container(
width: 40,
height: 40,
decoration: const BoxDecoration(
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.grey,
color: isTaskActive(i) ? Constants.colorPrimary : Constants.colorPrimaryOpaque,
),
child: const Icon(Icons.check, size: 30.0, color: Colors.white),
),
@@ -130,7 +131,7 @@ class _TaskListPageState extends State<TaskListPage> {
const SizedBox(width: 20),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
taskInfo.task.topic,
@@ -142,7 +143,7 @@ class _TaskListPageState extends State<TaskListPage> {
),
const SizedBox(height: 5),
Text(
taskInfo.additionalText ?? 'Additonal text',
taskInfo.additionalText ?? '',
textAlign: TextAlign.left,
style: const TextStyle(
color: Colors.blue,
@@ -169,12 +170,14 @@ class _TaskListPageState extends State<TaskListPage> {
for(var task in widget.tour.tasks) {
var taskInfo = await MyApp.isarInstance.taskInfos.filter().sIdEqualTo(task.sId).findFirst();
taskInfo ??= TaskInfo();
if (taskInfo == null) {
taskInfo = TaskInfo();
taskInfo.answer = null;
taskInfo.additionalText = null;
taskInfo.completed = task.opt as bool;
}
taskInfo.task = task;
taskInfo.answer = null;
taskInfo.additionalText = null;
taskList.add(taskInfo);
}
@@ -225,6 +228,7 @@ class _TaskListPageState extends State<TaskListPage> {
DateFormat dateFormat = DateFormat("dd.MM.yyyy HH:mm");
taskInfo.additionalText = dateFormat.format(DateTime.now());
taskInfo.completed = true;
setState(() {});
}
@@ -239,6 +243,7 @@ class _TaskListPageState extends State<TaskListPage> {
_popup.dismiss(context);
taskInfo.additionalText = comissionNumber;
taskInfo.completed = true;
setState(() {});
}
@@ -253,16 +258,26 @@ class _TaskListPageState extends State<TaskListPage> {
_popup.dismiss(context);
taskInfo.additionalText = "Barcodes gescannt";
taskInfo.completed = true;
setState(() {});
}
void _processTakePhotos(TaskInfo taskInfo) {
_processTakePhotos(TaskInfo taskInfo) {
_popup = showTakePhotosPopup(context, taskInfo, () => {
_popup.dismiss(context)
_finishProcessTakePhotos(taskInfo)
});
}
_finishProcessTakePhotos(TaskInfo taskInfo) {
_popup.dismiss(context);
taskInfo.additionalText = "Fotos aufgenommen";
taskInfo.completed = true;
setState(() {});
}
void _processStationNotice(TaskInfo taskInfo) {
_popup = showStationNoticePopup(context, taskInfo, (notice) => {
_finishProcessStationNotice(taskInfo, notice)
@@ -273,6 +288,7 @@ class _TaskListPageState extends State<TaskListPage> {
_popup.dismiss(context);
taskInfo.additionalText = notice;
taskInfo.completed = true;
setState(() {});
}
@@ -287,6 +303,7 @@ class _TaskListPageState extends State<TaskListPage> {
_popup.dismiss(context);
taskInfo.additionalText = receiptGiver;
taskInfo.completed = true;
setState(() {});
}
@@ -298,8 +315,20 @@ class _TaskListPageState extends State<TaskListPage> {
_popup = showSignaturePopup(context, taskInfo, () => {
_popup.dismiss(context),
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
taskInfo.completed = true,
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
});
});
}
bool isTaskActive(int index) {
for (int i = 0; i < index; i++) {
var taskInfo = _taskList[i];
if (!taskInfo.completed) return false;
}
return true;
}
}
+7 -5
View File
@@ -92,7 +92,7 @@ class _MainState extends State<Main> {
WidgetsBinding.instance.addPostFrameCallback((_) async {
_initMessages();
_currentContent = const MainPage();
_currentContent = MainPage();
var headerInfo = await _currentContent.getHeaderInfo(context);
_currentTitleWidget = headerInfo.titleWidget;
@@ -152,8 +152,8 @@ class _MainState extends State<Main> {
Visibility(
visible: _leftButtonVisible,
child: Container(
width: 40,
height: 40,
width: 60,
height: 60,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.white,
@@ -165,6 +165,7 @@ class _MainState extends State<Main> {
},
child: CircleAvatar(
radius: 15,
backgroundColor: Constants.colorPrimary,
child: Padding(padding: const EdgeInsets.all(1.0), child: _leftIconButton),
),
),
@@ -174,8 +175,8 @@ class _MainState extends State<Main> {
Visibility(
visible: _rightButtonVisible,
child: Container(
width: 40,
height: 40,
width: 60,
height: 60,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
@@ -186,6 +187,7 @@ class _MainState extends State<Main> {
_rightButtonOnPressed();
},
child: CircleAvatar(
backgroundColor: Constants.colorPrimary,
radius: 15,
child: Padding(padding: const EdgeInsets.all(1.0), child: _rightIconButton),
),
+36
View File
@@ -0,0 +1,36 @@
import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:stadtbote/tools/util.dart';
part 'start_session_message.g.dart';
@JsonSerializable()
class StartSessionMessage {
Id get isarId => Util.fastHash(messageId);
late String recv;
late bool store;
late String messageId;
late Payload payload;
StartSessionMessage();
factory StartSessionMessage.fromJson(Map<String, dynamic> json) => _$StartSessionMessageFromJson(json);
Map<String, dynamic> toJson() => _$StartSessionMessageToJson(this);
}
@JsonSerializable()
class Payload {
@JsonKey(name:'start_session')
late String startSession;
Payload();
factory Payload.fromJson(Map<String, dynamic> json) => _$PayloadFromJson(json);
Map<String, dynamic> toJson() => _$PayloadToJson(this);
}
+30
View File
@@ -0,0 +1,30 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'start_session_message.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
StartSessionMessage _$StartSessionMessageFromJson(Map<String, dynamic> json) =>
StartSessionMessage()
..recv = json['recv'] as String
..store = json['store'] as bool
..messageId = json['messageId'] as String
..payload = Payload.fromJson(json['payload'] as Map<String, dynamic>);
Map<String, dynamic> _$StartSessionMessageToJson(
StartSessionMessage instance) =>
<String, dynamic>{
'recv': instance.recv,
'store': instance.store,
'messageId': instance.messageId,
'payload': instance.payload,
};
Payload _$PayloadFromJson(Map<String, dynamic> json) =>
Payload()..startSession = json['start_session'] as String;
Map<String, dynamic> _$PayloadToJson(Payload instance) => <String, dynamic>{
'start_session': instance.startSession,
};
+8 -8
View File
@@ -9,21 +9,21 @@ class Status {
final Id id = 0;
@JsonKey(name: 'cust_id')
int? custId;
late int custId;
@JsonKey(name: 'hq_id')
int? hqId;
late int hqId;
@JsonKey(name: 'usr_id')
int? usrId;
late int usrId;
@JsonKey(name: 'cr_id')
int? crId;
late int crId;
@JsonKey(name: 'sid')
String? sid;
late String sid;
@JsonKey(name: 'vht_id')
int? vhtId;
late int vhtId;
@JsonKey(name: 'loc_zip')
String? locZip;
late String locZip;
Status({this.hqId, this.usrId, this.crId, this.sid, this.vhtId, this.locZip, this.custId});
Status();
factory Status.fromJson(Map<String, dynamic> json) => _$StatusFromJson(json);
+67 -192
View File
@@ -73,18 +73,8 @@ int _statusEstimateSize(
Map<Type, List<int>> allOffsets,
) {
var bytesCount = offsets.last;
{
final value = object.locZip;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.sid;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
bytesCount += 3 + object.locZip.length * 3;
bytesCount += 3 + object.sid.length * 3;
return bytesCount;
}
@@ -109,15 +99,14 @@ Status _statusDeserialize(
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
final object = Status(
crId: reader.readLongOrNull(offsets[0]),
custId: reader.readLongOrNull(offsets[1]),
hqId: reader.readLongOrNull(offsets[2]),
locZip: reader.readStringOrNull(offsets[3]),
sid: reader.readStringOrNull(offsets[4]),
usrId: reader.readLongOrNull(offsets[5]),
vhtId: reader.readLongOrNull(offsets[6]),
);
final object = Status();
object.crId = reader.readLong(offsets[0]);
object.custId = reader.readLong(offsets[1]);
object.hqId = reader.readLong(offsets[2]);
object.locZip = reader.readString(offsets[3]);
object.sid = reader.readString(offsets[4]);
object.usrId = reader.readLong(offsets[5]);
object.vhtId = reader.readLong(offsets[6]);
return object;
}
@@ -129,19 +118,19 @@ P _statusDeserializeProp<P>(
) {
switch (propertyId) {
case 0:
return (reader.readLongOrNull(offset)) as P;
return (reader.readLong(offset)) as P;
case 1:
return (reader.readLongOrNull(offset)) as P;
return (reader.readLong(offset)) as P;
case 2:
return (reader.readLongOrNull(offset)) as P;
return (reader.readLong(offset)) as P;
case 3:
return (reader.readStringOrNull(offset)) as P;
return (reader.readString(offset)) as P;
case 4:
return (reader.readStringOrNull(offset)) as P;
return (reader.readString(offset)) as P;
case 5:
return (reader.readLongOrNull(offset)) as P;
return (reader.readLong(offset)) as P;
case 6:
return (reader.readLongOrNull(offset)) as P;
return (reader.readLong(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
@@ -233,23 +222,7 @@ extension StatusQueryWhere on QueryBuilder<Status, Status, QWhereClause> {
}
extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
QueryBuilder<Status, Status, QAfterFilterCondition> crIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'crId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> crIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'crId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> crIdEqualTo(int? value) {
QueryBuilder<Status, Status, QAfterFilterCondition> crIdEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'crId',
@@ -259,7 +232,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> crIdGreaterThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -272,7 +245,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> crIdLessThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -285,8 +258,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> crIdBetween(
int? lower,
int? upper, {
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
@@ -301,24 +274,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> custIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'custId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> custIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'custId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> custIdEqualTo(
int? value) {
QueryBuilder<Status, Status, QAfterFilterCondition> custIdEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'custId',
@@ -328,7 +284,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> custIdGreaterThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -341,7 +297,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> custIdLessThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -354,8 +310,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> custIdBetween(
int? lower,
int? upper, {
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
@@ -370,23 +326,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'hqId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'hqId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdEqualTo(int? value) {
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'hqId',
@@ -396,7 +336,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdGreaterThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -409,7 +349,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdLessThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -422,8 +362,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> hqIdBetween(
int? lower,
int? upper, {
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
@@ -490,24 +430,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> locZipIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'locZip',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> locZipIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'locZip',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> locZipEqualTo(
String? value, {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
@@ -520,7 +444,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> locZipGreaterThan(
String? value, {
String value, {
bool include = false,
bool caseSensitive = true,
}) {
@@ -535,7 +459,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> locZipLessThan(
String? value, {
String value, {
bool include = false,
bool caseSensitive = true,
}) {
@@ -550,8 +474,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> locZipBetween(
String? lower,
String? upper, {
String lower,
String upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
@@ -636,24 +560,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> sidIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'sid',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> sidIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'sid',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> sidEqualTo(
String? value, {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
@@ -666,7 +574,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> sidGreaterThan(
String? value, {
String value, {
bool include = false,
bool caseSensitive = true,
}) {
@@ -681,7 +589,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> sidLessThan(
String? value, {
String value, {
bool include = false,
bool caseSensitive = true,
}) {
@@ -696,8 +604,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> sidBetween(
String? lower,
String? upper, {
String lower,
String upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
@@ -780,23 +688,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'usrId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'usrId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdEqualTo(int? value) {
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'usrId',
@@ -806,7 +698,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdGreaterThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -819,7 +711,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdLessThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -832,8 +724,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> usrIdBetween(
int? lower,
int? upper, {
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
@@ -848,23 +740,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'vhtId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'vhtId',
));
});
}
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdEqualTo(int? value) {
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'vhtId',
@@ -874,7 +750,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdGreaterThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -887,7 +763,7 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdLessThan(
int? value, {
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
@@ -900,8 +776,8 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
}
QueryBuilder<Status, Status, QAfterFilterCondition> vhtIdBetween(
int? lower,
int? upper, {
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
@@ -1158,43 +1034,43 @@ extension StatusQueryProperty on QueryBuilder<Status, Status, QQueryProperty> {
});
}
QueryBuilder<Status, int?, QQueryOperations> crIdProperty() {
QueryBuilder<Status, int, QQueryOperations> crIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'crId');
});
}
QueryBuilder<Status, int?, QQueryOperations> custIdProperty() {
QueryBuilder<Status, int, QQueryOperations> custIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'custId');
});
}
QueryBuilder<Status, int?, QQueryOperations> hqIdProperty() {
QueryBuilder<Status, int, QQueryOperations> hqIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'hqId');
});
}
QueryBuilder<Status, String?, QQueryOperations> locZipProperty() {
QueryBuilder<Status, String, QQueryOperations> locZipProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'locZip');
});
}
QueryBuilder<Status, String?, QQueryOperations> sidProperty() {
QueryBuilder<Status, String, QQueryOperations> sidProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'sid');
});
}
QueryBuilder<Status, int?, QQueryOperations> usrIdProperty() {
QueryBuilder<Status, int, QQueryOperations> usrIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'usrId');
});
}
QueryBuilder<Status, int?, QQueryOperations> vhtIdProperty() {
QueryBuilder<Status, int, QQueryOperations> vhtIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'vhtId');
});
@@ -1205,15 +1081,14 @@ extension StatusQueryProperty on QueryBuilder<Status, Status, QQueryProperty> {
// JsonSerializableGenerator
// **************************************************************************
Status _$StatusFromJson(Map<String, dynamic> json) => Status(
hqId: json['hq_id'] as int?,
usrId: json['usr_id'] as int?,
crId: json['cr_id'] as int?,
sid: json['sid'] as String?,
vhtId: json['vht_id'] as int?,
locZip: json['loc_zip'] as String?,
custId: json['cust_id'] as int?,
);
Status _$StatusFromJson(Map<String, dynamic> json) => Status()
..custId = json['cust_id'] as int
..hqId = json['hq_id'] as int
..usrId = json['usr_id'] as int
..crId = json['cr_id'] as int
..sid = json['sid'] as String
..vhtId = json['vht_id'] as int
..locZip = json['loc_zip'] as String;
Map<String, dynamic> _$StatusToJson(Status instance) => <String, dynamic>{
'cust_id': instance.custId,
+2
View File
@@ -13,6 +13,8 @@ class TaskInfo {
late String? answer;
late bool completed;
@ignore
late TourTask task;
+58 -3
View File
@@ -27,8 +27,13 @@ const TaskInfoSchema = CollectionSchema(
name: r'answer',
type: IsarType.string,
),
r'sId': PropertySchema(
r'completed': PropertySchema(
id: 2,
name: r'completed',
type: IsarType.bool,
),
r'sId': PropertySchema(
id: 3,
name: r'sId',
type: IsarType.long,
)
@@ -76,7 +81,8 @@ void _taskInfoSerialize(
) {
writer.writeString(offsets[0], object.additionalText);
writer.writeString(offsets[1], object.answer);
writer.writeLong(offsets[2], object.sId);
writer.writeBool(offsets[2], object.completed);
writer.writeLong(offsets[3], object.sId);
}
TaskInfo _taskInfoDeserialize(
@@ -88,8 +94,9 @@ TaskInfo _taskInfoDeserialize(
final object = TaskInfo();
object.additionalText = reader.readStringOrNull(offsets[0]);
object.answer = reader.readStringOrNull(offsets[1]);
object.completed = reader.readBool(offsets[2]);
object.id = id;
object.sId = reader.readLong(offsets[2]);
object.sId = reader.readLong(offsets[3]);
return object;
}
@@ -105,6 +112,8 @@ P _taskInfoDeserializeProp<P>(
case 1:
return (reader.readStringOrNull(offset)) as P;
case 2:
return (reader.readBool(offset)) as P;
case 3:
return (reader.readLong(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
@@ -499,6 +508,16 @@ extension TaskInfoQueryFilter
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterFilterCondition> completedEqualTo(
bool value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'completed',
value: value,
));
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterFilterCondition> idEqualTo(Id value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
@@ -636,6 +655,18 @@ extension TaskInfoQuerySortBy on QueryBuilder<TaskInfo, TaskInfo, QSortBy> {
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterSortBy> sortByCompleted() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'completed', Sort.asc);
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterSortBy> sortByCompletedDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'completed', Sort.desc);
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterSortBy> sortBySId() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'sId', Sort.asc);
@@ -675,6 +706,18 @@ extension TaskInfoQuerySortThenBy
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterSortBy> thenByCompleted() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'completed', Sort.asc);
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterSortBy> thenByCompletedDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'completed', Sort.desc);
});
}
QueryBuilder<TaskInfo, TaskInfo, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.asc);
@@ -717,6 +760,12 @@ extension TaskInfoQueryWhereDistinct
});
}
QueryBuilder<TaskInfo, TaskInfo, QDistinct> distinctByCompleted() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'completed');
});
}
QueryBuilder<TaskInfo, TaskInfo, QDistinct> distinctBySId() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'sId');
@@ -744,6 +793,12 @@ extension TaskInfoQueryProperty
});
}
QueryBuilder<TaskInfo, bool, QQueryOperations> completedProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'completed');
});
}
QueryBuilder<TaskInfo, int, QQueryOperations> sIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'sId');
+8 -40
View File
@@ -138,8 +138,8 @@ TourTask _tourTaskDeserialize(
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.opt = reader.readBool(offsets[3]);
object.reenter = reader.readBool(offsets[4]);
object.rt = reader.readBoolOrNull(offsets[5]);
object.sId = reader.readLong(offsets[6]);
object.taskArrival = reader.readLongOrNull(offsets[7]);
@@ -165,9 +165,9 @@ P _tourTaskDeserializeProp<P>(
case 2:
return (reader.readLongOrNull(offset)) as P;
case 3:
return (reader.readBoolOrNull(offset)) as P;
return (reader.readBool(offset)) as P;
case 4:
return (reader.readBoolOrNull(offset)) as P;
return (reader.readBool(offset)) as P;
case 5:
return (reader.readBoolOrNull(offset)) as P;
case 6:
@@ -398,24 +398,8 @@ extension TourTaskQueryFilter
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> optIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'opt',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> optIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'opt',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> optEqualTo(
bool? value) {
bool value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'opt',
@@ -424,24 +408,8 @@ extension TourTaskQueryFilter
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> reenterIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'reenter',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> reenterIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'reenter',
));
});
}
QueryBuilder<TourTask, TourTask, QAfterFilterCondition> reenterEqualTo(
bool? value) {
bool value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'reenter',
@@ -1123,8 +1091,8 @@ TourTask _$TourTaskFromJson(Map<String, dynamic> json) => TourTask()
..sId = json['s_id'] as int
..type = json['type'] as int
..topic = json['topic'] as String
..opt = json['opt'] as bool?
..reenter = json['reenter'] as bool?
..opt = json['opt'] as bool
..reenter = json['reenter'] as bool
..min = json['min'] as int?
..max = json['max'] as int?
..maxLen = json['max_len'] as int?
+2 -1
View File
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:stadtbote/tools/constants.dart';
class ColoredSafeArea extends StatelessWidget {
final Widget child;
@@ -9,7 +10,7 @@ class ColoredSafeArea extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Theme.of(context).colorScheme.primaryContainer,
color: Constants.colorPrimary,
child: SafeArea(
child: child,
),
+4 -1
View File
@@ -1,9 +1,12 @@
import 'dart:ui';
class Constants {
static const Color colorPrimary = Color(0xff0095DB);
static const Color colorPrimary = Color(0xFFE00029);
static const Color colorPrimaryOpaque = Color(0x33E00029);
static const String messageTopicConnectionStatusChanged = "connection_status_changed";
static const String messageTopicSessionInfoUpdate = "status_info_updated";
static const String messageTopicStatusInfoUpdate = "session_info_updated";
static const String messageTopicPushContentView = "push_content_view";
static const String messageTopicPopContentView = "pop_content_view";
static const String messageTopicReplaceContentView = "replace_content_view";
+68
View File
@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'dart:typed_data' as typed;
import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart';
import 'package:mqtt_client/mqtt_client.dart';
@@ -9,9 +10,12 @@ import 'package:stadtbote/model/bootstrap_request.dart';
import 'package:stadtbote/model/bootstrap_response_payload.dart';
import 'package:stadtbote/model/device_object.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/model/start_session_message.dart';
import 'package:stadtbote/tools/connection_status.dart';
import 'package:stadtbote/tools/session_info_update.dart';
import 'package:typed_data/typed_buffers.dart';
import 'package:http/http.dart' as http;
import 'package:uuid/uuid.dart';
import '../main.dart';
import '../model/status.dart';
@@ -64,6 +68,8 @@ class MqttCore {
_reconnectDelay = 0;
_setupSubscriptions();
_initSession();
} else {
Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!');
@@ -146,6 +152,8 @@ class MqttCore {
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.status.put(statusMessage);
});
BroadcastReceiver().publish<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdate, arguments: StatusInfoUpdate(status: statusMessage));
}
void _jobMessageReceived(payloadData) async {
@@ -211,4 +219,64 @@ class MqttCore {
_startReconnectTimer();
}
}
_initSession() {
var playload = Payload();
playload.startSession = "true";
var startSessionMessage = StartSessionMessage();
startSessionMessage.recv = "server";
startSessionMessage.store = true;
startSessionMessage.messageId = const Uuid().v4();;
startSessionMessage.payload = playload;
var jsonMap = startSessionMessage.toJson();
var json = jsonEncode(jsonMap);
Util.logInfo("json: $json");
final builder = MqttClientPayloadBuilder();
builder.addString(json);
var payload = builder.payload;
var topic = "$_toServerTopic/init";
Util.logInfo("topic: $topic");
var messageId = _mqttClient.publishMessage(topic, MqttQos.exactlyOnce, payload!);
Util.logInfo("messageId: $messageId");
}
/*
private async void StartSession()
{
App.Logger.Debug("StartSession called");
App.Logger.Debug("Setting state to start session");
_mqttState = MqttStateEnum.StartSession;
var startSession = new JObject
{
new JProperty("recv", "server"),
new JProperty("store", true),
new JProperty("id", Guid.NewGuid().ToString()),
new JProperty("payload", new JObject(
new JProperty("start_session", "true")))
};
var json = JsonConvert.SerializeObject(startSession);
var topic = _toServerTopic + "/init";
var message = new MqttApplicationMessage()
{
Topic = topic,
Payload = Encoding.UTF8.GetBytes(json),
QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,
Retain = true,
MessageExpiryInterval = 3600,
};
await _mqttClient.PublishAsync(message);
App.Logger.Debug("StartSession message " + json + " published to " + topic);
SendEnqueuedMessages();
}
*/
}
+8
View File
@@ -0,0 +1,8 @@
import 'package:stadtbote/model/status.dart';
class StatusInfoUpdate {
StatusInfoUpdate({required this.status});
final Status status;
}