From 7f3eb4fb88e78f3775a498fbda0e801f52d53ebc Mon Sep 17 00:00:00 2001 From: vitormpp Date: Fri, 26 Jan 2024 12:10:15 +0000 Subject: [PATCH 1/5] Added widgets to aggregate Academic Path page --- uni/lib/main.dart | 6 ++ uni/lib/utils/drawer_items.dart | 3 +- uni/lib/view/academic_path/academic_path.dart | 53 ++++++++++++ .../widgets/course_units_card.dart | 80 +++++++++++++++++++ 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 uni/lib/view/academic_path/academic_path.dart create mode 100644 uni/lib/view/academic_path/widgets/course_units_card.dart diff --git a/uni/lib/main.dart b/uni/lib/main.dart index 1dcbdcdc6..734b2c102 100644 --- a/uni/lib/main.dart +++ b/uni/lib/main.dart @@ -29,6 +29,7 @@ import 'package:uni/model/providers/startup/profile_provider.dart'; import 'package:uni/model/providers/startup/session_provider.dart'; import 'package:uni/model/providers/state_providers.dart'; import 'package:uni/utils/drawer_items.dart'; +import 'package:uni/view/academic_path/academic_path.dart'; import 'package:uni/view/bus_stop_next_arrivals/bus_stop_next_arrivals.dart'; import 'package:uni/view/calendar/calendar.dart'; import 'package:uni/view/common_widgets/page_transition.dart'; @@ -273,6 +274,11 @@ class ApplicationState extends State { page: const UsefulInfoPageView(), settings: settings, ), + '/${DrawerItem.navAcademicPath.title}': + PageTransition.makePageTransition( + page: const AcademicPathPageView(), + settings: settings, + ), }; return transitions[settings.name]; }, diff --git a/uni/lib/utils/drawer_items.dart b/uni/lib/utils/drawer_items.dart index 09d1e6f7d..a85b50d3b 100644 --- a/uni/lib/utils/drawer_items.dart +++ b/uni/lib/utils/drawer_items.dart @@ -8,7 +8,8 @@ enum DrawerItem { navRestaurants('restaurantes'), navCalendar('calendario'), navLibrary('biblioteca', faculties: {'feup'}), - navUsefulInfo('uteis', faculties: {'feup'}); + navUsefulInfo('uteis', faculties: {'feup'}), + navAcademicPath('percurso academico'); const DrawerItem(this.title, {this.faculties}); diff --git a/uni/lib/view/academic_path/academic_path.dart b/uni/lib/view/academic_path/academic_path.dart new file mode 100644 index 000000000..8ea05f02e --- /dev/null +++ b/uni/lib/view/academic_path/academic_path.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:uni/view/academic_path/widgets/course_units_card.dart'; +import 'package:uni/view/common_widgets/page_title.dart'; +import 'package:uni/view/common_widgets/pages_layouts/general/general.dart'; +import 'package:uni/view/home/widgets/exam_card.dart'; +import 'package:uni/view/home/widgets/main_cards_list.dart'; +import 'package:uni/view/home/widgets/schedule_card.dart'; + +class AcademicPathPageView extends StatefulWidget { + const AcademicPathPageView({super.key}); + + @override + State createState() => AcademicPathPageViewState(); +} + +class AcademicPathPageViewState extends GeneralPageViewState { + List academicPathCards = [ + ScheduleCard(), + ExamCard(), + CourseUnitsCard(), + // Add more cards if needed + ]; + + @override + Widget getBody(BuildContext context) { + return Column( + children: [ + const PageTitle(name: 'Academic Path'), + Expanded( + child: SingleChildScrollView( + child: Column( + children: academicPathCards, + ), + ), + ), + ], + ); + } + + @override + Future onRefresh(BuildContext context) async { + final cards = academicPathCards + .map( + (e) => + MainCardsList.cardCreators[e]!(const Key(''), editingMode: false), + ) + .toList(); + + for (final card in cards) { + card.onRefresh(context); + } + } +} \ No newline at end of file diff --git a/uni/lib/view/academic_path/widgets/course_units_card.dart b/uni/lib/view/academic_path/widgets/course_units_card.dart new file mode 100644 index 000000000..6b644c776 --- /dev/null +++ b/uni/lib/view/academic_path/widgets/course_units_card.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:uni/generated/l10n.dart'; +import 'package:uni/model/entities/course_units/course_unit.dart'; +import 'package:uni/model/entities/profile.dart'; +import 'package:uni/model/providers/startup/profile_provider.dart'; +import 'package:uni/utils/drawer_items.dart'; +import 'package:uni/view/common_widgets/generic_card.dart'; +import 'package:uni/view/course_units/widgets/course_unit_card.dart'; +import 'package:uni/view/lazy_consumer.dart'; + +class CourseUnitsCard extends GenericCard { + CourseUnitsCard({super.key}); + + @override + void onRefresh(BuildContext context) { + Provider.of(context, listen: false).forceRefresh(context); + } + + @override + Widget buildCardContent(BuildContext context) { + return LazyConsumer( + builder: (context, profile) { + final courseUnits = profile.courseUnits; + + return _generateCourseUnitsCards(courseUnits, context); + }, + hasContent: (Profile profile) => profile.courseUnits.isNotEmpty, + onNullContent: Center( + heightFactor: 10, + child: Text( + S.of(context).no_course_units, + style: Theme.of(context).textTheme.titleLarge, + ), + ), + ); + } + + Widget _generateCourseUnitsCards( + List courseUnits, + BuildContext context, + ) { + if (courseUnits.isEmpty) { + return Center( + heightFactor: 10, + child: Text( + S.of(context).no_course_units, + style: Theme.of(context).textTheme.titleLarge, + ), + ); + } + return Expanded( + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + child: ListView( + shrinkWrap: true, + children: _generateCourseUnitsList(courseUnits), + ), + ), + ); + } + + List _generateCourseUnitsList(List courseUnits) { + return courseUnits.map((courseUnit) { + return Column( + children: [ + CourseUnitCard(courseUnit), + const SizedBox(height: 10), + ], + ); + }).toList(); + } + + @override + String getTitle(BuildContext context) => 'Current Course Units'; + + @override + Future onClick(BuildContext context) => + Navigator.pushNamed(context, '/${DrawerItem.navCourseUnits.title}'); +} \ No newline at end of file From f2f3758e97155073758bbb1339976024b23e645a Mon Sep 17 00:00:00 2001 From: vitormpp Date: Fri, 2 Feb 2024 13:00:11 +0000 Subject: [PATCH 2/5] Filter course units --- uni/lib/view/academic_path/academic_path.dart | 15 ++----- .../widgets/course_units_card.dart | 41 +++++++++---------- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/uni/lib/view/academic_path/academic_path.dart b/uni/lib/view/academic_path/academic_path.dart index 8ea05f02e..18d761310 100644 --- a/uni/lib/view/academic_path/academic_path.dart +++ b/uni/lib/view/academic_path/academic_path.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:uni/view/academic_path/widgets/course_units_card.dart'; +import 'package:uni/view/common_widgets/generic_card.dart'; import 'package:uni/view/common_widgets/page_title.dart'; import 'package:uni/view/common_widgets/pages_layouts/general/general.dart'; import 'package:uni/view/home/widgets/exam_card.dart'; -import 'package:uni/view/home/widgets/main_cards_list.dart'; import 'package:uni/view/home/widgets/schedule_card.dart'; class AcademicPathPageView extends StatefulWidget { @@ -14,7 +14,7 @@ class AcademicPathPageView extends StatefulWidget { } class AcademicPathPageViewState extends GeneralPageViewState { - List academicPathCards = [ + List academicPathCards = [ ScheduleCard(), ExamCard(), CourseUnitsCard(), @@ -39,15 +39,8 @@ class AcademicPathPageViewState extends GeneralPageViewState { @override Future onRefresh(BuildContext context) async { - final cards = academicPathCards - .map( - (e) => - MainCardsList.cardCreators[e]!(const Key(''), editingMode: false), - ) - .toList(); - - for (final card in cards) { + for (final card in academicPathCards) { card.onRefresh(context); } } -} \ No newline at end of file +} diff --git a/uni/lib/view/academic_path/widgets/course_units_card.dart b/uni/lib/view/academic_path/widgets/course_units_card.dart index 6b644c776..abb91951f 100644 --- a/uni/lib/view/academic_path/widgets/course_units_card.dart +++ b/uni/lib/view/academic_path/widgets/course_units_card.dart @@ -19,9 +19,14 @@ class CourseUnitsCard extends GenericCard { @override Widget buildCardContent(BuildContext context) { + return LazyConsumer( builder: (context, profile) { - final courseUnits = profile.courseUnits; + final courseUnits = profile.courseUnits + .where((courseUnit) => courseUnit.enrollmentIsValid() + && courseUnit.grade == '',) + .take(5) + .toList(); return _generateCourseUnitsCards(courseUnits, context); }, @@ -49,32 +54,26 @@ class CourseUnitsCard extends GenericCard { ), ); } - return Expanded( - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 20), - child: ListView( - shrinkWrap: true, - children: _generateCourseUnitsList(courseUnits), - ), - ), + + return ListView( + shrinkWrap: true, + padding: const EdgeInsets.symmetric(horizontal: 20), + children: courseUnits.map((courseUnit) { + return Column( + children: [ + CourseUnitCard(courseUnit), + const SizedBox(height: 10), + ], + ); + }).toList(), ); } - List _generateCourseUnitsList(List courseUnits) { - return courseUnits.map((courseUnit) { - return Column( - children: [ - CourseUnitCard(courseUnit), - const SizedBox(height: 10), - ], - ); - }).toList(); - } @override - String getTitle(BuildContext context) => 'Current Course Units'; + String getTitle(BuildContext context) => 'Course Units'; @override Future onClick(BuildContext context) => Navigator.pushNamed(context, '/${DrawerItem.navCourseUnits.title}'); -} \ No newline at end of file +} From 2b7f6aba6d2840b1375f29e5ce85632930389ed4 Mon Sep 17 00:00:00 2001 From: vitormpp Date: Fri, 2 Feb 2024 13:17:11 +0000 Subject: [PATCH 3/5] Translation en-pt --- uni/lib/generated/intl/messages_en.dart | 1 + uni/lib/generated/intl/messages_pt_PT.dart | 1 + uni/lib/l10n/intl_en.arb | 2 +- uni/lib/l10n/intl_pt_PT.arb | 2 +- uni/lib/utils/drawer_items.dart | 2 +- uni/lib/view/academic_path/academic_path.dart | 6 +++++- uni/lib/view/academic_path/widgets/course_units_card.dart | 3 ++- 7 files changed, 12 insertions(+), 5 deletions(-) diff --git a/uni/lib/generated/intl/messages_en.dart b/uni/lib/generated/intl/messages_en.dart index d12932f32..369500799 100644 --- a/uni/lib/generated/intl/messages_en.dart +++ b/uni/lib/generated/intl/messages_en.dart @@ -35,6 +35,7 @@ class MessageLookup extends MessageLookupByLibrary { 'restaurantes': 'Restaurants', 'calendario': 'Calendar', 'biblioteca': 'Library', + 'percurso_academico': 'Academic Path', 'uteis': 'Utils', 'other': 'Other', })}"; diff --git a/uni/lib/generated/intl/messages_pt_PT.dart b/uni/lib/generated/intl/messages_pt_PT.dart index ecc041c37..fb6a1bcb6 100644 --- a/uni/lib/generated/intl/messages_pt_PT.dart +++ b/uni/lib/generated/intl/messages_pt_PT.dart @@ -35,6 +35,7 @@ class MessageLookup extends MessageLookupByLibrary { 'restaurantes': 'Restaurantes', 'calendario': 'Calendário', 'biblioteca': 'Biblioteca', + 'percurso_academico': 'Percurso Académico', 'uteis': 'Úteis', 'other': 'Outros', })}"; diff --git a/uni/lib/l10n/intl_en.arb b/uni/lib/l10n/intl_en.arb index 86f8fe8bc..c61bd64be 100644 --- a/uni/lib/l10n/intl_en.arb +++ b/uni/lib/l10n/intl_en.arb @@ -166,7 +166,7 @@ "@min_value_reference": {}, "multimedia_center": "Multimedia center", "@multimedia_center": {}, - "nav_title": "{title, select, horario{Schedule} exames{Exams} area{Personal Area} cadeiras{Course Units} autocarros{Buses} locais{Places} restaurantes{Restaurants} calendario{Calendar} biblioteca{Library} uteis{Utils} other{Other}}", + "nav_title": "{title, select, horario{Schedule} exames{Exams} area{Personal Area} cadeiras{Course Units} autocarros{Buses} locais{Places} restaurantes{Restaurants} calendario{Calendar} biblioteca{Library} percurso_academico{Academic Path} uteis{Utils} other{Other}}", "@nav_title": {}, "news": "News", "@news": {}, diff --git a/uni/lib/l10n/intl_pt_PT.arb b/uni/lib/l10n/intl_pt_PT.arb index b674d046f..0dc766131 100644 --- a/uni/lib/l10n/intl_pt_PT.arb +++ b/uni/lib/l10n/intl_pt_PT.arb @@ -166,7 +166,7 @@ "@min_value_reference": {}, "multimedia_center": "Centro de multimédia", "@multimedia_center": {}, - "nav_title": "{title, select, horario{Horário} exames{Exames} area{Área Pessoal} cadeiras{Cadeiras} autocarros{Autocarros} locais{Locais} restaurantes{Restaurantes} calendario{Calendário} biblioteca{Biblioteca} uteis{Úteis} other{Outros}}", + "nav_title": "{title, select, horario{Horário} exames{Exames} area{Área Pessoal} cadeiras{Cadeiras} autocarros{Autocarros} locais{Locais} restaurantes{Restaurantes} calendario{Calendário} biblioteca{Biblioteca} percurso_academico{Percurso Académico} uteis{Úteis} other{Outros}}", "@nav_title": {}, "news": "Notícias", "@news": {}, diff --git a/uni/lib/utils/drawer_items.dart b/uni/lib/utils/drawer_items.dart index a85b50d3b..52c4e8634 100644 --- a/uni/lib/utils/drawer_items.dart +++ b/uni/lib/utils/drawer_items.dart @@ -9,7 +9,7 @@ enum DrawerItem { navCalendar('calendario'), navLibrary('biblioteca', faculties: {'feup'}), navUsefulInfo('uteis', faculties: {'feup'}), - navAcademicPath('percurso academico'); + navAcademicPath('percurso_academico'); const DrawerItem(this.title, {this.faculties}); diff --git a/uni/lib/view/academic_path/academic_path.dart b/uni/lib/view/academic_path/academic_path.dart index 18d761310..ea4b27cc1 100644 --- a/uni/lib/view/academic_path/academic_path.dart +++ b/uni/lib/view/academic_path/academic_path.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:uni/generated/l10n.dart'; +import 'package:uni/utils/drawer_items.dart'; import 'package:uni/view/academic_path/widgets/course_units_card.dart'; import 'package:uni/view/common_widgets/generic_card.dart'; import 'package:uni/view/common_widgets/page_title.dart'; @@ -25,7 +27,8 @@ class AcademicPathPageViewState extends GeneralPageViewState { Widget getBody(BuildContext context) { return Column( children: [ - const PageTitle(name: 'Academic Path'), + PageTitle(name: + S.of(context).nav_title(DrawerItem.navAcademicPath.title),), Expanded( child: SingleChildScrollView( child: Column( @@ -37,6 +40,7 @@ class AcademicPathPageViewState extends GeneralPageViewState { ); } + @override Future onRefresh(BuildContext context) async { for (final card in academicPathCards) { diff --git a/uni/lib/view/academic_path/widgets/course_units_card.dart b/uni/lib/view/academic_path/widgets/course_units_card.dart index abb91951f..dbf9dc3e6 100644 --- a/uni/lib/view/academic_path/widgets/course_units_card.dart +++ b/uni/lib/view/academic_path/widgets/course_units_card.dart @@ -71,7 +71,8 @@ class CourseUnitsCard extends GenericCard { @override - String getTitle(BuildContext context) => 'Course Units'; + String getTitle(BuildContext context) => + S.of(context).nav_title(DrawerItem.navCourseUnits.title); @override Future onClick(BuildContext context) => From 161a8a082db23819b9cb9fdcc625932b9b450aea Mon Sep 17 00:00:00 2001 From: Bruno Mendes Date: Wed, 7 Feb 2024 16:06:15 +0000 Subject: [PATCH 4/5] Fix academic card scroll --- uni/lib/view/academic_path/academic_path.dart | 16 +++----- .../widgets/course_units_card.dart | 39 +++++++++---------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/uni/lib/view/academic_path/academic_path.dart b/uni/lib/view/academic_path/academic_path.dart index ea4b27cc1..e06ef1d65 100644 --- a/uni/lib/view/academic_path/academic_path.dart +++ b/uni/lib/view/academic_path/academic_path.dart @@ -25,22 +25,18 @@ class AcademicPathPageViewState extends GeneralPageViewState { @override Widget getBody(BuildContext context) { - return Column( + return ListView( children: [ - PageTitle(name: - S.of(context).nav_title(DrawerItem.navAcademicPath.title),), - Expanded( - child: SingleChildScrollView( - child: Column( - children: academicPathCards, - ), - ), + PageTitle( + name: S.of(context).nav_title(DrawerItem.navAcademicPath.title), + ), + Column( + children: academicPathCards, ), ], ); } - @override Future onRefresh(BuildContext context) async { for (final card in academicPathCards) { diff --git a/uni/lib/view/academic_path/widgets/course_units_card.dart b/uni/lib/view/academic_path/widgets/course_units_card.dart index dbf9dc3e6..04962e3ab 100644 --- a/uni/lib/view/academic_path/widgets/course_units_card.dart +++ b/uni/lib/view/academic_path/widgets/course_units_card.dart @@ -19,15 +19,15 @@ class CourseUnitsCard extends GenericCard { @override Widget buildCardContent(BuildContext context) { - return LazyConsumer( builder: (context, profile) { final courseUnits = profile.courseUnits - .where((courseUnit) => courseUnit.enrollmentIsValid() - && courseUnit.grade == '',) + .where( + (courseUnit) => + courseUnit.enrollmentIsValid() && courseUnit.grade == '', + ) .take(5) .toList(); - return _generateCourseUnitsCards(courseUnits, context); }, hasContent: (Profile profile) => profile.courseUnits.isNotEmpty, @@ -42,12 +42,12 @@ class CourseUnitsCard extends GenericCard { } Widget _generateCourseUnitsCards( - List courseUnits, - BuildContext context, - ) { + List courseUnits, + BuildContext context, + ) { if (courseUnits.isEmpty) { return Center( - heightFactor: 10, + heightFactor: 3, child: Text( S.of(context).no_course_units, style: Theme.of(context).textTheme.titleLarge, @@ -55,21 +55,20 @@ class CourseUnitsCard extends GenericCard { ); } - return ListView( - shrinkWrap: true, - padding: const EdgeInsets.symmetric(horizontal: 20), - children: courseUnits.map((courseUnit) { - return Column( - children: [ - CourseUnitCard(courseUnit), - const SizedBox(height: 10), - ], - ); - }).toList(), + return Column( + children: courseUnits + .map( + (courseUnit) => Column( + children: [ + CourseUnitCard(courseUnit), + const SizedBox(height: 10), + ], + ), + ) + .toList(), ); } - @override String getTitle(BuildContext context) => S.of(context).nav_title(DrawerItem.navCourseUnits.title); From 94694a4b064887544660e9bb2d2694545bfbbefa Mon Sep 17 00:00:00 2001 From: vitormpp Date: Wed, 7 Feb 2024 19:30:08 +0000 Subject: [PATCH 5/5] Used Padding widget instead of SizedBox --- uni/lib/view/academic_path/widgets/course_units_card.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/uni/lib/view/academic_path/widgets/course_units_card.dart b/uni/lib/view/academic_path/widgets/course_units_card.dart index 04962e3ab..e2553b683 100644 --- a/uni/lib/view/academic_path/widgets/course_units_card.dart +++ b/uni/lib/view/academic_path/widgets/course_units_card.dart @@ -60,8 +60,10 @@ class CourseUnitsCard extends GenericCard { .map( (courseUnit) => Column( children: [ - CourseUnitCard(courseUnit), - const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.all(5), + child: CourseUnitCard(courseUnit), + ), ], ), )