Skip to content

Commit

Permalink
Merge pull request #42 from B3-3iL-DLW/fix/display_all_events_per_week
Browse files Browse the repository at this point in the history
Fix/display all events per week
  • Loading branch information
julesartd authored Mar 14, 2024
2 parents 217a707 + 54dad32 commit 09813c7
Show file tree
Hide file tree
Showing 27 changed files with 584 additions and 267 deletions.
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
.idea/
.vscode/
backend/vendor/
/backend/.php-cs-fixer.cache
backend/vendor/
1 change: 1 addition & 0 deletions backend/.php-cs-fixer.cache
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"php":"8.2.12","version":"3.51.0:v3.51.0#127fa74f010da99053e3f5b62672615b72dd6efd","indent":" ","lineEnding":"\n","rules":{"align_multiline_comment":true,"array_syntax":true,"backtick_to_shell_exec":true,"binary_operator_spaces":true,"blank_line_before_statement":{"statements":["return"]},"braces_position":{"allow_single_line_anonymous_functions":true,"allow_single_line_empty_anonymous_classes":true},"class_attributes_separation":{"elements":{"method":"one"}},"class_definition":{"single_line":true},"class_reference_name_casing":true,"clean_namespace":true,"concat_space":true,"declare_parentheses":true,"echo_tag_syntax":true,"empty_loop_body":{"style":"braces"},"empty_loop_condition":true,"fully_qualified_strict_types":true,"function_declaration":true,"general_phpdoc_tag_rename":{"replacements":{"inheritDocs":"inheritDoc"}},"global_namespace_import":{"import_classes":false,"import_constants":false,"import_functions":false},"include":true,"increment_style":true,"integer_literal_case":true,"lambda_not_used_import":true,"linebreak_after_opening_tag":true,"magic_constant_casing":true,"magic_method_casing":true,"method_argument_space":{"on_multiline":"ignore"},"native_function_casing":true,"native_type_declaration_casing":true,"no_alias_language_construct_call":true,"no_alternative_syntax":true,"no_binary_string":true,"no_blank_lines_after_phpdoc":true,"no_empty_comment":true,"no_empty_phpdoc":true,"no_empty_statement":true,"no_extra_blank_lines":{"tokens":["attribute","case","continue","curly_brace_block","default","extra","parenthesis_brace_block","square_brace_block","switch","throw","use"]},"no_leading_namespace_whitespace":true,"no_mixed_echo_print":true,"no_multiline_whitespace_around_double_arrow":true,"no_null_property_initialization":true,"no_short_bool_cast":true,"no_singleline_whitespace_before_semicolons":true,"no_spaces_around_offset":true,"no_superfluous_phpdoc_tags":{"allow_hidden_params":true,"remove_inheritdoc":true},"no_trailing_comma_in_singleline":true,"no_unneeded_braces":{"namespaces":true},"no_unneeded_control_parentheses":{"statements":["break","clone","continue","echo_print","others","return","switch_case","yield","yield_from"]},"no_unneeded_import_alias":true,"no_unset_cast":true,"no_unused_imports":true,"no_useless_concat_operator":true,"no_useless_nullsafe_operator":true,"no_whitespace_before_comma_in_array":true,"normalize_index_brace":true,"nullable_type_declaration":true,"nullable_type_declaration_for_default_null_value":true,"object_operator_without_whitespace":true,"operator_linebreak":{"only_booleans":true},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"alpha"},"ordered_types":{"null_adjustment":"always_last","sort_algorithm":"none"},"php_unit_fqcn_annotation":true,"php_unit_method_casing":true,"phpdoc_align":true,"phpdoc_annotation_without_dot":true,"phpdoc_indent":true,"phpdoc_inline_tag_normalizer":true,"phpdoc_no_access":true,"phpdoc_no_alias_tag":true,"phpdoc_no_package":true,"phpdoc_no_useless_inheritdoc":true,"phpdoc_order":{"order":["param","return","throws"]},"phpdoc_return_self_reference":true,"phpdoc_scalar":true,"phpdoc_separation":{"groups":[["Annotation","NamedArgumentConstructor","Target"],["author","copyright","license"],["category","package","subpackage"],["property","property-read","property-write"],["deprecated","link","see","since"]]},"phpdoc_single_line_var_spacing":true,"phpdoc_summary":true,"phpdoc_tag_type":{"tags":{"inheritDoc":"inline"}},"phpdoc_to_comment":true,"phpdoc_trim":true,"phpdoc_trim_consecutive_blank_line_separation":true,"phpdoc_types":true,"phpdoc_types_order":{"null_adjustment":"always_last","sort_algorithm":"none"},"phpdoc_var_without_name":true,"semicolon_after_instruction":true,"simple_to_complex_string_variable":true,"single_class_element_per_statement":true,"single_import_per_statement":true,"single_line_comment_spacing":true,"single_line_comment_style":{"comment_types":["hash"]},"single_line_throw":true,"single_quote":true,"single_space_around_construct":true,"space_after_semicolon":{"remove_in_empty_for_expressions":true},"standardize_increment":true,"standardize_not_equals":true,"statement_indentation":{"stick_comment_to_next_continuous_control_statement":true},"switch_continue_to_break":true,"trailing_comma_in_multiline":true,"trim_array_spaces":true,"type_declaration_spaces":true,"types_spaces":true,"unary_operator_spaces":true,"whitespace_after_comma_in_array":true,"yoda_style":true,"cast_spaces":true,"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_parentheses":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"return_type_declaration":true,"short_scalar_cast":true,"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_line_after_imports":true,"spaces_inside_parentheses":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"src\\Controller\\Api\\ClassesController.php":"3edd9a69cd0992943c7f4e35e189a328","src\\Controller\\Api\\TimetableController.php":"c9b1d63edf22527d74b68c59b9bd06eb","src\\Entity\\ClassGroups.php":"6bc6445daf9e43c60078656be46a06d4","src\\Entity\\DaySchedule.php":"56b4524fd686bf525de63858705ecfb2","src\\Entity\\Event.php":"6cbed0ffedbaccef2e8935c1a584977b","src\\Entity\\EventHours.php":"b437c36942eca2170869a2a7aaf2fb70","src\\Entity\\WeekSchedule.php":"a622ed2509b48533d6d6bc79a42dbdcc","src\\Kernel.php":"065c02fc2d62bfff3cd16f3a0b46d9ee","src\\Repository\\ClassGroupsRepository.php":"92142c8ee810ca31f60bffab20a87b0d","src\\Repository\\DayScheduleRepository.php":"98703542528a91067ab9ce94728d37d2","src\\Repository\\EventHoursRepository.php":"ae0ae56be4254d2d2e0d0dda12c03723","src\\Repository\\EventRepository.php":"8be5088a65ffa6accaf4ccdbfb2f203b","src\\Repository\\WeekScheduleRepository.php":"49e3ea686a24c1193a983c024d08d22c","src\\Service\\ClassesScraperService.php":"d1961c5983c33c3fb970892a4976baa7","src\\Service\\JsonService.php":"130ad9ecda589dd98c6788ee552b66c1","src\\Service\\TimetableService.php":"efc4917fd4b881eac4e2c6d481b38904","src\\Service\\XMLService.php":"8db6a1d71c24b578809ad0793f2bd9d6","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder\\.php-cs-fixer.dist.php":"4a5cd9e046891dc468fde4a126674df1","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder1\\.php-cs-fixer.dist.php":"4a5cd9e046891dc468fde4a126674df1","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder8214\\src\\Service\\TimetableService.php":"efc4917fd4b881eac4e2c6d481b38904","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder5526\\src\\Service\\TimetableService.php":"efc4917fd4b881eac4e2c6d481b38904","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder563\\src\\Service\\TimetableService.php":"efc4917fd4b881eac4e2c6d481b38904","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder10365\\src\\Service\\TimetableService.php":"076a4cfe4213624431ce14be32f85675","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder9018\\src\\Service\\TimetableService.php":"13c4b244ab3280ab8f15336cded328eb","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder2666\\src\\Entity\\Event.php":"a31cdea7428a9d5caf1e22be96dc4409","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder4489\\src\\Service\\TimetableService.php":"13c4b244ab3280ab8f15336cded328eb","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder2522\\src\\Entity\\Event.php":"a31cdea7428a9d5caf1e22be96dc4409","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder8603\\src\\Service\\TimetableService.php":"13c4b244ab3280ab8f15336cded328eb","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder2585\\src\\Entity\\Event.php":"a31cdea7428a9d5caf1e22be96dc4409","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder7329\\src\\Service\\TimetableService.php":"13c4b244ab3280ab8f15336cded328eb","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder2168\\src\\Entity\\Event.php":"a31cdea7428a9d5caf1e22be96dc4409","C:\\Users\\phplu\\AppData\\Local\\Temp\\PHP CS Fixertemp_folder752\\src\\Service\\TimetableService.php":"13c4b244ab3280ab8f15336cded328eb"}}
9 changes: 8 additions & 1 deletion frontend/app_student/lib/api/api_service.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:convert';

