Aufgabenliste in Workflow umbenannt und Nachrichtenbestätigung abgesichert
This commit is contained in:
1 parent
5e7babf265
commit
d585da11b5
4 files changed
+142
-11
No files matched your search
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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() {}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user