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
///
/// The default implementation is `HH:mm`
final String Function(BuildContext, DateTime) timeFormatter;
final String Function(BuildContext, TimeOfDay) timeFormatter;
}
String _defaultTimeFormatter(BuildContext context, DateTime date) =>
"${date.hour.toString().padLeft(2, '0')}:"
"${date.minute.toString().padLeft(2, '0')}";
String _defaultTimeFormatter(BuildContext context, TimeOfDay time) =>
"${time.hour.toString().padLeft(2, '0')}:"
"${time.minute.toString().padLeft(2, '0')}";
String _defaultDayMonthFormatter(BuildContext context, DateTime date) =>
"${_getDayName(date.weekday)} ${date.day} ${_getMonthName(date.month)}";

View file

@ -108,30 +108,14 @@ class _AvailabilityModificationViewState
var timeSelection = AvailabilityTimeSelection(
dateRange: widget.dateRange,
startTime: _startTime != null
? DateTime(
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,
startTime: _startTime,
endTime: _endTime,
key: ValueKey([_startTime, _endTime]),
onStartChanged: (start) => setState(() {
_startTime = TimeOfDay.fromDateTime(start);
_startTime = start;
}),
onEndChanged: (end) => setState(() {
_endTime = TimeOfDay.fromDateTime(end);
_endTime = end;
}),
);

View file

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

View file

@ -26,16 +26,16 @@ class TimeSelection extends StatelessWidget {
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
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
Widget build(BuildContext context) {
@ -24,22 +24,14 @@ class TimeInputField extends StatelessWidget {
var translations = options.translations;
Future<void> onFieldtap() async {
var initialTime = TimeOfDay.fromDateTime(initialValue ?? DateTime.now());
var initialTime = initialValue ?? TimeOfDay.now();
var time = await (options.timePickerBuilder?.call(context, initialTime) ??
showTimePicker(
context: context,
initialTime: TimeOfDay.fromDateTime(initialValue ?? DateTime.now()),
initialTime: initialTime,
));
if (time != null) {
onTimeChanged(
DateTime(
initialValue?.year ?? DateTime.now().year,
initialValue?.month ?? DateTime.now().month,
initialValue?.day ?? DateTime.now().day,
time.hour,
time.minute,
),
);
onTimeChanged(time);
}
}

View file

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