From 60cd573b4260eb62af91de54c8afee6cb10210dd Mon Sep 17 00:00:00 2001 From: Shubham Jitiya Date: Fri, 3 Jan 2025 18:03:45 +0530 Subject: [PATCH] :feat: Fixes issue #382: Added support for 3-Days week view --- example/lib/widgets/week_view_widget.dart | 1 + lib/src/extensions.dart | 37 ++++++++++------- .../week_view/_internal_week_view_page.dart | 5 +++ lib/src/week_view/week_view.dart | 40 +++++++++++++++++-- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/example/lib/widgets/week_view_widget.dart b/example/lib/widgets/week_view_widget.dart index 4222c531..615f32c7 100644 --- a/example/lib/widgets/week_view_widget.dart +++ b/example/lib/widgets/week_view_widget.dart @@ -16,6 +16,7 @@ class WeekViewWidget extends StatelessWidget { width: width, showWeekends: true, showLiveTimeLineInAllDays: true, + showThreeDaysView: true, eventArranger: SideEventArranger(maxWidth: 30), timeLineWidth: 65, scrollPhysics: const BouncingScrollPhysics(), diff --git a/lib/src/extensions.dart b/lib/src/extensions.dart index 7e6165d7..ccaff3ce 100644 --- a/lib/src/extensions.dart +++ b/lib/src/extensions.dart @@ -55,6 +55,7 @@ extension DateTimeExtensions on DateTime { List datesOfWeek({ WeekDays start = WeekDays.monday, bool showWeekEnds = true, + bool showThreeDays = false, }) { // Here %7 ensure that we do not subtract >6 and <0 days. // Initial formula is, @@ -63,21 +64,29 @@ extension DateTimeExtensions on DateTime { // But in WeekDays enum index ranges from 0 to 6 so we are // adding 1 in index. So, new formula with WeekDays is, // difference = (weekdays - (start.index + 1))%7 + + // final startDay = + // DateTime(year, month, day - (weekday - start.index - 1) % 7); + // // Generate weekdays with weekends or without weekends + // final days = List.generate( + // 7, + // (index) => DateTime(startDay.year, startDay.month, startDay.day + index), + // ) + // .where( + // (date) => + // showWeekEnds || + // (date.weekday != DateTime.saturday && + // date.weekday != DateTime.sunday), + // ) + // .toList(); + + // Three days view + // final days = showThreeDays ? day : day - (weekday - start.index - 1) % 7; + // final startDay = DateTime(year, month, days); // - final startDay = - DateTime(year, month, day - (weekday - start.index - 1) % 7); - // Generate weekdays with weekends or without weekends - final days = List.generate( - 7, - (index) => DateTime(startDay.year, startDay.month, startDay.day + index), - ) - .where( - (date) => - showWeekEnds || - (date.weekday != DateTime.saturday && - date.weekday != DateTime.sunday), - ) - .toList(); + // return List.generate(showThreeDays ? 3 : 7, (index) { + // return startDay.add(Duration(days: index)); + // }); return days; } diff --git a/lib/src/week_view/_internal_week_view_page.dart b/lib/src/week_view/_internal_week_view_page.dart index 85d36b54..39013c23 100644 --- a/lib/src/week_view/_internal_week_view_page.dart +++ b/lib/src/week_view/_internal_week_view_page.dart @@ -139,6 +139,10 @@ class InternalWeekViewPage extends StatefulWidget { /// Flag to display quarter hours final bool showQuarterHours; + /// Enable this flag to show 3-days view default is false. + /// i.e 7 days view + final bool showThreeDaysView; + /// Emulate vertical line offset from hour line starts. final double emulateVerticalOffsetBy; @@ -205,6 +209,7 @@ class InternalWeekViewPage extends StatefulWidget { required this.showWeekDayAtBottom, required this.showHalfHours, required this.showQuarterHours, + required this.showThreeDaysView, required this.emulateVerticalOffsetBy, required this.onTileDoubleTap, required this.endHour, diff --git a/lib/src/week_view/week_view.dart b/lib/src/week_view/week_view.dart index 19c651b4..c9778b84 100644 --- a/lib/src/week_view/week_view.dart +++ b/lib/src/week_view/week_view.dart @@ -172,6 +172,10 @@ class WeekView extends StatefulWidget { /// saturday and sunday, only monday and tuesday will be visible in week view. final bool showWeekends; + /// Enable this flag to show 3-days view default is false. + /// i.e 7 days view + final bool showThreeDaysView; + /// Defines which days should be displayed in one week. /// /// By default all the days will be visible. @@ -287,6 +291,7 @@ class WeekView extends StatefulWidget { this.onDateTap, this.weekDays = WeekDays.values, this.showWeekends = true, + this.showThreeDaysView = false, this.startDay = WeekDays.monday, this.minuteSlotSize = MinuteSlotSize.minutes60, this.weekDetectorBuilder, @@ -333,6 +338,10 @@ class WeekView extends StatefulWidget { endHour <= Constants.hoursADay || endHour < startHour, "End hour must be less than 24 or startHour must be less than endHour", ), + assert(!(showThreeDaysView && !showWeekends), + "For three days view, showWeekends should be true"), + assert(!(showThreeDaysView && weekDays.length != 7), + "For three days view, weekDays should not be set"), super(key: key); @override @@ -526,6 +535,9 @@ class WeekViewState extends State> { showWeekEnds: widget.showWeekends, ); + // TODO(Shubham): Three days view + // final dates = _getDatesOnWeek(index); + return ValueListenableBuilder( valueListenable: _scrollConfiguration, builder: (_, __, ___) => InternalWeekViewPage( @@ -573,6 +585,7 @@ class WeekViewState extends State> { startHour: _startHour, showHalfHours: widget.showHalfHours, showQuarterHours: widget.showQuarterHours, + showThreeDaysView: widget.showThreeDaysView, emulateVerticalOffsetBy: widget.emulateVerticalOffsetBy, showWeekDayAtBottom: widget.showWeekDayAtBottom, @@ -631,7 +644,7 @@ class WeekViewState extends State> { "Make sure you are providing weekdays in initialization of " "WeekView. or showWeekends is true if you are providing only " "saturday or sunday in weekDays."); - _totalDaysInWeek = _weekDays.length; + _totalDaysInWeek = widget.showThreeDaysView ? 3 : _weekDays.length; } void _updateViewDimensions() { @@ -724,7 +737,6 @@ class WeekViewState extends State> { } else if (_currentWeek.isAfter(_maxDate)) { _currentWeek = _maxDate; } - _currentStartDate = _currentWeek.firstDayOfWeek(start: widget.startDay); _currentEndDate = _currentWeek.lastDayOfWeek(start: widget.startDay); _currentIndex = @@ -790,6 +802,9 @@ class WeekViewState extends State> { /// Default builder for week number. Widget _defaultWeekNumberBuilder(DateTime date) { + if (widget.showThreeDaysView) { + return const SizedBox.shrink(); + } final daysToAdd = DateTime.thursday - date.weekday; final thursday = daysToAdd > 0 ? date.add(Duration(days: daysToAdd)) @@ -894,9 +909,11 @@ class WeekViewState extends State> { _currentStartDate = DateTime( _currentStartDate.year, _currentStartDate.month, - _currentStartDate.day + (index - _currentIndex) * 7, + _currentStartDate.day + + (index - _currentIndex) * (widget.showThreeDaysView ? 3 : 7), ); - _currentEndDate = _currentStartDate.add(Duration(days: 6)); + _currentEndDate = _currentStartDate + .add(Duration(days: widget.showThreeDaysView ? 2 : 6)); _currentIndex = index; }); } @@ -1036,6 +1053,21 @@ class WeekViewState extends State> { void _scrollPageListener(ScrollController controller) { _lastScrollOffset = controller.offset; } + + List _getDatesOnWeek(int index) { + if (widget.showThreeDaysView) { + return _currentStartDate.datesOfWeek( + start: widget.startDay, + showThreeDays: widget.showThreeDaysView, + ); + } else { + return DateTime( + _minDate.year, + _minDate.month, + _minDate.day + (index * DateTime.daysPerWeek), + ).datesOfWeek(start: widget.startDay); + } + } } class WeekHeader {