Skip to content

Commit a6c031e

Browse files
author
Shubham Jitiya
committed
feat: Fixes issue #378: ✨Added support for daily & weekly recurrence event in month view
1 parent cc99a0e commit a6c031e

13 files changed

+861
-13
lines changed

example/lib/constants.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'app_colors.dart';
55
class AppConstants {
66
AppConstants._();
77

8+
static final List<String> weekTitles = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
9+
810
static OutlineInputBorder inputBorder = OutlineInputBorder(
911
borderRadius: BorderRadius.circular(7),
1012
borderSide: BorderSide(

example/lib/main.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,29 @@ List<CalendarEventData> _events = [
4242
startTime: DateTime(_now.year, _now.month, _now.day, 18, 30),
4343
endTime: DateTime(_now.year, _now.month, _now.day, 22),
4444
),
45+
CalendarEventData(
46+
date: _now.subtract(Duration(days: 3)),
47+
recurrenceSettings: RecurrenceSettings.withCalculatedEndDate(
48+
startDate: _now.subtract(Duration(days: 3)),
49+
endDate: _now.subtract(Duration(days: 3)),
50+
frequency: RepeatFrequency.daily,
51+
recurrenceEndOn: RecurrenceEnd.after,
52+
interval: 5,
53+
),
54+
title: "Physics test prep",
55+
description: "Prepare for physics test",
56+
),
4557
CalendarEventData(
4658
date: _now.add(Duration(days: 1)),
4759
startTime: DateTime(_now.year, _now.month, _now.day, 18),
4860
endTime: DateTime(_now.year, _now.month, _now.day, 19),
61+
recurrenceSettings: RecurrenceSettings(
62+
startDate: _now,
63+
endDate: _now.add(Duration(days: 5)),
64+
frequency: RepeatFrequency.daily,
65+
interval: 5,
66+
recurrenceEndOn: RecurrenceEnd.after,
67+
),
4968
title: "Wedding anniversary",
5069
description: "Attend uncle's wedding anniversary.",
5170
),

example/lib/pages/event_details_page.dart

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
import 'package:calendar_view/calendar_view.dart';
2+
import 'package:example/pages/web/delete_event_dialog.dart';
23
import 'package:flutter/material.dart';
34

45
import '../extension.dart';
56
import 'create_event_page.dart';
67

78
class DetailsPage extends StatelessWidget {
89
final CalendarEventData event;
10+
final DateTime date;
11+
12+
const DetailsPage({
13+
super.key,
14+
required this.event,
15+
required this.date,
16+
});
917

10-
const DetailsPage({super.key, required this.event});
1118
@override
1219
Widget build(BuildContext context) {
1320
return Scaffold(
@@ -90,10 +97,8 @@ class DetailsPage extends StatelessWidget {
9097
children: [
9198
Expanded(
9299
child: ElevatedButton(
93-
onPressed: () {
94-
CalendarControllerProvider.of(context)
95-
.controller
96-
.remove(event);
100+
onPressed: () async {
101+
await _handleDeleteEvent(context);
97102
Navigator.of(context).pop();
98103
},
99104
child: Text('Delete Event'),
@@ -111,7 +116,7 @@ class DetailsPage extends StatelessWidget {
111116
),
112117
);
113118

114-
if (result) {
119+
if (result != null) {
115120
Navigator.of(context).pop();
116121
}
117122
},
@@ -124,4 +129,33 @@ class DetailsPage extends StatelessWidget {
124129
),
125130
);
126131
}
132+
133+
/// Handles the deletion of an event, showing a dialog for repeating events.
134+
///
135+
/// This method checks if the event is a repeating event. If it is, it shows
136+
/// a dialog to the user to choose the deletion type (e.g., delete this
137+
/// event, delete following events, delete all events).
138+
/// If the event is not repeating, it defaults to deleting all occurrences
139+
/// of the event.
140+
Future<void> _handleDeleteEvent(BuildContext context) async {
141+
DeleteEvent? result;
142+
final isRepeatingEvent = event.recurrenceSettings != null &&
143+
(event.recurrenceSettings?.frequency != RepeatFrequency.doNotRepeat);
144+
145+
if (isRepeatingEvent) {
146+
result = await showDialog(
147+
context: context,
148+
builder: (_) => DeleteEventDialog(),
149+
);
150+
} else {
151+
result = DeleteEvent.all;
152+
}
153+
if (result != null) {
154+
CalendarControllerProvider.of(context).controller.deleteRecurrenceEvent(
155+
date: date,
156+
event: event,
157+
deleteEventType: result,
158+
);
159+
}
160+
}
127161
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import 'package:calendar_view/calendar_view.dart';
2+
import 'package:flutter/material.dart';
3+
4+
class DeleteEventDialog extends StatefulWidget {
5+
@override
6+
_RadioDialogState createState() => _RadioDialogState();
7+
}
8+
9+
class _RadioDialogState extends State<DeleteEventDialog> {
10+
DeleteEvent _selectedOption = DeleteEvent.current;
11+
12+
@override
13+
Widget build(BuildContext context) {
14+
return AlertDialog(
15+
title: Text('Delete recurring event '),
16+
content: Column(
17+
mainAxisSize: MainAxisSize.min,
18+
children: [
19+
RadioListTile<DeleteEvent>(
20+
title: Text('This event'),
21+
value: DeleteEvent.current,
22+
groupValue: _selectedOption,
23+
onChanged: (deleteType) {
24+
if (deleteType != null) {
25+
setState(() => _selectedOption = deleteType);
26+
}
27+
},
28+
),
29+
RadioListTile<DeleteEvent>(
30+
title: Text('This and following events'),
31+
value: DeleteEvent.following,
32+
groupValue: _selectedOption,
33+
onChanged: (deleteType) {
34+
if (deleteType != null) {
35+
setState(() => _selectedOption = deleteType);
36+
}
37+
},
38+
),
39+
RadioListTile<DeleteEvent>(
40+
title: Text('All events'),
41+
value: DeleteEvent.all,
42+
groupValue: _selectedOption,
43+
onChanged: (deleteType) {
44+
if (deleteType != null) {
45+
setState(() => _selectedOption = deleteType);
46+
}
47+
},
48+
),
49+
],
50+
),
51+
actions: [
52+
TextButton(
53+
onPressed: () => Navigator.of(context).pop(),
54+
child: Text('Cancel'),
55+
),
56+
TextButton(
57+
onPressed: () => Navigator.of(context).pop(_selectedOption),
58+
child: Text('Done'),
59+
),
60+
],
61+
);
62+
}
63+
}

0 commit comments

Comments
 (0)