Aufgabenliste in Workflow umbenannt und Nachrichtenbestätigung abgesichert

This commit is contained in:
Sven committed 2026-10-10 10:48:42 +02:00
1 parent 5e7babf265
commit d585da11b5
4 files changed
+142 -11

No files matched your search

+1
View File
@@ -204,6 +204,7 @@ class _MessagesPageState extends State<MessagesPage> with ProducerMixin {
if (unreadChatMessages.isNotEmpty) { if (unreadChatMessages.isNotEmpty) {
List<String> chatMessageIds = []; List<String> chatMessageIds = [];
for (var message in unreadChatMessages) { for (var message in unreadChatMessages) {
// Der Server erwartet seine Nachrichten-ID, nicht die lokale ObjectBox-ID.
chatMessageIds.add(message.externalId.toString()); chatMessageIds.add(message.externalId.toString());
} }
+1 -1
View File
@@ -1287,7 +1287,7 @@ class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
child: const Center( child: const Center(
child: Text( child: Text(
textAlign: TextAlign.center, textAlign: TextAlign.center,
"Liste der Aufgaben", "Workflow",
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.white), style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.white),
), ),
), ),
+10 -10
View File
@@ -145,7 +145,7 @@ class AppLocalizations {
'unknown': 'Unbekannt', 'unknown': 'Unbekannt',
// Aufgabenliste // Aufgabenliste
'task_list': 'Liste der Aufgaben', 'task_list': 'Workflow',
'commission_number_short': 'Komm-#', 'commission_number_short': 'Komm-#',
'photos_taken': 'Fotos aufgenommen', 'photos_taken': 'Fotos aufgenommen',
'signature_captured': 'Unterschrift erfasst', 'signature_captured': 'Unterschrift erfasst',
@@ -287,7 +287,7 @@ class AppLocalizations {
'unknown': 'Unknown', 'unknown': 'Unknown',
// Task List // Task List
'task_list': 'Task List', 'task_list': 'Workflow',
'commission_number_short': 'Comm-#', 'commission_number_short': 'Comm-#',
'photos_taken': 'Photos taken', 'photos_taken': 'Photos taken',
'signature_captured': 'Signature captured', 'signature_captured': 'Signature captured',
@@ -418,7 +418,7 @@ class AppLocalizations {
'unknown': 'Desconocido', 'unknown': 'Desconocido',
// Task List // Task List
'task_list': 'Lista de Tareas', 'task_list': 'Workflow',
'commission_number_short': 'Núm. Com.', 'commission_number_short': 'Núm. Com.',
'photos_taken': 'Fotos tomadas', 'photos_taken': 'Fotos tomadas',
'signature_captured': 'Firma capturada', 'signature_captured': 'Firma capturada',
@@ -539,7 +539,7 @@ class AppLocalizations {
'unknown': 'Inconnu', 'unknown': 'Inconnu',
// Task List // Task List
'task_list': 'Liste des Tâches', 'task_list': 'Workflow',
'commission_number_short': 'N° Comm.', 'commission_number_short': 'N° Comm.',
'photos_taken': 'Photos prises', 'photos_taken': 'Photos prises',
'signature_captured': 'Signature capturée', 'signature_captured': 'Signature capturée',
@@ -660,7 +660,7 @@ class AppLocalizations {
'unknown': 'Nieznany', 'unknown': 'Nieznany',
// Task List // Task List
'task_list': 'Lista Zadań', 'task_list': 'Workflow',
'commission_number_short': 'Nr Zlec.', 'commission_number_short': 'Nr Zlec.',
'photos_taken': 'Zrobione zdjęcia', 'photos_taken': 'Zrobione zdjęcia',
'signature_captured': 'Podpis zapisany', 'signature_captured': 'Podpis zapisany',
@@ -781,7 +781,7 @@ class AppLocalizations {
'unknown': 'Неизвестно', 'unknown': 'Неизвестно',
// Task List // Task List
'task_list': 'Список Задач', 'task_list': 'Workflow',
'commission_number_short': '№ Комм.', 'commission_number_short': '№ Комм.',
'photos_taken': 'Фотографии сделаны', 'photos_taken': 'Фотографии сделаны',
'signature_captured': 'Подпись сохранена', 'signature_captured': 'Подпись сохранена',
@@ -902,7 +902,7 @@ class AppLocalizations {
'unknown': 'Bilinmiyor', 'unknown': 'Bilinmiyor',
// Task List // Task List
'task_list': 'Görev Listesi', 'task_list': 'Workflow',
'commission_number_short': 'Kom. No.', 'commission_number_short': 'Kom. No.',
'photos_taken': 'Fotoğraflar çekildi', 'photos_taken': 'Fotoğraflar çekildi',
'signature_captured': 'İmza kaydedildi', 'signature_captured': 'İmza kaydedildi',
@@ -1023,7 +1023,7 @@ class AppLocalizations {
'unknown': 'Teadmata', 'unknown': 'Teadmata',
// Task List // Task List
'task_list': 'Ülesannete Nimekiri', 'task_list': 'Workflow',
'commission_number_short': 'Kom. Nr.', 'commission_number_short': 'Kom. Nr.',
'photos_taken': 'Fotod tehtud', 'photos_taken': 'Fotod tehtud',
'signature_captured': 'Allkiri salvestatud', 'signature_captured': 'Allkiri salvestatud',
@@ -1144,7 +1144,7 @@ class AppLocalizations {
'unknown': 'Nezināms', 'unknown': 'Nezināms',
// Task List // Task List
'task_list': 'Uzdevumu Saraksts', 'task_list': 'Workflow',
'commission_number_short': 'Kom. Nr.', 'commission_number_short': 'Kom. Nr.',
'photos_taken': 'Fotogrāfijas uzņemtas', 'photos_taken': 'Fotogrāfijas uzņemtas',
'signature_captured': 'Paraksts saglabāts', 'signature_captured': 'Paraksts saglabāts',
@@ -1265,7 +1265,7 @@ class AppLocalizations {
'unknown': 'Nežinoma', 'unknown': 'Nežinoma',
// Task List // Task List
'task_list': 'Užduočių Sąrašas', 'task_list': 'Workflow',
'commission_number_short': 'Kom. Nr.', 'commission_number_short': 'Kom. Nr.',
'photos_taken': 'Nuotraukos padarytos', 'photos_taken': 'Nuotraukos padarytos',
'signature_captured': 'Parašas užfiksuotas', 'signature_captured': 'Parašas užfiksuotas',
+130
View File
@@ -0,0 +1,130 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:dart_mq/dart_mq.dart';
import 'package:flat_buffers/flat_buffers.dart' as fb;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:objectbox/internal.dart' show EntityDefinition;
import 'package:stadtbote/content_views/messages_page.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/model/chat_message.dart';
import 'package:stadtbote/model/session_status.dart';
import 'package:stadtbote/objectbox.g.dart';
import 'package:stadtbote/tools/constants.dart';
import 'package:stadtbote/tools/messages/publish_payload_message.dart';
void main() {
setUp(() {
MQClient.initialize();
MQClient.instance.declareQueue(Constants.messageTopicPublishPayload);
});
tearDown(() {
MQClient.instance.close();
});
testWidgets('bestätigt die Server-ID auch nach der lokalen ID-Vergabe', (
tester,
) async {
final message = ChatMessage.fromJson({
'id': 6094830,
'time': 1791536566,
'from': 'NL',
'subj': 'Test1',
'text': 'Test2',
});
final store = _MessageStore();
final definition =
getObjectBoxModel().bindings[ChatMessage]!
as EntityDefinition<ChatMessage>;
// Die nativen Datenbankzugriffe werden ersetzt; die generierte
// ObjectBox-Serialisierung und der Nachrichtenversand laufen unverändert.
definition.setId(message, 2);
final builder = fb.Builder();
definition.objectToFB(message, builder);
final restored = definition.objectFromFB(
store,
ByteData.sublistView(builder.buffer),
);
expect(restored.id, 2);
expect(restored.externalId, 6094830);
expect(restored.read, isFalse);
store.messages = _MessageBox(restored);
MyApp.objectBoxStore = store;
await tester.pumpWidget(
const MaterialApp(home: Scaffold(body: MessagesPage())),
);
await tester.pumpAndSettle();
final published =
MQClient.instance
.getLatestMessage(Constants.messageTopicPublishPayload)!
.payload
as PublishPayloadMessage;
expect(published.topic, 'mssg_received');
expect(published.acknowledgeRequired, isFalse);
expect(jsonDecode(jsonEncode(published.message)), {
'ids': ['6094830'],
'time': isA<int>(),
});
expect(restored.read, isTrue);
expect(find.text('Test1\nTest2', findRichText: true), findsOneWidget);
});
}
class _MessageStore extends Fake implements Store {
late final _MessageBox messages;
@override
Box<T> box<T>() {
if (T == ChatMessage) return messages as Box<T>;
if (T == SessionStatus) return _SessionBox() as Box<T>;
throw StateError('Unerwarteter Entity-Typ: $T');
}
}
class _SessionBox extends Fake implements Box<SessionStatus> {
@override
List<SessionStatus> getAll() => [];
}
class _MessageBox extends Fake implements Box<ChatMessage> {
final ChatMessage message;
_MessageBox(this.message);
@override
List<ChatMessage> getAll() => [message];
@override
QueryBuilder<ChatMessage> query([Condition<ChatMessage>? qc]) =>
_UnreadQueryBuilder(message);
@override
int put(ChatMessage object, {PutMode mode = PutMode.put}) => object.id;
}
class _UnreadQueryBuilder extends Fake implements QueryBuilder<ChatMessage> {
final ChatMessage message;
_UnreadQueryBuilder(this.message);
@override
Query<ChatMessage> build() => _UnreadQuery(message);
}
class _UnreadQuery extends Fake implements Query<ChatMessage> {
final ChatMessage message;
_UnreadQuery(this.message);
@override
List<ChatMessage> find() => [if (!message.read) message];
@override
void close() {}
}