Task-Typnummern neu zugeordnet und benutzerdefinierte Typen via effectiveType unterstuetzt

- TourTask: base_type-Feld und effectiveType-Getter ergaenzt; benutzerdefinierte
  Typen (>= 1000) aus dem Workflow-Editor werden auf ihren Basis-Typ abgebildet,
  bei Altdaten ohne base_type wird der Basis-Typ aus den Eigenschaften abgeleitet
- TaskListPage: alle Typ-Switches auf effectiveType und die neuen Typnummern
  umgestellt (u.a. Ankunft 1->3, Fotos 3->4, Bestaetigung 6->12, Listen 12-14->13-15)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Sven CarstensenandClaude Fable 5 committed 2026-08-03 14:29:22 +02:00
1 parent aa44311776
commit ac4266079a
2 files changed
+88 -54

No files matched your search

+35 -3
View File
@@ -1,6 +1,16 @@
class TourTask {
/// Untergrenze der im Workflow-Editor vergebenen Typnummern für
/// benutzerdefinierte Typen.
static const int customTypeStart = 1000;
late int sId;
late int type;
/// Typnummer des Basis-Typs bei benutzerdefinierten Typen
/// (>= [customTypeStart]) aus dem Workflow-Editor. `null` bei
/// Standard-Typen und bei Altdaten ohne Angabe.
int? baseType;
late String topic;
bool? opt;
bool? reenter;
@@ -17,15 +27,36 @@ class TourTask {
/// Auswahloptionen eines Status-Tasks (Typ 11).
List<TourChoice>? choices;
/// Eingabefelder einer Text-/Zahlen-Liste (Typ 12/13).
/// Eingabefelder einer Text-/Zahlen-Liste (Typ 13/14).
List<TourField>? fields;
TourTask();
/// Der für Darstellung und Validierung maßgebliche Typ: Standard-Typen
/// unverändert; benutzerdefinierte Typen (>= [customTypeStart]) werden auf
/// ihren Basis-Typ abgebildet. Fehlt {@code base_type} (Altdaten), wird der
/// Basis-Typ aus den typprägenden Eigenschaften abgeleitet.
int get effectiveType {
if (type < customTypeStart) {
return type;
}
if (baseType != null) {
return baseType!;
}
if (choices != null && choices!.isNotEmpty) return 11; // Statusauswahl
if (entries != null && entries!.isNotEmpty) return 15; // Checkbox-Liste
if (fields != null && fields!.isNotEmpty) return 13; // Text-Liste
if (min != null || max != null) return 4; // Fotos
if (maxLen != null) return 8; // Texteingabe (Bemerkung)
if (track != null) return 3; // Ankunft melden
return 12; // Bestätigung per Checkbox
}
factory TourTask.fromJson(Map<String, dynamic> json) {
final task = TourTask();
task.sId = json['s_id'] as int;
task.type = json['type'] as int;
task.baseType = json['base_type'] as int?;
task.topic = json['topic'] as String;
task.opt = json['opt'] as bool? ?? false;
task.reenter = json['reenter'] as bool? ?? false;
@@ -59,6 +90,7 @@ class TourTask {
return {
's_id': sId,
'type': type,
if (baseType != null) 'base_type': baseType,
'topic': topic,
'opt': opt,
'reenter': reenter,
@@ -82,7 +114,7 @@ class TourEntry {
late String text;
late bool queryRemark;
/// Pflicht-Kennzeichen aus dem Workflow-Editor (Checkbox-Liste, Typ 14).
/// Pflicht-Kennzeichen aus dem Workflow-Editor (Checkbox-Liste, Typ 15).
/// `null`, wenn das JSON keine Angabe enthält (Altdaten).
bool? required;
@@ -145,7 +177,7 @@ class TourChoice {
bool get requiresRemark => (quest != null && quest!.trim().isNotEmpty);
}
/// Ein Eingabefeld einer Text-/Zahlen-Liste (Typ 12/13).
/// Ein Eingabefeld einer Text-/Zahlen-Liste (Typ 13/14).
class TourField {
String? title;
String? placeholder;