Skip to content

Commit 3d18d70

Browse files
feat: agenda view, multi-day events, swipe gestures for v2.1.0
1 parent 9ee7d97 commit 3d18d70

8 files changed

Lines changed: 741 additions & 67 deletions

File tree

CHANGELOG.md

Lines changed: 57 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,65 @@
1+
## 2.1.0
2+
3+
- Added `AgendaView` — chronological event list grouped by date
4+
- Added `CalendarView.agenda` — new view mode
5+
- Added multi-day event support in `CalendarEvent`
6+
- `endDate` — optional end date for multi-day events
7+
- `isMultiDay` — check if spans multiple days
8+
- `spanDays` — number of days event spans
9+
- `startsOnDate()` / `endsOnDate()`
10+
- `dateRangeString` — formatted date range
11+
- Added swipe gestures — left/right to navigate
12+
- Added `agendaDaysAhead` / `agendaDaysBehind` params
13+
- Multi-day events show bar indicator in month view
14+
115
## 2.0.0
216

3-
* 🎉 Major release — Full Calendar Widget!
4-
* Added `SmartCalendar` widget
5-
* Month view — full grid calendar
6-
* Week view — week strip with events list
7-
* Day view — single day detail view
8-
* View switcher — switch between month/week/day
9-
* Today button — jump to today
10-
* Smooth navigation with chevron buttons
11-
* Added `SmartCalendarController`
12-
* `nextMonth/previousMonth`
13-
* `nextWeek/previousWeek`
14-
* `nextDay/previousDay`
15-
* `jumpToDate/jumpToMonth`
16-
* `goToToday/selectDate`
17-
* `isCurrentMonth`
18-
* Added `CalendarEvent` model
19-
* title, date, color, description
20-
* allDay, startTime, endTime
21-
* `isOnDate()`, `timeString`
22-
* Added `EventMarkerStyle` — dot, chip, both
23-
* Added `CalendarView` — month, week, day
17+
- 🎉 Major release — Full Calendar Widget!
18+
- Added `SmartCalendar` widget
19+
- Month view — full grid calendar
20+
- Week view — week strip with events list
21+
- Day view — single day detail view
22+
- View switcher — switch between month/week/day
23+
- Today button — jump to today
24+
- Smooth navigation with chevron buttons
25+
- Added `SmartCalendarController`
26+
- `nextMonth/previousMonth`
27+
- `nextWeek/previousWeek`
28+
- `nextDay/previousDay`
29+
- `jumpToDate/jumpToMonth`
30+
- `goToToday/selectDate`
31+
- `isCurrentMonth`
32+
- Added `CalendarEvent` model
33+
- title, date, color, description
34+
- allDay, startTime, endTime
35+
- `isOnDate()`, `timeString`
36+
- Added `EventMarkerStyle` — dot, chip, both
37+
- Added `CalendarView` — month, week, day
2438

2539
## 1.6.0
2640

