fix: change DateTime to TimeOfDay for timeselection widgets

This commit is contained in:
Freek van de Ven 2024-07-10 15:16:58 +02:00 committed by Bart Ribbers
parent 79be2d74dc
commit 9ba32016b8
8 changed files with 84 additions and 65 deletions

View file

@ -225,12 +225,12 @@ class AvailabilityTranslations {
/// Get the time formatted as a string /// Get the time formatted as a string
/// ///
/// The default implementation is `HH:mm` /// The default implementation is `HH:mm`
final String Function(BuildContext, DateTime) timeFormatter; final String Function(BuildContext, TimeOfDay) timeFormatter;
} }
String _defaultTimeFormatter(BuildContext context, DateTime date) => String _defaultTimeFormatter(BuildContext context, TimeOfDay time) =>
"${date.hour.toString().padLeft(2, '0')}:" "${time.hour.toString().padLeft(2, '0')}:"
"${date.minute.toString().padLeft(2, '0')}"; "${time.minute.toString().padLeft(2, '0')}";
String _defaultDayMonthFormatter(BuildContext context, DateTime date) => String _defaultDayMonthFormatter(BuildContext context, DateTime date) =>
"${_getDayName(date.weekday)} ${date.day} ${_getMonthName(date.month)}"; "${_getDayName(date.weekday)} ${date.day} ${_getMonthName(date.month)}";

View file

@ -108,30 +108,14 @@ class _AvailabilityModificationViewState
var timeSelection = AvailabilityTimeSelection( var timeSelection = AvailabilityTimeSelection(
dateRange: widget.dateRange, dateRange: widget.dateRange,
startTime: _startTime != null startTime: _startTime,
? DateTime( endTime: _endTime,
widget.dateRange.start.year,
widget.dateRange.start.month,
widget.dateRange.start.day,
_startTime!.hour,
_startTime!.minute,
)
: null,
endTime: _endTime != null
? DateTime(
widget.dateRange.start.year,
widget.dateRange.start.month,
widget.dateRange.start.day,
_endTime!.hour,
_endTime!.minute,
)
: null,
key: ValueKey([_startTime, _endTime]), key: ValueKey([_startTime, _endTime]),
onStartChanged: (start) => setState(() { onStartChanged: (start) => setState(() {
_startTime = TimeOfDay.fromDateTime(start); _startTime = start;
}), }),
onEndChanged: (end) => setState(() { onEndChanged: (end) => setState(() {
_endTime = TimeOfDay.fromDateTime(end); _endTime = end;
}), }),
); );

View file

