| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import 'package:flutter/material.dart';
- import 'package:jiffy/jiffy.dart';
- import 'package:tp5/roster/widgets/w_month.dart';
- import 'package:scroll_to_index/scroll_to_index.dart';
- class HorizontalMonth extends StatefulWidget {
- const HorizontalMonth(
- {super.key,
- required this.start,
- required this.end,
- required this.onmonthclick,
- required this.selectedmonth});
- final Jiffy start;
- final Jiffy end;
- final void Function(Jiffy date) onmonthclick;
- final List<Jiffy> selectedmonth;
- @override
- State<HorizontalMonth> createState() => _WMonthsState();
- }
- class _WMonthsState extends State<HorizontalMonth> {
- final AutoScrollController scrollCtrl = AutoScrollController();
- List<Jiffy> dates = [];
- @override
- void initState() {
- Jiffy ijiffy = widget.start;
- while (ijiffy.isSameOrBefore(widget.end)) {
- if (!(dates
- .map((Jiffy e) => e.format(pattern: "MMMyy"))
- .contains(ijiffy.format(pattern: "MMMyy")))) {
- dates.add(ijiffy);
- }
- ijiffy = ijiffy.add(days: 1);
- }
- dates = dates.reversed.toList();
- int index = 0;
- for (var date in dates) {
- if ((widget.selectedmonth).any((month) =>
- month.isSameOrAfter(date.startOf(Unit.month)) &&
- month.isSameOrBefore(date.endOf(Unit.month)))) {
- break;
- }
- index++;
- }
- Future.delayed(const Duration(milliseconds: 300)).then((value) =>
- scrollCtrl.scrollToIndex(index,
- duration: const Duration(milliseconds: 1000),
- preferPosition: AutoScrollPosition.middle));
- super.initState();
- }
- @override
- Widget build(BuildContext context) {
- return SizedBox(
- height: 90,
- child: ListView.builder(
- controller: scrollCtrl,
- padding: const EdgeInsets.all(5),
- scrollDirection: Axis.horizontal,
- itemCount: dates.length,
- itemBuilder: (_, i) => AutoScrollTag(
- key: ValueKey(i),
- controller: scrollCtrl,
- index: i,
- child: InkWell(
- onTap: () => widget.onmonthclick(dates.elementAt(i)),
- child: WMonth(
- date: dates.elementAt(i),
- selected: widget.selectedmonth.any((Jiffy j) => (j
- .isSameOrAfter(
- dates.elementAt(i).startOf(Unit.month)) &&
- j.isSameOrBefore(dates.elementAt(i).endOf(Unit.month)))),
- ),
- ))),
- );
- }
- }
|