week_picker.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'package:flutter/material.dart';
  2. import 'date_period.dart';
  3. import 'date_picker_keys.dart';
  4. import 'day_based_changable_picker.dart';
  5. import 'day_picker_selection.dart';
  6. import 'i_selectable_picker.dart';
  7. import 'styles/date_picker_styles.dart';
  8. import 'styles/event_decoration.dart';
  9. import 'styles/layout_settings.dart';
  10. import 'typedefs.dart';
  11. import 'utils.dart';
  12. /// Date picker for selection a week.
  13. class UtilWeekPicker extends StatelessWidget {
  14. /// Creates a month picker.
  15. UtilWeekPicker({
  16. Key? key,
  17. required DateTime selectedDate,
  18. required DateTime firstDate,
  19. required DateTime lastDate,
  20. required this.onChanged,
  21. DateTime? initiallyShowDate,
  22. this.datePickerLayoutSettings = const DatePickerLayoutSettings(),
  23. this.datePickerStyles,
  24. this.datePickerKeys,
  25. this.selectableDayPredicate,
  26. this.onSelectionError,
  27. this.eventDecorationBuilder,
  28. this.onMonthChanged,
  29. }) : firstDate = DatePickerUtils.startOfTheDay(firstDate),
  30. lastDate = DatePickerUtils.endOfTheDay(lastDate),
  31. selectedDate = DatePickerUtils.startOfTheDay(selectedDate),
  32. initiallyShowDate = initiallyShowDate == null
  33. ? null
  34. : DatePickerUtils.startOfTheDay(initiallyShowDate),
  35. super(key: key) {
  36. assert(!this.firstDate!.isAfter(this.lastDate!));
  37. assert(!this.lastDate!.isBefore(this.firstDate!));
  38. assert(!this.selectedDate!.isBefore(this.firstDate!));
  39. assert(!this.selectedDate!.isAfter(this.lastDate!));
  40. assert(this.initiallyShowDate == null ||
  41. !this.initiallyShowDate!.isAfter(this.lastDate!));
  42. assert(this.initiallyShowDate == null ||
  43. !this.initiallyShowDate!.isBefore(this.firstDate!));
  44. }
  45. /// The currently selected date.
  46. ///
  47. /// This date is highlighted in the picker.
  48. final DateTime? selectedDate;
  49. /// Called when the user picks a week.
  50. final ValueChanged<DatePeriod>? onChanged;
  51. /// Called when the error was thrown after user selection.
  52. /// (e.g. when user selected a week with one or more days
  53. /// what can't be selected)
  54. final OnSelectionError? onSelectionError;
  55. /// The earliest date the user is permitted to pick.
  56. final DateTime? firstDate;
  57. /// The latest date the user is permitted to pick.
  58. final DateTime? lastDate;
  59. /// Date for defining what month should be shown initially.
  60. ///
  61. /// In case of null month with earliest date of the selected week
  62. /// will be shown.
  63. final DateTime? initiallyShowDate;
  64. /// Layout settings what can be customized by user
  65. final DatePickerLayoutSettings? datePickerLayoutSettings;
  66. /// Some keys useful for integration tests
  67. final DatePickerKeys? datePickerKeys;
  68. /// Styles what can be customized by user
  69. final DatePickerRangeStyles? datePickerStyles;
  70. /// Function returns if day can be selected or not.
  71. final SelectableDayPredicate? selectableDayPredicate;
  72. /// Builder to get event decoration for each date.
  73. ///
  74. /// For selected days all event styles are overridden by selected styles.
  75. final EventDecorationBuilder? eventDecorationBuilder;
  76. /// Called when the user changes the month.
  77. /// New DateTime object represents first day of new month and 00:00 time.
  78. final ValueChanged<DateTime>? onMonthChanged;
  79. @override
  80. Widget build(BuildContext context) {
  81. int firstDayOfWeekIndex = datePickerStyles!.firstDayOfeWeekIndex!;
  82. ISelectablePicker<DatePeriod> weekSelectablePicker = WeekSelectable(
  83. selectedDate!, firstDayOfWeekIndex, firstDate!, lastDate!,
  84. selectableDayPredicate: selectableDayPredicate!);
  85. return DayBasedChangeablePicker<DatePeriod>(
  86. selectablePicker: weekSelectablePicker,
  87. // todo: maybe create selection for week
  88. // todo: and change logic here to work with it
  89. selection: DayPickerSingleSelection(selectedDate!),
  90. firstDate: firstDate,
  91. lastDate: lastDate,
  92. initiallyShownDate: initiallyShowDate,
  93. onChanged: onChanged!,
  94. onSelectionError: onSelectionError,
  95. datePickerLayoutSettings: datePickerLayoutSettings,
  96. datePickerStyles: datePickerStyles,
  97. datePickerKeys: datePickerKeys,
  98. eventDecorationBuilder: eventDecorationBuilder,
  99. onMonthChanged: onMonthChanged,
  100. );
  101. }
  102. }