added sent and id column again for add_cam_main

id checks if entry already exists. sent says if the entry is already
sent to the db
This commit is contained in:
Nico
2025-05-12 18:18:36 +02:00
parent a5769a7dc0
commit ecafe2df02
7 changed files with 518 additions and 607 deletions

View File

@@ -9,7 +9,7 @@ abstract interface class IDb {
Future<int> addMainEntry(Map<String, String> excursion);
Future<void> updateMainEntry(Map<String, String> excursion);
Future<int> updateMainEntry(Map<String, String> excursion);
Future<void> updateSent(int id);

View File

@@ -65,10 +65,10 @@ class ExcursionDBHelper implements IDb{
}
@override
Future<void> updateMainEntry(Map<String, String> excursion) async {
Future<int> updateMainEntry(Map<String, String> excursion) async {
var excursionDBClient = await dB;
await excursionDBClient
return await excursionDBClient
.update('excursion', excursion, where: "ID = ?", whereArgs: [excursion['ID']]);
}

View File

@@ -64,10 +64,10 @@ class PlaceDBHelper implements IDb{
}
@override
Future<void> updateMainEntry(Map<String, String> place) async {
Future<int> updateMainEntry(Map<String, String> place) async {
var placeDBClient = await dB;
await placeDBClient
return await placeDBClient
.update('place', place, where: "ID = ?", whereArgs: [place['ID']]);
}

View File

@@ -27,12 +27,13 @@ class AddCamMain extends StatefulWidget {
final bool isSent;
final Map<String, dynamic>? existingData;
const AddCamMain(
{super.key,
const AddCamMain({
super.key,
this.isTemplate = false,
this.existingData,
this.isFinished = false,
this.isSent = false});
this.isSent = false,
});
@override
State<AddCamMain> createState() => _AddCamMainState();
@@ -42,7 +43,6 @@ class _AddCamMainState extends State<AddCamMain> {
// var declaration
int currentStep = 0;
String selectedStatus = 'aktiv';
String selectedFotoFilm = 'Foto';
String selectedMEZ = 'Sommerzeit';
@@ -58,7 +58,8 @@ class _AddCamMainState extends State<AddCamMain> {
speed: 0.0,
speedAccuracy: 0.0,
altitudeAccuracy: 0.0,
headingAccuracy: 0.0);
headingAccuracy: 0.0,
);
DateTime? abbauDat;
DateTime datum = DateTime.now();
@@ -66,146 +67,51 @@ class _AddCamMainState extends State<AddCamMain> {
DateTime? protoAm = DateTime.now();
Map<String, Map<String, dynamic>> rmap = {
"ID": {"controller": TextEditingController(), "required": false},
// Step 1
"Standort": {
"controller": TextEditingController(),
"required": true,
},
"Status": {
"controller": TextEditingController(),
"required": true,
},
"Betreuung": {
"controller": TextEditingController(),
"required": false,
},
"CID": {
"controller": TextEditingController(),
"required": true,
},
"FFTyp": {
"controller": TextEditingController(),
"required": true,
},
"MEZ": {
"controller": TextEditingController(),
"required": true,
},
"KSchloNr": {
"controller": TextEditingController(),
"required": false,
},
"Rudel": {
"controller": TextEditingController(),
"required": true,
},
"Standort": {"controller": TextEditingController(), "required": true},
"Status": {"controller": TextEditingController(), "required": true},
"Betreuung": {"controller": TextEditingController(), "required": false},
"CID": {"controller": TextEditingController(), "required": true},
"FFTyp": {"controller": TextEditingController(), "required": true},
"MEZ": {"controller": TextEditingController(), "required": true},
"KSchloNr": {"controller": TextEditingController(), "required": false},
"Rudel": {"controller": TextEditingController(), "required": true},
// Step 2
"DECLNG": {
"controller": TextEditingController(),
"required": false,
},
"DECLAT": {
"controller": TextEditingController(),
"required": false,
},
"BLand": {
"controller": TextEditingController(),
"required": true,
},
"Lkr": {
"controller": TextEditingController(),
"required": true,
},
"BeiOrt": {
"controller": TextEditingController(),
"required": true,
},
"OrtInfo": {
"controller": TextEditingController(),
"required": false,
},
"Platzung": {
"controller": TextEditingController(),
"required": true,
},
"DECLNG": {"controller": TextEditingController(), "required": false},
"DECLAT": {"controller": TextEditingController(), "required": false},
"BLand": {"controller": TextEditingController(), "required": true},
"Lkr": {"controller": TextEditingController(), "required": true},
"BeiOrt": {"controller": TextEditingController(), "required": true},
"OrtInfo": {"controller": TextEditingController(), "required": false},
"Platzung": {"controller": TextEditingController(), "required": true},
// Step 3
"Datum": {
"controller": TextEditingController(),
"required": false,
},
"KontDat": {
"controller": TextEditingController(),
"required": false,
},
"KTage1": {
"controller": TextEditingController(),
"required": true,
},
"KTage2": {
"controller": TextEditingController(),
"required": true,
},
"AbbauDat": {
"controller": TextEditingController(),
"required": false,
},
"Auftrag": {
"controller": TextEditingController(),
"required": false,
},
"KontAbsp": {
"controller": TextEditingController(),
"required": false,
},
"SonstBem": {
"controller": TextEditingController(),
"required": false,
},
"Datum": {"controller": TextEditingController(), "required": false},
"KontDat": {"controller": TextEditingController(), "required": false},
"KTage1": {"controller": TextEditingController(), "required": true},
"KTage2": {"controller": TextEditingController(), "required": true},
"AbbauDat": {"controller": TextEditingController(), "required": false},
"Auftrag": {"controller": TextEditingController(), "required": false},
"KontAbsp": {"controller": TextEditingController(), "required": false},
"SonstBem": {"controller": TextEditingController(), "required": false},
// Step 4
"Adresse1": {
"controller": TextEditingController(),
"required": true,
},
"Adresse2": {
"controller": TextEditingController(),
"required": false,
},
"Adresse3": {
"controller": TextEditingController(),
"required": false,
},
"FKontakt1": {
"controller": TextEditingController(),
"required": false,
},
"FKontakt2": {
"controller": TextEditingController(),
"required": false,
},
"FKontakt3": {
"controller": TextEditingController(),
"required": false,
},
"IntKomm": {
"controller": TextEditingController(),
"required": false,
},
"Adresse1": {"controller": TextEditingController(), "required": true},
"Adresse2": {"controller": TextEditingController(), "required": false},
"Adresse3": {"controller": TextEditingController(), "required": false},
"FKontakt1": {"controller": TextEditingController(), "required": false},
"FKontakt2": {"controller": TextEditingController(), "required": false},
"FKontakt3": {"controller": TextEditingController(), "required": false},
"IntKomm": {"controller": TextEditingController(), "required": false},
// Gone?
"ProtoAm": {
"controller": TextEditingController(),
"required": false,
},
"FotoFilm": {
"controller": TextEditingController(),
"required": false,
},
"ProtoAm": {"controller": TextEditingController(), "required": false},
"FotoFilm": {"controller": TextEditingController(), "required": false},
"Sent": {"controller": TextEditingController(), "required": false},
};
Map<String, String> getFieldsText() {
Map<String, String> puff = {};
@@ -216,7 +122,6 @@ class _AddCamMainState extends State<AddCamMain> {
return puff;
}
@override
void initState() {
// updates the currentPosition var after the _determine position has finished. Means user view updates with his live location
@@ -226,12 +131,16 @@ class _AddCamMainState extends State<AddCamMain> {
if (error is LocationDisabledException) {
if (mounted) {
SnackBarHelper.showSnackBarMessage(
context, AppLocalizations.of(context)!.locationDisabled);
context,
AppLocalizations.of(context)!.locationDisabled,
);
}
} else if (error is LocationForbiddenException) {
if (mounted) {
SnackBarHelper.showSnackBarMessage(
context, AppLocalizations.of(context)!.locationForbidden);
context,
AppLocalizations.of(context)!.locationForbidden,
);
}
}
return currentPosition;
@@ -241,13 +150,8 @@ class _AddCamMainState extends State<AddCamMain> {
rmap["Status"]!["controller"]!.text = selectedStatus;
// If a template is edited this fills in the existing values
var firstRun = true;
if (widget.existingData?.isNotEmpty ?? false) {
for (var key in widget.existingData!.keys) {
if (firstRun) {
firstRun = false;
continue;
}
rmap[key]!["controller"]!.text =
widget.existingData?[key].toString() ?? "";
}
@@ -286,21 +190,17 @@ class _AddCamMainState extends State<AddCamMain> {
dbDesignation: DatabasesEnum.place,
),
),
const SizedBox(
height: 5,
),
const SizedBox(height: 5),
// --------------------
Align(
alignment: Alignment.bottomLeft,
child: Row(
children: [
Text(AppLocalizations.of(context)!.status),
const Text(
'*',
style: TextStyle(color: Colors.red),
),
const Text('*', style: TextStyle(color: Colors.red)),
],
)),
),
),
Status(
initialStatus: selectedStatus,
onStatusChanged: (status) {
@@ -317,9 +217,7 @@ class _AddCamMainState extends State<AddCamMain> {
required: false,
dbDesignation: DatabasesEnum.place,
),
const SizedBox(
height: 20,
),
const SizedBox(height: 20),
// --------------------
VarTextField(
textController: rmap["CID"]!["controller"],
@@ -336,21 +234,17 @@ class _AddCamMainState extends State<AddCamMain> {
required: true,
dbDesignation: DatabasesEnum.place,
),
const SizedBox(
height: 15,
),
const SizedBox(height: 15),
// --------------------
Align(
alignment: Alignment.bottomLeft,
child: Row(
children: [
Text(AppLocalizations.of(context)!.zeiteinstellung),
const Text(
'*',
style: TextStyle(color: Colors.red),
)
const Text('*', style: TextStyle(color: Colors.red)),
],
)),
),
),
MEZ(
initialMEZ: selectedMEZ,
onMEZChanged: (mez) {
@@ -360,9 +254,7 @@ class _AddCamMainState extends State<AddCamMain> {
});
},
),
const SizedBox(
height: 15,
),
const SizedBox(height: 15),
// --------------------
VarTextField(
textController: rmap["KSchloNr"]!["controller"],
@@ -371,9 +263,7 @@ class _AddCamMainState extends State<AddCamMain> {
required: false,
dbDesignation: DatabasesEnum.place,
),
const SizedBox(
height: 5,
),
const SizedBox(height: 5),
// --------------------
VarTextField(
textController: rmap["Rudel"]!["controller"],
@@ -382,11 +272,10 @@ class _AddCamMainState extends State<AddCamMain> {
required: true,
dbDesignation: DatabasesEnum.place,
),
const SizedBox(
height: 15,
),
const SizedBox(height: 15),
],
)),
),
),
// Second step
Step(
@@ -401,14 +290,12 @@ class _AddCamMainState extends State<AddCamMain> {
Text(currentPosition.longitude.toString()),
],
),
const SizedBox(
width: 15,
),
const SizedBox(width: 15),
ElevatedButton(
onPressed: () async {
final result = await Navigator.of(context)
.push<LatLng>(
MaterialPageRoute(builder: (context) {
final result = await Navigator.of(context).push<LatLng>(
MaterialPageRoute(
builder: (context) {
return Karte(
ortInfoC: rmap["OrtInfo"]!["controller"],
beiOrtC: rmap["BeiOrt"]!["controller"],
@@ -416,7 +303,9 @@ class _AddCamMainState extends State<AddCamMain> {
decLatC: rmap["DECLAT"]!["controller"],
decLngC: rmap["DECLNG"]!["controller"],
);
}));
},
),
);
if (result != null) {
setState(() {
currentPosition = Position(
@@ -434,7 +323,8 @@ class _AddCamMainState extends State<AddCamMain> {
});
}
},
child: Text(AppLocalizations.of(context)!.openMap)),
child: Text(AppLocalizations.of(context)!.openMap),
),
],
),
// --------------------
@@ -470,21 +360,17 @@ class _AddCamMainState extends State<AddCamMain> {
required: false,
dbDesignation: DatabasesEnum.place,
),
const SizedBox(
height: 15,
),
const SizedBox(height: 15),
// --------------------
Align(
alignment: Alignment.bottomLeft,
child: Row(
children: [
Text(AppLocalizations.of(context)!.platzung),
const Text(
'*',
style: TextStyle(color: Colors.red),
)
const Text('*', style: TextStyle(color: Colors.red)),
],
)),
),
),
Platzung(
initialPlatzung: selectedPlatzung,
onPlatzungChanged: (platzung) {
@@ -495,7 +381,8 @@ class _AddCamMainState extends State<AddCamMain> {
},
),
],
)),
),
),
// Third step
Step(
title: Text(AppLocalizations.of(context)!.thirdstep),
@@ -521,29 +408,21 @@ class _AddCamMainState extends State<AddCamMain> {
});
},
),
const SizedBox(
height: 20,
),
const SizedBox(height: 20),
// --------------------
Align(
alignment: Alignment.bottomLeft,
child: Row(
children: [
Text(AppLocalizations.of(context)!.ktage),
const Text(
'*',
style: TextStyle(color: Colors.red),
),
const Text('*', style: TextStyle(color: Colors.red)),
],
),
),
Row(
children: [
Expanded(
child: Text(AppLocalizations.of(context)!.ktage1)),
const SizedBox(
width: 15,
),
Expanded(child: Text(AppLocalizations.of(context)!.ktage1)),
const SizedBox(width: 15),
Expanded(
flex: 4,
child: VarTextField(
@@ -553,16 +432,14 @@ class _AddCamMainState extends State<AddCamMain> {
dbName: "KTage1",
required: true,
dbDesignation: DatabasesEnum.place,
))
),
),
],
),
Row(
children: [
Expanded(
child: Text(AppLocalizations.of(context)!.ktage2)),
const SizedBox(
width: 15,
),
Expanded(child: Text(AppLocalizations.of(context)!.ktage2)),
const SizedBox(width: 15),
Expanded(
flex: 4,
child: VarTextField(
@@ -572,12 +449,11 @@ class _AddCamMainState extends State<AddCamMain> {
dbName: "KTage2",
required: true,
dbDesignation: DatabasesEnum.place,
))
),
),
],
),
const SizedBox(
height: 20,
),
const SizedBox(height: 20),
// --------------------
Row(
children: [
@@ -591,9 +467,7 @@ class _AddCamMainState extends State<AddCamMain> {
),
],
),
const SizedBox(
height: 20,
),
const SizedBox(height: 20),
// --------------------
VarTextField(
textController: rmap["Auftrag"]!["controller"]!,
@@ -613,13 +487,14 @@ class _AddCamMainState extends State<AddCamMain> {
// --------------------
VarTextField(
textController: rmap["SonstBem"]!["controller"]!,
localization:
AppLocalizations.of(context)!.sonstbemerkungen,
localization: AppLocalizations.of(context)!.sonstbemerkungen,
dbName: "SonstBem",
dbDesignation: DatabasesEnum.place,
required: false),
required: false,
),
],
)),
),
),
// Fourth step
Step(
title: Text(AppLocalizations.of(context)!.fourthstep),
@@ -649,9 +524,7 @@ class _AddCamMainState extends State<AddCamMain> {
required: false,
dbDesignation: DatabasesEnum.place,
),
const SizedBox(
height: 15,
),
const SizedBox(height: 15),
// --------------------
VarTextField(
textController: rmap["FKontakt1"]!["controller"]!,
@@ -685,7 +558,8 @@ class _AddCamMainState extends State<AddCamMain> {
dbDesignation: DatabasesEnum.place,
),
],
))
),
),
];
// Here the site is built with the steps from above
@@ -693,8 +567,11 @@ class _AddCamMainState extends State<AddCamMain> {
appBar: AppBar(title: Text(AppLocalizations.of(context)!.addplace)),
body: PageTransitionSwitcher(
duration: const Duration(milliseconds: 800),
transitionBuilder: (Widget child, Animation<double> animation,
Animation<double> secondaryAnimation) {
transitionBuilder: (
Widget child,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
return SharedAxisTransition(
animation: animation,
secondaryAnimation: secondaryAnimation,
@@ -719,7 +596,10 @@ class _AddCamMainState extends State<AddCamMain> {
if (!isLastStep) {
saveTemplate(
getFieldsText(), DatabasesEnum.place, widget.isTemplate);
getFieldsText(),
DatabasesEnum.place,
widget.isTemplate,
);
setState(() {
currentStep += 1;
});
@@ -728,19 +608,31 @@ class _AddCamMainState extends State<AddCamMain> {
if (widget.isSent) {
Navigator.pushNamedAndRemoveUntil(
context, '/home', (route) => false);
context,
'/home',
(route) => false,
);
return;
}
bool empty = CheckRequired.checkRequired(rmap);
// TODO for debugging always true
empty = false;
if (empty == true) {
AddEntriesDialogHelper.showTemplateDialog(context, getFieldsText(),
widget.existingData?.isNotEmpty ?? false);
AddEntriesDialogHelper.showTemplateDialog(
context,
getFieldsText(),
widget.existingData?.isNotEmpty ?? false,
);
return;
} else if (empty == false) {
await AddEntriesDialogHelper.showSaveOptionsDialog(
context, getFieldsText(), widget.isTemplate);
context,
getFieldsText(),
widget.isTemplate,
DatabasesEnum.place,
);
}
}
},

View File

@@ -360,6 +360,7 @@ class _ExcursionMainState extends State<ExcursionMain> {
context,
getFieldsText(),
false,
DatabasesEnum.excursion
);
}
}

View File

@@ -7,7 +7,7 @@ import 'package:fforte/screens/sharedMethods/save_main_entry.dart';
import 'package:flutter/material.dart';
import 'package:fforte/l10n/app_localizations.dart';
class DialogHelper {
class AddEntriesDialogHelper {
// Function to show the dialog where the user has to choose if he want to safe his values as a template
static Future<void> showTemplateDialog(BuildContext context,
Map<String, String> saveData, bool update) async {
@@ -36,7 +36,7 @@ class DialogHelper {
}
static Future<dynamic> showServerErrorDialog(
BuildContext context, Map<String, String> saveData, bool isTemplate) {
BuildContext context, Map<String, String> saveData, bool isTemplate, DatabasesEnum dbType) {
bool isLoading = false;
return showDialog(
@@ -62,12 +62,12 @@ class DialogHelper {
if (errorCode != 201 && context.mounted) {
showServerErrorDialog(
context, saveData, isTemplate);
context, saveData, isTemplate, dbType);
} else {
if (context.mounted) Navigator.pop(context);
// saveData(true);
SaveMainEntryMethod.saveEntry(
entryData: saveData, isTemplate: isTemplate);
entryData: saveData, isTemplate: isTemplate, dbType: dbType);
if (context.mounted) showSuccessDialog(context);
}
},
@@ -86,7 +86,7 @@ class DialogHelper {
}
static Future<void> showSaveOptionsDialog(BuildContext context,
Map<String, String> saveData, bool isTemplate) async {
Map<String, String> saveData, bool isTemplate, DatabasesEnum dbType) async {
bool isLoading = false;
return showDialog(
@@ -126,15 +126,16 @@ class DialogHelper {
if (errorCode != 201 || !context.mounted) {
SaveMainEntryMethod.saveEntry(
entryData: saveData, isTemplate: isTemplate);
entryData: saveData, isTemplate: isTemplate, dbType: dbType);
if (context.mounted) {
DialogHelper.showServerErrorDialog(
context, saveData, isTemplate);
AddEntriesDialogHelper.showServerErrorDialog(
context, saveData, isTemplate, dbType);
}
} else {
SaveMainEntryMethod.saveEntry(
entryData: saveData,
isTemplate: isTemplate,
dbType: dbType,
sent: true);
showSuccessDialog(context);
}
@@ -148,7 +149,7 @@ class DialogHelper {
try {
SaveMainEntryMethod.saveEntry(
entryData: saveData, isTemplate: isTemplate);
entryData: saveData, isTemplate: isTemplate, dbType: dbType);
SaveFileMethod.saveFile(
saveData,
AppLocalizations.of(context)!.savefilefailed,
@@ -165,7 +166,7 @@ class DialogHelper {
TextButton(
onPressed: () {
SaveMainEntryMethod.saveEntry(
entryData: saveData, isTemplate: isTemplate);
entryData: saveData, isTemplate: isTemplate, dbType: dbType);
Navigator.pushNamedAndRemoveUntil(
context, '/home', (route) => false);
},

View File

@@ -1,21 +1,38 @@
import 'package:fforte/enums/databases.dart';
import 'package:fforte/interfaces/i_db.dart';
import 'package:fforte/methods/excursion_db_helper.dart';
import 'package:fforte/methods/place_db_helper.dart';
class SaveMainEntryMethod {
static void saveEntry(
{required Map<String, String> entryData,
static void saveEntry({
required Map<String, String> entryData,
required bool isTemplate,
bool sent = false}) async {
var placeDB = PlaceDBHelper();
required DatabasesEnum dbType,
bool sent = false,
}) async {
// Get the ID of the newly added or updated place
int newPlaceId = await placeDB.addMainEntry(entryData);
IDb? placeDB;
if (sent == true) {
placeDB.updateSent(newPlaceId); // Update 'Sent' using the correct ID
if (dbType == DatabasesEnum.place) {
placeDB = PlaceDBHelper();
} else if (dbType == DatabasesEnum.excursion) {
placeDB = ExcursionDBHelper();
}
int entryId;
// Get the ID of the newly added or updated place
if (entryData["ID"] == "") {
entryData.remove("ID");
entryId = await placeDB!.addMainEntry(entryData);
} else {
entryId = await placeDB!.updateMainEntry(entryData);
}
if (sent == true) {
placeDB.updateSent(entryId); // Update 'Sent' using the correct ID
}
if (isTemplate) {
await placeDB.deleteTemplateById(entryData["CID"]!);
}
}
}