diff --git a/packages/uni_app/assets/images/files.png b/packages/uni_app/assets/images/files.png new file mode 100644 index 000000000..d423390fe Binary files /dev/null and b/packages/uni_app/assets/images/files.png differ diff --git a/packages/uni_app/lib/generated/intl/messages_all.dart b/packages/uni_app/lib/generated/intl/messages_all.dart index b77f94db2..6b3ebeae5 100644 --- a/packages/uni_app/lib/generated/intl/messages_all.dart +++ b/packages/uni_app/lib/generated/intl/messages_all.dart @@ -11,7 +11,6 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; import 'package:intl/src/intl_helpers.dart'; @@ -21,8 +20,8 @@ import 'messages_pt_PT.dart' as messages_pt_pt; typedef Future LibraryLoader(); Map _deferredLibraries = { - 'en': () => new SynchronousFuture(null), - 'pt_PT': () => new SynchronousFuture(null), + 'en': () => new Future.value(null), + 'pt_PT': () => new Future.value(null), }; MessageLookupByLibrary? _findExact(String localeName) { @@ -37,18 +36,18 @@ MessageLookupByLibrary? _findExact(String localeName) { } /// User programs should call this before using [localeName] for messages. -Future initializeMessages(String localeName) { +Future initializeMessages(String localeName) async { var availableLocale = Intl.verifiedLocale( localeName, (locale) => _deferredLibraries[locale] != null, onFailure: (_) => null); if (availableLocale == null) { - return new SynchronousFuture(false); + return new Future.value(false); } var lib = _deferredLibraries[availableLocale]; - lib == null ? new SynchronousFuture(false) : lib(); + await (lib == null ? new Future.value(false) : lib()); initializeInternalMessageLookup(() => new CompositeMessageLookup()); messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); - return new SynchronousFuture(true); + return new Future.value(true); } bool _messagesExistFor(String locale) { diff --git a/packages/uni_app/lib/generated/intl/messages_en.dart b/packages/uni_app/lib/generated/intl/messages_en.dart index c684ea722..b3ab90f05 100644 --- a/packages/uni_app/lib/generated/intl/messages_en.dart +++ b/packages/uni_app/lib/generated/intl/messages_en.dart @@ -7,8 +7,7 @@ // ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new // ignore_for_file:prefer_single_quotes,comment_references, directives_ordering // ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes -// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes +// ignore_for_file:unused_import, file_names import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; @@ -20,7 +19,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'en'; - static String m0(type) => "${Intl.select(type, { + static m0(type) => "${Intl.select(type, { 'all_dishes': 'All dishes', 'meat_dishes': 'Meat dishes', 'fish_dishes': 'Fish dishes', @@ -32,12 +31,12 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Other', })}"; - static String m1(time) => "last refresh at ${time}"; + static m1(time) => "last refresh at ${time}"; - static String m2(time) => + static m2(time) => "${Intl.plural(time, zero: 'Refreshed ${time} minutes ago', one: 'Refreshed ${time} minute ago', other: 'Refreshed ${time} minutes ago')}"; - static String m3(title) => "${Intl.select(title, { + static m3(title) => "${Intl.select(title, { 'horario': 'Schedule', 'exames': 'Exams', 'area': 'Personal Area', @@ -53,14 +52,14 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Other', })}"; - static String m4(period) => "${Intl.select(period, { + static m4(period) => "${Intl.select(period, { 'lunch': 'Lunch', 'dinner': 'Dinner', 'other': 'Other', })}"; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { + static _notInlinedMessages(_) => { "about": MessageLookupByLibrary.simpleMessage("About us"), "academic_services": MessageLookupByLibrary.simpleMessage("Academic services"), @@ -248,8 +247,12 @@ class MessageLookup extends MessageLookupByLibrary { "Looks like you are on vacation!"), "no_favorite_restaurants": MessageLookupByLibrary.simpleMessage("No favorite restaurants"), + "no_files": + MessageLookupByLibrary.simpleMessage("There\'s no files attached"), "no_files_found": MessageLookupByLibrary.simpleMessage("No files found"), + "no_files_label": + MessageLookupByLibrary.simpleMessage("You have nothing to see!"), "no_info": MessageLookupByLibrary.simpleMessage( "There is no information to display"), "no_internet": MessageLookupByLibrary.simpleMessage( diff --git a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart index 296707ff4..feb8303f1 100644 --- a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart +++ b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart @@ -7,8 +7,7 @@ // ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new // ignore_for_file:prefer_single_quotes,comment_references, directives_ordering // ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases -// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes -// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes +// ignore_for_file:unused_import, file_names import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; @@ -20,7 +19,7 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'pt_PT'; - static String m0(type) => "${Intl.select(type, { + static m0(type) => "${Intl.select(type, { 'all_dishes': 'Todos os pratos', 'meat_dishes': 'Pratos de Carne', 'fish_dishes': 'Pratos de Peixe', @@ -32,12 +31,12 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Outros', })}"; - static String m1(time) => "última atualização às ${time}"; + static m1(time) => "última atualização às ${time}"; - static String m2(time) => + static m2(time) => "${Intl.plural(time, zero: 'Atualizado há ${time} minutos', one: 'Atualizado há ${time} minuto', other: 'Atualizado há ${time} minutos')}"; - static String m3(title) => "${Intl.select(title, { + static m3(title) => "${Intl.select(title, { 'horario': 'Horário', 'exames': 'Exames', 'area': 'Área Pessoal', @@ -53,14 +52,14 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Outros', })}"; - static String m4(period) => "${Intl.select(period, { + static m4(period) => "${Intl.select(period, { 'lunch': 'Almoço', 'dinner': 'Jantar', 'other': 'Other', })}"; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { + static _notInlinedMessages(_) => { "about": MessageLookupByLibrary.simpleMessage("Sobre nós"), "academic_services": MessageLookupByLibrary.simpleMessage("Serviços académicos"), @@ -247,8 +246,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Parece que estás de férias!"), "no_favorite_restaurants": MessageLookupByLibrary.simpleMessage("Sem restaurantes favoritos"), + "no_files": MessageLookupByLibrary.simpleMessage( + "Não possui ficheiros anexados"), "no_files_found": MessageLookupByLibrary.simpleMessage("Nenhum ficheiro encontrado"), + "no_files_label": + MessageLookupByLibrary.simpleMessage("Não tens nada para ver!"), "no_info": MessageLookupByLibrary.simpleMessage( "Não existem informações para apresentar"), "no_internet": diff --git a/packages/uni_app/lib/generated/l10n.dart b/packages/uni_app/lib/generated/l10n.dart index 6459637b6..b7b9b7930 100644 --- a/packages/uni_app/lib/generated/l10n.dart +++ b/packages/uni_app/lib/generated/l10n.dart @@ -10,7 +10,7 @@ import 'intl/messages_all.dart'; // ignore_for_file: non_constant_identifier_names, lines_longer_than_80_chars // ignore_for_file: join_return_with_assignment, prefer_final_in_for_each -// ignore_for_file: avoid_redundant_argument_values, avoid_escaping_inner_quotes +// ignore_for_file: avoid_redundant_argument_values class S { S(); @@ -1098,6 +1098,26 @@ class S { ); } + /// `There's no files attached` + String get no_files { + return Intl.message( + 'There\'s no files attached', + name: 'no_files', + desc: '', + args: [], + ); + } + + /// `You have nothing to see!` + String get no_files_label { + return Intl.message( + 'You have nothing to see!', + name: 'no_files_label', + desc: '', + args: [], + ); + } + /// `No favorite restaurants` String get no_favorite_restaurants { return Intl.message( diff --git a/packages/uni_app/lib/l10n/intl_en.arb b/packages/uni_app/lib/l10n/intl_en.arb index b64f0db01..1f524d32b 100644 --- a/packages/uni_app/lib/l10n/intl_en.arb +++ b/packages/uni_app/lib/l10n/intl_en.arb @@ -214,6 +214,10 @@ "@no_exams": {}, "no_exams_label": "Looks like you are on vacation!", "@no_exams_label": {}, + "no_files": "There's no files attached", + "@no_files": {}, + "no_files_label": "You have nothing to see!", + "@no_files_label": {}, "no_favorite_restaurants": "No favorite restaurants", "@no_favorite_restaurants": {}, "no_info": "There is no information to display", diff --git a/packages/uni_app/lib/l10n/intl_pt_PT.arb b/packages/uni_app/lib/l10n/intl_pt_PT.arb index 03e3a26b8..20c389e45 100644 --- a/packages/uni_app/lib/l10n/intl_pt_PT.arb +++ b/packages/uni_app/lib/l10n/intl_pt_PT.arb @@ -220,6 +220,10 @@ "@no_events": {}, "no_exams_label": "Parece que estás de férias!", "@no_exams_label": {}, + "no_files": "Não possui ficheiros anexados", + "@no_files": {}, + "no_files_label": "Não tens nada para ver!", + "@no_files_label": {}, "no_favorite_restaurants": "Sem restaurantes favoritos", "@no_favorite_restaurants": {}, "no_info": "Não existem informações para apresentar", diff --git a/packages/uni_app/lib/view/course_unit_info/course_unit_info.dart b/packages/uni_app/lib/view/course_unit_info/course_unit_info.dart index e48748c62..f4c4fb88c 100644 --- a/packages/uni_app/lib/view/course_unit_info/course_unit_info.dart +++ b/packages/uni_app/lib/view/course_unit_info/course_unit_info.dart @@ -9,6 +9,7 @@ import 'package:uni/model/providers/startup/session_provider.dart'; import 'package:uni/view/common_widgets/pages_layouts/secondary/secondary.dart'; import 'package:uni/view/course_unit_info/widgets/course_unit_classes.dart'; import 'package:uni/view/course_unit_info/widgets/course_unit_files.dart'; +import 'package:uni/view/course_unit_info/widgets/course_unit_no_files.dart'; import 'package:uni/view/course_unit_info/widgets/course_unit_sheet.dart'; import 'package:uni_ui/icons.dart'; import 'package:uni_ui/tabs/tab_icon.dart'; @@ -138,10 +139,16 @@ class CourseUnitDetailPageViewState .courseUnitsFiles[widget.courseUnit]; if (files == null || files.isEmpty) { - return Center( - child: Text( - S.of(context).no_files_found, - textAlign: TextAlign.center, + return LayoutBuilder( + builder: (context, constraints) => SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Container( + height: constraints.maxHeight, + padding: const EdgeInsets.only(bottom: 120), + child: const Center( + child: NoFilesWidget(), + ), + ), ), ); } diff --git a/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_files.dart b/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_files.dart index 452f593f8..33f2877d3 100644 --- a/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_files.dart +++ b/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_files.dart @@ -10,6 +10,8 @@ import 'package:uni/view/common_widgets/toast_message.dart'; import 'package:uni_ui/cards/file_card.dart'; import 'package:uni_ui/cards/folder_card.dart'; +import 'course_unit_no_files.dart'; + class CourseUnitFilesView extends StatelessWidget { const CourseUnitFilesView(this.files, {super.key}); final List files; @@ -22,10 +24,16 @@ class CourseUnitFilesView extends StatelessWidget { .toList(); return cards.isEmpty - ? Center( - child: Container( - padding: const EdgeInsets.only(left: 10, right: 10), - child: Text(S.of(context).no_files_found), + ? LayoutBuilder( + builder: (context, constraints) => SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Container( + height: constraints.maxHeight, + padding: const EdgeInsets.only(bottom: 120), + child: const Center( + child: NoFilesWidget(), + ), + ), ), ) : Container( diff --git a/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_no_files.dart b/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_no_files.dart new file mode 100644 index 000000000..911aa1fb2 --- /dev/null +++ b/packages/uni_app/lib/view/course_unit_info/widgets/course_unit_no_files.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:uni/generated/l10n.dart'; +import 'package:uni/view/common_widgets/expanded_image_label.dart'; + +class NoFilesWidget extends StatelessWidget { + const NoFilesWidget({super.key}); + + @override + Widget build(BuildContext context) { + return ImageLabel( + imagePath: 'assets/images/files.png', + label: S.of(context).no_files_label, + labelTextStyle: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Theme.of(context).colorScheme.primary, + ), + sublabel: S.of(context).no_files, + sublabelTextStyle: const TextStyle(fontSize: 15), + ); + } +}