123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- import 'package:app_flowy/generated/locale_keys.g.dart';
- import 'package:app_flowy/plugins/grid/presentation/layout/sizes.dart';
- import 'package:calendar_view/calendar_view.dart';
- import 'package:easy_localization/easy_localization.dart';
- import 'package:flowy_infra/image.dart';
- import 'package:flowy_infra/size.dart';
- import 'package:flowy_infra/theme_extension.dart';
- import 'package:flowy_infra_ui/style_widget/button.dart';
- import 'package:flowy_infra_ui/style_widget/icon_button.dart';
- import 'package:flowy_infra_ui/style_widget/text.dart';
- import 'package:flutter/material.dart';
- import 'package:styled_widget/styled_widget.dart';
- import 'layout/sizes.dart';
- import 'toolbar/calendar_toolbar.dart';
- class CalendarPage extends StatelessWidget {
- const CalendarPage({super.key});
- @override
- Widget build(BuildContext context) {
- return const CalendarContent();
- }
- }
- class CalendarContent extends StatefulWidget {
- const CalendarContent({super.key});
- @override
- State<CalendarContent> createState() => _CalendarContentState();
- }
- class _CalendarContentState extends State<CalendarContent> {
- late EventController _eventController;
- GlobalKey<MonthViewState>? _calendarState;
- @override
- void initState() {
- _eventController = EventController();
- _calendarState = GlobalKey<MonthViewState>();
- super.initState();
- }
- @override
- Widget build(BuildContext context) {
- return CalendarControllerProvider(
- controller: _eventController,
- child: Column(
- children: [
- // const _ToolbarBlocAdaptor(),
- _toolbar(),
- _buildCalendar(_eventController),
- ],
- ),
- );
- }
- Widget _toolbar() {
- return const CalendarToolbar();
- }
- Widget _buildCalendar(EventController eventController) {
- return Expanded(
- child: MonthView(
- key: _calendarState,
- controller: _eventController,
- cellAspectRatio: 1.75,
- borderColor: Theme.of(context).dividerColor,
- headerBuilder: _headerNavigatorBuilder,
- weekDayBuilder: _headerWeekDayBuilder,
- cellBuilder: _calendarDayBuilder,
- ),
- );
- }
- Widget _headerNavigatorBuilder(DateTime currentMonth) {
- return Row(
- children: [
- FlowyText.medium(
- DateFormat('MMMM y', context.locale.toLanguageTag())
- .format(currentMonth),
- ),
- const Spacer(),
- FlowyIconButton(
- width: CalendarSize.navigatorButtonWidth,
- height: CalendarSize.navigatorButtonHeight,
- icon: svgWidget('home/arrow_left'),
- tooltipText: LocaleKeys.calendar_navigation_previousMonth.tr(),
- hoverColor: AFThemeExtension.of(context).lightGreyHover,
- onPressed: () => _calendarState?.currentState?.previousPage(),
- ),
- FlowyTextButton(
- LocaleKeys.calendar_navigation_today.tr(),
- fillColor: Colors.transparent,
- fontWeight: FontWeight.w500,
- tooltip: LocaleKeys.calendar_navigation_jumpToday.tr(),
- padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
- hoverColor: AFThemeExtension.of(context).lightGreyHover,
- onPressed: () =>
- _calendarState?.currentState?.animateToMonth(DateTime.now()),
- ),
- FlowyIconButton(
- width: CalendarSize.navigatorButtonWidth,
- height: CalendarSize.navigatorButtonHeight,
- icon: svgWidget('home/arrow_right'),
- tooltipText: LocaleKeys.calendar_navigation_nextMonth.tr(),
- hoverColor: AFThemeExtension.of(context).lightGreyHover,
- onPressed: () => _calendarState?.currentState?.nextPage(),
- ),
- ],
- );
- }
- Widget _headerWeekDayBuilder(day) {
- final symbols = DateFormat.EEEE(context.locale.toLanguageTag()).dateSymbols;
- final weekDayString = symbols.WEEKDAYS[day];
- return Center(
- child: Padding(
- padding: CalendarSize.daysOfWeekInsets,
- child: FlowyText.medium(
- weekDayString,
- color: Theme.of(context).hintColor,
- ),
- ),
- );
- }
- Widget _calendarDayBuilder(date, event, isToday, isInMonth) {
- Color dayTextColor = Theme.of(context).colorScheme.onSurface;
- Color cellBackgroundColor = Theme.of(context).colorScheme.surface;
- String dayString = date.day == 1
- ? DateFormat('MMM d', context.locale.toLanguageTag()).format(date)
- : date.day.toString();
- if (isToday) {
- dayTextColor = Theme.of(context).colorScheme.onPrimary;
- }
- if (!isInMonth) {
- dayTextColor = Theme.of(context).disabledColor;
- cellBackgroundColor = AFThemeExtension.of(context).lightGreyHover;
- }
- Widget day = Container(
- decoration: BoxDecoration(
- color: isToday ? Theme.of(context).colorScheme.primary : null,
- borderRadius: Corners.s6Border,
- ),
- padding: GridSize.typeOptionContentInsets,
- child: FlowyText.medium(
- dayString,
- color: dayTextColor,
- ),
- );
- return Container(
- color: cellBackgroundColor,
- child: Align(
- alignment: Alignment.topRight,
- child: day.padding(all: 6.0),
- ),
- );
- }
- }
|