implemented DST-safe date arithmetic with new addDays and subtractDays extensions, updated timetable state to reset view and scroll boundaries on initialization to prevent stale views, added hard caps to calendar navigation, and updated version to 1.0.3+52
This commit is contained in:
@@ -19,7 +19,7 @@ class _DayHeaderStrip extends StatelessWidget {
|
||||
for (var d = 0; d < 5; d++)
|
||||
Expanded(
|
||||
child: _DayHeaderCell(
|
||||
date: weekStart.add(Duration(days: d)),
|
||||
date: weekStart.addDays(d),
|
||||
today: today,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -38,7 +38,7 @@ class _WeekGrid extends StatelessWidget {
|
||||
for (var d = 0; d < 5; d++)
|
||||
Expanded(
|
||||
child: _DayColumn(
|
||||
date: weekStart.add(Duration(days: d)),
|
||||
date: weekStart.addDays(d),
|
||||
schedule: schedule,
|
||||
appointments: partitioned.inside[d],
|
||||
timeRegions: timeRegions,
|
||||
|
||||
@@ -101,9 +101,7 @@ class CustomWorkWeekCalendarState extends State<CustomWorkWeekCalendar> {
|
||||
final newLastMonday = _mondayOf(widget.maxDate);
|
||||
final newTotalWeeks =
|
||||
newLastMonday.difference(newFirstMonday).inDays ~/ 7 + 1;
|
||||
final visibleWeekStart = _firstMonday.add(
|
||||
Duration(days: _currentWeekIndex * 7),
|
||||
);
|
||||
final visibleWeekStart = _firstMonday.addDays(_currentWeekIndex * 7);
|
||||
final newIndex = visibleWeekStart
|
||||
.difference(newFirstMonday)
|
||||
.inDays
|
||||
@@ -141,16 +139,14 @@ class CustomWorkWeekCalendarState extends State<CustomWorkWeekCalendar> {
|
||||
}
|
||||
|
||||
static DateTime _mondayOf(DateTime d) {
|
||||
final monday = d.subtract(Duration(days: d.weekday - 1));
|
||||
final monday = d.subtractDays(d.weekday - 1);
|
||||
return DateTime(monday.year, monday.month, monday.day);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
final visibleWeekStart = _firstMonday.add(
|
||||
Duration(days: _currentWeekIndex * 7),
|
||||
);
|
||||
final visibleWeekStart = _firstMonday.addDays(_currentWeekIndex * 7);
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
@@ -231,18 +227,11 @@ class CustomWorkWeekCalendarState extends State<CustomWorkWeekCalendar> {
|
||||
itemCount: _totalWeeks,
|
||||
onPageChanged: (index) {
|
||||
setState(() => _currentWeekIndex = index);
|
||||
final weekStart = _firstMonday.add(
|
||||
Duration(days: index * 7),
|
||||
);
|
||||
widget.onWeekChanged(
|
||||
weekStart,
|
||||
weekStart.add(const Duration(days: 4)),
|
||||
);
|
||||
final weekStart = _firstMonday.addDays(index * 7);
|
||||
widget.onWeekChanged(weekStart, weekStart.addDays(4));
|
||||
},
|
||||
itemBuilder: (_, weekIndex) {
|
||||
final weekStart = _firstMonday.add(
|
||||
Duration(days: weekIndex * 7),
|
||||
);
|
||||
final weekStart = _firstMonday.addDays(weekIndex * 7);
|
||||
return _WeekGrid(
|
||||
weekStart: weekStart,
|
||||
schedule: widget.schedule,
|
||||
|
||||
@@ -23,12 +23,12 @@ class SpecialRegionsBuilder {
|
||||
|
||||
List<TimeRegion> build() {
|
||||
final rangeStart = DateTime.now()
|
||||
.subtract(const Duration(days: 14))
|
||||
.subtractDays(14)
|
||||
.nextWeekday(DateTime.monday);
|
||||
// Far enough out to cover comfortable scrolling without rebuilding;
|
||||
// Syncfusion only paints regions that intersect the visible window so
|
||||
// the extra entries don't hurt rendering cost.
|
||||
final rangeEnd = DateTime.now().add(const Duration(days: 180));
|
||||
final rangeEnd = DateTime.now().addDays(180);
|
||||
|
||||
final holidayRegions = _buildHolidayRegions().toList();
|
||||
final holidayDays = holidayRegions
|
||||
@@ -42,11 +42,7 @@ class SpecialRegionsBuilder {
|
||||
// explicit per-day regions and just skipping holidays is robust.
|
||||
final breakPeriods = schedule.periods.where((p) => p.isBreak).toList();
|
||||
final breakRegions = <TimeRegion>[];
|
||||
for (
|
||||
var day = rangeStart;
|
||||
!day.isAfter(rangeEnd);
|
||||
day = day.add(const Duration(days: 1))
|
||||
) {
|
||||
for (var day = rangeStart; !day.isAfter(rangeEnd); day = day.addDays(1)) {
|
||||
if (holidayDays.contains(_dayKey(day))) continue;
|
||||
for (final p in breakPeriods) {
|
||||
final start = day.copyWith(
|
||||
@@ -77,7 +73,7 @@ class SpecialRegionsBuilder {
|
||||
// otherwise be skipped.
|
||||
final dayCount = endDay.difference(startDay).inDays + 1;
|
||||
for (var i = 0; i < dayCount; i++) {
|
||||
final day = startDay.add(Duration(days: i));
|
||||
final day = startDay.addDays(i);
|
||||
final key = _dayKey(day);
|
||||
byDay.putIfAbsent(key, () => _HolidayDay(day, [])).names.add(
|
||||
holiday.name,
|
||||
|
||||
Reference in New Issue
Block a user