From 6ea5b32406921876f270f92f49e490acfe61575c Mon Sep 17 00:00:00 2001 From: DevCore <62793354+rawi-coding@users.noreply.github.com> Date: Mon, 20 Jan 2025 12:44:38 +0100 Subject: [PATCH] chore: resolved team testing inputs, mainly rows overlapping bracket stations. (#81) (#500) --- .../test/train_journey_table_test.dart | 57 +++++--- .../lib/app/bloc/train_journey_cubit.dart | 2 +- .../train_journey/train_journey_overview.dart | 1 - .../additional_speed_restriction_row.dart | 5 +- .../balise_level_crossing_group_row.dart | 5 +- .../widgets/table/balise_row.dart | 5 +- .../widgets/table/base_row_builder.dart | 38 +++-- .../widgets/table/cab_signaling_row.dart | 5 +- .../cells/bracket_station_cell_body.dart | 55 ++++---- .../cells/track_equipment_cell_body.dart | 4 +- .../config/bracket_station_render_data.dart | 25 ++++ .../track_equipment_render_data.dart | 6 +- .../table/config/train_journey_config.dart | 16 +++ .../table/config}/train_journey_settings.dart | 2 +- .../widgets/table/connection_track_row.dart | 5 +- .../widgets/table/curve_point_row.dart | 5 +- .../widgets/table/level_crossing_row.dart | 5 +- .../widgets/table/protection_section_row.dart | 5 +- .../widgets/table/service_point_row.dart | 55 +++----- .../widgets/table/signal_row.dart | 5 +- .../widgets/table/speed_change_row.dart | 5 +- .../widgets/table/tram_area_row.dart | 5 +- .../widgets/table/whistle_row.dart | 5 +- .../train_journey/widgets/train_journey.dart | 130 +++++++++--------- .../train_selection/train_selection.dart | 10 +- .../app/widgets/table/das_table_column.dart | 2 +- .../journey/additional_speed_restriction.dart | 2 +- .../additional_speed_restriction_data.dart | 2 +- das_client/lib/model/journey/balise.dart | 2 +- .../journey/balise_level_crossing_group.dart | 2 +- das_client/lib/model/journey/base_data.dart | 2 +- .../model/journey/base_data_extension.dart | 5 +- .../lib/model/journey/bracket_station.dart | 26 +++- .../journey/bracket_station_segment.dart | 29 ++++ .../lib/model/journey/break_series.dart | 2 +- .../lib/model/journey/cab_signaling.dart | 2 +- .../lib/model/journey/connection_track.dart | 2 +- das_client/lib/model/journey/curve_point.dart | 2 +- .../lib/model/journey/level_crossing.dart | 2 +- das_client/lib/model/journey/metadata.dart | 7 +- .../lib/model/journey/protection_section.dart | 2 +- .../lib/model/journey/service_point.dart | 8 +- das_client/lib/model/journey/signal.dart | 2 +- .../lib/model/journey/speed_change.dart | 2 +- das_client/lib/model/journey/speed_data.dart | 2 +- ...ment.dart => track_equipment_segment.dart} | 0 das_client/lib/model/journey/tram_area.dart | 14 +- das_client/lib/model/journey/velocity.dart | 2 +- das_client/lib/model/journey/whistles.dart | 2 +- .../sfera/src/mapper/sfera_model_mapper.dart | 50 +++++-- .../src/mapper/track_equipment_mapper.dart | 2 +- .../src/model/enums/track_equipment_type.dart | 2 +- .../bracket_station_render_data_test.dart | 52 +++++++ .../track_equipment_render_data_test.dart | 57 +++++--- .../journey/base_data_extension_test.dart | 19 +-- .../model/journey/track_equipment_test.dart | 2 +- .../test/sfera/mapper/sfera_mapper_test.dart | 18 +-- 57 files changed, 494 insertions(+), 292 deletions(-) create mode 100644 das_client/lib/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart rename das_client/lib/app/pages/journey/train_journey/widgets/table/{cells => config}/track_equipment_render_data.dart (96%) create mode 100644 das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_config.dart rename das_client/lib/app/{model => pages/journey/train_journey/widgets/table/config}/train_journey_settings.dart (94%) create mode 100644 das_client/lib/model/journey/bracket_station_segment.dart rename das_client/lib/model/journey/{track_equipment.dart => track_equipment_segment.dart} (100%) create mode 100644 das_client/test/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data_test.dart rename das_client/test/app/pages/journey/train_journey/widgets/table/{cells => config}/track_equipment_render_data_test.dart (75%) diff --git a/das_client/integration_test/test/train_journey_table_test.dart b/das_client/integration_test/test/train_journey_table_test.dart index 28d3c95c..0453012a 100644 --- a/das_client/integration_test/test/train_journey_table_test.dart +++ b/das_client/integration_test/test/train_journey_table_test.dart @@ -134,7 +134,8 @@ void main() { final countText = find.descendant(of: groupOf5BaliseRow, matching: find.text('5')); expect(countText, findsOneWidget); - final levelCrossingText = find.descendant(of: groupOf5BaliseRow, matching: find.text(l10n.p_train_journey_table_level_crossing)); + final levelCrossingText = + find.descendant(of: groupOf5BaliseRow, matching: find.text(l10n.p_train_journey_table_level_crossing)); expect(levelCrossingText, findsOneWidget); var detailRowBalise = findDASTableRowByText('41.552'); @@ -153,7 +154,9 @@ void main() { expect(detailRowBalise, findsOneWidget); expect(find.descendant(of: detailRowBalise, matching: find.byKey(BaliseRow.baliseIconKey)), findsOneWidget); - expect(find.descendant(of: detailRowLevelCrossing, matching: find.text(l10n.p_train_journey_table_level_crossing)), findsOneWidget); + expect( + find.descendant(of: detailRowLevelCrossing, matching: find.text(l10n.p_train_journey_table_level_crossing)), + findsOneWidget); // collapse group await tapElement(tester, groupOf5BaliseRow); @@ -371,7 +374,7 @@ void main() { it is Container && it.decoration is BoxDecoration && (it.decoration as BoxDecoration).color == AdditionalSpeedRestrictionRow.additionalSpeedRestrictionColor)); - expect(coloredCells, findsNWidgets(12)); + expect(coloredCells, findsNWidgets(13)); }); testWidgets('test other rows are displayed correctly', (tester) async { @@ -594,21 +597,33 @@ void main() { await tester.dragUntilVisible(find.text('Klammerbahnhof D1'), scrollableFinder, const Offset(0, -50)); final bracketStationD = findDASTableRowByText('Klammerbahnhof D'); + final zahnstangenEnde = findDASTableRowByText('Zahnstangen Ende'); + final deckungssignal = findDASTableRowByText('Deckungssignal'); final bracketStationD1 = findDASTableRowByText('Klammerbahnhof D1'); expect(bracketStationD, findsOneWidget); + expect(zahnstangenEnde, findsOneWidget); + expect(deckungssignal, findsOneWidget); expect(bracketStationD1, findsOneWidget); // check if the bracket station widget is displayed final bracketStationDWidget = find.descendant(of: bracketStationD, matching: find.byKey(BracketStationCellBody.bracketStationKey)); + final zahnstangenEndeWidget = + find.descendant(of: zahnstangenEnde, matching: find.byKey(BracketStationCellBody.bracketStationKey)); + final deckungssignalWidget = + find.descendant(of: deckungssignal, matching: find.byKey(BracketStationCellBody.bracketStationKey)); final bracketStationD1Widget = find.descendant(of: bracketStationD1, matching: find.byKey(BracketStationCellBody.bracketStationKey)); expect(bracketStationDWidget, findsOneWidget); + expect(zahnstangenEndeWidget, findsOneWidget); + expect(deckungssignalWidget, findsOneWidget); expect(bracketStationD1Widget, findsOneWidget); // check that the abbreviation is displayed correctly - expect(find.descendant(of: bracketStationDWidget, matching: find.text('D')), findsNothing); - expect(find.descendant(of: bracketStationD1Widget, matching: find.text('D')), findsOneWidget); + expect(find.descendant(of: bracketStationDWidget, matching: find.text('D')), findsOneWidget); + expect(find.descendant(of: zahnstangenEndeWidget, matching: find.text('D')), findsNothing); + expect(find.descendant(of: deckungssignalWidget, matching: find.text('D')), findsNothing); + expect(find.descendant(of: bracketStationD1Widget, matching: find.text('D')), findsNothing); }); testWidgets('test halt on request is displayed correctly', (tester) async { @@ -620,7 +635,7 @@ void main() { final scrollableFinder = find.byType(ListView); expect(scrollableFinder, findsOneWidget); - await tester.dragUntilVisible(find.text('Halt auf Verlangen C'), scrollableFinder, const Offset(0, -50)); + await tester.dragUntilVisible(find.text('Klammerbahnhof D'), scrollableFinder, const Offset(0, -50)); final stopOnDemandRow = findDASTableRowByText('Halt auf Verlangen C'); expect(stopOnDemandRow, findsOneWidget); @@ -837,48 +852,58 @@ void main() { final bernStationRow = findDASTableRowByText('Bern'); expect(bernStationRow, findsOneWidget); - final bernIncomingSpeeds = find.descendant(of: bernStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); + final bernIncomingSpeeds = + find.descendant(of: bernStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); expect(bernIncomingSpeeds, findsNWidgets(2)); final bernIncomingSpeedsText = find.descendant(of: bernStationRow, matching: find.text('75-70-60')); expect(bernIncomingSpeedsText, findsOneWidget); - final bernOutgoingSpeeds = find.descendant(of: bernStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); + final bernOutgoingSpeeds = + find.descendant(of: bernStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); expect(bernOutgoingSpeeds, findsNothing); // check station speeds for Wankdorf, no station speeds given final wankdorfStationRow = findDASTableRowByText('Wankdorf'); expect(wankdorfStationRow, findsOneWidget); - final wankdorfIncomingSpeeds = find.descendant(of: wankdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); + final wankdorfIncomingSpeeds = + find.descendant(of: wankdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); expect(wankdorfIncomingSpeeds, findsNothing); - final wankdorfOutgoingSpeeds = find.descendant(of: wankdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); + final wankdorfOutgoingSpeeds = + find.descendant(of: wankdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); expect(wankdorfOutgoingSpeeds, findsNothing); // check station speeds for Burgdorf final burgdorfStationRow = findDASTableRowByText('Burgdorf'); expect(burgdorfStationRow, findsOneWidget); - final burgdorfIncomingSpeeds = find.descendant(of: burgdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); + final burgdorfIncomingSpeeds = + find.descendant(of: burgdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); expect(burgdorfIncomingSpeeds, findsNWidgets(2)); final burgdorfIncomingSpeeds75 = find.descendant(of: burgdorfIncomingSpeeds, matching: find.text('75')); expect(burgdorfIncomingSpeeds75, findsOneWidget); final burgdorfIncomingSpeeds70 = find.descendant(of: burgdorfIncomingSpeeds, matching: find.text('70')); expect(burgdorfIncomingSpeeds70, findsOneWidget); - final burgdorfIncomingSpeeds70Circled = find.ancestor(of: burgdorfIncomingSpeeds70, matching: find.byKey(GraduatedSpeedsCellBody.circledSpeedKey)); + final burgdorfIncomingSpeeds70Circled = + find.ancestor(of: burgdorfIncomingSpeeds70, matching: find.byKey(GraduatedSpeedsCellBody.circledSpeedKey)); expect(burgdorfIncomingSpeeds70Circled, findsOneWidget); - final burgdorfOutgoingSpeeds = find.descendant(of: burgdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); + final burgdorfOutgoingSpeeds = + find.descendant(of: burgdorfStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); expect(burgdorfOutgoingSpeeds, findsOneWidget); final burgdorfOutgoingSpeeds60 = find.descendant(of: burgdorfOutgoingSpeeds, matching: find.text('60')); expect(burgdorfOutgoingSpeeds60, findsOneWidget); - final burgdorfOutgoingSpeeds60Squared = find.ancestor(of: burgdorfOutgoingSpeeds60, matching: find.byKey(GraduatedSpeedsCellBody.squaredSpeedKey)); + final burgdorfOutgoingSpeeds60Squared = + find.ancestor(of: burgdorfOutgoingSpeeds60, matching: find.byKey(GraduatedSpeedsCellBody.squaredSpeedKey)); expect(burgdorfOutgoingSpeeds60Squared, findsOneWidget); // check station speeds for Olten, no graduated speed for train series R final oltenStationRow = findDASTableRowByText('Olten'); expect(oltenStationRow, findsOneWidget); - final oltenIncomingSpeeds = find.descendant(of: oltenStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); + final oltenIncomingSpeeds = + find.descendant(of: oltenStationRow, matching: find.byKey(GraduatedSpeedsCellBody.incomingSpeedsKey)); expect(oltenIncomingSpeeds, findsOneWidget); - final oltenOutgoingSpeeds = find.descendant(of: oltenStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); + final oltenOutgoingSpeeds = + find.descendant(of: oltenStationRow, matching: find.byKey(GraduatedSpeedsCellBody.outgoingSpeedsKey)); expect(oltenOutgoingSpeeds, findsNothing); }); diff --git a/das_client/lib/app/bloc/train_journey_cubit.dart b/das_client/lib/app/bloc/train_journey_cubit.dart index 965a34a0..4955479c 100644 --- a/das_client/lib/app/bloc/train_journey_cubit.dart +++ b/das_client/lib/app/bloc/train_journey_cubit.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:das_client/app/model/ru.dart'; -import 'package:das_client/app/model/train_journey_settings.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/train_journey_settings.dart'; import 'package:das_client/model/journey/break_series.dart'; import 'package:das_client/model/journey/journey.dart'; import 'package:das_client/sfera/sfera_component.dart'; diff --git a/das_client/lib/app/pages/journey/train_journey/train_journey_overview.dart b/das_client/lib/app/pages/journey/train_journey/train_journey_overview.dart index e49d7457..fe1ec691 100644 --- a/das_client/lib/app/pages/journey/train_journey/train_journey_overview.dart +++ b/das_client/lib/app/pages/journey/train_journey/train_journey_overview.dart @@ -2,7 +2,6 @@ import 'package:das_client/app/pages/journey/train_journey/widgets/header/header import 'package:das_client/app/pages/journey/train_journey/widgets/train_journey.dart'; import 'package:flutter/material.dart'; -// TODO: handle extraLarge font sizes (diff to figma) globally. class TrainJourneyOverview extends StatelessWidget { const TrainJourneyOverview({super.key}); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart index 12625a2f..72f83d3b 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart @@ -11,11 +11,10 @@ class AdditionalSpeedRestrictionRow extends BaseRowBuilder { static const Key baliseIconKey = Key('balise_icon_key'); - BaliseLevelCrossingGroupRow({ + const BaliseLevelCrossingGroupRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, super.onTap, }); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/balise_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/balise_row.dart index 3a129eea..bac67d3d 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/balise_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/balise_row.dart @@ -10,11 +10,10 @@ import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; class BaliseRow extends BaseRowBuilder { static const Key baliseIconKey = Key('balise_icon_key'); - BaliseRow({ + const BaliseRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, super.isGrouped, }); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/base_row_builder.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/base_row_builder.dart index 22770c52..b713cc5f 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/base_row_builder.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/base_row_builder.dart @@ -1,9 +1,9 @@ -import 'package:das_client/app/model/train_journey_settings.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/graduated_speeds_cell_body.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/bracket_station_cell_body.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/route_cell_body.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/track_equipment_cell_body.dart'; -import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/train_journey_config.dart'; import 'package:das_client/app/widgets/table/das_table_cell.dart'; import 'package:das_client/app/widgets/table/das_table_row.dart'; import 'package:das_client/model/journey/additional_speed_restriction.dart'; @@ -19,9 +19,8 @@ class BaseRowBuilder extends DASTableRowBuilder { const BaseRowBuilder({ required this.metadata, required this.data, - required this.settings, super.height = rowHeight, - this.trackEquipmentRenderData = const TrackEquipmentRenderData(), + this.config = const TrainJourneyConfig(), this.defaultAlignment = Alignment.bottomCenter, this.rowColor, this.onTap, @@ -32,8 +31,7 @@ class BaseRowBuilder extends DASTableRowBuilder { final Color? rowColor; final Metadata metadata; final T data; - final TrackEquipmentRenderData trackEquipmentRenderData; - final TrainJourneySettings settings; + final TrainJourneyConfig config; final VoidCallback? onTap; final bool isGrouped; @@ -49,6 +47,7 @@ class BaseRowBuilder extends DASTableRowBuilder { routeCell(context), trackEquipment(context), iconsCell1(context), + bracketStation(context), informationCell(context), iconsCell2(context), iconsCell3(context), @@ -93,12 +92,16 @@ class BaseRowBuilder extends DASTableRowBuilder { } DASTableCell trackEquipment(BuildContext context) { + if (config.trackEquipmentRenderData == null) { + return DASTableCell.empty(color: specialCellColor); + } + return DASTableCell( color: specialCellColor, padding: EdgeInsets.all(0.0), alignment: null, child: TrackEquipmentCellBody( - renderData: trackEquipmentRenderData, + renderData: config.trackEquipmentRenderData!, ), ); } @@ -128,8 +131,10 @@ class BaseRowBuilder extends DASTableRowBuilder { return DASTableCell.empty(); } - final currentTrainSeries = settings.selectedBreakSeries?.trainSeries ?? metadata.breakSeries?.trainSeries; - final currentBreakSeries = settings.selectedBreakSeries?.breakSeries ?? metadata.breakSeries?.breakSeries; + final currentTrainSeries = + config.settings.selectedBreakSeries?.trainSeries ?? metadata.breakSeries?.trainSeries; + final currentBreakSeries = + config.settings.selectedBreakSeries?.breakSeries ?? metadata.breakSeries?.breakSeries; final graduatedSpeeds = speedData.speedsFor(currentTrainSeries, currentBreakSeries); if (graduatedSpeeds == null) { @@ -150,6 +155,21 @@ class BaseRowBuilder extends DASTableRowBuilder { return DASTableCell.empty(); } + DASTableCell bracketStation(BuildContext context) { + final bracketStationRenderData = config.bracketStationRenderData; + if (bracketStationRenderData == null) return DASTableCell.empty(); + + return DASTableCell( + padding: EdgeInsets.all(0.0), + clipBehaviour: Clip.none, + child: BracketStationCellBody( + stationAbbreviation: + config.bracketStationRenderData!.isStart ? bracketStationRenderData.stationAbbreviation : null, + height: height, + ), + ); + } + DASTableCell iconsCell2(BuildContext context) { return DASTableCell.empty(); } diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart index 721efd09..9f1feb3f 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart @@ -9,11 +9,10 @@ class CABSignalingRow extends BaseRowBuilder { static const Key cabSignalingStartIconKey = Key('cab_signaling_start_icon_key'); static const Key cabSignalingEndIconKey = Key('cab_signaling_end_icon_key'); - CABSignalingRow({ + const CABSignalingRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/bracket_station_cell_body.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/bracket_station_cell_body.dart index de47b70c..ec0bfed2 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/bracket_station_cell_body.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/bracket_station_cell_body.dart @@ -1,7 +1,7 @@ import 'package:das_client/app/widgets/das_text_styles.dart'; -import 'package:das_client/model/journey/bracket_station.dart'; -import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; +import 'package:das_client/app/widgets/table/das_table_theme.dart'; import 'package:flutter/material.dart'; +import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; class BracketStationCellBody extends StatelessWidget { static const Key bracketStationKey = Key('bracketStationKey'); @@ -9,40 +9,47 @@ class BracketStationCellBody extends StatelessWidget { static const double _bracketStationFontSize = 12.0; const BracketStationCellBody({ - required this.bracketStation, + required this.stationAbbreviation, required this.height, super.key, }); - final BracketStation bracketStation; + final String? stationAbbreviation; final double height; @override Widget build(BuildContext context) { - return Positioned( - top: -sbbDefaultSpacing, - bottom: -sbbDefaultSpacing, - right: 0, - child: Container( - key: bracketStationKey, - height: height, - width: _bracketStationWidth, - color: SBBColors.black, - child: Align( - alignment: Alignment.center, - child: RotatedBox( - quarterTurns: -1, - child: Text( - bracketStation.mainStationAbbreviation ?? '', - style: DASTextStyles.extraSmallBold.copyWith( - color: SBBColors.white, - fontSize: _bracketStationFontSize, - height: _bracketStationWidth / _bracketStationFontSize, + final tableBorder = DASTableTheme.of(context)?.data.tableBorder; + final bottomBorder = -(tableBorder?.horizontalInside.width ?? 0); + return Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 0, + bottom: bottomBorder, + left: -_bracketStationWidth, + child: Container( + key: bracketStationKey, + height: height, + width: _bracketStationWidth, + color: SBBColors.black, + child: Align( + alignment: Alignment.center, + child: RotatedBox( + quarterTurns: -1, + child: Text( + stationAbbreviation ?? '', + style: DASTextStyles.extraSmallBold.copyWith( + color: SBBColors.white, + fontSize: _bracketStationFontSize, + height: _bracketStationWidth / _bracketStationFontSize, + ), + ), ), ), ), ), - ), + ], ); } } diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_cell_body.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_cell_body.dart index ce3d3f1a..bc40c1bb 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_cell_body.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_cell_body.dart @@ -1,6 +1,6 @@ -import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart'; import 'package:das_client/app/widgets/table/das_table_theme.dart'; -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:flutter/material.dart'; class TrackEquipmentCellBody extends StatelessWidget { diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart new file mode 100644 index 00000000..ac96c1e6 --- /dev/null +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart @@ -0,0 +1,25 @@ +import 'package:das_client/model/journey/base_data.dart'; +import 'package:das_client/model/journey/bracket_station_segment.dart'; +import 'package:das_client/model/journey/metadata.dart'; + +/// Data class to hold all the information to visualize bracket stations. +class BracketStationRenderData { + const BracketStationRenderData({ + this.stationAbbreviation, + this.isStart = false, + }); + + final String? stationAbbreviation; + final bool isStart; + + static BracketStationRenderData? from(BaseData data, Metadata metadata) { + final bracketStationSegments = metadata.bracketStationSegments; + final segment = bracketStationSegments.appliesToOrder(data.order); + if (segment == null) return null; + + return BracketStationRenderData( + stationAbbreviation: segment.mainStationAbbreviation, + isStart: data.order == segment.startOrder, + ); + } +} diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart similarity index 96% rename from das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart rename to das_client/lib/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart index d9d4fb29..72226215 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart @@ -5,7 +5,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/cab_signaling.dart'; import 'package:das_client/model/journey/datatype.dart'; import 'package:das_client/model/journey/metadata.dart'; -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; /// Data class to hold all the information to visualize the track equipment. class TrackEquipmentRenderData { @@ -23,11 +23,11 @@ class TrackEquipmentRenderData { final bool isConventionalExtendedSpeedBorder; final TrackEquipmentType? trackEquipmentType; - factory TrackEquipmentRenderData.from(List rowData, Metadata metadata, int index) { + static TrackEquipmentRenderData? from(List rowData, Metadata metadata, int index) { final data = rowData[index]; final nonStandardTrackEquipmentSegments = metadata.nonStandardTrackEquipmentSegments; final trackEquipment = nonStandardTrackEquipmentSegments.appliesToOrder(data.order).firstOrNull; - if (trackEquipment == null || !trackEquipment.isEtcsL2Segment) return TrackEquipmentRenderData(); + if (trackEquipment == null || !trackEquipment.isEtcsL2Segment) return null; return TrackEquipmentRenderData( trackEquipmentType: trackEquipment.type, diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_config.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_config.dart new file mode 100644 index 00000000..9293c533 --- /dev/null +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_config.dart @@ -0,0 +1,16 @@ +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/train_journey_settings.dart'; + +/// Data class to hold all the information to visualize the train journey. +class TrainJourneyConfig { + const TrainJourneyConfig({ + this.trackEquipmentRenderData, + this.bracketStationRenderData, + this.settings = const TrainJourneySettings(), + }); + + final TrainJourneySettings settings; + final TrackEquipmentRenderData? trackEquipmentRenderData; + final BracketStationRenderData? bracketStationRenderData; +} diff --git a/das_client/lib/app/model/train_journey_settings.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_settings.dart similarity index 94% rename from das_client/lib/app/model/train_journey_settings.dart rename to das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_settings.dart index ffbdc124..6368c8e4 100644 --- a/das_client/lib/app/model/train_journey_settings.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/config/train_journey_settings.dart @@ -1,7 +1,7 @@ import 'package:das_client/model/journey/break_series.dart'; class TrainJourneySettings { - TrainJourneySettings({ + const TrainJourneySettings({ this.selectedBreakSeries, this.expandedGroups = const [], }); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/connection_track_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/connection_track_row.dart index acc14e88..60c9c172 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/connection_track_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/connection_track_row.dart @@ -5,11 +5,10 @@ import 'package:das_client/model/journey/connection_track.dart'; import 'package:flutter/material.dart'; class ConnectionTrackRow extends BaseRowBuilder { - ConnectionTrackRow({ + const ConnectionTrackRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/curve_point_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/curve_point_row.dart index 403af89c..a1f7238e 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/curve_point_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/curve_point_row.dart @@ -9,11 +9,10 @@ import 'package:flutter_svg/flutter_svg.dart'; class CurvePointRow extends BaseRowBuilder { static const Key curvePointIconKey = Key('curve_point_icon_key'); - CurvePointRow({ + const CurvePointRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/level_crossing_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/level_crossing_row.dart index dbce46b6..dede1670 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/level_crossing_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/level_crossing_row.dart @@ -5,11 +5,10 @@ import 'package:das_client/model/journey/level_crossing.dart'; import 'package:flutter/material.dart'; class LevelCrossingRow extends BaseRowBuilder { - LevelCrossingRow({ + const LevelCrossingRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, super.isGrouped, }); diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/protection_section_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/protection_section_row.dart index 844af433..22f0dd6a 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/protection_section_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/protection_section_row.dart @@ -10,11 +10,10 @@ import 'package:flutter_svg/flutter_svg.dart'; class ProtectionSectionRow extends BaseRowBuilder { static const Key protectionSectionKey = Key('protection_section_key'); - ProtectionSectionRow({ + const ProtectionSectionRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }) : super(rowColor: SBBColors.peach); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/service_point_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/service_point_row.dart index 6d880c04..492c053e 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/service_point_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/service_point_row.dart @@ -1,5 +1,4 @@ import 'package:das_client/app/pages/journey/train_journey/widgets/table/base_row_builder.dart'; -import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/bracket_station_cell_body.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/graduated_speeds_cell_body.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/route_cell_body.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/track_equipment_cell_body.dart'; @@ -19,22 +18,24 @@ class ServicePointRow extends BaseRowBuilder { ServicePointRow({ required super.metadata, required super.data, - required super.settings, super.height = rowHeight, - super.trackEquipmentRenderData, + super.config, }) : super(rowColor: metadata.nextStop == data ? SBBColors.royal.withAlpha((255.0 * 0.2).round()) : null); @override DASTableCell informationCell(BuildContext context) { final servicePointName = data.name.localized; - final textStyle = - data.isStation ? DASTextStyles.xLargeBold : DASTextStyles.xLargeLight.copyWith(fontStyle: FontStyle.italic); return DASTableCell( alignment: defaultAlignment, child: Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text(servicePointName, style: textStyle), + Text( + servicePointName, + style: data.isStation + ? DASTextStyles.xLargeBold + : DASTextStyles.xLargeLight.copyWith(fontStyle: FontStyle.italic), + ), ], ), ); @@ -47,14 +48,13 @@ class ServicePointRow extends BaseRowBuilder { @override DASTableCell iconsCell1(BuildContext context) { + if (data.mandatoryStop) return DASTableCell.empty(); + return DASTableCell( - padding: EdgeInsets.fromLTRB(0, sbbDefaultSpacing * 0.5, 0, sbbDefaultSpacing * 0.5), - child: Stack( - clipBehavior: Clip.none, - children: [ - if (data.bracketStation != null) _bracketStationCell(), - if (!data.mandatoryStop) _stopOnRequestIcon() - ], + alignment: Alignment.bottomCenter, + child: SvgPicture.asset( + AppAssets.iconStopOnRequest, + key: stopOnRequestKey, ), ); } @@ -79,8 +79,10 @@ class ServicePointRow extends BaseRowBuilder { DASTableCell localSpeedCell(BuildContext context) { if (data.localSpeedData == null) return DASTableCell.empty(); - final currentTrainSeries = settings.selectedBreakSeries?.trainSeries ?? metadata.breakSeries?.trainSeries; - final currentBreakSeries = settings.selectedBreakSeries?.breakSeries ?? metadata.breakSeries?.breakSeries; + final currentTrainSeries = + config.settings.selectedBreakSeries?.trainSeries ?? metadata.breakSeries?.trainSeries; + final currentBreakSeries = + config.settings.selectedBreakSeries?.breakSeries ?? metadata.breakSeries?.breakSeries; final graduatedSpeeds = data.localSpeedData!.speedsFor(currentTrainSeries, currentBreakSeries); if (graduatedSpeeds == null) return DASTableCell.empty(); @@ -97,30 +99,17 @@ class ServicePointRow extends BaseRowBuilder { @override DASTableCell trackEquipment(BuildContext context) { + if (config.trackEquipmentRenderData == null) { + return DASTableCell.empty(color: specialCellColor); + } + return DASTableCell( color: specialCellColor, padding: const EdgeInsets.all(0.0), alignment: null, child: TrackEquipmentCellBody( - renderData: trackEquipmentRenderData, + renderData: config.trackEquipmentRenderData!, ), ); } - - Widget _stopOnRequestIcon() { - return Align( - alignment: Alignment.bottomCenter, - child: SvgPicture.asset( - AppAssets.iconStopOnRequest, - key: stopOnRequestKey, - ), - ); - } - - Widget _bracketStationCell() { - return BracketStationCellBody( - bracketStation: data.bracketStation!, - height: height, - ); - } } diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/signal_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/signal_row.dart index d87193c5..d9914479 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/signal_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/signal_row.dart @@ -9,11 +9,10 @@ import 'package:flutter_svg/flutter_svg.dart'; class SignalRow extends BaseRowBuilder { static const Key signalLineChangeIconKey = Key('signal_line_change_icon_key'); - SignalRow({ + const SignalRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/speed_change_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/speed_change_row.dart index a7dd616c..c1693ccf 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/speed_change_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/speed_change_row.dart @@ -9,11 +9,10 @@ import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; class SpeedChangeRow extends BaseRowBuilder { static const Key kmIndicatorKey = Key('km_indicator_key'); - SpeedChangeRow({ + const SpeedChangeRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/tram_area_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/tram_area_row.dart index fa522188..48a24502 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/tram_area_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/tram_area_row.dart @@ -10,11 +10,10 @@ import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; class TramAreaRow extends BaseRowBuilder { static const Key tramAreaIconKey = Key('tram_area_icon_key'); - TramAreaRow({ + const TramAreaRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/table/whistle_row.dart b/das_client/lib/app/pages/journey/train_journey/widgets/table/whistle_row.dart index 9230430b..8ba731f9 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/table/whistle_row.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/table/whistle_row.dart @@ -9,11 +9,10 @@ import 'package:sbb_design_system_mobile/sbb_design_system_mobile.dart'; class WhistleRow extends BaseRowBuilder { static const Key whistleIconKey = Key('whistle_icon_key'); - WhistleRow({ + const WhistleRow({ required super.metadata, required super.data, - required super.settings, - super.trackEquipmentRenderData, + super.config, }); @override diff --git a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart index 1c534dd9..6c6045ed 100644 --- a/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart +++ b/das_client/lib/app/pages/journey/train_journey/widgets/train_journey.dart @@ -1,12 +1,14 @@ import 'package:das_client/app/bloc/train_journey_cubit.dart'; import 'package:das_client/app/i18n/i18n.dart'; -import 'package:das_client/app/model/train_journey_settings.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/train_journey_config.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/train_journey_settings.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/break_series_selection.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/additional_speed_restriction_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/balise_level_crossing_group_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/balise_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/cab_signaling_row.dart'; -import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/connection_track_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/curve_point_row.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/level_crossing_row.dart'; @@ -75,7 +77,7 @@ class TrainJourney extends StatelessWidget { } List _rows(BuildContext context, Journey journey, TrainJourneySettings settings) { - final rows = journey.data.groupBaliseAndLeveLCrossings(settings); + final rows = journey.data.groupBaliseAndLeveLCrossings(settings.expandedGroups); final groupedRows = rows.whereType().map((it) => it.groupedElements).expand((it) => it).toList(); @@ -83,100 +85,91 @@ class TrainJourney extends StatelessWidget { return List.generate(rows.length, (index) { final rowData = rows[index]; - final renderData = TrackEquipmentRenderData.from(rows, journey.metadata, index); + final trainJourneyConfig = TrainJourneyConfig( + settings: settings, + trackEquipmentRenderData: TrackEquipmentRenderData.from(rows, journey.metadata, index), + bracketStationRenderData: BracketStationRenderData.from(rowData, journey.metadata), + ); switch (rowData.type) { case Datatype.servicePoint: return ServicePointRow( - metadata: journey.metadata, - data: rowData as ServicePoint, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as ServicePoint, + config: trainJourneyConfig, + ).build(context); case Datatype.protectionSection: return ProtectionSectionRow( - metadata: journey.metadata, - data: rowData as ProtectionSection, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as ProtectionSection, + config: trainJourneyConfig, + ).build(context); case Datatype.curvePoint: return CurvePointRow( - metadata: journey.metadata, - data: rowData as CurvePoint, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as CurvePoint, + config: trainJourneyConfig, + ).build(context); case Datatype.signal: return SignalRow( - metadata: journey.metadata, - data: rowData as Signal, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as Signal, + config: trainJourneyConfig, + ).build(context); case Datatype.additionalSpeedRestriction: return AdditionalSpeedRestrictionRow( - metadata: journey.metadata, - data: rowData as AdditionalSpeedRestrictionData, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as AdditionalSpeedRestrictionData, + config: trainJourneyConfig, + ).build(context); case Datatype.connectionTrack: return ConnectionTrackRow( - metadata: journey.metadata, - data: rowData as ConnectionTrack, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as ConnectionTrack, + config: trainJourneyConfig, + ).build(context); case Datatype.speedChange: return SpeedChangeRow( - metadata: journey.metadata, - data: rowData as SpeedChange, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as SpeedChange, + config: trainJourneyConfig, + ).build(context); case Datatype.cabSignaling: return CABSignalingRow( - metadata: journey.metadata, - data: rowData as CABSignaling, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as CABSignaling, + config: trainJourneyConfig, + ).build(context); case Datatype.balise: return BaliseRow( - metadata: journey.metadata, - data: rowData as Balise, - settings: settings, - trackEquipmentRenderData: renderData, - isGrouped: groupedRows.contains(rowData)) - .build(context); + metadata: journey.metadata, + data: rowData as Balise, + config: trainJourneyConfig, + isGrouped: groupedRows.contains(rowData), + ).build(context); case Datatype.whistle: return WhistleRow( - metadata: journey.metadata, - data: rowData as Whistle, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as Whistle, + config: trainJourneyConfig, + ).build(context); case Datatype.levelCrossing: return LevelCrossingRow( - metadata: journey.metadata, - data: rowData as LevelCrossing, - settings: settings, - trackEquipmentRenderData: renderData, - isGrouped: groupedRows.contains(rowData)) - .build(context); + metadata: journey.metadata, + data: rowData as LevelCrossing, + config: trainJourneyConfig, + isGrouped: groupedRows.contains(rowData), + ).build(context); case Datatype.tramArea: return TramAreaRow( - metadata: journey.metadata, - data: rowData as TramArea, - settings: settings, - trackEquipmentRenderData: renderData) - .build(context); + metadata: journey.metadata, + data: rowData as TramArea, + config: trainJourneyConfig, + ).build(context); case Datatype.baliseLevelCrossingGroup: return BaliseLevelCrossingGroupRow( metadata: journey.metadata, data: rowData as BaliseLevelCrossingGroup, - settings: settings, - trackEquipmentRenderData: renderData, + config: trainJourneyConfig, onTap: () => _onBaliseLevelCrossingGroupTap(context, rowData, settings), ).build(context); } @@ -194,6 +187,7 @@ class TrainJourney extends StatelessWidget { DASTableColumn(width: 48.0), // route column DASTableColumn(width: 20.0), // track equipment column DASTableColumn(width: 64.0), // icons column + DASTableColumn(width: 0.0), // bracket station column DASTableColumn( child: Text(context.l10n.p_train_journey_table_journey_information_label), expanded: true, diff --git a/das_client/lib/app/pages/journey/train_selection/train_selection.dart b/das_client/lib/app/pages/journey/train_selection/train_selection.dart index 1c01a698..9e3b85e0 100644 --- a/das_client/lib/app/pages/journey/train_selection/train_selection.dart +++ b/das_client/lib/app/pages/journey/train_selection/train_selection.dart @@ -24,8 +24,6 @@ class _TrainSelectionState extends State { super.initState(); _trainNumberController = TextEditingController(); _dateController = TextEditingController(); - - context.trainJourneyCubit.updateTrainNumber(_trainNumberController.text); } @override @@ -56,7 +54,7 @@ class _TrainSelectionState extends State { : null, child: Column( children: [ - _trainNumberInput(), + _trainNumberInput(state), _dateInput(state), _ruSelection(context, state), ], @@ -64,7 +62,11 @@ class _TrainSelectionState extends State { ); } - Widget _trainNumberInput() { + Widget _trainNumberInput(SelectingTrainJourneyState state) { + if (state.errorCode != null && state.trainNumber != null) { + _trainNumberController.text = state.trainNumber!; + } + return Padding( padding: const EdgeInsets.fromLTRB(sbbDefaultSpacing, sbbDefaultSpacing, 0, sbbDefaultSpacing / 2), child: SBBTextField( diff --git a/das_client/lib/app/widgets/table/das_table_column.dart b/das_client/lib/app/widgets/table/das_table_column.dart index 729acdf9..91e5d653 100644 --- a/das_client/lib/app/widgets/table/das_table_column.dart +++ b/das_client/lib/app/widgets/table/das_table_column.dart @@ -19,7 +19,7 @@ class DASTableColumn { this.alignment = Alignment.center, this.onTap, this.headerKey, - }) : assert((width != null && width > 0) || expanded); + }) : assert(width != null || expanded); /// The content of the column header as a widget. final Widget? child; diff --git a/das_client/lib/model/journey/additional_speed_restriction.dart b/das_client/lib/model/journey/additional_speed_restriction.dart index cff0a5b7..14ee6b51 100644 --- a/das_client/lib/model/journey/additional_speed_restriction.dart +++ b/das_client/lib/model/journey/additional_speed_restriction.dart @@ -1,7 +1,7 @@ import 'package:das_client/model/journey/base_data.dart'; class AdditionalSpeedRestriction { - AdditionalSpeedRestriction( + const AdditionalSpeedRestriction( {required this.kmFrom, required this.kmTo, required this.orderFrom, required this.orderTo, this.speed}); final double kmFrom; diff --git a/das_client/lib/model/journey/additional_speed_restriction_data.dart b/das_client/lib/model/journey/additional_speed_restriction_data.dart index e047600e..ea7bfa6a 100644 --- a/das_client/lib/model/journey/additional_speed_restriction_data.dart +++ b/das_client/lib/model/journey/additional_speed_restriction_data.dart @@ -3,7 +3,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class AdditionalSpeedRestrictionData extends BaseData { - AdditionalSpeedRestrictionData({required this.restriction, required super.order, required super.kilometre}) + const AdditionalSpeedRestrictionData({required this.restriction, required super.order, required super.kilometre}) : super(type: Datatype.additionalSpeedRestriction); final AdditionalSpeedRestriction restriction; diff --git a/das_client/lib/model/journey/balise.dart b/das_client/lib/model/journey/balise.dart index a4da10d4..6d56ed26 100644 --- a/das_client/lib/model/journey/balise.dart +++ b/das_client/lib/model/journey/balise.dart @@ -3,7 +3,7 @@ import 'package:das_client/model/journey/datatype.dart'; import 'package:das_client/model/journey/level_crossing.dart'; class Balise extends BaseData { - Balise({ + const Balise({ required super.order, required super.kilometre, required this.amountLevelCrossings, diff --git a/das_client/lib/model/journey/balise_level_crossing_group.dart b/das_client/lib/model/journey/balise_level_crossing_group.dart index 0f452f71..51c871e2 100644 --- a/das_client/lib/model/journey/balise_level_crossing_group.dart +++ b/das_client/lib/model/journey/balise_level_crossing_group.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class BaliseLevelCrossingGroup extends BaseData { - BaliseLevelCrossingGroup({ + const BaliseLevelCrossingGroup({ required super.order, required super.kilometre, required this.groupedElements, diff --git a/das_client/lib/model/journey/base_data.dart b/das_client/lib/model/journey/base_data.dart index 292c3d04..2b9b0745 100644 --- a/das_client/lib/model/journey/base_data.dart +++ b/das_client/lib/model/journey/base_data.dart @@ -3,7 +3,7 @@ import 'package:das_client/model/journey/datatype.dart'; import 'package:das_client/model/journey/speed_data.dart'; abstract class BaseData implements Comparable { - BaseData({ + const BaseData({ required this.type, required this.order, required this.kilometre, diff --git a/das_client/lib/model/journey/base_data_extension.dart b/das_client/lib/model/journey/base_data_extension.dart index b8a428a4..c7db6f37 100644 --- a/das_client/lib/model/journey/base_data_extension.dart +++ b/das_client/lib/model/journey/base_data_extension.dart @@ -1,10 +1,9 @@ -import 'package:das_client/app/model/train_journey_settings.dart'; import 'package:das_client/model/journey/balise_level_crossing_group.dart'; import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; extension BaseDataExtension on List { - List groupBaliseAndLeveLCrossings(TrainJourneySettings settings) { + List groupBaliseAndLeveLCrossings(List expandedGroups) { final List resultList = []; for (int i = 0; i < length; i++) { @@ -34,7 +33,7 @@ extension BaseDataExtension on List { resultList.add(group); // Add all the elements if the group is currently expanded - if (settings.expandedGroups.contains(group.order)) { + if (expandedGroups.contains(group.order)) { resultList.addAll(groupedElements); } diff --git a/das_client/lib/model/journey/bracket_station.dart b/das_client/lib/model/journey/bracket_station.dart index 94dd5896..66c2e7fb 100644 --- a/das_client/lib/model/journey/bracket_station.dart +++ b/das_client/lib/model/journey/bracket_station.dart @@ -1,10 +1,28 @@ -class BracketStation { - BracketStation({this.mainStationAbbreviation}); +class BracketMainStation { + const BracketMainStation({ + required this.countryCode, + required this.primaryCode, + required this.abbreviation, + }); - final String? mainStationAbbreviation; + final String countryCode; + final int primaryCode; + final String abbreviation; @override String toString() { - return "BracketStation(mainStationAbbreviation: '$mainStationAbbreviation')"; + return 'BracketMainStation(countryCode: $countryCode, primaryCode: $primaryCode, abbreviation: $abbreviation)'; } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BracketMainStation && + runtimeType == other.runtimeType && + countryCode == other.countryCode && + primaryCode == other.primaryCode && + abbreviation == other.abbreviation; + + @override + int get hashCode => countryCode.hashCode ^ primaryCode.hashCode ^ abbreviation.hashCode; } diff --git a/das_client/lib/model/journey/bracket_station_segment.dart b/das_client/lib/model/journey/bracket_station_segment.dart new file mode 100644 index 00000000..4a3d25f9 --- /dev/null +++ b/das_client/lib/model/journey/bracket_station_segment.dart @@ -0,0 +1,29 @@ +class BracketStationSegment { + const BracketStationSegment({ + required this.mainStationAbbreviation, + required this.startOrder, + required this.endOrder, + }); + + final String mainStationAbbreviation; + + /// Start order of this segment. + final int startOrder; + + /// End order of this segment. + final int endOrder; + + /// checks if the given order is part of this bracket station. + bool appliesToOrder(int order) => startOrder <= order && order <= endOrder; + + @override + String toString() { + return 'BracketStationSegment(mainStationAbbreviation: $mainStationAbbreviation, startOrder: $startOrder, endOrder: $endOrder)'; + } +} + +// extensions + +extension BracketStationSegmentsExtension on Iterable { + BracketStationSegment? appliesToOrder(int order) => where((segment) => segment.appliesToOrder(order)).firstOrNull; +} diff --git a/das_client/lib/model/journey/break_series.dart b/das_client/lib/model/journey/break_series.dart index 13536302..2918fa84 100644 --- a/das_client/lib/model/journey/break_series.dart +++ b/das_client/lib/model/journey/break_series.dart @@ -1,7 +1,7 @@ import 'package:das_client/model/journey/train_series.dart'; class BreakSeries { - BreakSeries({ + const BreakSeries({ required this.trainSeries, required this.breakSeries, }); diff --git a/das_client/lib/model/journey/cab_signaling.dart b/das_client/lib/model/journey/cab_signaling.dart index 1aaefaad..d421f08f 100644 --- a/das_client/lib/model/journey/cab_signaling.dart +++ b/das_client/lib/model/journey/cab_signaling.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class CABSignaling extends BaseData { - CABSignaling({ + const CABSignaling({ required super.order, required super.kilometre, this.isStart = false, diff --git a/das_client/lib/model/journey/connection_track.dart b/das_client/lib/model/journey/connection_track.dart index 6cbd9fab..9c64f88e 100644 --- a/das_client/lib/model/journey/connection_track.dart +++ b/das_client/lib/model/journey/connection_track.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class ConnectionTrack extends BaseData { - ConnectionTrack({required super.order, required super.kilometre, this.text, super.speedData}) + const ConnectionTrack({required super.order, required super.kilometre, this.text, super.speedData}) : super(type: Datatype.connectionTrack); final String? text; diff --git a/das_client/lib/model/journey/curve_point.dart b/das_client/lib/model/journey/curve_point.dart index 052bff54..9311ad7c 100644 --- a/das_client/lib/model/journey/curve_point.dart +++ b/das_client/lib/model/journey/curve_point.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class CurvePoint extends BaseData { - CurvePoint({ + const CurvePoint({ required super.order, required super.kilometre, super.localSpeedData, diff --git a/das_client/lib/model/journey/level_crossing.dart b/das_client/lib/model/journey/level_crossing.dart index 856bf5ae..ab180914 100644 --- a/das_client/lib/model/journey/level_crossing.dart +++ b/das_client/lib/model/journey/level_crossing.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class LevelCrossing extends BaseData { - LevelCrossing({ + const LevelCrossing({ required super.order, required super.kilometre, super.speedData, diff --git a/das_client/lib/model/journey/metadata.dart b/das_client/lib/model/journey/metadata.dart index f7302643..ad1d3823 100644 --- a/das_client/lib/model/journey/metadata.dart +++ b/das_client/lib/model/journey/metadata.dart @@ -1,11 +1,12 @@ import 'package:das_client/model/journey/additional_speed_restriction.dart'; import 'package:das_client/model/journey/base_data.dart'; +import 'package:das_client/model/journey/bracket_station_segment.dart'; import 'package:das_client/model/journey/break_series.dart'; import 'package:das_client/model/journey/service_point.dart'; -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; class Metadata { - Metadata({ + const Metadata({ this.nextStop, this.currentPosition, this.routeStart, @@ -14,6 +15,7 @@ class Metadata { this.breakSeries, this.additionalSpeedRestrictions = const [], this.nonStandardTrackEquipmentSegments = const [], + this.bracketStationSegments = const [], this.availableBreakSeries = const {}, }); @@ -24,6 +26,7 @@ class Metadata { final BaseData? routeEnd; final Duration? delay; final List nonStandardTrackEquipmentSegments; + final List bracketStationSegments; final BreakSeries? breakSeries; final Set availableBreakSeries; } diff --git a/das_client/lib/model/journey/protection_section.dart b/das_client/lib/model/journey/protection_section.dart index 9736f599..3fd7c69f 100644 --- a/das_client/lib/model/journey/protection_section.dart +++ b/das_client/lib/model/journey/protection_section.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class ProtectionSection extends BaseData { - ProtectionSection({required this.isOptional, required this.isLong, required super.order, required super.kilometre}) + const ProtectionSection({required this.isOptional, required this.isLong, required super.order, required super.kilometre}) : super(type: Datatype.protectionSection); final bool isOptional; diff --git a/das_client/lib/model/journey/service_point.dart b/das_client/lib/model/journey/service_point.dart index 2ab49965..0e9dee55 100644 --- a/das_client/lib/model/journey/service_point.dart +++ b/das_client/lib/model/journey/service_point.dart @@ -5,7 +5,7 @@ import 'package:das_client/model/journey/speed_data.dart'; import 'package:das_client/model/localized_string.dart'; class ServicePoint extends BaseData { - ServicePoint({ + const ServicePoint({ required this.name, required super.order, required super.kilometre, @@ -14,7 +14,7 @@ class ServicePoint extends BaseData { this.mandatoryStop = false, this.isStop = false, this.isStation = false, - this.bracketStation, + this.bracketMainStation, this.graduatedSpeedInfo, }) : super(type: Datatype.servicePoint); @@ -22,11 +22,11 @@ class ServicePoint extends BaseData { final bool mandatoryStop; final bool isStop; final bool isStation; - final BracketStation? bracketStation; + final BracketMainStation? bracketMainStation; final SpeedData? graduatedSpeedInfo; @override String toString() { - return 'ServicePoint(order: $order, kilometre: $kilometre, name: $name, mandatoryStop: $mandatoryStop, isStop: $isStop, isStation: $isStation, bracketStation: $bracketStation, speedData: $speedData, localSpeedData: $localSpeedData)'; + return 'ServicePoint(order: $order, kilometre: $kilometre, name: $name, mandatoryStop: $mandatoryStop, isStop: $isStop, isStation: $isStation, bracketMainStation: $bracketMainStation, speedData: $speedData, localSpeedData: $localSpeedData)'; } } diff --git a/das_client/lib/model/journey/signal.dart b/das_client/lib/model/journey/signal.dart index 87caa4b3..0432c610 100644 --- a/das_client/lib/model/journey/signal.dart +++ b/das_client/lib/model/journey/signal.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class Signal extends BaseData { - Signal({ + const Signal({ required super.order, required super.kilometre, this.visualIdentifier, diff --git a/das_client/lib/model/journey/speed_change.dart b/das_client/lib/model/journey/speed_change.dart index 8ae0b95a..7a22171f 100644 --- a/das_client/lib/model/journey/speed_change.dart +++ b/das_client/lib/model/journey/speed_change.dart @@ -2,7 +2,7 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class SpeedChange extends BaseData { - SpeedChange({required super.order, required super.kilometre, required super.speedData, this.text}) + const SpeedChange({required super.order, required super.kilometre, required super.speedData, this.text}) : super(type: Datatype.speedChange); final String? text; diff --git a/das_client/lib/model/journey/speed_data.dart b/das_client/lib/model/journey/speed_data.dart index b7f65884..156e9691 100644 --- a/das_client/lib/model/journey/speed_data.dart +++ b/das_client/lib/model/journey/speed_data.dart @@ -3,7 +3,7 @@ import 'package:das_client/model/journey/speeds.dart'; import 'package:das_client/model/journey/train_series.dart'; class SpeedData { - SpeedData({this.speeds = const []}); + const SpeedData({this.speeds = const []}); final List speeds; diff --git a/das_client/lib/model/journey/track_equipment.dart b/das_client/lib/model/journey/track_equipment_segment.dart similarity index 100% rename from das_client/lib/model/journey/track_equipment.dart rename to das_client/lib/model/journey/track_equipment_segment.dart diff --git a/das_client/lib/model/journey/tram_area.dart b/das_client/lib/model/journey/tram_area.dart index 99de7395..13943b1f 100644 --- a/das_client/lib/model/journey/tram_area.dart +++ b/das_client/lib/model/journey/tram_area.dart @@ -2,13 +2,13 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class TramArea extends BaseData { - TramArea( - {required super.order, - required super.kilometre, - required this.endKilometre, - required this.amountTramSignals, - super.speedData}) - : super(type: Datatype.tramArea); + const TramArea({ + required super.order, + required super.kilometre, + required this.endKilometre, + required this.amountTramSignals, + super.speedData, + }) : super(type: Datatype.tramArea); final double endKilometre; final int amountTramSignals; diff --git a/das_client/lib/model/journey/velocity.dart b/das_client/lib/model/journey/velocity.dart index cccf8688..74f7220b 100644 --- a/das_client/lib/model/journey/velocity.dart +++ b/das_client/lib/model/journey/velocity.dart @@ -1,7 +1,7 @@ import 'package:das_client/model/journey/train_series.dart'; class Velocity { - Velocity({ + const Velocity({ required this.trainSeries, required this.reduced, this.breakSeries, diff --git a/das_client/lib/model/journey/whistles.dart b/das_client/lib/model/journey/whistles.dart index 18ce7d43..0b7ff8b8 100644 --- a/das_client/lib/model/journey/whistles.dart +++ b/das_client/lib/model/journey/whistles.dart @@ -2,5 +2,5 @@ import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/datatype.dart'; class Whistle extends BaseData { - Whistle({required super.order, required super.kilometre, super.speedData}) : super(type: Datatype.whistle); + const Whistle({required super.order, required super.kilometre, super.speedData}) : super(type: Datatype.whistle); } diff --git a/das_client/lib/sfera/src/mapper/sfera_model_mapper.dart b/das_client/lib/sfera/src/mapper/sfera_model_mapper.dart index 1d6108d7..c6d8b4e8 100644 --- a/das_client/lib/sfera/src/mapper/sfera_model_mapper.dart +++ b/das_client/lib/sfera/src/mapper/sfera_model_mapper.dart @@ -4,13 +4,11 @@ import 'package:das_client/model/journey/additional_speed_restriction_data.dart' import 'package:das_client/model/journey/balise.dart' as journey_balise; import 'package:das_client/model/journey/base_data.dart'; import 'package:das_client/model/journey/bracket_station.dart'; +import 'package:das_client/model/journey/bracket_station_segment.dart'; import 'package:das_client/model/journey/break_series.dart'; import 'package:das_client/model/journey/cab_signaling.dart'; import 'package:das_client/model/journey/connection_track.dart'; import 'package:das_client/model/journey/curve_point.dart'; -import 'package:das_client/model/journey/datatype.dart'; -import 'package:das_client/model/journey/speed_data.dart'; -import 'package:das_client/model/journey/speeds.dart'; import 'package:das_client/model/journey/journey.dart'; import 'package:das_client/model/journey/level_crossing.dart'; import 'package:das_client/model/journey/metadata.dart'; @@ -18,7 +16,9 @@ import 'package:das_client/model/journey/protection_section.dart'; import 'package:das_client/model/journey/service_point.dart'; import 'package:das_client/model/journey/signal.dart'; import 'package:das_client/model/journey/speed_change.dart'; -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/speed_data.dart'; +import 'package:das_client/model/journey/speeds.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:das_client/model/journey/train_series.dart'; import 'package:das_client/model/journey/tram_area.dart'; import 'package:das_client/model/journey/whistles.dart'; @@ -120,7 +120,7 @@ class SferaModelMapper { mandatoryStop: tpConstraint.stoppingPointInformation?.stopType?.mandatoryStop ?? true, isStop: tpConstraint.stopSkipPass == StopSkipPass.stoppingPoint, isStation: tafTapLocation.locationType != TafTapLocationType.stoppingLocation, - bracketStation: _parseBracketStation(tafTapLocations, tafTapLocation), + bracketMainStation: _parseBracketMainStation(tafTapLocations, tafTapLocation), kilometre: kilometreMap[timingPoint.location] ?? [], speedData: _graduatedSpeedDataFromVelocities(tafTapLocation.newLineSpeed?.xmlNewLineSpeed.element.velocities), localSpeedData: @@ -155,17 +155,17 @@ class SferaModelMapper { journeyData.sort(); final trainCharacteristic = _resolveFirstTrainCharacteristics(journeyProfile, trainCharacteristics); - final servicePoints = journeyData.where((it) => it.type == Datatype.servicePoint).toList(); - + final servicePoints = journeyData.whereType(); return Journey( metadata: Metadata( - nextStop: servicePoints.length > 1 ? servicePoints[1] as ServicePoint : null, + nextStop: servicePoints.skip(1).firstWhereOrNull((data) => data.isStop), currentPosition: journeyData.first, additionalSpeedRestrictions: additionalSpeedRestrictions, routeStart: journeyData.firstOrNull, routeEnd: journeyData.lastOrNull, delay: relatedTrainInformation?.ownTrain.trainLocationInformation.delay.delayAsDuration, nonStandardTrackEquipmentSegments: trackEquipmentSegments, + bracketStationSegments: _parseBracketStationSegments(servicePoints), availableBreakSeries: _parseAvailableBreakSeries(journeyData), breakSeries: trainCharacteristic?.tcFeatures.trainCategoryCode != null && trainCharacteristic?.tcFeatures.brakedWeightPercentage != null @@ -319,7 +319,8 @@ class SferaModelMapper { } } - static BracketStation? _parseBracketStation(List allLocations, TafTapLocation tafTapLocation) { + static BracketMainStation? _parseBracketMainStation( + List allLocations, TafTapLocation tafTapLocation) { for (final tafTapLocationNsp in tafTapLocation.nsp) { if (tafTapLocationNsp.name == _bracketStationNspName) { final mainStationNsp = @@ -336,8 +337,8 @@ class SferaModelMapper { if (mainStation == null) { Fimber.w('Failed to resolve main station for bracket station: $tafTapLocation'); } else { - return BracketStation( - mainStationAbbreviation: mainStation != tafTapLocation ? mainStation.abbreviation : null); + return BracketMainStation( + abbreviation: mainStation.abbreviation, countryCode: countryCode, primaryCode: primaryCode); } } } @@ -585,4 +586,31 @@ class SferaModelMapper { return result; } + + static List _parseBracketStationSegments(Iterable servicePoints) { + final Map> combinedBracketStations = {}; + + for (final servicePoint in servicePoints) { + final mainStation = servicePoint.bracketMainStation; + if (mainStation != null) { + if (!combinedBracketStations.containsKey(mainStation)) { + combinedBracketStations[mainStation] = []; + } + combinedBracketStations[mainStation]!.add(servicePoint); + } + } + + return combinedBracketStations.values.map((bracketStations) { + if (bracketStations.length < 2) { + Fimber.w('There should at least be two bracket stations for a segment. Found service points: $bracketStations'); + } + + final orders = bracketStations.map((it) => it.order); + return BracketStationSegment( + mainStationAbbreviation: bracketStations.first.bracketMainStation!.abbreviation, + startOrder: orders.min, + endOrder: orders.max, + ); + }).toList(); + } } diff --git a/das_client/lib/sfera/src/mapper/track_equipment_mapper.dart b/das_client/lib/sfera/src/mapper/track_equipment_mapper.dart index 34052104..a4a58883 100644 --- a/das_client/lib/sfera/src/mapper/track_equipment_mapper.dart +++ b/das_client/lib/sfera/src/mapper/track_equipment_mapper.dart @@ -1,4 +1,4 @@ -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:das_client/sfera/src/mapper/sfera_model_mapper.dart'; import 'package:das_client/sfera/src/model/enums/start_end_qualifier.dart'; import 'package:das_client/sfera/src/model/enums/track_equipment_type.dart'; diff --git a/das_client/lib/sfera/src/model/enums/track_equipment_type.dart b/das_client/lib/sfera/src/model/enums/track_equipment_type.dart index d396202e..68a1f1bf 100644 --- a/das_client/lib/sfera/src/model/enums/track_equipment_type.dart +++ b/das_client/lib/sfera/src/model/enums/track_equipment_type.dart @@ -1,4 +1,4 @@ -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:das_client/sfera/src/model/enums/xml_enum.dart'; enum SferaTrackEquipmentType implements XmlEnum { diff --git a/das_client/test/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data_test.dart b/das_client/test/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data_test.dart new file mode 100644 index 00000000..a6e09c1b --- /dev/null +++ b/das_client/test/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data_test.dart @@ -0,0 +1,52 @@ +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/bracket_station_render_data.dart'; +import 'package:das_client/model/journey/bracket_station_segment.dart'; +import 'package:das_client/model/journey/journey.dart'; +import 'package:das_client/model/journey/metadata.dart'; +import 'package:das_client/model/journey/service_point.dart'; +import 'package:das_client/model/journey/signal.dart'; +import 'package:das_client/model/localized_string.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('test BracketStationRenderData factory', () { + // GIVEN + final journey = Journey( + metadata: Metadata( + bracketStationSegments: [ + _bracketStationSegment('D', 100, 300), + ], + ), + data: [ + Signal(order: 0, kilometre: []), + ServicePoint(name: LocalizedString(), order: 100, kilometre: []), + Signal(order: 200, kilometre: []), + ServicePoint(name: LocalizedString(), order: 300, kilometre: []), + ServicePoint(name: LocalizedString(), order: 400, kilometre: []), + ], + ); + + // WHEN + final renderData1 = BracketStationRenderData.from(journey.data[0], journey.metadata); + final renderData2 = BracketStationRenderData.from(journey.data[1], journey.metadata); + final renderData3 = BracketStationRenderData.from(journey.data[2], journey.metadata); + final renderData4 = BracketStationRenderData.from(journey.data[3], journey.metadata); + final renderData5 = BracketStationRenderData.from(journey.data[4], journey.metadata); + + // THEN + expect(renderData1, isNull); + expect(renderData2, isNotNull); + expect(renderData2!.isStart, isTrue); + expect(renderData2.stationAbbreviation, 'D'); + expect(renderData3, isNotNull); + expect(renderData3!.isStart, isFalse); + expect(renderData3.stationAbbreviation, 'D'); + expect(renderData4, isNotNull); + expect(renderData4!.isStart, isFalse); + expect(renderData4.stationAbbreviation, 'D'); + expect(renderData5, isNull); + }); +} + +BracketStationSegment _bracketStationSegment(String abbreviation, int startOrder, int endOrder) { + return BracketStationSegment(mainStationAbbreviation: abbreviation, startOrder: startOrder, endOrder: endOrder); +} diff --git a/das_client/test/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data_test.dart b/das_client/test/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data_test.dart similarity index 75% rename from das_client/test/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data_test.dart rename to das_client/test/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data_test.dart index 98a39339..d19d39c8 100644 --- a/das_client/test/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data_test.dart +++ b/das_client/test/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data_test.dart @@ -1,5 +1,5 @@ import 'package:das_client/app/pages/journey/train_journey/widgets/table/base_row_builder.dart'; -import 'package:das_client/app/pages/journey/train_journey/widgets/table/cells/track_equipment_render_data.dart'; +import 'package:das_client/app/pages/journey/train_journey/widgets/table/config/track_equipment_render_data.dart'; import 'package:das_client/app/pages/journey/train_journey/widgets/table/service_point_row.dart'; import 'package:das_client/model/journey/cab_signaling.dart'; import 'package:das_client/model/journey/connection_track.dart'; @@ -8,7 +8,7 @@ import 'package:das_client/model/journey/journey.dart'; import 'package:das_client/model/journey/metadata.dart'; import 'package:das_client/model/journey/service_point.dart'; import 'package:das_client/model/journey/signal.dart'; -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:das_client/model/localized_string.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -34,11 +34,14 @@ void main() { final cabSignalingEnd = TrackEquipmentRenderData.from(journey.data, journey.metadata, 2); // THEN - expect(cabSignalingStart.isCABStart, isTrue); + expect(cabSignalingStart, isNotNull); + expect(cabSignalingStart!.isCABStart, isTrue); expect(cabSignalingStart.isCABEnd, isFalse); - expect(signal.isCABStart, isFalse); + expect(signal, isNotNull); + expect(signal!.isCABStart, isFalse); expect(signal.isCABEnd, isFalse); - expect(cabSignalingEnd.isCABStart, isFalse); + expect(cabSignalingEnd, isNotNull); + expect(cabSignalingEnd!.isCABStart, isFalse); expect(cabSignalingEnd.isCABEnd, isTrue); }); test('test cumulativeHeight calculation', () { @@ -67,11 +70,16 @@ void main() { // THEN var expectedHeight = 0.0; - expect(curvePoint.cumulativeHeight, expectedHeight); - expect(cabSignalingStart.cumulativeHeight, expectedHeight += BaseRowBuilder.rowHeight); - expect(servicePoint.cumulativeHeight, expectedHeight += (BaseRowBuilder.rowHeight / 2)); - expect(cabSignalingEnd.cumulativeHeight, expectedHeight += ServicePointRow.rowHeight); - expect(signal.cumulativeHeight, expectedHeight += BaseRowBuilder.rowHeight); + expect(curvePoint, isNotNull); + expect(curvePoint!.cumulativeHeight, expectedHeight); + expect(cabSignalingStart, isNotNull); + expect(cabSignalingStart!.cumulativeHeight, expectedHeight += BaseRowBuilder.rowHeight); + expect(servicePoint, isNotNull); + expect(servicePoint!.cumulativeHeight, expectedHeight += (BaseRowBuilder.rowHeight / 2)); + expect(cabSignalingEnd, isNotNull); + expect(cabSignalingEnd!.cumulativeHeight, expectedHeight += ServicePointRow.rowHeight); + expect(signal, isNotNull); + expect(signal!.cumulativeHeight, expectedHeight += BaseRowBuilder.rowHeight); }); test('test trackEquipmentType mapping', () { // GIVEN @@ -99,11 +107,14 @@ void main() { final connectionTrack = TrackEquipmentRenderData.from(journey.data, journey.metadata, 4); // THEN - expect(curvePoint.trackEquipmentType, isNull); - expect(cabSignaling.trackEquipmentType, TrackEquipmentType.etcsL2ExtSpeedReversingPossible); - expect(servicePoint.trackEquipmentType, TrackEquipmentType.etcsL2ConvSpeedReversingImpossible); - expect(signal.trackEquipmentType, TrackEquipmentType.etcsL2ExtSpeedReversingImpossible); - expect(connectionTrack.trackEquipmentType, isNull); // non ETCS level 2 are ignored + expect(curvePoint, isNull); + expect(cabSignaling, isNotNull); + expect(cabSignaling!.trackEquipmentType, TrackEquipmentType.etcsL2ExtSpeedReversingPossible); + expect(servicePoint, isNotNull); + expect(servicePoint!.trackEquipmentType, TrackEquipmentType.etcsL2ConvSpeedReversingImpossible); + expect(signal, isNotNull); + expect(signal!.trackEquipmentType, TrackEquipmentType.etcsL2ExtSpeedReversingImpossible); + expect(connectionTrack, isNull); // non ETCS level 2 are ignored }); test('test conventional extended speed border', () { @@ -135,12 +146,16 @@ void main() { final servicePoint2 = TrackEquipmentRenderData.from(journey.data, journey.metadata, 5); // THEN - expect(curvePoint.isConventionalExtendedSpeedBorder, isFalse); - expect(cabSignaling.isConventionalExtendedSpeedBorder, isFalse); - expect(servicePoint.isConventionalExtendedSpeedBorder, isTrue); - expect(signal.isConventionalExtendedSpeedBorder, isFalse); - expect(connectionTrack.isConventionalExtendedSpeedBorder, isFalse); - expect(servicePoint2.isConventionalExtendedSpeedBorder, isTrue); + expect(curvePoint, isNull); + expect(cabSignaling, isNotNull); + expect(cabSignaling!.isConventionalExtendedSpeedBorder, isFalse); + expect(servicePoint, isNotNull); + expect(servicePoint!.isConventionalExtendedSpeedBorder, isTrue); + expect(signal, isNull); + expect(connectionTrack, isNotNull); + expect(connectionTrack!.isConventionalExtendedSpeedBorder, isFalse); + expect(servicePoint2, isNotNull); + expect(servicePoint2!.isConventionalExtendedSpeedBorder, isTrue); }); } diff --git a/das_client/test/model/journey/base_data_extension_test.dart b/das_client/test/model/journey/base_data_extension_test.dart index 3bacd009..ab20051b 100644 --- a/das_client/test/model/journey/base_data_extension_test.dart +++ b/das_client/test/model/journey/base_data_extension_test.dart @@ -1,4 +1,3 @@ -import 'package:das_client/app/model/train_journey_settings.dart'; import 'package:das_client/model/journey/balise.dart'; import 'package:das_client/model/journey/balise_level_crossing_group.dart'; import 'package:das_client/model/journey/base_data.dart'; @@ -16,15 +15,13 @@ void main() { LevelCrossing(order: 202, kilometre: [0.22]), ]; - final notExpandedSettings = TrainJourneySettings(); - final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings(notExpandedSettings); + final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings([]); expect(groupedRowsNotExpanded, hasLength(1)); expect(groupedRowsNotExpanded[0], isA()); expect((groupedRowsNotExpanded[0] as BaliseLevelCrossingGroup).groupedElements, hasLength(4)); - final expandedSettings = TrainJourneySettings(expandedGroups: [100]); - final groupedRowsExpanded = originalRows.groupBaliseAndLeveLCrossings(expandedSettings); + final groupedRowsExpanded = originalRows.groupBaliseAndLeveLCrossings([100]); expect(groupedRowsExpanded, hasLength(5)); expect(groupedRowsExpanded[0], isA()); @@ -44,8 +41,7 @@ void main() { LevelCrossing(order: 203, kilometre: [0.23]), ]; - final notExpandedSettings = TrainJourneySettings(); - final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings(notExpandedSettings); + final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings([]); expect(groupedRowsNotExpanded, hasLength(2)); expect(groupedRowsNotExpanded[0], isA()); @@ -53,8 +49,7 @@ void main() { expect(groupedRowsNotExpanded[1], isA()); expect((groupedRowsNotExpanded[1] as BaliseLevelCrossingGroup).groupedElements, hasLength(3)); - final expandedSettings = TrainJourneySettings(expandedGroups: [200]); - final groupedRowsExpanded = originalRows.groupBaliseAndLeveLCrossings(expandedSettings); + final groupedRowsExpanded = originalRows.groupBaliseAndLeveLCrossings([200]); expect(groupedRowsExpanded, hasLength(5)); expect(groupedRowsExpanded[0], isA()); @@ -76,8 +71,7 @@ void main() { LevelCrossing(order: 202, kilometre: [0.22]), ]; - final notExpandedSettings = TrainJourneySettings(); - final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings(notExpandedSettings); + final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings([]); expect(groupedRowsNotExpanded, hasLength(3)); expect(groupedRowsNotExpanded[0], isA()); @@ -94,8 +88,7 @@ void main() { LevelCrossing(order: 303, kilometre: [0.33]), ]; - final notExpandedSettings = TrainJourneySettings(); - final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings(notExpandedSettings); + final groupedRowsNotExpanded = originalRows.groupBaliseAndLeveLCrossings([]); expect(groupedRowsNotExpanded, hasLength(1)); expect(groupedRowsNotExpanded[0], isA()); diff --git a/das_client/test/model/journey/track_equipment_test.dart b/das_client/test/model/journey/track_equipment_test.dart index ea8e8f06..a4351b85 100644 --- a/das_client/test/model/journey/track_equipment_test.dart +++ b/das_client/test/model/journey/track_equipment_test.dart @@ -1,4 +1,4 @@ -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { diff --git a/das_client/test/sfera/mapper/sfera_mapper_test.dart b/das_client/test/sfera/mapper/sfera_mapper_test.dart index 6dc87b9b..b1832f2a 100644 --- a/das_client/test/sfera/mapper/sfera_mapper_test.dart +++ b/das_client/test/sfera/mapper/sfera_mapper_test.dart @@ -14,7 +14,7 @@ import 'package:das_client/model/journey/service_point.dart'; import 'package:das_client/model/journey/signal.dart'; import 'package:das_client/model/journey/speed.dart'; import 'package:das_client/model/journey/speed_change.dart'; -import 'package:das_client/model/journey/track_equipment.dart'; +import 'package:das_client/model/journey/track_equipment_segment.dart'; import 'package:das_client/model/journey/train_series.dart'; import 'package:das_client/model/journey/tram_area.dart'; import 'package:das_client/model/journey/whistles.dart'; @@ -353,14 +353,14 @@ void main() { expect(journey.valid, true); expect(servicePoints, hasLength(6)); - expect(servicePoints[0].bracketStation, isNull); - expect(servicePoints[1].bracketStation, isNull); - expect(servicePoints[2].bracketStation, isNull); - expect(servicePoints[3].bracketStation, isNotNull); - expect(servicePoints[3].bracketStation!.mainStationAbbreviation, isNull); - expect(servicePoints[4].bracketStation, isNotNull); - expect(servicePoints[4].bracketStation!.mainStationAbbreviation, 'D'); - expect(servicePoints[5].bracketStation, isNull); + expect(servicePoints[0].bracketMainStation, isNull); + expect(servicePoints[1].bracketMainStation, isNull); + expect(servicePoints[2].bracketMainStation, isNull); + expect(servicePoints[3].bracketMainStation, isNotNull); + expect(servicePoints[3].bracketMainStation!.abbreviation, 'D'); + expect(servicePoints[4].bracketMainStation, isNotNull); + expect(servicePoints[4].bracketMainStation!.abbreviation, 'D'); + expect(servicePoints[5].bracketMainStation, isNull); }); test('Test protection section is parsed correctly', () async {