diff --git a/lib/Helpers/translations.dart b/lib/Helpers/translations.dart index f707b37..785aa59 100644 --- a/lib/Helpers/translations.dart +++ b/lib/Helpers/translations.dart @@ -3,42 +3,52 @@ import 'package:tablet_app/Models/translation.dart'; List translations = [ Translation(language: "FR", data: { "weather.hourly": "Prochaines heures", - "weather.nextdays": "Prochains jours" + "weather.nextdays": "Prochains jours", + "agenda.all": "Tout" }), Translation(language: "EN", data: { "weather.hourly": "Hourly", - "weather.nextdays": "Next days" + "weather.nextdays": "Next days", + "agenda.all": "All" }), Translation(language: "DE", data: { "weather.hourly": "Nächste Stunden", - "weather.nextdays": "Nächsten Tage" + "weather.nextdays": "Nächsten Tage", + "agenda.all": "Alle" }), Translation(language: "NL", data: { "weather.hourly": "Volgende uren", - "weather.nextdays": "Volgende dagen" + "weather.nextdays": "Volgende dagen", + "agenda.all": "Alle" }), Translation(language: "IT", data: { "weather.hourly": "Le prossime ore", - "weather.nextdays": "Prossimi giorni" + "weather.nextdays": "Prossimi giorni", + "agenda.all": "Tutto" }), Translation(language: "ES", data: { "weather.hourly": "Próximas horas", - "weather.nextdays": "Proximos dias" + "weather.nextdays": "Proximos dias", + "agenda.all": "Todo" }), Translation(language: "PL", data: { "weather.hourly": "Następne godziny", - "weather.nextdays": "Następne dni" + "weather.nextdays": "Następne dni", + "agenda.all": "Wszystko" }), Translation(language: "CN", data: { "weather.hourly": "接下来的几个小时", - "weather.nextdays": "未来几天" + "weather.nextdays": "未来几天", + "agenda.all": "全部" }), Translation(language: "UK", data: { "weather.hourly": "Наступні години", - "weather.nextdays": "Наступні дні" + "weather.nextdays": "Наступні дні", + "agenda.all": "все" }), Translation(language: "AR", data: { "weather.hourly": "الساعات القادمة", - "weather.nextdays": "الايام القادمة" + "weather.nextdays": "الايام القادمة", + "agenda.all": "الجميع" }), ]; \ No newline at end of file diff --git a/lib/Screens/Agenda/agenda_view.dart b/lib/Screens/Agenda/agenda_view.dart index 1bc7c38..dd15068 100644 --- a/lib/Screens/Agenda/agenda_view.dart +++ b/lib/Screens/Agenda/agenda_view.dart @@ -8,11 +8,14 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:manager_api/api.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:provider/provider.dart'; import 'package:tablet_app/Components/loading_common.dart'; import 'package:tablet_app/Models/agenda.dart'; +import 'package:tablet_app/Models/tabletContext.dart'; import 'package:tablet_app/Screens/Agenda/event_list_item.dart'; import 'package:tablet_app/Screens/Agenda/event_popup.dart'; import 'package:tablet_app/Screens/Agenda/month_filter.dart'; +import 'package:tablet_app/app_context.dart'; import 'package:tablet_app/constants.dart'; @@ -42,11 +45,16 @@ class _AgendaView extends State { super.dispose(); } - Future getAndParseJsonInfo() async { + Future getAndParseJsonInfo(TabletAppContext tabletAppContext) async { try { // Récupération du contenu JSON depuis l'URL var httpClient = HttpClient(); - var request = await httpClient.getUrl(Uri.parse(agendaDTO.resourceUrl!)); + + // We need to get detail to get url from resourceId + var resourceIdForSelectedLanguage = agendaDTO.resourceIds!.where((ri) => ri.language == tabletAppContext.language).first.value; + ResourceDTO? resourceDTO = await tabletAppContext.clientAPI!.resourceApi!.resourceGetDetail(resourceIdForSelectedLanguage!); + + var request = await httpClient.getUrl(Uri.parse(resourceDTO!.url!)); var response = await request.close(); var jsonString = await response.transform(utf8.decoder).join(); @@ -64,8 +72,9 @@ class _AgendaView extends State { @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; + final TabletAppContext tabletAppContext = Provider.of(context).getContext(); - return FutureBuilder(future: getAndParseJsonInfo(), + return FutureBuilder(future: getAndParseJsonInfo(tabletAppContext), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.data == null) { @@ -93,7 +102,7 @@ class _AgendaView extends State { events: snapshot.data.events, onMonthSelected: (filteredList) { print('events sélectionné: $filteredList'); - var result = filteredList!; + var result = filteredList != null ? filteredList : []; result.sort((a, b) => a.dateFrom!.compareTo(b.dateFrom!)); filteredAgenda.value = result; }), diff --git a/lib/Screens/Agenda/month_filter.dart b/lib/Screens/Agenda/month_filter.dart index 8f69586..204915f 100644 --- a/lib/Screens/Agenda/month_filter.dart +++ b/lib/Screens/Agenda/month_filter.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:tablet_app/Helpers/translationHelper.dart'; import 'package:tablet_app/Models/agenda.dart'; +import 'package:tablet_app/app_context.dart'; import 'package:tablet_app/constants.dart'; class MonthFilter extends StatefulWidget { @@ -25,38 +28,47 @@ class _MonthFilterState extends State { @override Widget build(BuildContext context) { List> sortedMonths = _getSortedMonths(); + final appContext = Provider.of(context); return ListView.builder( itemCount: sortedMonths.length + 1, // +1 for "Tout (nbr total events)" itemBuilder: (context, index) { if (index == 0) { - return _buildAllItem(); + return _buildAllItem(appContext); } else { final monthYear = sortedMonths[index - 1]['monthYear']; List? filteredEvents = _filterEvents(monthYear); - String monthName = _getTranslatedMonthName(monthYear); - RegExp regExp = RegExp(r'\d{4}'); - String annee = regExp.stringMatch(monthYear)!; + var nbrEvents = filteredEvents == null ? 0 : filteredEvents.length; - return ListTile( - title: Text( - '$monthName $annee (${filteredEvents!.length})', - style: TextStyle( - fontSize: 16.0, - fontWeight: _selectedMonth == monthYear ? FontWeight.bold : FontWeight.normal, - color: _selectedMonth == monthYear ? kTestSecondColor : null, + // Vérifier si nbrEvents est supérieur à 0 + if (nbrEvents > 0) { + String monthName = _getTranslatedMonthName(monthYear); + RegExp regExp = RegExp(r'\d{4}'); + String annee = regExp.stringMatch(monthYear)!; + + return ListTile( + title: Text( + '$monthName $annee (${nbrEvents})', + style: TextStyle( + fontSize: 16.0, + fontWeight: _selectedMonth == monthYear ? FontWeight.bold : FontWeight.normal, + color: _selectedMonth == monthYear ? kTestSecondColor : null, + ), ), - ), - onTap: () { - setState(() { - _selectedMonth = monthYear; - }); - widget.onMonthSelected(filteredEvents); - }, - tileColor: _selectedMonth == monthYear ? kTestSecondColor : null, - ); + onTap: () { + setState(() { + _selectedMonth = monthYear; + }); + widget.onMonthSelected(filteredEvents); + }, + tileColor: _selectedMonth == monthYear ? kTestSecondColor : null, + ); + } else { + // Si nbrEvents est 0, ne retourne pas de widget + return SizedBox.shrink(); + } } }, ); @@ -70,11 +82,11 @@ class _MonthFilterState extends State { return translatedMonthName; } - Widget _buildAllItem() { + Widget _buildAllItem(AppContext appContext) { int totalEvents = widget.events.length; return ListTile( title: Text( - 'Tout ($totalEvents)', + '${TranslationHelper.getFromLocale("agenda.all", appContext.getContext())} ($totalEvents)', style: TextStyle( fontSize: 16.0, fontWeight: _selectedMonth == null ? FontWeight.bold : FontWeight.normal, diff --git a/lib/Screens/MainView/weather_view.dart b/lib/Screens/MainView/weather_view.dart index bc2a9d0..bc47844 100644 --- a/lib/Screens/MainView/weather_view.dart +++ b/lib/Screens/MainView/weather_view.dart @@ -49,24 +49,34 @@ class WeatherView extends StatelessWidget { List nextDay5All = allForecasts.where((af) => (DateTime.fromMillisecondsSinceEpoch(af.dt! * 1000)).day == (today.add(Duration(days: 5))).day).toList(); var nextDay1MiddayTest = nextDay1All.where((nd) => (DateTime.fromMillisecondsSinceEpoch(nd.dt! * 1000)).hour == 12).firstOrNull; - WeatherForecast nextDay1AllSummary = nextDay1MiddayTest != null ? nextDay1MiddayTest : nextDay1All.last; - nextFiveDaysForecast.add(nextDay1AllSummary); + if(nextDay1All.isNotEmpty) { + WeatherForecast nextDay1AllSummary = nextDay1MiddayTest != null ? nextDay1MiddayTest : nextDay1All.last; + nextFiveDaysForecast.add(nextDay1AllSummary); + } var nextDay2MiddayTest = nextDay2All.where((nd) => (DateTime.fromMillisecondsSinceEpoch(nd.dt! * 1000)).hour == 12).firstOrNull; - WeatherForecast nextDay2Midday = nextDay2MiddayTest != null ? nextDay2MiddayTest : nextDay2All.last; - nextFiveDaysForecast.add(nextDay2Midday); + if(nextDay2All.isNotEmpty) { + WeatherForecast nextDay2Midday = nextDay2MiddayTest != null ? nextDay2MiddayTest : nextDay2All.last; + nextFiveDaysForecast.add(nextDay2Midday); + } var nextDay3MiddayTest = nextDay3All.where((nd) => (DateTime.fromMillisecondsSinceEpoch(nd.dt! * 1000)).hour == 12).firstOrNull; - WeatherForecast nextDay3Midday = nextDay3MiddayTest != null ? nextDay3MiddayTest : nextDay3All.last; - nextFiveDaysForecast.add(nextDay3Midday); + if(nextDay3All.isNotEmpty) { + WeatherForecast nextDay3Midday = nextDay3MiddayTest != null ? nextDay3MiddayTest : nextDay3All.last; + nextFiveDaysForecast.add(nextDay3Midday); + } var nextDay4MiddayTest = nextDay4All.where((nd) => (DateTime.fromMillisecondsSinceEpoch(nd.dt! * 1000)).hour == 12).firstOrNull; - WeatherForecast nextDay4Midday = nextDay4MiddayTest != null ? nextDay4MiddayTest : nextDay4All.last; - nextFiveDaysForecast.add(nextDay4Midday); + if(nextDay4All.isNotEmpty) { + WeatherForecast nextDay4Midday = nextDay4MiddayTest != null ? nextDay4MiddayTest : nextDay4All.last; + nextFiveDaysForecast.add(nextDay4Midday); + } var nextDay5MiddayTest = nextDay5All.where((nd) => (DateTime.fromMillisecondsSinceEpoch(nd.dt! * 1000)).hour == 12).firstOrNull; - WeatherForecast nextDay5Midday = nextDay5MiddayTest != null ? nextDay5MiddayTest : nextDay5All.last; - nextFiveDaysForecast.add(nextDay5Midday); + if(nextDay5All.isNotEmpty) { + WeatherForecast nextDay5Midday = nextDay5MiddayTest != null ? nextDay5MiddayTest : nextDay5All.last; + nextFiveDaysForecast.add(nextDay5Midday); + } return nextFiveDaysForecast; } @@ -272,8 +282,8 @@ class WeatherView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: List.generate( - nbrNextHours, - (index) { + getNextFiveDaysForecast(weatherData.list!).length, // nbrNextHours + (index) { final weatherForecastNextDay = getNextFiveDaysForecast(weatherData.list!)[index]; return Padding( padding: const EdgeInsets.all(8.0), diff --git a/lib/Services/downloadService.dart b/lib/Services/downloadService.dart index 9def30c..f0a0fc8 100644 --- a/lib/Services/downloadService.dart +++ b/lib/Services/downloadService.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:manager_api/api.dart'; import 'package:provider/provider.dart'; import 'package:tablet_app/Models/tabletContext.dart'; @@ -50,7 +51,6 @@ class _DownloadConfigurationWidgetState extends State**](TranslationDTO.md) | | [optional] [default to const []] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/manager_api/lib/model/agenda_dto.dart b/manager_api/lib/model/agenda_dto.dart index 1e46c8d..e3cac18 100644 --- a/manager_api/lib/model/agenda_dto.dart +++ b/manager_api/lib/model/agenda_dto.dart @@ -13,39 +13,29 @@ part of openapi.api; class AgendaDTO { /// Returns a new [AgendaDTO] instance. AgendaDTO({ - this.resourceId, - this.resourceUrl, + this.resourceIds = const [], }); - String? resourceId; - - String? resourceUrl; + List? resourceIds; @override bool operator ==(Object other) => identical(this, other) || other is AgendaDTO && - other.resourceId == resourceId && - other.resourceUrl == resourceUrl; + other.resourceIds == resourceIds; @override int get hashCode => // ignore: unnecessary_parenthesis - (resourceId == null ? 0 : resourceId!.hashCode) + - (resourceUrl == null ? 0 : resourceUrl!.hashCode); + (resourceIds == null ? 0 : resourceIds!.hashCode); @override - String toString() => 'AgendaDTO[resourceId=$resourceId, resourceUrl=$resourceUrl]'; + String toString() => 'AgendaDTO[resourceIds=$resourceIds]'; Map toJson() { final json = {}; - if (this.resourceId != null) { - json[r'resourceId'] = this.resourceId; + if (this.resourceIds != null) { + json[r'resourceIds'] = this.resourceIds; } else { - json[r'resourceId'] = null; - } - if (this.resourceUrl != null) { - json[r'resourceUrl'] = this.resourceUrl; - } else { - json[r'resourceUrl'] = null; + json[r'resourceIds'] = null; } return json; } @@ -69,8 +59,7 @@ class AgendaDTO { }()); return AgendaDTO( - resourceId: mapValueOfType(json, r'resourceId'), - resourceUrl: mapValueOfType(json, r'resourceUrl'), + resourceIds: TranslationDTO.listFromJson(json[r'resourceIds']), ); } return null;