27-
* SmartParser — major improvements
28-
* New English expressions:
29-
* `midnight`, `noon`, `end of day`
30-
* `start/end of month`, `start/end of year`
31-
* `start/end of week`
32-
* `this weekend`, `next weekend`, `last weekend`
33-
* `day after tomorrow`, `day before yesterday`
34-
* `a day ago`, `in a week`
35-
* `N days/weeks from now`
36-
* Added Hindi parsing support:
37-
* `आज`, `कल`, `परसों`
38-
* `अगले/पिछले हफ्ते/महीने/साल`
39-
* `अगले/पिछले सोमवार...रविवार`
40-
* `{n} दिन बाद/पहले`
41-
* Added Marathi parsing support:
42-
* `आज`, `उद्या`, `काल`, `परवा`
43-
* `पुढील/मागील आठवडा/महिना/वर्ष`
44-
* `पुढील/मागील सोमवार...रविवार`
45-
* `{n} दिवसांनी/{n} दिवसांपूर्वी`
46-
* Added `SmartParser.parseLocale()` — parse with explicit locale
47-
* Added `SmartParser.canParseLocale()` — check locale parsing
48-
* Added `SmartParser.supportedParseLocales`['en', 'hi', 'mr']
41+
- SmartParser — major improvements
42+
- New English expressions:
43+
- `midnight`, `noon`, `end of day`
44+
- `start/end of month`, `start/end of year`
45+
- `start/end of week`
46+
- `this weekend`, `next weekend`, `last weekend`
47+
- `day after tomorrow`, `day before yesterday`
48+
- `a day ago`, `in a week`
49+
- `N days/weeks from now`
50+
- Added Hindi parsing support:
51+
- `आज`, `कल`, `परसों`
52+
- `अगले/पिछले हफ्ते/महीने/साल`
53+
- `अगले/पिछले सोमवार...रविवार`
54+
- `{n} दिन बाद/पहले`
55+
- Added Marathi parsing support:
56+
- `आज`, `उद्या`, `काल`, `परवा`
57+
- `पुढील/मागील आठवडा/महिना/वर्ष`
58+
- `पुढील/मागील सोमवार...रविवार`
59+
- `{n} दिवसांनी/{n} दिवसांपूर्वी`
60+
- Added `SmartParser.parseLocale()` — parse with explicit locale
61+
- Added `SmartParser.canParseLocale()` — check locale parsing
62+
- Added `SmartParser.supportedParseLocales`['en', 'hi', 'mr']
4963

5064
## 1.5.0
5165

example/pubspec.lock

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ packages:
2121
dependency: transitive
2222
description:
2323
name: characters
24-
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
24+
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
2525
url: "https://pub.dev"
2626
source: hosted
27-
version: "1.4.1"
27+
version: "1.4.0"
2828
clock:
2929
dependency: transitive
3030
description:
@@ -111,26 +111,26 @@ packages:
111111
dependency: transitive
112112
description:
113113
name: matcher
114-
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
114+
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
115115
url: "https://pub.dev"
116116
source: hosted
117-
version: "0.12.19"
117+
version: "0.12.17"
118118
material_color_utilities:
119119
dependency: transitive
120120
description:
121121
name: material_color_utilities
122-
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
122+
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
123123
url: "https://pub.dev"
124124
source: hosted
125-
version: "0.13.0"
125+
version: "0.11.1"
126126
meta:
127127
dependency: transitive
128128
description:
129129
name: meta
130-
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
130+
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
131131
url: "https://pub.dev"
132132
source: hosted
133-
version: "1.18.0"
133+
version: "1.16.0"
134134
path:
135135
dependency: transitive
136136
description:
@@ -150,7 +150,7 @@ packages:
150150
path: ".."
151151
relative: true
152152
source: path
153-
version: "1.6.0"
153+
version: "2.1.0"
154154
source_span:
155155
dependency: transitive
156156
description:
@@ -195,10 +195,10 @@ packages:
195195
dependency: transitive
196196
description:
197197
name: test_api
198-
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
198+
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
199199
url: "https://pub.dev"
200200
source: hosted
201-
version: "0.7.11"
201+
version: "0.7.6"
202202
vector_math:
203203
dependency: transitive
204204
description:
@@ -216,5 +216,5 @@ packages:
216216
source: hosted
217217
version: "15.2.0"
218218
sdks:
219-
dart: ">=3.10.0-0 <4.0.0"
219+
dart: ">=3.9.0 <4.0.0"
220220
flutter: ">=3.18.0-18.0.pre.54"

