mirror of
https://github.com/Iconica-Development/flutter_agenda.git
synced 2025-05-18 21:03:45 +02:00
feat: added datetime_picker
This commit is contained in:
parent
c8e010e3ec
commit
c775e06f77
8 changed files with 276 additions and 5 deletions
|
@ -1,7 +1,7 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.iconica.agenda_example">
|
||||
<application
|
||||
android:label="agenda_example"
|
||||
android:label="Flutter Agenda Example"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:agenda/agenda.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
void main() {
|
||||
|
@ -9,6 +10,69 @@ class AgendaDemo extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(body: Text('AgendaDemo'));
|
||||
return Scaffold(
|
||||
body: SafeArea(
|
||||
child: AgendaWidget(
|
||||
header: Text('Agenda', style: Theme.of(context).textTheme.headline6),
|
||||
blockWidth: 50,
|
||||
highlightToday: false,
|
||||
blocks: [
|
||||
AgendaEvent(
|
||||
start: DateTime.now().subtract(const Duration(hours: 3)),
|
||||
end: DateTime.now().add(const Duration(hours: 2)),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().subtract(const Duration(hours: 2)),
|
||||
end: DateTime.now().add(const Duration(hours: 1)),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().subtract(const Duration(hours: 1)),
|
||||
end: DateTime.now().add(const Duration(hours: 1)),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().add(const Duration(hours: 3)),
|
||||
end: DateTime.now().add(const Duration(hours: 4)),
|
||||
id: 4,
|
||||
content: const Text('event 4'),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().add(const Duration(hours: 3)),
|
||||
end: DateTime.now().add(const Duration(hours: 4)),
|
||||
id: 4,
|
||||
content: const Text('event 5'),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().add(const Duration(hours: 3)),
|
||||
end: DateTime.now().add(const Duration(hours: 4)),
|
||||
id: 4,
|
||||
content: const Text('event 6'),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().add(const Duration(days: 1)),
|
||||
end: DateTime.now()
|
||||
.add(const Duration(days: 1))
|
||||
.add(const Duration(hours: 2)),
|
||||
),
|
||||
AgendaEvent(
|
||||
start: DateTime.now().subtract(const Duration(hours: 2)),
|
||||
end: DateTime.now().add(const Duration(hours: 1)),
|
||||
),
|
||||
],
|
||||
disabledDates: [
|
||||
// yesterday
|
||||
DateTime.now().subtract(const Duration(days: 1)),
|
||||
],
|
||||
highlightedDates: [
|
||||
// tomorrow
|
||||
DateTime.now().add(const Duration(days: 1)),
|
||||
],
|
||||
theme: const AgendaTheme(
|
||||
tableTheme: TableTheme(
|
||||
blockPaddingBetween: 10,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,6 +62,15 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_date_time_picker:
|
||||
dependency: transitive
|
||||
description:
|
||||
path: "."
|
||||
ref: main
|
||||
resolved-ref: "7a3c66d28c2d29c1983d186435ed559a19fe34ff"
|
||||
url: "https://github.com/Iconica-Development/flutter_date_time_picker"
|
||||
source: git
|
||||
version: "0.0.1"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
@ -74,6 +83,13 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
intl:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: intl
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.17.0"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -156,6 +172,15 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.12"
|
||||
timetable:
|
||||
dependency: transitive
|
||||
description:
|
||||
path: "."
|
||||
ref: "v0.0.2"
|
||||
resolved-ref: "62fdaa443818bd646058b536a12304725d1619fd"
|
||||
url: "https://github.com/Iconica-Development/timetable"
|
||||
source: git
|
||||
version: "0.0.1"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -165,4 +190,4 @@ packages:
|
|||
version: "2.1.2"
|
||||
sdks:
|
||||
dart: ">=2.18.0 <3.0.0"
|
||||
flutter: ">=1.17.0"
|
||||
flutter: ">=2.0.0"
|
||||
|
|
|
@ -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';
|
||||
|
|
128
lib/src/agenda.dart
Normal file
128
lib/src/agenda.dart
Normal file
|
@ -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<AgendaEvent> blocks;
|
||||
|
||||
final List<DateTime> highlightedDates;
|
||||
|
||||
final List<DateTime> 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<AgendaWidget> createState() => _AgendaWidgetState();
|
||||
}
|
||||
|
||||
class _AgendaWidgetState extends State<AgendaWidget> {
|
||||
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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
23
lib/src/models/agenda_event.dart
Normal file
23
lib/src/models/agenda_event.dart
Normal file
|
@ -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;
|
||||
}
|
15
lib/src/models/agenda_theme.dart
Normal file
15
lib/src/models/agenda_theme.dart
Normal file
|
@ -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;
|
||||
}
|
12
pubspec.yaml
12
pubspec.yaml
|
@ -3,13 +3,23 @@ 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:
|
||||
|
|
Loading…
Reference in a new issue