Skip to content

Commit 3924c93

Browse files
authored
Merge pull request #419 from SimformSolutionsPvtLtd/feature/time_clickable_function
feat: Fixes issue #383: ✨ Add action on tap of timestamp in day & week view
2 parents 372cdcc + 1be329c commit 3924c93

File tree

9 files changed

+54
-8
lines changed

9 files changed

+54
-8
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
- Adds additional configurations for `CalendarPageHeader`, `MonthPageHeader`, `DayPageHeader` and `WeekPageHeader`.
1010
- Added `titleBuilder` to build custom title for header.
1111
- Fixes issue calendar scroll physics for day & week view. [#417](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/417)
12+
- Adds `onTimestampTap` callback in `WeekView`
13+
and `DayView`. [#383](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/383)
1214
- `Deprecations`:
1315
- deprecated `backgroundColor` and `iconColor` from `CalendarPageHeader`, `DayPageHeader`, `MonthPageHeader` and `WeekPageHeader`.
1416
- **Solution:** use `headerStyle` instead.

example/lib/widgets/day_view_widget.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ class DayViewWidget extends StatelessWidget {
2626
hourIndicatorSettings: HourIndicatorSettings(
2727
color: Theme.of(context).dividerColor,
2828
),
29+
onTimestampTap: (date) {
30+
SnackBar snackBar = SnackBar(
31+
content: Text("On tap: ${date.hour} Hr : ${date.minute} Min"),
32+
);
33+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
34+
},
2935
onEventTap: (events, date) {
3036
Navigator.of(context).push(
3137
MaterialPageRoute(

example/lib/widgets/week_view_widget.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ class WeekViewWidget extends StatelessWidget {
2121
color: Colors.redAccent,
2222
showTime: true,
2323
),
24+
onTimestampTap: (date) {
25+
SnackBar snackBar = SnackBar(
26+
content: Text("On tap: ${date.hour} Hr : ${date.minute} Min"),
27+
);
28+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
29+
},
2430
onEventTap: (events, date) {
2531
Navigator.of(context).push(
2632
MaterialPageRoute(

lib/src/components/_internal_components.dart

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ class TimeLine extends StatefulWidget {
147147
/// This will display time string in timeline.
148148
final DateWidgetBuilder timeLineBuilder;
149149

150+
/// This method will be called when user taps on timestamp in timeline.
151+
final TimestampCallback? onTimestampTap;
152+
150153
/// Flag to display half hours.
151154
final bool showHalfHours;
152155

@@ -175,6 +178,7 @@ class TimeLine extends StatefulWidget {
175178
required this.height,
176179
required this.timeLineOffset,
177180
required this.timeLineBuilder,
181+
required this.onTimestampTap,
178182
this.startHour = 0,
179183
this.showHalfHours = false,
180184
this.showQuarterHours = false,
@@ -287,6 +291,14 @@ class _TimeLineState extends State<TimeLine> {
287291
required int hour,
288292
int minutes = 0,
289293
}) {
294+
final dateTime = DateTime(
295+
TimeLine._date.year,
296+
TimeLine._date.month,
297+
TimeLine._date.day,
298+
hour,
299+
minutes,
300+
);
301+
290302
return Visibility(
291303
visible: !((_currentTime.minute >= 45 && _currentTime.hour == hour - 1) ||
292304
(_currentTime.minute <= 15 && _currentTime.hour == hour)) ||
@@ -300,14 +312,13 @@ class _TimeLineState extends State<TimeLine> {
300312
child: Container(
301313
height: widget.hourHeight,
302314
width: widget.timeLineWidth,
303-
child: widget.timeLineBuilder.call(
304-
DateTime(
305-
TimeLine._date.year,
306-
TimeLine._date.month,
307-
TimeLine._date.day,
308-
hour,
309-
minutes,
310-
),
315+
child: InkWell(
316+
onTap: () {
317+
if (widget.onTimestampTap != null) {
318+
widget.onTimestampTap!(dateTime);
319+
}
320+
},
321+
child: widget.timeLineBuilder.call(dateTime),
311322
),
312323
),
313324
),

lib/src/day_view/_internal_day_view_page.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ class InternalDayViewPage<T extends Object?> extends StatefulWidget {
136136
/// Use this field to disable the calendar scrolling
137137
final ScrollPhysics? scrollPhysics;
138138

139+
final TimestampCallback? onTimestampTap;
140+
139141
/// Defines a single day page.
140142
const InternalDayViewPage({
141143
Key? key,
@@ -176,6 +178,7 @@ class InternalDayViewPage<T extends Object?> extends StatefulWidget {
176178
required this.quarterHourIndicatorSettings,
177179
required this.emulateVerticalOffsetBy,
178180
required this.onTileDoubleTap,
181+
required this.onTimestampTap,
179182
this.keepScrollOffset = false,
180183
}) : super(key: key);
181184

@@ -330,6 +333,7 @@ class _InternalDayViewPageState<T extends Object?>
330333
key: ValueKey(widget.heightPerMinute),
331334
liveTimeIndicatorSettings:
332335
widget.liveTimeIndicatorSettings,
336+
onTimestampTap: widget.onTimestampTap,
333337
),
334338
if (widget.showLiveLine &&
335339
widget.liveTimeIndicatorSettings.height > 0)

lib/src/day_view/day_view.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ class DayView<T extends Object?> extends StatefulWidget {
158158
/// initial offset.
159159
final double? scrollOffset;
160160

161+
/// This method will be called when user taps on timestamp in timeline.
162+
final TimestampCallback? onTimestampTap;
163+
161164
/// This method will be called when user taps on event tile.
162165
final CellTapCallback<T>? onEventTap;
163166

@@ -273,6 +276,7 @@ class DayView<T extends Object?> extends StatefulWidget {
273276
this.onEventDoubleTap,
274277
this.endHour = Constants.hoursADay,
275278
this.keepScrollOffset = false,
279+
this.onTimestampTap,
276280
}) : assert(!(onHeaderTitleTap != null && dayTitleBuilder != null),
277281
"can't use [onHeaderTitleTap] & [dayTitleBuilder] simultaneously"),
278282
assert(timeLineOffset >= 0,
@@ -467,6 +471,7 @@ class DayViewState<T extends Object?> extends State<DayView<T>> {
467471
hourIndicatorSettings: _hourIndicatorSettings,
468472
hourLinePainter: _hourLinePainter,
469473
date: date,
474+
onTimestampTap: widget.onTimestampTap,
470475
onTileTap: widget.onEventTap,
471476
onTileLongTap: widget.onEventLongTap,
472477
onDateLongPress: widget.onDateLongPress,

lib/src/typedefs.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ typedef DatePressCallback = void Function(DateTime date);
7070

7171
typedef DateTapCallback = void Function(DateTime date);
7272

73+
typedef TimestampCallback = void Function(DateTime date);
74+
7375
typedef EventFilter<T extends Object?> = List<CalendarEventData<T>> Function(
7476
DateTime date, List<CalendarEventData<T>> events);
7577

lib/src/week_view/_internal_week_view_page.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ class InternalWeekViewPage<T extends Object?> extends StatefulWidget {
163163
/// Use this field to disable the calendar scrolling
164164
final ScrollPhysics? scrollPhysics;
165165

166+
/// This method will be called when user taps on timestamp in timeline.
167+
final TimestampCallback? onTimestampTap;
168+
166169
/// A single page for week view.
167170
const InternalWeekViewPage({
168171
Key? key,
@@ -205,6 +208,7 @@ class InternalWeekViewPage<T extends Object?> extends StatefulWidget {
205208
required this.emulateVerticalOffsetBy,
206209
required this.onTileDoubleTap,
207210
required this.endHour,
211+
required this.onTimestampTap,
208212
this.fullDayHeaderTitle = '',
209213
required this.fullDayHeaderTextConfig,
210214
required this.scrollPhysics,
@@ -475,6 +479,7 @@ class _InternalWeekViewPageState<T extends Object?>
475479
liveTimeIndicatorSettings:
476480
widget.liveTimeIndicatorSettings,
477481
endHour: widget.endHour,
482+
onTimestampTap: widget.onTimestampTap,
478483
),
479484
if (widget.showLiveLine &&
480485
widget.liveTimeIndicatorSettings.height > 0)

lib/src/week_view/week_view.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ class WeekView<T extends Object?> extends StatefulWidget {
149149
/// Scroll offset of week view page.
150150
final double scrollOffset;
151151

152+
/// This method will be called when user taps on timestamp in timeline.
153+
final TimestampCallback? onTimestampTap;
154+
152155
/// Called when user taps on event tile.
153156
final CellTapCallback<T>? onEventTap;
154157

@@ -306,6 +309,7 @@ class WeekView<T extends Object?> extends StatefulWidget {
306309
this.fullDayHeaderTitle = '',
307310
this.fullDayHeaderTextConfig,
308311
this.keepScrollOffset = false,
312+
this.onTimestampTap,
309313
}) : assert(!(onHeaderTitleTap != null && weekPageHeaderBuilder != null),
310314
"can't use [onHeaderTitleTap] & [weekPageHeaderBuilder] simultaneously"),
311315
assert((timeLineOffset) >= 0,
@@ -527,6 +531,7 @@ class WeekViewState<T extends Object?> extends State<WeekView<T>> {
527531
liveTimeIndicatorSettings:
528532
_liveTimeIndicatorSettings,
529533
timeLineBuilder: _timeLineBuilder,
534+
onTimestampTap: widget.onTimestampTap,
530535
onTileTap: widget.onEventTap,
531536
onTileLongTap: widget.onEventLongTap,
532537
onDateLongPress: widget.onDateLongPress,

0 commit comments

Comments
 (0)