lib/src/calendar/calendar_event.dart

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,31 @@ enum EventMarkerStyle {
1414

1515
/// Represents a single calendar event.
1616
///
17+
/// Supports single-day and multi-day events.
18+
///
1719
/// ```dart
20+
/// // Single day event
1821
/// CalendarEvent(
1922
/// date: DateTime(2024, 6, 15),
2023
/// title: 'Team Meeting',
2124
/// color: Colors.blue,
2225
/// )
26+
///
27+
/// // Multi-day event
28+
/// CalendarEvent(
29+
/// date: DateTime(2024, 6, 15),
30+
/// endDate: DateTime(2024, 6, 17),
31+
/// title: 'Company Retreat',
32+
/// color: Colors.green,
33+
/// )
2334
/// ```
2435
class CalendarEvent {
25-
/// Date of the event
36+
/// Start date of the event
2637
final DateTime date;
2738

39+
/// End date for multi-day events — null means single day
40+
final DateTime? endDate;
41+
2842
/// Title of the event
2943
final String title;
3044

@@ -51,13 +65,14 @@ class CalendarEvent {
5165
/// ```dart
5266
/// CalendarEvent(
5367
/// date: DateTime(2024, 6, 15),
54-
/// title: 'Meeting',
68+
/// endDate: DateTime(2024, 6, 17), // multi-day
69+
/// title: 'Conference',
5570
/// color: Colors.blue,
56-
/// startTime: TimeOfDay(hour: 10, minute: 0),
5771
/// )
5872
/// ```
5973
const CalendarEvent({
6074
required this.date,
75+
this.endDate,
6176
required this.title,
6277
this.color = Colors.blue,
6378
this.description,
@@ -67,11 +82,33 @@ class CalendarEvent {
6782
this.endTime,
6883
});
6984

70-
/// Returns true if this event is on [date].
71-
bool isOnDate(DateTime date) =>
72-
this.date.year == date.year &&
73-
this.date.month == date.month &&
74-
this.date.day == date.day;
85+
/// Returns true if this is a multi-day event.
86+
bool get isMultiDay => endDate != null && !_isSameDay(date, endDate!);
87+
88+
/// Returns number of days this event spans.
89+
int get spanDays {
90+
if (endDate == null) return 1;
91+
return endDate!.difference(date).inDays + 1;
92+
}
93+
94+
/// Returns true if [date] falls within this event's range.
95+
bool isOnDate(DateTime date) {
96+
final target = DateTime(date.year, date.month, date.day);
97+
final start = DateTime(this.date.year, this.date.month, this.date.day);
98+
99+
if (endDate == null) return start == target;
100+
101+
final end = DateTime(endDate!.year, endDate!.month, endDate!.day);
102+
return (target.isAtSameMomentAs(start) || target.isAfter(start)) &&
103+
(target.isAtSameMomentAs(end) || target.isBefore(end));
104+
}
105+
106+
/// Returns true if this event starts on [date].
107+
bool startsOnDate(DateTime date) => _isSameDay(this.date, date);
108+
109+
/// Returns true if this event ends on [date].
110+
bool endsOnDate(DateTime date) =>
111+
endDate != null && _isSameDay(endDate!, date);
75112

76113
/// Returns formatted time string.
77114
String get timeString {
@@ -82,6 +119,15 @@ class CalendarEvent {
82119
return '$start – ${_formatTime(endTime!)}';
83120
}
84121

122+
/// Returns formatted date range string.
123+
String get dateRangeString {
124+
if (!isMultiDay) return '';
125+
return '${_formatDate(date)} – ${_formatDate(endDate!)}';
126+
}
127+
128+
bool _isSameDay(DateTime a, DateTime b) =>
129+
a.year == b.year && a.month == b.month && a.day == b.day;
130+
85131
String _formatTime(TimeOfDay time) {
86132
final hour = time.hour > 12
87133
? time.hour - 12
@@ -93,6 +139,9 @@ class CalendarEvent {
93139
return '$hour:$minute $period';
94140
}
95141

142+
String _formatDate(DateTime date) => '${date.day}/${date.month}/${date.year}';
143+
96144
@override
97-
String toString() => 'CalendarEvent($title, $date)';
145+
String toString() => 'CalendarEvent($title, $date'
146+
'${endDate != null ? ' → $endDate' : ''})';
98147
}

0 commit comments

Comments
 (0)