@ -104,22 +104,40 @@ class _AvailabilityDayTemplateEditState
var timeSection = TemplateTimeSelection( var timeSection = TemplateTimeSelection(
key: ValueKey(_template.templateData), key: ValueKey(_template.templateData),
startTime: (_template.templateData as DayTemplateData).startTime, startTime: TimeOfDay.fromDateTime(
endTime: (_template.templateData as DayTemplateData).endTime, (_template.templateData as DayTemplateData).startTime,),
endTime: TimeOfDay.fromDateTime(
(_template.templateData as DayTemplateData).endTime,),
onStartChanged: (start) { onStartChanged: (start) {
var startTime = (_template.templateData as DayTemplateData).startTime;
var updatedStartTime = DateTime(
startTime.year,
startTime.month,
startTime.day,
start.hour,
start.minute,
);
setState(() { setState(() {
_template = _template.copyWith( _template = _template.copyWith(
templateData: (_template.templateData as DayTemplateData).copyWith( templateData: (_template.templateData as DayTemplateData).copyWith(
startTime: start, startTime: updatedStartTime,
), ),
); );
}); });
}, },
onEndChanged: (end) { onEndChanged: (end) {
var endTime = (_template.templateData as DayTemplateData).endTime;
var updatedEndTime = DateTime(
endTime.year,
endTime.month,
endTime.day,
end.hour,
end.minute,
);
setState(() { setState(() {
_template = _template.copyWith( _template = _template.copyWith(
templateData: (_template.templateData as DayTemplateData).copyWith( templateData: (_template.templateData as DayTemplateData).copyWith(
endTime: end, endTime: updatedEndTime,
), ),
); );
}); });

View file

@ -15,16 +15,16 @@ class AvailabilityTimeSelection extends StatelessWidget {
}); });
/// ///
final DateTime? startTime; final TimeOfDay? startTime;
/// ///
final DateTime? endTime; final TimeOfDay? endTime;
/// ///
final void Function(DateTime) onStartChanged; final void Function(TimeOfDay) onStartChanged;
/// ///
final void Function(DateTime) onEndChanged; final void Function(TimeOfDay) onEndChanged;
/// The date range for which the availabilities are being managed /// The date range for which the availabilities are being managed
final DateTimeRange dateRange; final DateTimeRange dateRange;

View file

@ -26,16 +26,16 @@ class TimeSelection extends StatelessWidget {
final CrossAxisAlignment crossAxisAlignment; final CrossAxisAlignment crossAxisAlignment;
/// ///
final DateTime? startTime; final TimeOfDay? startTime;
/// ///
final DateTime? endTime; final TimeOfDay? endTime;
/// ///
final void Function(DateTime) onStartChanged; final void Function(TimeOfDay) onStartChanged;
/// ///
final void Function(DateTime) onEndChanged; final void Function(TimeOfDay) onEndChanged;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View file

@ -11,10 +11,10 @@ class TimeInputField extends StatelessWidget {
}); });
/// ///
final DateTime? initialValue; final TimeOfDay? initialValue;
/// ///
final void Function(DateTime) onTimeChanged; final void Function(TimeOfDay) onTimeChanged;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -24,22 +24,14 @@ class TimeInputField extends StatelessWidget {
var translations = options.translations; var translations = options.translations;
Future<void> onFieldtap() async { Future<void> onFieldtap() async {
var initialTime = TimeOfDay.fromDateTime(initialValue ?? DateTime.now()); var initialTime = initialValue ?? TimeOfDay.now();
var time = await (options.timePickerBuilder?.call(context, initialTime) ?? var time = await (options.timePickerBuilder?.call(context, initialTime) ??
showTimePicker( showTimePicker(
context: context, context: context,
initialTime: TimeOfDay.fromDateTime(initialValue ?? DateTime.now()), initialTime: initialTime,
)); ));
if (time != null) { if (time != null) {
onTimeChanged( onTimeChanged(time);
DateTime(
initialValue?.year ?? DateTime.now().year,
initialValue?.month ?? DateTime.now().month,
initialValue?.day ?? DateTime.now().day,
time.hour,
time.minute,
),
);
} }
} }

View file

@ -136,6 +136,15 @@ class BreakDisplay extends StatelessWidget {
var colors = options.colors; var colors = options.colors;
var translations = options.translations; var translations = options.translations;
var starTime = translations.timeFormatter(
context,
TimeOfDay.fromDateTime(breakModel.startTime),
);
var endTime = translations.timeFormatter(
context,
TimeOfDay.fromDateTime(breakModel.endTime),
);
return GestureDetector( return GestureDetector(
onTap: onClick, onTap: onClick,
child: Container( child: Container(
@ -150,8 +159,8 @@ class BreakDisplay extends StatelessWidget {
Text( Text(
"${breakModel.duration.inMinutes} " "${breakModel.duration.inMinutes} "
"${translations.timeMinutes} | " "${translations.timeMinutes} | "
"${translations.timeFormatter(context, breakModel.startTime)} - " "$starTime - "
"${translations.timeFormatter(context, breakModel.endTime)}", "$endTime",
), ),
const Spacer(), const Spacer(),
GestureDetector(onTap: onRemove, child: const Icon(Icons.remove)), GestureDetector(onTap: onRemove, child: const Icon(Icons.remove)),
@ -207,15 +216,19 @@ class AvailabilityBreakSelectionDialog extends StatefulWidget {
class _AvailabilityBreakSelectionDialogState class _AvailabilityBreakSelectionDialogState
extends State<AvailabilityBreakSelectionDialog> { extends State<AvailabilityBreakSelectionDialog> {
late DateTime? _startTime; late TimeOfDay? _startTime;
late DateTime? _endTime; late TimeOfDay? _endTime;
late Duration? _duration; late Duration? _duration;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_startTime = widget.initialBreak?.startTime; _startTime = widget.initialBreak != null
_endTime = widget.initialBreak?.endTime; ? TimeOfDay.fromDateTime(widget.initialBreak!.startTime)
: null;
_endTime = widget.initialBreak != null
? TimeOfDay.fromDateTime(widget.initialBreak!.endTime)
: null;
_duration = widget.initialBreak?.duration; _duration = widget.initialBreak?.duration;
} }
@ -234,15 +247,15 @@ class _AvailabilityBreakSelectionDialogState
}); });
} }
void onUpdateStart(DateTime time) { void onUpdateStart(TimeOfDay start) {
setState(() { setState(() {
_startTime = time; _startTime = start;
}); });
} }
void onUpdateEnd(DateTime time) { void onUpdateEnd(TimeOfDay end) {
setState(() { setState(() {
_endTime = time; _endTime = end;
}); });
} }
@ -251,8 +264,20 @@ class _AvailabilityBreakSelectionDialogState
var onSaveButtonPress = canSave var onSaveButtonPress = canSave
? () { ? () {
var breakModel = AvailabilityBreakModel( var breakModel = AvailabilityBreakModel(
startTime: _startTime!, startTime: DateTime(
endTime: _endTime!, DateTime.now().year,
DateTime.now().month,
DateTime.now().day,
_startTime!.hour,
_startTime!.minute,
),
endTime: DateTime(
DateTime.now().year,
DateTime.now().month,
DateTime.now().day,
_endTime!.hour,
_endTime!.minute,
),
duration: _duration, duration: _duration,
); );
Navigator.of(context).pop(breakModel); Navigator.of(context).pop(breakModel);

View file

@ -14,16 +14,16 @@ class TemplateTimeSelection extends StatelessWidget {
}); });
/// ///
final DateTime? startTime; final TimeOfDay? startTime;
/// ///
final DateTime? endTime; final TimeOfDay? endTime;
/// ///
final void Function(DateTime) onStartChanged; final void Function(TimeOfDay) onStartChanged;
/// ///
final void Function(DateTime) onEndChanged; final void Function(TimeOfDay) onEndChanged;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {