diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 55ece1e..19f44cd 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ =2.18.0 <3.0.0" - flutter: ">=1.17.0" + flutter: ">=2.0.0" diff --git a/lib/agenda.dart b/lib/agenda.dart index e7e0021..4eba1ba 100644 --- a/lib/agenda.dart +++ b/lib/agenda.dart @@ -1 +1,7 @@ library agenda; + +export 'package:agenda/src/agenda.dart'; +export 'package:agenda/src/models/agenda_event.dart'; +export 'package:agenda/src/models/agenda_theme.dart'; + +export 'package:timetable/timetable.dart'; diff --git a/lib/src/agenda.dart b/lib/src/agenda.dart new file mode 100644 index 0000000..efa6f4e --- /dev/null +++ b/lib/src/agenda.dart @@ -0,0 +1,128 @@ +import 'package:agenda/src/models/agenda_event.dart'; +import 'package:agenda/src/models/agenda_theme.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_date_time_picker/flutter_date_time_picker.dart'; +import 'package:timetable/timetable.dart'; + +class AgendaWidget extends StatefulWidget { + const AgendaWidget({ + required this.blocks, + this.highlightedDates = const [], + this.disabledDates = const [], + this.initialDate, + this.header, + this.scrollController, + this.scrollPhysics, + this.startHour = 0, + this.endHour = 24, + this.hourHeight = 80, + this.highlightToday = true, + this.blockWidth = 50, + this.blockColor = const Color(0x80FF0000), + this.theme = const AgendaTheme(), + super.key, + }); + + /// Header widget that is displayed above the datepicker. + final Widget? header; + + final List blocks; + + final List highlightedDates; + + final List disabledDates; + + /// The date that is initially selected. + final DateTime? initialDate; + + final bool highlightToday; + + /// Hour at which the timetable starts. + final int startHour; + + /// Hour at which the timetable ends. + final int endHour; + + /// The heigh of one hour in the timetable. + final double hourHeight; + + /// The width of the agendaItem if there is no child + final double blockWidth; + + /// The color of the agendaItem if there is no child + final Color blockColor; + + /// The theme used by the agenda. + /// The [TableTheme] used by the timetable is included. + final AgendaTheme theme; + + /// The scroll controller to control the scrolling of the timetable. + final ScrollController? scrollController; + + /// The scroll physics used for the SinglechildScrollView. + final ScrollPhysics? scrollPhysics; + + @override + State createState() => _AgendaWidgetState(); +} + +class _AgendaWidgetState extends State { + DateTime? _selectedDate; + + @override + void initState() { + super.initState(); + _selectedDate = widget.initialDate ?? DateTime.now(); + } + + @override + Widget build(BuildContext context) { + // filter out the blocks that are not on the selected date. + var events = + widget.blocks.where((block) => block.start.day == _selectedDate?.day); + return DateTimePicker( + initialDate: _selectedDate, + pickTime: false, + highlightToday: widget.highlightToday, + header: widget.header, + onTapDay: (p0) { + setState(() { + _selectedDate = p0; + }); + }, + disabledDates: widget.disabledDates, + markedDates: widget.highlightedDates, + dateTimePickerTheme: widget.theme.timePickerTheme, + child: Timetable( + scrollPhysics: widget.scrollPhysics, + scrollController: widget.scrollController, + blockColor: widget.blockColor, + blockWidth: widget.blockWidth, + hourHeight: widget.hourHeight, + startHour: widget.startHour, + endHour: widget.endHour, + timeBlocks: events.isEmpty + ? [] + : events + .map( + (e) => TimeBlock( + start: TimeOfDay( + hour: e.start.hour, + minute: e.start.minute, + ), + end: TimeOfDay( + hour: e.end.hour, + minute: e.end.minute, + ), + id: e.id ?? 0, + child: e.content, + ), + ) + .toList(), + theme: widget.theme.tableTheme, + combineBlocks: true, + mergeBlocks: true, + ), + ); + } +} diff --git a/lib/src/models/agenda_event.dart b/lib/src/models/agenda_event.dart new file mode 100644 index 0000000..7a694b7 --- /dev/null +++ b/lib/src/models/agenda_event.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class AgendaEvent { + const AgendaEvent({ + required this.start, + required this.end, + this.id, + this.content, + }); + + /// The start time of the event. + final DateTime start; + + /// The end time of the event. + final DateTime end; + + /// + final Widget? content; + + /// The identifier of the event that is used to combine events + /// with the same id. Leave empty or 0 if you don't want to combine events. + final int? id; +} diff --git a/lib/src/models/agenda_theme.dart b/lib/src/models/agenda_theme.dart new file mode 100644 index 0000000..32a36b8 --- /dev/null +++ b/lib/src/models/agenda_theme.dart @@ -0,0 +1,15 @@ +import 'package:flutter_date_time_picker/flutter_date_time_picker.dart'; +import 'package:timetable/timetable.dart'; + +class AgendaTheme { + const AgendaTheme({ + this.tableTheme = const TableTheme(), + this.timePickerTheme = const DateTimePickerTheme(), + }); + + /// The theme for the timetable. + final TableTheme tableTheme; + + /// The theme for the datetime picker. + final DateTimePickerTheme timePickerTheme; +} diff --git a/pubspec.yaml b/pubspec.yaml index e22da7f..77557d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,17 +3,27 @@ description: Agenda widget with timetable version: 0.0.1 homepage: https://github.com/Iconica-Development/agenda +publish_to: none + environment: - sdk: '>=2.18.0 <3.0.0' + sdk: ">=2.18.0 <3.0.0" flutter: ">=1.17.0" dependencies: flutter: sdk: flutter + flutter_date_time_picker: + git: + url: https://github.com/Iconica-Development/flutter_date_time_picker + ref: main + timetable: + git: + url: https://github.com/Iconica-Development/timetable + ref: v0.0.2 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 -flutter: \ No newline at end of file +flutter: