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