luc sitzung

This commit is contained in:
nico
2024-05-08 21:56:09 +02:00
parent 77f14257d3
commit 3d08e7d968
12 changed files with 221 additions and 231 deletions

View File

@@ -17,7 +17,11 @@ class AddCamMain extends StatefulWidget {
final bool isFinished;
final Map<String, dynamic>? existingData;
const AddCamMain({super.key, this.isTemplate = false, this.existingData, this.isFinished = false});
const AddCamMain(
{super.key,
this.isTemplate = false,
this.existingData,
this.isFinished = false});
@override
State<AddCamMain> createState() => _AddCamMainState();
@@ -52,11 +56,9 @@ class _AddCamMainState extends State<AddCamMain> {
TextEditingController betreuungC = TextEditingController();
String selectedStatus = 'aktiv';
String selectedSTTyp = 'opportunistisch';
String selectedFotoFilm = 'Foto';
String selectedMEZ = 'Sommerzeit';
String selectedPlatzung = 'Kirrung';
String selectedBearsafe = 'Nein';
String selectedPlatzung = '';
Position currentPosition = Position(
longitude: 10.0,
@@ -89,13 +91,11 @@ class _AddCamMainState extends State<AddCamMain> {
'BeiOrt': beiOrtC.text,
'OrtInfo': ortInfoC.text,
'Status': selectedStatus,
'STTyp': selectedSTTyp,
'FFTyp': ffTypC.text,
'FotoFilm': selectedFotoFilm,
'MEZ': selectedMEZ,
'Platzung': selectedPlatzung,
'KSchloNr': kSchloNrC.text,
'Bearsafe': selectedBearsafe,
'KontDat': kontDat.toString().split(" ").first,
'AbbauDat': abbauDat.toString().split(" ").first.replaceAll("null", ""),
'Auftrag': auftragC.text,
@@ -179,16 +179,16 @@ class _AddCamMainState extends State<AddCamMain> {
beiOrtC.text = widget.existingData!['BeiOrt'];
ortInfoC.text = widget.existingData!['OrtInfo'];
selectedStatus = widget.existingData!['Status'];
selectedSTTyp = widget.existingData!['STTyp'];
ffTypC.text = widget.existingData!['FFTyp'];
selectedFotoFilm = widget.existingData!['FotoFilm'];
selectedMEZ = widget.existingData!['MEZ'];
selectedPlatzung = widget.existingData!['Platzung'];
kSchloNrC.text = widget.existingData!['KSchloNr'];
selectedBearsafe = widget.existingData!['Bearsafe'];
datum = DateTime.parse(widget.existingData!['Datum']);
kontDat = DateTime.parse(widget.existingData!['KontDat']);
abbauDat = widget.existingData!['AbbauDat'] == "" ? null : DateTime.parse(widget.existingData!['AbbauDat']);
abbauDat = widget.existingData!['AbbauDat'] == ""
? null
: DateTime.parse(widget.existingData!['AbbauDat']);
auftragC.text = widget.existingData!['Auftrag'];
kontAbspC.text = widget.existingData!['KontAbsp'];
sonstBemC.text = widget.existingData!['SonstBem'];
@@ -233,6 +233,35 @@ class _AddCamMainState extends State<AddCamMain> {
});
}
Future<dynamic> _showServerErrorDialog() {
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(AppLocalizations.of(context)!.servererrortitle),
actions: [
TextButton(
onPressed: () async {
int errorCode = _httpRequest();
if (errorCode != 201) {
Navigator.pop(context);
_showServerErrorDialog();
}
},
child: Text(AppLocalizations.of(context)!.sendagain)),
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text(AppLocalizations.of(context)!.cancel))
],
);
});
}
Future<void> showSaveOptionsDialog() async {
return showDialog(
context: context,
@@ -252,13 +281,38 @@ class _AddCamMainState extends State<AddCamMain> {
child: Text(AppLocalizations.of(context)!.template)),
TextButton(
onPressed: () async {
_httpRequest();
saveData();
Navigator.pushNamedAndRemoveUntil(
// ignore: use_build_context_synchronously
context,
'/home',
(route) => false);
int errorCode = _httpRequest();
if (errorCode != 201) {
saveData();
_showServerErrorDialog();
} else {
saveData();
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(
AppLocalizations.of(context)!.successful),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text(
AppLocalizations.of(context)!.back)),
TextButton(
onPressed: () {
Navigator.pushNamedAndRemoveUntil(
context, '/home', (route) => false);
},
child: Text(AppLocalizations.of(context)!
.continueB))
],
);
});
}
},
child: Text(AppLocalizations.of(context)!.sendtoserver)),
TextButton(
@@ -269,14 +323,15 @@ class _AddCamMainState extends State<AddCamMain> {
},
child: Text(AppLocalizations.of(context)!.saveasfile)),
TextButton(
onPressed: () {
saveData();
onPressed: () {
saveData();
Navigator.pushNamedAndRemoveUntil(
// ignore: use_build_context_synchronously
context,
'/home',
(route) => false);
}, child: Text(AppLocalizations.of(context)!.justsave)),
},
child: Text(AppLocalizations.of(context)!.justsave)),
TextButton(
onPressed: () {
Navigator.pop(context);
@@ -287,13 +342,15 @@ class _AddCamMainState extends State<AddCamMain> {
});
}
int _httpRequest() {
void _httpRequest() async {
Map<String, dynamic> place = getPlace();
Methods(jsonEncode(place)).httpRequest();
Methods method = Methods();
method.httpRequest(jsonEncode(place));
return method.errorCode;
}
Future<void> saveFile() async {
@@ -310,7 +367,8 @@ class _AddCamMainState extends State<AddCamMain> {
await prefs.setString('saveDir', selectedDirectory);
// ignore: use_build_context_synchronously
File file = File('$selectedDirectory/${AppLocalizations.of(context)!.justplace}-${standortC.text}.txt');
File file = File(
'$selectedDirectory/${AppLocalizations.of(context)!.justplace}-${standortC.text}.txt');
try {
await file.writeAsString(jsonPlace);
@@ -346,7 +404,6 @@ class _AddCamMainState extends State<AddCamMain> {
'Lkr': lkrC,
'BeiOrt': beiOrtC,
'Status': TextEditingController(text: selectedStatus),
'STTyp': TextEditingController(text: selectedSTTyp),
'FFTyp': ffTypC,
'FotoFilm': TextEditingController(text: selectedFotoFilm),
'MEZ': TextEditingController(text: selectedMEZ),
@@ -418,14 +475,6 @@ class _AddCamMainState extends State<AddCamMain> {
const SizedBox(
height: 1,
),
STTyp(
initialSTTyp: selectedSTTyp,
onSTTypChanged: (sttyp) {
setState(() {
selectedSTTyp = sttyp;
});
},
),
const SizedBox(
height: 5,
),
@@ -488,21 +537,6 @@ class _AddCamMainState extends State<AddCamMain> {
});
},
),
Align(
alignment: Alignment.bottomLeft,
child: Row(
children: [
Text(AppLocalizations.of(context)!.bearsafe),
],
)),
Bearsafe(
initialBearsafe: selectedBearsafe,
onBearsafeChanged: (bearsafe) {
setState(() {
selectedBearsafe = bearsafe;
});
},
),
const SizedBox(
height: 15,
),
@@ -530,20 +564,24 @@ class _AddCamMainState extends State<AddCamMain> {
title: Text(AppLocalizations.of(context)!.secondstep),
content: Column(
children: [
Align(
alignment: Alignment.bottomLeft,
child: Text(currentPosition.latitude.toString())),
Align(
alignment: Alignment.bottomLeft,
child: Text(currentPosition.longitude.toString())),
Align(
alignment: Alignment.bottomLeft,
child: ElevatedButton(
Row(
children: [
Column(
children: [
Text(currentPosition.latitude.toString()),
Text(currentPosition.longitude.toString()),
],
),
const SizedBox(width: 15,),
ElevatedButton(
onPressed: () async {
final result = await Navigator.of(context)
.push<LatLng>(
MaterialPageRoute(builder: (context) {
return Karte(
ortInfoC: ortInfoC,
beiOrtC: beiOrtC,
currentPosition: currentPosition,
onPositionChange: (updatedPosition) {
@@ -571,6 +609,7 @@ class _AddCamMainState extends State<AddCamMain> {
}
},
child: Text(AppLocalizations.of(context)!.openMap)),
],
),
VarTextField(
textController: bLandC,
@@ -609,6 +648,7 @@ class _AddCamMainState extends State<AddCamMain> {
],
)),
Platzung(
initialPlatzung: selectedPlatzung,
onPlatzungChanged: (platzung) {
setState(() {
selectedPlatzung = platzung;

View File

@@ -147,6 +147,7 @@ class _VarTextFieldState extends State<VarTextField> {
class Karte extends StatefulWidget {
final TextEditingController beiOrtC;
final TextEditingController ortInfoC;
final Position currentPosition;
final Function(Position) onPositionChange;
@@ -154,7 +155,7 @@ class Karte extends StatefulWidget {
{super.key,
required this.currentPosition,
required this.onPositionChange,
required this.beiOrtC});
required this.beiOrtC, required this.ortInfoC});
@override
KarteState createState() => KarteState();
@@ -196,10 +197,12 @@ class KarteState extends State<Karte> {
List<Placemark> placemarks = await placemarkFromCoordinates(
selectedPosition!.latitude,
selectedPosition!.longitude);
print(placemarks);
if (selectedPosition != null) {
setState(() {
widget.beiOrtC.text = placemarks.first.locality!;
widget.ortInfoC.text = placemarks.first.street!;
updatedPosition = Position(
longitude: selectedPosition!.longitude,
@@ -307,7 +310,7 @@ class _DatumState extends State<Datum> {
children: [
Row(children: [
SizedBox(
width: 125,
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();
@@ -468,10 +471,12 @@ class _STTypState extends State<STTyp> {
class Platzung extends StatefulWidget {
final Function(String) onPlatzungChanged;
final String? initialPlatzung;
const Platzung(
{super.key,
required this.onPlatzungChanged,
required this.onPlatzungChanged, this.initialPlatzung,
});
@override
@@ -481,6 +486,14 @@ class Platzung extends StatefulWidget {
class _PlatzungState extends State<Platzung> {
String? _selectedPlatzung;
@override
void initState() {
super.initState();
if (widget.initialPlatzung != "") {
_selectedPlatzung = widget.initialPlatzung;
}
}
@override
Widget build(BuildContext context) {
@@ -709,67 +722,6 @@ class _MEZState extends State<MEZ> {
}
}
// Bearsafe
class Bearsafe extends StatefulWidget {
final Function(String) onBearsafeChanged;
final String initialBearsafe;
const Bearsafe(
{super.key,
required this.onBearsafeChanged,
this.initialBearsafe = 'Nein'});
@override
State<Bearsafe> createState() => _BearsafeState();
}
class _BearsafeState extends State<Bearsafe> {
String? _selectedBearsafe;
@override
void initState() {
super.initState();
_selectedBearsafe = widget.initialBearsafe;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.nein),
leading: Radio<String>(
value: 'Nein',
groupValue: _selectedBearsafe,
onChanged: (value) {
setState(() {
_selectedBearsafe = value;
widget.onBearsafeChanged(value!);
});
},
),
),
ListTile(
visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.ja),
leading: Radio<String>(
value: 'Ja',
groupValue: _selectedBearsafe,
onChanged: (value) {
setState(() {
_selectedBearsafe = value;
widget.onBearsafeChanged(value!);
});
},
),
),
],
);
}
}
// KontDat
class KontDat extends StatefulWidget {
@@ -790,7 +742,7 @@ class _KontDatState extends State<KontDat> {
children: [
Row(children: [
SizedBox(
width: 125,
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();
@@ -847,7 +799,7 @@ class _AbbauDatState extends State<AbbauDat> {
children: [
Row(children: [
SizedBox(
width: 125,
width: 140,
child: ElevatedButton(
onPressed: () async {
final date = await pickDate();

View File

@@ -7,9 +7,9 @@ import 'addCam/add_cam_main.dart';
// * The homepage where you can choose to add something or view the database entries
class HomePage extends StatelessWidget {
const HomePage({super.key});
void _sendFile() async {
FilePickerResult? result = await FilePicker.platform.pickFiles();
@@ -17,42 +17,46 @@ class HomePage extends StatelessWidget {
if (result != null) {
File file = File(result.files.single.path!);
String content = await file.readAsString();
Methods(content).httpRequest();
}
Methods().httpRequest(content);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(AppLocalizations.of(context)!.homePageTitle),
actions: [
PopupMenuButton(
onSelected: (value) {
Navigator.pushNamed(context, value.toString());
},
itemBuilder: (context) => [
PopupMenuItem(
value: '/settings',
child: Text(AppLocalizations.of(context)!.settings),
),
PopupMenuItem(
value: '/introScreen',
child: Text(AppLocalizations.of(context)!.showloginscreen))
])
],
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.homePageTitle),
actions: [
PopupMenuButton(
onSelected: (value) {
Navigator.pushNamed(context, value.toString());
},
itemBuilder: (context) => [
PopupMenuItem(
value: '/settings',
child: Text(AppLocalizations.of(context)!.settings),
),
PopupMenuItem(
value: '/introScreen',
child:
Text(AppLocalizations.of(context)!.showloginscreen))
])
],
),
body: Column(
children: [
Image.asset('assets/images/reconix_small.png'),
Center(
child: Column(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(height: 30,),
ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size(250, 40),
padding: const EdgeInsets.fromLTRB(10, 5, 10, 5),
),
onPressed: () {
Navigator.push(
context,
@@ -60,11 +64,22 @@ class HomePage extends StatelessWidget {
builder: (context) => const AddCamMain()));
},
child: Text(AppLocalizations.of(context)!.addplace)),
ElevatedButton(onPressed: () => Navigator.pushNamed(context, '/viewCams'),
child: Text(AppLocalizations.of(context)!.viewplaces)),
ElevatedButton(onPressed: () {
_sendFile();
}, child: Text(AppLocalizations.of(context)!.sendfile))
const SizedBox(height: 10,),
ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size(250, 40)
),
onPressed: () => Navigator.pushNamed(context, '/viewCams'),
child: Text(AppLocalizations.of(context)!.viewplaces)),
const SizedBox(height: 10,),
ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size(250, 40)
),
onPressed: () {
_sendFile();
},
child: Text(AppLocalizations.of(context)!.sendfile))
],
)),
],

View File

@@ -93,5 +93,9 @@
"justplace": "Standort",
"justsave": "Nur speichern",
"finishedentrie": "Bereits fertiger Eintrag",
"justdelete": "Löschen"
"justdelete": "Löschen",
"servererrortitle": "Serverfehler",
"sendagain": "Nochmal senden",
"successful": "Erfolgreich",
"back": "Zurück"
}

View File

@@ -452,6 +452,26 @@
"justdelete": "Delete",
"@justdelete": {
"description": "just delete action pane label"
},
"servererrortitle": "Server Error",
"@servererrortitle": {
"description": "server error alert dialog title"
},
"sendagain": "Send again",
"@sendagain": {
"description": "send again option"
},
"successful": "successful",
"@successful": {
"description": "successful alert dialog title"
},
"back": "Back",
"@back": {
"description": "back alert dialog option"
}
}

View File

@@ -21,6 +21,7 @@ void main() async {
bool isFirstLaunch = prefs.getBool('isFirstLaunch') ?? true;
await prefs.setString('kTage1', "28");
await prefs.setString('kTage2', "48");
await prefs.setString('apiAddress', 'http://192.168.1.106/www.dbb-wolf.de/data/app24.php');
runApp(MyApp(isFirstLaunch: isFirstLaunch));
}

View File

@@ -30,9 +30,9 @@ class DBHelper {
// The function that helps
_onCreatePlace(Database placeDB, int version) async {
await placeDB.execute(
'CREATE TABLE place (ID INTEGER PRIMARY KEY AUTOINCREMENT, CID TEXT, Standort TEXT, Rudel TEXT, Datum DATE, Adresse1 TEXT, Adresse2 TEXT, Adresse3 TEXT, BLand TEXT, Lkr TEXT, BeiOrt TEXT, OrtInfo TEXT, Status TEXT, STTyp TEXT, FFTyp TEXT, FotoFilm TEXT, MEZ TEXT, Platzung TEXT, KSchloNr TEXT, Bearsafe TEXT, KontDat DATE, Betreuung TEXT, AbbauDat DATE, Auftrag TEXT, KontAbsp TEXT, SonstBem TEXT, FKontakt1 TEXT, FKontakt2 TEXT, FKontakt3 TEXT, KTage1 INTEGER, KTage2 INTEGER, ProtoAm DATE, IntKomm TEXT, DECLNG DECIMALS(4,8), DECLAT DECIMALS(4,8), Sent INTEGER DEFAULT 0)');
'CREATE TABLE place (ID INTEGER PRIMARY KEY AUTOINCREMENT, CID TEXT, Standort TEXT, Rudel TEXT, Datum DATE, Adresse1 TEXT, Adresse2 TEXT, Adresse3 TEXT, BLand TEXT, Lkr TEXT, BeiOrt TEXT, OrtInfo TEXT, Status TEXT, FFTyp TEXT, FotoFilm TEXT, MEZ TEXT, Platzung TEXT, KSchloNr TEXT, KontDat DATE, Betreuung TEXT, AbbauDat DATE, Auftrag TEXT, KontAbsp TEXT, SonstBem TEXT, FKontakt1 TEXT, FKontakt2 TEXT, FKontakt3 TEXT, KTage1 INTEGER, KTage2 INTEGER, ProtoAm DATE, IntKomm TEXT, DECLNG DECIMALS(4,8), DECLAT DECIMALS(4,8), Sent INTEGER DEFAULT 0)');
await placeDB.execute(
'CREATE TABLE templates (ID INTEGER PRIMARY KEY AUTOINCREMENT, CID TEXT, Standort TEXT, Rudel TEXT, Datum DATE, Adresse1 TEXT, Adresse2 TEXT, Adresse3 TEXT, BLand TEXT, Lkr TEXT, BeiOrt TEXT, OrtInfo TEXT, Status TEXT, STTyp TEXT, FFTyp TEXT, FotoFilm TEXT, MEZ TEXT, Platzung TEXT, KSchloNr TEXT, Bearsafe TEXT, KontDat DATE, Betreuung TEXT, AbbauDat DATE, Auftrag TEXT, KontAbsp TEXT, SonstBem TEXT, FKontakt1 TEXT, FKontakt2 TEXT, FKontakt3 TEXT, KTage1 INTEGER, KTage2 INTEGER, ProtoAm DATE, IntKomm TEXT, DECLNG DECIMALS(4,8), DECLAT DECIMALS(4,8))');
'CREATE TABLE templates (ID INTEGER PRIMARY KEY AUTOINCREMENT, CID TEXT, Standort TEXT, Rudel TEXT, Datum DATE, Adresse1 TEXT, Adresse2 TEXT, Adresse3 TEXT, BLand TEXT, Lkr TEXT, BeiOrt TEXT, OrtInfo TEXT, Status TEXT, FFTyp TEXT, FotoFilm TEXT, MEZ TEXT, Platzung TEXT, KSchloNr TEXT, KontDat DATE, Betreuung TEXT, AbbauDat DATE, Auftrag TEXT, KontAbsp TEXT, SonstBem TEXT, FKontakt1 TEXT, FKontakt2 TEXT, FKontakt3 TEXT, KTage1 INTEGER, KTage2 INTEGER, ProtoAm DATE, IntKomm TEXT, DECLNG DECIMALS(4,8), DECLAT DECIMALS(4,8))');
}
// Function to add a finished entrie

View File

@@ -1,45 +1,43 @@
import 'dart:convert';
// ignore_for_file: avoid_print
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:fforte/other/db_helper.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Methods {
String httpData;
int? _errorCode;
Methods(this.httpData);
void httpRequest() async {
int get errorCode => _errorCode ?? 0;
Methods();
void httpRequest(String httpData) async {
// print(jsonEncode(place));
final dio = Dio();
final SharedPreferences prefs = await SharedPreferences.getInstance();
dio.options.responseType = ResponseType.plain;
Response response =
Response(requestOptions: RequestOptions(path: ''), statusCode: 400);
Response response = Response(requestOptions: RequestOptions(path: ''), statusCode: 400);
try {
response = await dio.post(prefs.getString('apiAddress') ?? "",
data: jsonEncode(httpData));
// print(jsonEncode(httpData));
} on DioException catch (e) {
if (e.response?.statusCode == 500) {
print('-------------------------');
print('code 500');
return;
}
}
if (response.statusCode == 201) {
print("------------------");
print(response.statusCode);
var placeDB = DBHelper();
await placeDB.updateSent();
} else {
print("----------------");
print("Anderer code");
print(response.statusCode);
// ignore: unused_catch_clause
} on DioException catch (e) {
_errorCode = response.statusCode;
print('is hier. var: ${_errorCode}');
return;
}
_errorCode = response.statusCode;
print('is hier 2. var: ${_errorCode}');
}
}