sitzung luc

This commit is contained in:
Nico
2024-03-15 19:22:46 +01:00
parent 624bb38846
commit d157757893
12 changed files with 158 additions and 82 deletions

View File

@@ -2,6 +2,26 @@ todo:
TESTEN!! TESTEN!!
maybe auch vorschläge aus templates in dropdown menüs anzeigen maybe auch vorschläge aus templates in dropdown menüs anzeigen
eintrag in db wenn http response (in sent column) eintrag in db wenn http response (in sent column)
nachricht wenn einstellungen erfolgreich geändert
view cams übersetzen
abbaudat leer
datum step redesign (maybe linien dazwischen und sized box zwischen text und button weg)
beim nächsten schritt als template
im englischen abändern
systematic ???
standort automatisch in Karte
karte drehen aus
Auftrag absätze machen und textfeld größer wenn langer text
beim letzten weiter alle leeren felder anzeigen (array zurückgeben)
gespeicherten ordner anzeigen
zurückfeld in datenansicht
überschriften für view cams
Überall wo Kameras steht standorte hinschreiben
null eintrag in dropdown menüs weg
speichern funktion zum Abbrechen
fehler beim speichern anzeigen
ktage raus
not to do: not to do:
clean db_helper clean db_helper

View File

@@ -32,4 +32,5 @@
</application> </application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
</manifest> </manifest>

View File

