mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
Merge pull request #991 from wger-project/fix/timezone-handling
Properly handle timezones (again)
This commit is contained in:
@@ -20,9 +20,9 @@ import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:wger/helpers/consts.dart';
|
||||
import 'package:wger/helpers/json.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/models/gallery/image.dart' as gallery;
|
||||
import 'package:wger/providers/gallery.dart';
|
||||
@@ -43,7 +43,7 @@ class _ImageFormState extends State<ImageForm> {
|
||||
|
||||
XFile? _file;
|
||||
|
||||
final dateController = TextEditingController();
|
||||
final dateController = TextEditingController(text: '');
|
||||
final TextEditingController descriptionController = TextEditingController();
|
||||
|
||||
@override
|
||||
@@ -57,7 +57,6 @@ class _ImageFormState extends State<ImageForm> {
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
dateController.text = dateToYYYYMMDD(widget._image.date)!;
|
||||
descriptionController.text = widget._image.description;
|
||||
}
|
||||
|
||||
@@ -97,6 +96,12 @@ class _ImageFormState extends State<ImageForm> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final dateFormat = DateFormat.yMd(Localizations.localeOf(context).languageCode);
|
||||
|
||||
if (dateController.text.isEmpty) {
|
||||
dateController.text = dateFormat.format(widget._image.date);
|
||||
}
|
||||
|
||||
return Form(
|
||||
key: _form,
|
||||
child: Column(
|
||||
@@ -156,14 +161,15 @@ class _ImageFormState extends State<ImageForm> {
|
||||
final pickedDate = await showDatePicker(
|
||||
context: context,
|
||||
initialDate: widget._image.date,
|
||||
firstDate: DateTime(DateTime.now().year - 10),
|
||||
firstDate: DateTime.now().subtract(const Duration(days: 3000)),
|
||||
lastDate: DateTime.now(),
|
||||
);
|
||||
|
||||
dateController.text = dateToYYYYMMDD(pickedDate)!;
|
||||
if (pickedDate != null) {
|
||||
dateController.text = dateFormat.format(pickedDate);
|
||||
}
|
||||
},
|
||||
onSaved: (newValue) {
|
||||
widget._image.date = DateTime.parse(newValue!);
|
||||
widget._image.date = dateFormat.parse(newValue!);
|
||||
},
|
||||
validator: (value) {
|
||||
if (widget._image.id == null && _file == null) {
|
||||
|
||||
@@ -20,7 +20,6 @@ import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:wger/helpers/consts.dart';
|
||||
import 'package:wger/helpers/json.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/models/measurements/measurement_category.dart';
|
||||
import 'package:wger/models/measurements/measurement_entry.dart';
|
||||
@@ -136,7 +135,7 @@ class MeasurementEntryForm extends StatelessWidget {
|
||||
final _form = GlobalKey<FormState>();
|
||||
final int _categoryId;
|
||||
final _valueController = TextEditingController();
|
||||
final _dateController = TextEditingController();
|
||||
final _dateController = TextEditingController(text: '');
|
||||
final _notesController = TextEditingController();
|
||||
|
||||
late final Map<String, dynamic> _entryData;
|
||||
@@ -158,18 +157,23 @@ class MeasurementEntryForm extends StatelessWidget {
|
||||
_entryData['notes'] = entry.notes;
|
||||
}
|
||||
|
||||
_dateController.text = dateToYYYYMMDD(_entryData['date'])!;
|
||||
_valueController.text = '';
|
||||
_notesController.text = _entryData['notes']!;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final dateFormat = DateFormat.yMd(Localizations.localeOf(context).languageCode);
|
||||
|
||||
final measurementProvider = Provider.of<MeasurementProvider>(context, listen: false);
|
||||
final measurementCategory = measurementProvider.categories.firstWhere(
|
||||
(category) => category.id == _categoryId,
|
||||
);
|
||||
|
||||
if (_dateController.text.isEmpty) {
|
||||
_dateController.text = dateFormat.format(_entryData['date']);
|
||||
}
|
||||
|
||||
final numberFormat = NumberFormat.decimalPattern(Localizations.localeOf(context).toString());
|
||||
|
||||
// If the value is not empty, format it
|
||||
@@ -213,10 +217,10 @@ class MeasurementEntryForm extends StatelessWidget {
|
||||
},
|
||||
);
|
||||
|
||||
_dateController.text = pickedDate == null ? '' : dateToYYYYMMDD(pickedDate)!;
|
||||
_dateController.text = pickedDate == null ? '' : dateFormat.format(pickedDate);
|
||||
},
|
||||
onSaved: (newValue) {
|
||||
_entryData['date'] = DateTime.parse(newValue!);
|
||||
_entryData['date'] = dateFormat.parse(newValue!);
|
||||
},
|
||||
validator: (value) {
|
||||
if (value!.isEmpty) {
|
||||
|
||||
@@ -20,7 +20,6 @@ import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:wger/helpers/consts.dart';
|
||||
import 'package:wger/helpers/date.dart';
|
||||
import 'package:wger/helpers/json.dart';
|
||||
import 'package:wger/l10n/generated/app_localizations.dart';
|
||||
import 'package:wger/models/nutrition/ingredient.dart';
|
||||
@@ -182,18 +181,10 @@ class IngredientFormState extends State<IngredientForm> {
|
||||
final _ingredientIdController = TextEditingController();
|
||||
final _amountController = TextEditingController();
|
||||
final _dateController = TextEditingController(); // optional
|
||||
final _timeController = TextEditingController(); // optional
|
||||
final _timeController = TextEditingController(text: ''); // optional
|
||||
final _mealItem = MealItem.empty();
|
||||
var _searchQuery = ''; // copy from typeahead. for filtering suggestions
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
final now = DateTime.now();
|
||||
_dateController.text = dateToYYYYMMDD(now)!;
|
||||
_timeController.text = timeToString(TimeOfDay.fromDateTime(now))!;
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_ingredientController.dispose();
|
||||
@@ -236,6 +227,17 @@ class IngredientFormState extends State<IngredientForm> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final dateFormat = DateFormat.yMd(Localizations.localeOf(context).languageCode);
|
||||
final timeFormat = DateFormat.Hm(Localizations.localeOf(context).languageCode);
|
||||
|
||||
if (_dateController.text.isEmpty) {
|
||||
_dateController.text = dateFormat.format(DateTime.now());
|
||||
}
|
||||
|
||||
if (_timeController.text.isEmpty) {
|
||||
_timeController.text = timeFormat.format(DateTime.now());
|
||||
}
|
||||
|
||||
final String unit = AppLocalizations.of(context).g;
|
||||
final queryLower = _searchQuery.toLowerCase();
|
||||
final suggestions = widget.recent
|
||||
@@ -311,7 +313,7 @@ class IngredientFormState extends State<IngredientForm> {
|
||||
);
|
||||
|
||||
if (pickedDate != null) {
|
||||
_dateController.text = dateToYYYYMMDD(pickedDate)!;
|
||||
_dateController.text = dateFormat.format(pickedDate);
|
||||
}
|
||||
},
|
||||
onSaved: (newValue) {
|
||||
@@ -402,9 +404,8 @@ class IngredientFormState extends State<IngredientForm> {
|
||||
_form.currentState!.save();
|
||||
_mealItem.ingredientId = int.parse(_ingredientIdController.text);
|
||||
|
||||
final loggedDate = getDateTimeFromDateAndTime(
|
||||
_dateController.text,
|
||||
_timeController.text,
|
||||
final loggedDate = dateFormat.parse(
|
||||
'${_dateController.text} ${_timeController.text}',
|
||||
);
|
||||
widget.onSave(context, _mealItem, loggedDate);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user