import 'package:http/http.dart' as http;
Expand All @@ -12,7 +13,11 @@ class ApiService {
String fullUrl = '$apiUrl$endpoint';
fullUrl = Uri.encodeFull(fullUrl);
try {
final response = await http.get(Uri.parse(fullUrl));
final response = await http
.get(Uri.parse(fullUrl))
.timeout(const Duration(seconds: 20), onTimeout: () {
throw TimeoutException('The connection has timed out!');
});

if (response.statusCode == 200) {
List jsonResponse = json.decode(response.body);
Expand All @@ -26,6 +31,8 @@ class ApiService {
} else {
throw Exception('ERROR ${response.statusCode} Failed to load data');
}
} on TimeoutException catch (e) {
throw Exception('Request time out: $e');
} catch (e) {
throw Exception('Failed to load data: $e');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class EventEntity {
final EventHoursEntity horaires;
final String salle;
final bool visio;
final bool repas;

EventEntity({
required this.id,
Expand All @@ -17,6 +18,7 @@ class EventEntity {
required this.horaires,
required this.salle,
required this.visio,
required this.repas,
});

factory EventEntity.fromJson(Map<String, dynamic> json) {
Expand All @@ -28,6 +30,7 @@ class EventEntity {
horaires: EventHoursEntity.fromJson(json['horaire']),
salle: json['salle'] ?? 'null',
visio: json['visio'] ?? false,
repas: json['repas'] ?? false,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ class EventModel {
EventHoursModel get horaires => EventHoursModel(entity: entity.horaires);
String get salle => entity.salle;
bool get visio => entity.visio;
bool get repas => entity.repas;
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
import 'package:app_student/api/class_groups/models/class_group_model.dart';
import 'package:app_student/api/users/models/user_model.dart';
import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';

import '../../api/class_groups/repositories/class_group_repository.dart';
import '../../api/users/repositories/user_repository.dart';

part 'class_group_state.dart';

class ClassGroupCubit extends Cubit<ClassGroupState> {
final ClassGroupRepository classRepository;
final UserRepository userRepository;

ClassGroupCubit({required this.classRepository, required this.userRepository})
: super(ClassGroupInitial());
ClassGroupCubit({required this.classRepository}) : super(ClassGroupInitial());

Future<void> fetchClasses() async {
try {
Expand All @@ -25,13 +21,4 @@ class ClassGroupCubit extends Cubit<ClassGroupState> {
emit(ClassGroupError(e.toString()));
}
}

Future<UserModel> getConnectedUser() async {
return userRepository.getUser();
}

Future<void> saveClass(ClassGroupModel classGroup) async {
await userRepository.saveUserClass(classGroup.name.toString());
emit(ClassGroupSelected());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,3 @@ class ClassGroupError extends ClassGroupState {

ClassGroupError([this.message = 'An error occurred']);
}

class ClassGroupSelected extends ClassGroupState {}
63 changes: 31 additions & 32 deletions frontend/app_student/lib/class_groups/views/class_group_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@ import 'package:app_student/class_groups/views/widgets/card_list.dart';
import 'package:app_student/class_groups/views/widgets/header/header_logo.dart';
import 'package:app_student/class_groups/views/widgets/header/header_text.dart';
import 'package:app_student/class_groups/views/widgets/header/header_title.dart';
import 'package:app_student/users/cubit/user_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:go_router/go_router.dart';

import '../../api/users/models/user_model.dart';
import '../../api/users/repositories/user_repository.dart';

class ClassGroupPage extends StatelessWidget {
const ClassGroupPage({super.key});
Expand All @@ -19,52 +18,52 @@ class ClassGroupPage extends StatelessWidget {
Widget build(BuildContext context) {
final classRepository =
RepositoryProvider.of<ClassGroupRepository>(context);
final userRepository = RepositoryProvider.of<UserRepository>(context);
final classCubit = ClassGroupCubit(
classRepository: classRepository, userRepository: userRepository);
classRepository: classRepository,
)..fetchClasses();

return BlocProvider<ClassGroupCubit>(
create: (context) => classCubit..fetchClasses(),
create: (context) => classCubit,
child: FutureBuilder<UserModel>(
future: context.read<ClassGroupCubit>().getConnectedUser(),
future: context.read<UserCubit>().getCurrentUser(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(
child: Text(AppLocalizations.of(context)!
.genericError(snapshot.error.toString())));
return Center(child: Text('Erreur: ${snapshot.error}'));
} else {
final user = snapshot.data;
return Scaffold(
body: BlocBuilder<ClassGroupCubit, ClassGroupState>(
builder: (context, state) {
if (state is ClassGroupLoading) {
return const Center(child: CircularProgressIndicator());
} else if (state is ClassGroupSelected) {
body: BlocListener<UserCubit, UserState>(
listener: (context, state) {
if (state is UserClassesSelected) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go('/schedule');
});
return const SizedBox.shrink();
} else if (state is ClassGroupLoaded) {
return Column(
children: [
const HeaderLogo(),
HeaderTitle(AppLocalizations.of(context)!
.classSelectionTitle(user!.name)),
HeaderText(AppLocalizations.of(context)!
.classSelectionSubtitle),
Expanded(
child: CardList(classesList: state.classes),
),
],
);
} else if (state is ClassGroupError) {
return Center(child: Text(state.message));
} else {
return const SizedBox.shrink();
}
},
child: BlocBuilder<ClassGroupCubit, ClassGroupState>(
builder: (context, state) {
if (state is ClassGroupLoading) {
return const Center(child: CircularProgressIndicator());
} else if (state is ClassGroupLoaded) {
return Column(
children: [
const HeaderLogo(),
HeaderTitle('Bonjour, ${user?.name}'),
const HeaderText('Choisis ta promotion :'),
Expanded(
child: CardList(classesList: state.classes),
),
],
);
} else if (state is ClassGroupError) {
return Center(child: Text(state.message));
} else {
return const SizedBox.shrink();
}
},
),
),
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import 'package:app_student/api/class_groups/models/class_group_model.dart';
import 'package:app_student/users/cubit/user_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../../cubit/class_group_cubit.dart';

class CardList extends StatelessWidget {
final List<ClassGroupModel> classesList;

Expand All @@ -21,7 +20,7 @@ class CardList extends StatelessWidget {
classesList[index].name,
),
onTap: () {
context.read<ClassGroupCubit>().saveClass(classesList[index]);
context.read<UserCubit>().saveUserClass(classesList[index]);
},
),
);
Expand Down
Loading

0 comments on commit 09813c7

Please sign in to comment.