@@ -10,6 +10,7 @@ import 'package:geolocator/geolocator.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:latlong2/latlong.dart'; import 'package:latlong2/latlong.dart';
import 'package:animations/animations.dart'; import 'package:animations/animations.dart';
import 'package:http/http.dart' as http;
class AddCamMain extends StatefulWidget { class AddCamMain extends StatefulWidget {
final bool isTemplate; final bool isTemplate;
@@ -49,10 +50,10 @@ class _AddCamMainState extends State<AddCamMain> {
TextEditingController intKommC = TextEditingController(); TextEditingController intKommC = TextEditingController();
TextEditingController kontSumC = TextEditingController(); TextEditingController kontSumC = TextEditingController();
String selectedStatus = 'inaktiv'; String selectedStatus = 'aktiv';
String selectedSTTyp = 'opportunistisch'; String selectedSTTyp = 'opportunistisch';
String selectedFotoFilm = 'foto'; String selectedFotoFilm = 'foto';
String selectedMEZ = 'mez'; String selectedMEZ = 'sommerzeit';
String selectedPlatzung = 'kirrung'; String selectedPlatzung = 'kirrung';
String selectedBearsafe = 'nein'; String selectedBearsafe = 'nein';
@@ -69,11 +70,11 @@ class _AddCamMainState extends State<AddCamMain> {
headingAccuracy: 0.0); headingAccuracy: 0.0);
String datumS = DateFormat('yyyy-MM-dd').format(DateTime.now()); String datumS = DateFormat('yyyy-MM-dd').format(DateTime.now());
String kontDatS = DateFormat('yyyy-mm-dd').format(DateTime.now()); String kontDatS = DateFormat('yyyy-MM-dd').format(DateTime.now());
String abbauDatS = DateFormat('yyyy-mm-dd').format(DateTime.now()); String abbauDatS = DateFormat('yyyy-MM-dd').format(DateTime.now());
String ausVonS = DateFormat('yyyy-mm-dd').format(DateTime(2000)); String ausVonS = DateFormat('yyyy-MM-dd').format(DateTime(2000));
String ausBisS = DateFormat('yyyy-mm-dd').format(DateTime(2000)); String ausBisS = DateFormat('yyyy-MM-dd').format(DateTime(2000));
String protoAmS = DateFormat('yyyy-mm-dd').format(DateTime.now()); String protoAmS = DateFormat('yyyy-MM-dd').format(DateTime.now());
DateTime? ausBis; DateTime? ausBis;
DateTime? ausVon; DateTime? ausVon;
DateTime abbauDat = DateTime.now(); DateTime abbauDat = DateTime.now();
@@ -207,15 +208,17 @@ class _AddCamMainState extends State<AddCamMain> {
title: Text(AppLocalizations.of(context)!.savemethod), title: Text(AppLocalizations.of(context)!.savemethod),
actions: [ actions: [
TextButton( TextButton(
onPressed: () { onPressed: () async {
Navigator.pushNamedAndRemoveUntil(context, '/home', (route) => false); _httpRequest();
// Navigator.pushNamedAndRemoveUntil(context, '/home', (route) => false);
}, },
child: Text(AppLocalizations.of(context)!.sendtoserver)), child: Text(AppLocalizations.of(context)!.sendtoserver)),
TextButton( TextButton(
onPressed: () async { onPressed: () async {
await saveFile(); await saveFile();
// ignore: use_build_context_synchronously // ignore: use_build_context_synchronously
Navigator.pushNamedAndRemoveUntil(context, '/home', (route) => false); Navigator.pushNamedAndRemoveUntil(
context, '/home', (route) => false);
}, },
child: Text(AppLocalizations.of(context)!.saveasfile)) child: Text(AppLocalizations.of(context)!.saveasfile))
], ],
@@ -223,9 +226,55 @@ class _AddCamMainState extends State<AddCamMain> {
}); });
} }
void _httpRequest() async {
Map<String, dynamic> place = {
'CID': id.text,
'Rudel': rudelC.text,
'Datum': datumS,
'NameVorname': nameVornameC.text,
'PLZOrt': plzOrtC.text,
'EmailTel': emailTelC.text,
'BLand': bLandC.text,
'Lkr': lkrC.text,
'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': kontDatS,
'AbbauDat': abbauDatS,
'Auftrag': auftragC.text,
'Absprachen': absprachenC.text,
'SonstBemerkungen': sonstBemerkungenC.text,
'FKontakt1': fKontakt1C.text,
'FKontakt2': fKontakt2C.text,
'FKontakt3': fKontakt3C.text,
'AltStOrt': altStOrtC.text,
'AusVon': ausVonS,
'AusBis': ausBisS,
'KTage1': kTage1C.text,
'KTage2': kTage2C.text,
'ProtoAm': protoAmS,
'IntKomm': intKommC.text,
'KontSum': kontSumC.text,
};
final response = await http.post(Uri.parse("http://192.168.178.30/www.dbb-wolf.de/data/_nicoapi.php"),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(place));
print(response);
}
Future<void> saveFile() async { Future<void> saveFile() async {
String? selectedDirectory = await FilePicker.platform.getDirectoryPath(); String? selectedDirectory = await FilePicker.platform.getDirectoryPath();
Map<String, dynamic> place = { Map<String, dynamic> place = {
'CID': id.text, 'CID': id.text,
'Rudel': rudelC.text, 'Rudel': rudelC.text,
@@ -270,8 +319,7 @@ class _AddCamMainState extends State<AddCamMain> {
File file = File('$selectedDirectory/cam-${id.text}.txt'); File file = File('$selectedDirectory/cam-${id.text}.txt');
await file await file.writeAsString(jsonPlace);
.writeAsString(jsonPlace);
// ignore: use_build_context_synchronously // ignore: use_build_context_synchronously
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@@ -287,7 +335,6 @@ class _AddCamMainState extends State<AddCamMain> {
'BLand': bLandC, 'BLand': bLandC,
'Lkr': lkrC, 'Lkr': lkrC,
'BeiOrt': beiOrtC, 'BeiOrt': beiOrtC,
'OrtInfo': ortInfoC,
'Status': TextEditingController(text: selectedStatus), 'Status': TextEditingController(text: selectedStatus),
'STTyp': TextEditingController(text: selectedSTTyp), 'STTyp': TextEditingController(text: selectedSTTyp),
'FFTyp': ffTypC, 'FFTyp': ffTypC,
@@ -572,7 +619,7 @@ class _AddCamMainState extends State<AddCamMain> {
alignment: Alignment.bottomLeft, alignment: Alignment.bottomLeft,
child: Row( child: Row(
children: [ children: [
Text(AppLocalizations.of(context)!.sommerzeit), Text(AppLocalizations.of(context)!.zeiteinstellung),
const Text( const Text(
'*', '*',
style: TextStyle(color: Colors.red), style: TextStyle(color: Colors.red),
@@ -685,7 +732,7 @@ class _AddCamMainState extends State<AddCamMain> {
], ],
)), )),
Step( Step(
title: Text(AppLocalizations.of(context)!.secondStep), title: Text(AppLocalizations.of(context)!.kontakt),
content: Column( content: Column(
children: [ children: [
const SizedBox( const SizedBox(
@@ -764,6 +811,7 @@ class _AddCamMainState extends State<AddCamMain> {
final isLastStep = currentStep == getSteps().length - 1; final isLastStep = currentStep == getSteps().length - 1;
if (!isLastStep) { if (!isLastStep) {
// ! saveTemplate();
setState(() { setState(() {
currentStep += 1; currentStep += 1;
}); });
@@ -774,11 +822,14 @@ class _AddCamMainState extends State<AddCamMain> {
(); ();
return; return;
} else if (empty == false) { } else if (empty == false) {
// throw const FormatException(("Speichert"));
saveData(); saveData();
await showSaveOptionsDialog(); await showSaveOptionsDialog();
Navigator.pushNamedAndRemoveUntil( Navigator.pushNamedAndRemoveUntil(
// ignore: use_build_context_synchronously // ignore: use_build_context_synchronously
context, '/home', (route) => false); context,
'/home',
(route) => false);
} }
} }
}, },

View File

@@ -351,9 +351,9 @@ class _DatumState extends State<Datum> {
Text( Text(
'${datum?.day}. ${datum?.month}. ${datum?.year}', '${datum?.day}. ${datum?.month}. ${datum?.year}',
), ),
const SizedBox( //const SizedBox(
height: 8, // height: 2,
), //),
ElevatedButton( ElevatedButton(
onPressed: () async { onPressed: () async {
final date = await pickDate(); final date = await pickDate();
@@ -949,18 +949,7 @@ class _OrtInfoState extends State<OrtInfo> {
flex: 2, flex: 2,
child: TextField( child: TextField(
decoration: InputDecoration( decoration: InputDecoration(
hintText: AppLocalizations.of(context)!.ortinfo, hintText: AppLocalizations.of(context)!.ortinfo,),
enabledBorder: widget.ortInfoC.text.isEmpty
? const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.red))
: const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.green)),
focusedBorder: widget.ortInfoC.text.isEmpty
? const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.red))
: const UnderlineInputBorder(
borderSide: BorderSide(color: Colors.green)),
),
controller: widget.ortInfoC, controller: widget.ortInfoC,
onChanged: (value) => setState(() { onChanged: (value) => setState(() {
widget.ortInfoC.text = value; widget.ortInfoC.text = value;
@@ -1417,7 +1406,7 @@ class MEZ extends StatefulWidget {
final Function(String) onMEZChanged; final Function(String) onMEZChanged;
final String initialMEZ; final String initialMEZ;
const MEZ({super.key, required this.onMEZChanged, this.initialMEZ = 'aktiv'}); const MEZ({super.key, required this.onMEZChanged, this.initialMEZ = 'sommerzeit'});
@override @override
State<MEZ> createState() => _MEZState(); State<MEZ> createState() => _MEZState();
@@ -1438,9 +1427,9 @@ class _MEZState extends State<MEZ> {
children: [ children: [
ListTile( ListTile(
visualDensity: const VisualDensity(vertical: -4), visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.mez), title: Text(AppLocalizations.of(context)!.sommerzeit),
leading: Radio<String>( leading: Radio<String>(
value: 'mez', value: 'sommerzeit',
groupValue: _selectedMEZ, groupValue: _selectedMEZ,
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {
@@ -1452,9 +1441,9 @@ class _MEZState extends State<MEZ> {
), ),
ListTile( ListTile(
visualDensity: const VisualDensity(vertical: -4), visualDensity: const VisualDensity(vertical: -4),
title: Text(AppLocalizations.of(context)!.unklar), title: Text(AppLocalizations.of(context)!.winterzeit),
leading: Radio<String>( leading: Radio<String>(
value: 'unklar', value: 'winterzeit',
groupValue: _selectedMEZ, groupValue: _selectedMEZ,
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {

View File

@@ -5,30 +5,31 @@
"uncompleted": "Unvollständig", "uncompleted": "Unvollständig",
"deleteEverything": "Alles löschen?", "deleteEverything": "Alles löschen?",
"deleteEverythingContent": "Alle Kameras werden lokal gelöscht!", "deleteEverythingContent": "Alle Kameras werden lokal gelöscht!",
"camLink": "Link zur Kamera", "camLink": "ID der Kamera",
"firstStep": "Kamera, Rudel", "firstStep": "KAMERA, TERRITORIUM",
"secondStep": "Datum, Kontakt", "secondStep": "DATUM, KONTAKT",
"date": "Datum", "date": "DATUM",
"kontakt": "KONTAKT",
"status": "Status", "status": "Status",
"viewCamsAppbar": "Kameras ansehen", "viewCamsAppbar": "Kameras ansehen",
"locations": "Standort", "locations": "STANDORT",
"rudel": "Rudel", "rudel": "Territorium",
"namevorname": "Name", "namevorname": "Name",
"plzort": "PLZ und Ort", "plzort": "PLZ und Ort",
"emailtel": "Email und/oder Telefon", "emailtel": "Email und/oder Telefon",
"bland": "Bundesland", "bland": "Bundesland",
"lkr": "Landkreis", "lkr": "Landkreis",
"beiort": "Bei Ort", "beiort": "Bei Ort",
"ortinfo": "Ort Info", "ortinfo": "Nähere Ortsbeschreibung",
"aktiv": "Aktiv", "aktiv": "Aktiv",
"inaktiv": "Inaktiv", "inaktiv": "Inaktiv",
"opportunistisch": "opportunistisch", "opportunistisch": "opportunistisch",
"systematic": "systematisch", "systematic": "systematisch",
"fftyp": "Fotofallen typ", "fftyp": "Fotofallentyp",
"foto": "Foto", "foto": "Foto",
"film": "Film", "film": "Film",
"mez": "MEZ", "sommerzeit": "Sommerzeit",
"unklar": "Unklar", "winterzeit": "Winterzeit",
"intkomm": "Interne Kommunikation", "intkomm": "Interne Kommunikation",
"kirrung": "Kirrung", "kirrung": "Kirrung",
"wasserstelle": "Wasserstelle", "wasserstelle": "Wasserstelle",
@@ -38,10 +39,10 @@
"kschlonr": "KSchloss Nummer", "kschlonr": "KSchloss Nummer",
"nein": "Nein", "nein": "Nein",
"ja": "Ja", "ja": "Ja",
"pickkontdat": "KontDat Auswählen", "pickkontdat": "Datum Kontrolle",
"pickabbaudat": "Abbau datum Auswählen", "pickabbaudat": "Datum Abbau",
"platzung": "Platzung", "platzung": "Platzierung",
"sommerzeit": "sommerzeit", "zeiteinstellung": "Zeiteinstellung",
"auftrag": "Auftrag", "auftrag": "Auftrag",
"absprachen": "Absprachen", "absprachen": "Absprachen",
"sonstbemerkungen": "Sonstige Bemerkungen", "sonstbemerkungen": "Sonstige Bemerkungen",
@@ -49,29 +50,29 @@
"fkontakt2": "FKontakt 2", "fkontakt2": "FKontakt 2",
"fkontakt3": "FKontakt 3", "fkontakt3": "FKontakt 3",
"hofgarten": "Hof/Garten", "hofgarten": "Hof/Garten",
"altstort": "AltStOrt", "altstort": "Alter Standort",
"wiesefeld": "Wiese/Feld/offenfläche", "wiesefeld": "Wiese/Feld/offenfläche",
"ausvon": "Aus von", "ausvon": "Aus von",
"nichts": "Nichts", "nichts": "---",
"ausbis": "Aus Bis", "ausbis": "Aus Bis",
"ktage1": "KTage 1", "ktage1": "KTage 1",
"ktage2": "KTage 2", "ktage2": "KTage 2",
"eugrid": "EUGrid", "eugrid": "EUGrid",
"pickDate": "Datum Auswählen", "pickDate": "Datum Aufstelung",
"pickTime": "Zeit Auswählen", "pickTime": "Zeit auswählen",
"delAll": "Alle Kameras löschen", "delAll": "Alle Kameras löschen",
"fieldEmpty": "Folgendes Felde ist leer:", "fieldEmpty": "Folgendes Feld ist leer:",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"template": "Als Vorlage speichern", "template": "Als Vorlage speichern",
"openMap": "Karte öffnen", "openMap": "Karte öffnen",
"saveMap": "Speichern und Schleßen", "saveMap": "Speichern und Schließen",
"locationDisabled": "Standort ausgeschaltet. Bitte einschalten", "locationDisabled": "Standort ausgeschaltet. Bitte einschalten",
"locationForbidden": "Zugriff auf Standort verweigert. Es ist empfohlen dies zu erlauben", "locationForbidden": "Zugriff auf Standort verweigert. Es ist empfohlen dies zu erlauben",
"map": "Karte", "map": "Karte",
"markerSet": "Marker gesetzt auf", "markerSet": "Marker gesetzt auf",
"kontsum": "Kontrollsumme", "kontsum": "Kontrollsumme",
"bearsafe": "Bärensafe", "bearsafe": "Bearsafe",
"sttyp": "STTyp", "sttyp": "Status",
"ort": "Ort", "ort": "Ort",
"continueB": "Weiter", "continueB": "Weiter",
"settings": "Einstellungen", "settings": "Einstellungen",

View File

@@ -132,14 +132,14 @@
"description": "film radiobutton" "description": "film radiobutton"
}, },
"mez": "MEZ", "sommerzeit": "Summertime",
"@mez": { "@sommerzeit": {
"description": "mez radiobutton" "description": "summertime radiobutton"
}, },
"unklar": "unclear", "winterzeit": "winterzeit",
"@unklar": { "@winterzeit": {
"description": "unclear radiobutton" "description": "winterzeit radiobutton"
}, },
"kirrung": "Kirrung", "kirrung": "Kirrung",
@@ -197,9 +197,14 @@
"description": "platzung header" "description": "platzung header"
}, },
"sommerzeit": "Summertime", "zeiteinstellung": "Timesetting",
"@sommerzeit": { "@zeiteinstellung": {
"description": "mez summertime header" "description": "summertime header"
},
"kontakt": "Contact",
"@kontakt": {
"description": "contact header"
}, },
"auftrag": "Order", "auftrag": "Order",

View File

@@ -31,7 +31,7 @@ class MyApp extends StatelessWidget {
return MaterialApp( return MaterialApp(
title: 'FFOrte', title: 'FFOrte',
theme: theme:
FlexThemeData.light(scheme: FlexScheme.greenM3, useMaterial3: true), FlexThemeData.light(scheme: FlexScheme.gold, useMaterial3: true),
darkTheme: darkTheme:
FlexThemeData.dark(scheme: FlexScheme.greenM3, useMaterial3: true), FlexThemeData.dark(scheme: FlexScheme.greenM3, useMaterial3: true),
themeMode: ThemeMode.system, themeMode: ThemeMode.system,

View File

@@ -47,6 +47,11 @@ class _SettingsState extends State<Settings> {
await prefs.setString('nameVorname', nameVornameC.text); await prefs.setString('nameVorname', nameVornameC.text);
} }
void _saveBLand() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('bLand', bLandC.text);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@@ -95,6 +100,7 @@ class _SettingsState extends State<Settings> {
child: const Icon(Icons.save), child: const Icon(Icons.save),
onPressed: () { onPressed: () {
_saveName(); _saveName();
_saveBLand();
}), }),
); );
} }

View File

@@ -133,7 +133,7 @@ class _ViewCamsState extends State<ViewCams> {
Map<String, dynamic> place = Map<String, dynamic> place =
snapshot.data![index]; snapshot.data![index];
return ListTile( return ListTile(
title: Text('Place ${index + 1}'), title: Text('Standort ${index + 1}'),
subtitle: Text( subtitle: Text(
'ID: ${place['CID']} DATUM: ${place['Datum']}'), 'ID: ${place['CID']} DATUM: ${place['Datum']}'),
trailing: Checkbox( trailing: Checkbox(
@@ -199,7 +199,7 @@ class _ViewCamsState extends State<ViewCams> {
Text( Text(
'${AppLocalizations.of(context)!.ausbis}: ${place['AusBis']}'), '${AppLocalizations.of(context)!.ausbis}: ${place['AusBis']}'),
Text( Text(
'${AppLocalizations.of(context)!.mez}: ${place['MEZ']}'), '${AppLocalizations.of(context)!.sommerzeit}: ${place['MEZ']}'),
Text( Text(
'${AppLocalizations.of(context)!.kontsum}: ${place['KontSum']}'), '${AppLocalizations.of(context)!.kontsum}: ${place['KontSum']}'),
Text( Text(

View File

@@ -238,13 +238,13 @@ packages:
source: hosted source: hosted
version: "0.2.2" version: "0.2.2"
http: http:
dependency: transitive dependency: "direct main"
description: description:
name: http name: http
sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
@@ -481,10 +481,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_web name: shared_preferences_web
sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.2" version: "2.3.0"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
@@ -622,10 +622,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: web name: web
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.3.0" version: "0.5.1"
win32: win32:
dependency: transitive dependency: transitive
description: description:
@@ -651,5 +651,5 @@ packages:
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
sdks: sdks:
dart: ">=3.2.0 <4.0.0" dart: ">=3.3.0 <4.0.0"
flutter: ">=3.16.0" flutter: ">=3.19.0"

View File

@@ -46,6 +46,7 @@ dependencies:
shared_preferences: ^2.2.2 shared_preferences: ^2.2.2
flutter_file_dialog: ^3.0.2 flutter_file_dialog: ^3.0.2
file_picker: ^6.2.0 file_picker: ^6.2.0
http: ^1.2.1
dev_dependencies: dev_dependencies:
flutter_lints: ^3.0.1 flutter_lints: ^3.0.1

View File

@@ -21,7 +21,7 @@
18 dez 2h 18 dez 2h
20 dez 15 min 20 dez 15 min
21 dez 1h 45 min 21 dez 1h 45 min
24 jan 1 20 min 24 jan 1h 20 min
25 jan 30 min 25 jan 30 min
26 jan 1h 10 min 26 jan 1h 10 min
31 jan 1h 10 min 31 jan 1h 10 min
@@ -37,4 +37,6 @@
26 feb 1h 30 min 26 feb 1h 30 min
27 feb 1h 10 min 27 feb 1h 10 min
2 mär 1h 30 min 2 mär 1h 30 min
7 mär 1h 7 mär 1h
- abgerechnet -