diff --git a/lib/home/calendar/calendar_body.dart b/lib/home/calendar/calendar_body.dart index f6e3f5c..95ced09 100644 --- a/lib/home/calendar/calendar_body.dart +++ b/lib/home/calendar/calendar_body.dart @@ -1,6 +1,6 @@ -import 'package:animations/animations.dart'; import 'package:better_hm/home/calendar/calendar_service.dart'; -import 'package:better_hm/home/calendar/detail_screen.dart'; +import 'package:better_hm/home/calendar/components/multi_day_tile.dart'; +import 'package:better_hm/home/calendar/components/tile.dart'; import 'package:better_hm/shared/extensions/extensions_context.dart'; import 'package:better_hm/shared/models/event_data.dart'; import 'package:better_hm/shared/prefs.dart'; @@ -57,9 +57,8 @@ class _CalendarBodyState extends ConsumerState { controller: calendarController, eventsController: eventsController, viewConfiguration: currentViewConfiguration, - tileBuilder: (event, config) => _tileBuilder(event, config, context), - multiDayTileBuilder: (event, config) => - _multiDayTileBuilder(event, config, context), + tileBuilder: _tileBuilder, + multiDayTileBuilder: _multiDayTileBuilder, scheduleTileBuilder: _scheduleTileBuilder, ); } @@ -93,104 +92,24 @@ class _CalendarBodyState extends ConsumerState { Widget _tileBuilder( CustomCalendarEvent event, TileConfiguration configuration, - BuildContext context, ) { final colors = getColors(event, context); - return Padding( - padding: const EdgeInsets.only(right: 4), - child: OpenContainer( - closedShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide.none, - ), - closedColor: colors.$1, - openColor: context.theme.colorScheme.surface, - closedElevation: 0, - useRootNavigator: true, - openBuilder: (context, action) { - return CalendarDetailScreen( - key: ObjectKey(event), - event: event, - ); - }, - closedBuilder: (context, action) { - return Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - margin: EdgeInsets.zero, - elevation: 0, - color: configuration.tileType != TileType.ghost - ? colors.$1 - : colors.$1.withAlpha(100), - child: Padding( - padding: const EdgeInsets.only(left: 2), - child: configuration.tileType != TileType.ghost - ? Text( - event.eventData?.component.summary?.value.value ?? - "No title", - style: TextStyle(color: colors.$2), - softWrap: true, - ) - : null, - ), - ); - }, - ), + return Tile( + event: event, + configuration: configuration, + colors: colors, ); } Widget _multiDayTileBuilder( CustomCalendarEvent event, MultiDayTileConfiguration configuration, - BuildContext context, ) { final colors = getColors(event, context); - return Padding( - padding: const EdgeInsets.only(bottom: 2), - child: OpenContainer( - closedShape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - closedColor: colors.$1, - openColor: context.theme.colorScheme.surface, - closedElevation: 0, - useRootNavigator: true, - openBuilder: (context, action) { - return CalendarDetailScreen(event: event); - }, - closedBuilder: (context, action) { - return Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(color: colors.$1), - ), - margin: EdgeInsets.zero, - elevation: configuration.tileType == TileType.selected ? 8 : 0, - color: configuration.tileType == TileType.ghost - ? colors.$1.withAlpha(100) - : colors.$1, - child: Padding( - padding: const EdgeInsets.only(left: 2), - child: Align( - alignment: Alignment.centerLeft, - child: configuration.tileType != TileType.ghost - ? Text( - event.eventData?.component.summary?.value.value ?? - "No title", - // style: TextStyle(color: colors.$2), - style: context.theme.textTheme.bodySmall?.copyWith( - color: colors.$2, - ), - overflow: TextOverflow.clip, - softWrap: false, - ) - : null, - ), - ), - ); - }, - ), + return MultiDayTile( + event: event, + configuration: configuration, + colors: colors, ); } diff --git a/lib/home/calendar/components/multi_day_tile.dart b/lib/home/calendar/components/multi_day_tile.dart new file mode 100644 index 0000000..59f6cef --- /dev/null +++ b/lib/home/calendar/components/multi_day_tile.dart @@ -0,0 +1,70 @@ +import 'package:animations/animations.dart'; +import 'package:better_hm/home/calendar/calendar_service.dart'; +import 'package:better_hm/home/calendar/detail_screen.dart'; +import 'package:better_hm/shared/extensions/extensions_context.dart'; +import 'package:flutter/material.dart'; +import 'package:kalender/kalender.dart'; + +class MultiDayTile extends StatelessWidget { + const MultiDayTile({ + super.key, + required this.event, + required this.configuration, + required this.colors, + }); + + final CustomCalendarEvent event; + final MultiDayTileConfiguration configuration; + + final (Color, Color) colors; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 2, right: 4), + child: OpenContainer( + closedShape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + closedColor: colors.$1, + openColor: context.theme.colorScheme.surface, + closedElevation: 0, + useRootNavigator: true, + openBuilder: (context, action) { + return CalendarDetailScreen(event: event); + }, + closedBuilder: (context, action) { + return Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(color: colors.$1), + ), + margin: EdgeInsets.zero, + elevation: configuration.tileType == TileType.selected ? 8 : 0, + color: configuration.tileType == TileType.ghost + ? colors.$1.withAlpha(100) + : colors.$1, + child: Padding( + padding: const EdgeInsets.only(left: 4), + child: Align( + alignment: Alignment.centerLeft, + child: configuration.tileType != TileType.ghost + ? Text( + event.eventData?.component.summary?.value.value ?? + "No title", + // style: TextStyle(color: colors.$2), + style: context.theme.textTheme.bodySmall?.copyWith( + color: colors.$2, + ), + overflow: TextOverflow.clip, + softWrap: false, + ) + : null, + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/home/calendar/components/tile.dart b/lib/home/calendar/components/tile.dart new file mode 100644 index 0000000..6041141 --- /dev/null +++ b/lib/home/calendar/components/tile.dart @@ -0,0 +1,70 @@ +import 'package:animations/animations.dart'; +import 'package:better_hm/home/calendar/calendar_service.dart'; +import 'package:better_hm/home/calendar/detail_screen.dart'; +import 'package:better_hm/shared/extensions/extensions_context.dart'; +import 'package:flutter/material.dart'; +import 'package:kalender/kalender.dart'; + +class Tile extends StatelessWidget { + const Tile({ + super.key, + required this.event, + required this.configuration, + required this.colors, + }); + + final CustomCalendarEvent event; + final TileConfiguration configuration; + + final (Color, Color) colors; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(right: 4), + child: OpenContainer( + closedShape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide.none, + ), + closedColor: colors.$1, + openColor: context.theme.colorScheme.surface, + closedElevation: 0, + useRootNavigator: true, + openBuilder: (context, action) { + return CalendarDetailScreen( + key: ObjectKey(event), + event: event, + ); + }, + closedBuilder: (context, action) { + return Container( + padding: const EdgeInsets.only(left: 6, top: 2), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: configuration.tileType != TileType.ghost + ? colors.$1 + : colors.$1.withAlpha(100), + border: configuration.drawOutline + ? Border.all( + color: context.theme.colorScheme.surface, + width: 2, + ) + : null, + ), + margin: EdgeInsets.zero, + child: configuration.tileType != TileType.ghost + ? Text( + event.eventData?.component.summary?.value.value ?? + "No title", + style: context.theme.textTheme.bodySmall + ?.copyWith(color: colors.$2), + softWrap: true, + ) + : null, + ); + }, + ), + ); + } +} diff --git a/lib/home/calendar/detail_screen.dart b/lib/home/calendar/detail_screen.dart index 6fb3438..4e66e0d 100644 --- a/lib/home/calendar/detail_screen.dart +++ b/lib/home/calendar/detail_screen.dart @@ -25,7 +25,8 @@ class CalendarDetailScreen extends StatelessWidget { body: ListView( children: [ _TitleRow(event: event), - if (component.location != null) + if (component.location != null && + component.location!.value.value.isNotEmpty) _PropertyRow( leading: const Icon(Icons.location_on_outlined), label: Text(component.location!.value.value),