Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redesign/calendar page #1444

Merged
merged 16 commits into from
Feb 6, 2025
93 changes: 76 additions & 17 deletions packages/uni_app/lib/model/entities/calendar_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,90 @@ part '../../generated/model/entities/calendar_event.g.dart';
/// An event in the school calendar
@JsonSerializable()
class CalendarEvent {
CalendarEvent(this.name, this.date);
/// Creates an instance of the class [CalendarEvent]
///

CalendarEvent(this.name, this.date) {
if (date != 'TBD') {
date = formatString(date);
}
RegExpMatch? match;
String? day1;
String? day2;
String? year1;
String? month1;
String? month2;
String? year2;
final regex1 = RegExp(r'(\d{1,2}) ([a-zç]+) (\d{4})');
final regex2 = RegExp(r'(\d{1,2}) (\d{1,2}) ([a-zç]+) (\d{4})');
final regex3 = RegExp(r'(\d{1,2}) ([a-zç]+) (\d{1,2}) ([a-zç]+) (\d{4})');
final regex4 =
RegExp(r'(\d{1,2}) ([a-zç]+) (\d{4}) (\d{1,2}) ([a-zç]+) (\d{4})');

match = regex4.firstMatch(date);
if (match != null && match.groupCount == 6) {
day1 = match.group(1);
month1 = match.group(2);
year1 = match.group(3);
day2 = match.group(4);
month2 = match.group(5);
year2 = match.group(6);
start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1');
finish =
DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day2 $month2 $year2');
return;
}

match = regex3.firstMatch(date);
if (match != null && match.groupCount == 5) {
day1 = match.group(1);
month1 = match.group(2);
day2 = match.group(3);
month2 = match.group(4);
year1 = match.group(5);
start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1');
finish =
DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day2 $month2 $year1');
return;
}
match = regex2.firstMatch(date);
if (match != null && match.groupCount == 4) {
day1 = match.group(1);
day2 = match.group(2);
month1 = match.group(3);
year1 = match.group(4);
start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1');
finish =
DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day2 $month1 $year1');
return;
}
match = regex1.firstMatch(date);
if (match != null && match.groupCount == 3) {
day1 = match.group(1);
month1 = match.group(2);
year1 = match.group(3);
start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1');
return;
}
}
factory CalendarEvent.fromJson(Map<String, dynamic> json) =>
_$CalendarEventFromJson(json);

/// Creates an instance of the class [CalendarEvent]
///
String name;
String date;
DateTime? start;
DateTime? finish;

Map<String, dynamic> toJson() => _$CalendarEventToJson(this);

DateTime? get parsedStartDate {
final splitDate = date.split(' ');
final month = splitDate.firstWhere(
(element) =>
DateFormat.MMMM('pt').dateSymbols.MONTHS.contains(element) ||
element == 'TBD',
);

try {
return DateFormat('dd MMMM yyyy', 'pt')
.parse('${splitDate[0]} $month ${splitDate.last}');
} catch (_) {
return null;
}
String formatString(String date) {
return date
.toLowerCase()
.replaceAll(RegExp(r'\baté\b'), '')
.replaceAll(RegExp(r'\bde\b'), '')
.replaceAll(RegExp(r'\ba\b'), '')
.replaceAll(RegExp(r'\e\b'), '')
.replaceAll(RegExp(r'\s+'), ' ')
.trim();
}
}
26 changes: 7 additions & 19 deletions packages/uni_app/lib/view/calendar/calendar.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:timelines/timelines.dart';
import 'package:uni/generated/l10n.dart';
import 'package:uni/model/entities/calendar_event.dart';
import 'package:uni/model/providers/lazy/calendar_provider.dart';
import 'package:uni/utils/navigation_items.dart';
import 'package:uni/view/calendar/widgets/calendar_tile.dart';
import 'package:uni/view/calendar/widgets/row_format.dart';
import 'package:uni/view/common_widgets/pages_layouts/secondary/secondary.dart';
import 'package:uni/view/lazy_consumer.dart';
import 'package:uni/view/locale_notifier.dart';

class CalendarPageView extends StatefulWidget {
const CalendarPageView({super.key});
Expand All @@ -32,24 +32,12 @@ class CalendarPageViewState extends SecondaryPageViewState<CalendarPageView> {
}

Widget getTimeline(BuildContext context, List<CalendarEvent> calendar) {
final locale = Provider.of<LocaleNotifier>(context).getLocale();
return SingleChildScrollView(
child: FixedTimeline.tileBuilder(
theme: TimelineTheme.of(context).copyWith(
connectorTheme: TimelineTheme.of(context)
.connectorTheme
.copyWith(thickness: 2, color: Theme.of(context).dividerColor),
indicatorTheme: TimelineTheme.of(context)
.indicatorTheme
.copyWith(size: 15, color: Theme.of(context).primaryColor),
),
builder: TimelineTileBuilder.fromStyle(
contentsAlign: ContentsAlign.alternating,
contentsBuilder: (_, index) =>
CalendarTile(text: calendar[index].name),
oppositeContentsBuilder: (_, index) =>
CalendarTile(text: calendar[index].date, isOpposite: true),
itemCount: calendar.length,
),
child: Column(
children: calendar
.map((event) => RowFormat(event: event, locale: locale))
.toList(),
),
);
}
Expand Down
6 changes: 3 additions & 3 deletions packages/uni_app/lib/view/calendar/widgets/calendar_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ class CalendarCard extends GenericCard {

List<CalendarEvent> getFurtherEvents(List<CalendarEvent> events) {
final sortedEvents = events
.where((element) => element.parsedStartDate != null)
.sorted((a, b) => a.parsedStartDate!.compareTo(b.parsedStartDate!));
.where((element) => element.start != null)
.sorted((a, b) => a.start!.compareTo(b.start!));
final pinEvent = sortedEvents.firstWhere(
(element) => element.parsedStartDate!.compareTo(DateTime.now()) == 1,
(element) => element.start!.compareTo(DateTime.now()) == 1,
);
return sortedEvents.sublist(
sortedEvents.indexOf(pinEvent),
Expand Down
25 changes: 0 additions & 25 deletions packages/uni_app/lib/view/calendar/widgets/calendar_tile.dart

This file was deleted.

94 changes: 94 additions & 0 deletions packages/uni_app/lib/view/calendar/widgets/row_format.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:uni/model/entities/app_locale.dart';
import 'package:uni/model/entities/calendar_event.dart';
import 'package:uni_ui/cards/timeline_card.dart';

// TODO(thePeras): This class should be extracted up
class RowFormat extends StatelessWidget {
const RowFormat({super.key, required this.event, required this.locale});
final CalendarEvent event;
final AppLocale locale;

@override
Widget build(BuildContext context) {
final eventperiod = eventPeriod(event.date, event.start, event.finish);

return TimelineItem(
title: eventperiod[0],
subtitle: eventperiod[1],
card: Text(
event.name,
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
fontSize: 16,
fontWeight: FontWeight.w500,
height: 1,
),
maxLines: 5,
),
);
}

// TODO(thePeras): This shoudn't exist here
List<String> eventPeriod(String date, DateTime? start, DateTime? end) {
final period = <String>[];
String timePeriod;
String month;
String? month1;
String day;
String? day1;
String year;
String? year1;
if (start == null) {
period
..add(date)
..add('');
return period;
}
year = start.year.toString();
month = shortMonth(start);
day = start.day.toString();
if (end == null) {
timePeriod = '$day $month';
period
..add(timePeriod)
..add(year);
return period;
}
day1 = end.day.toString();
year1 = end.year.toString();
month1 = shortMonth(end);
if (year == year1 && month1 == month) {
timePeriod = '$day-$day1 $month';
period
..add(timePeriod)
..add(year);
return period;
}
if (year == year1 && month1 != month) {
timePeriod = '$day $month-$day1 $month1';
period
..add(timePeriod)
..add(year);
return period;
}
if (year1 != year) {
timePeriod = '$day $month-$day1 $month1';
period
..add(timePeriod)
..add(year);
return period;
}
period
..add('the date')
..add(date);
return period;
}

String shortMonth(DateTime date) {
return DateFormat.MMM(locale.localeCode.languageCode)
.format(date)
.replaceFirst('.', '');
}
}
8 changes: 5 additions & 3 deletions packages/uni_ui/lib/cards/timeline_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ class TimelineItem extends StatelessWidget {
Widget build(BuildContext context) {
return Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
Container(
width: 50,
width: 60,
child: Column(
children: [
Text(title,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18)),
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center),
Text(subtitle,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600))
style: Theme.of(context).textTheme.labelLarge,
textAlign: TextAlign.center),
],
),
),
Expand Down