Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e29095a
refactor: ensure consistent source → target trainrunSections chain
louisgreiner Jul 8, 2025
45ce43f
one-way: introduce Trainrun.TrainrunDirection attribute
louisgreiner Jul 8, 2025
a892d98
one-way: display direction text and arrows in reticular + update trai…
louisgreiner Jul 8, 2025
da4585f
one-way: update Perlenkette
louisgreiner Jul 8, 2025
d1a1a70
one-way: add filtering
louisgreiner Jul 8, 2025
6aad317
one-way: update Streckengrafik
louisgreiner Jul 8, 2025
46273f3
one-way: update o/d matrix
louisgreiner Jul 8, 2025
206efc6
one-way: update node occupancy
louisgreiner Jul 8, 2025
83dca7d
one-way: update analytics
louisgreiner Jul 8, 2025
930a39a
one-way: allow to update TrainrunDirection in TrainrunSection dialog
louisgreiner Jul 8, 2025
dffa9c5
one-way: add documentation
louisgreiner Jul 8, 2025
8f0effd
one-way: display trainrun times in one-way direction selection tab
SarahBellaha Jul 24, 2025
fd85978
Lint error fix
aiAdrian Jul 27, 2025
6dc25f8
Lint error fix
aiAdrian Jul 27, 2025
9418e2d
one-way: display trainrun times in one-way direction selection tab
SarahBellaha Jul 24, 2025
6ecb643
review: typos and renaming
SarahBellaha Jul 25, 2025
c883bf6
review: add comment explaining extremity nodes occupation times adjus…
SarahBellaha Jul 25, 2025
9b6817c
review: update arrow handling to use descriptive types and add some d…
SarahBellaha Jul 28, 2025
6d56b75
review: update CREATE_TRAINRUN.md
SarahBellaha Jul 28, 2025
ee6d169
one-way: add dialog button to Perlenkette by Adrian
louisgreiner Jul 28, 2025
e180e90
fix: change input data for the - Reconnect TrainrunSection Test -
SarahBellaha Jul 28, 2025
419b9e4
Aeg/enable one way trainrun perlenview UI integration (#500)
aiAdrian Jul 29, 2025
df51817
fix: Perlenkette top tabs enum
louisgreiner Jul 29, 2025
290bfd7
fix: node name in one way card
louisgreiner Jul 30, 2025
a3acfad
fix source->target chain for disjoint trainruns
louisgreiner Aug 7, 2025
a64da7a
fix typo in trainrunDirection enum
louisgreiner Aug 7, 2025
4ce031d
clean translateAndRotateArrow
louisgreiner Aug 7, 2025
cec7140
rename TrainrunDirection into Direction
louisgreiner Aug 7, 2025
f4601da
use isRoundTrip() to make code clearer
louisgreiner Aug 7, 2025
7e51510
fix typo on infos
louisgreiner Aug 7, 2025
af7c623
remove arrowDirection field for non state duplication
louisgreiner Aug 7, 2025
018596e
use only RightOrBottom logic instead of LeftOrTop in trainrunSectionH…
louisgreiner Aug 7, 2025
782f626
fix: revert '.classed(hidden, ..)' in trainrunsection.view.ts
louisgreiner Aug 11, 2025
be7683a
initialize one-way trainruns with top one-way card
louisgreiner Aug 11, 2025
1d055ab
update trainrun direction documentation video + TrainrunDirection mis…
louisgreiner Aug 11, 2025
3f5cad0
avoid reversing the timeStructure array in-place
louisgreiner Aug 11, 2025
171a640
move getTrainrunTimeStructure out of trainrun.service.ts
louisgreiner Aug 11, 2025
01b3367
refactor and spread the use of getTrainrunTimeStructure
louisgreiner Aug 11, 2025
95f9cd0
fixup! refactor and spread the use of getTrainrunTimeStructure
louisgreiner Aug 12, 2025
e06a1ea
one-way: filter out arrows when node is filtered on its side
louisgreiner Aug 12, 2025
df5e394
fixup! initialize one-way trainruns with top one-way card
louisgreiner Aug 13, 2025
31b879c
asymmetry: introduce TrainrunSection asymmetric attributes
louisgreiner Aug 18, 2025
e43ca6a
asymmetry: display TrainrunSection asymmetric attributes on reticular…
louisgreiner Aug 18, 2025
cc2176f
asymmetry: enable filtering on SymmetryArrows, BackwardTravelTime, As…
louisgreiner Aug 18, 2025
232bfb9
wip: asymmetry: enable symmetrize whole trainrun at once
louisgreiner Aug 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions documentation/CREATE_TRAINRUN.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,16 @@ For more details have a look into

## Special cases

### One-way trainruns (Direction)

By default, a trainrun is a round-trip schedule for a defined path. However, some situations need to deal with only "one-way" trainruns. For that, a trainrun can be modified to only show the journey for a single direction. The direction of the trainrun is then stored in its attribute `Direction`, that is either one of the following value:
- `"round_trip"`: trainrun represents `A - B - C`
- `"one_way"`: trainrun represents `A -> B -> C` or `A <- B <- C` (same value of `Direction` attribute, but the trainrun (so the nodes path) is inverted)

The resulting trainrun then behave then differently with the rest of the features of NGE (space-time chart, origin-destination matrix, node occupancy...).

[2025-08-11-Update_Trainrun_Direction.webm](documentation/animated_images/2025-08-11-Update_Trainrun_Direction.webm)

### Trainrun path with "holes" (missing sections)

![image](https://github.com/user-attachments/assets/d87b842c-7696-4e81-aa78-75cc966b5306)
Expand Down
1 change: 1 addition & 0 deletions documentation/DATA_MODEL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ category, frequency and time category, which define the behaviour of a trainrun.
or every hour.
- ***TimeCategory*** defines the time categorisation of the trainrun, e.g. peak times or
off-peak times or occasional.
- ***Direction*** defines the direction of the trainrun (`round_trip` or `one_way`).

By combining the nodes and trainrun sections in this data model, we can create a representation of
the trainrun network, mapping out the connections and relationships between the different stations
Expand Down
6 changes: 3 additions & 3 deletions documentation/DATA_MODEL_JSON.md
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,8 @@ More details about TimeLock
"categoryId": 1,
"frequencyId": 3,
"trainrunTimeCategoryId": 0,
"labelIds": []
"labelIds": [],
"direction": "round_trip"
}
],
```
Expand All @@ -401,8 +402,7 @@ More details about TimeLock
- **frequencyId**: Reference to the [trainrunFrequencies](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/DATA_MODEL_JSON.md#metadata) : numeric
- **trainrunTimeCategoryId**: Reference to the [trainrunTimeCategories](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/DATA_MODEL_JSON.md#metadata) : numeric
- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Array of integer


- **direction**: Direction of the trainrun : Direction (enum value)

---

Expand Down
1 change: 1 addition & 0 deletions documentation/STANDALONE.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ The operations related to the NGE framework are used to handle changes to Trainr
- modify Trainrun name (trainrun window or Perlenkette, fill in the box + ENTER key / click elsewhere) => TrainrunOperation(update)
- modify Trainrun category (trainrun window or Perlenkette, select another category) => TrainrunOperation(update)
- modify Trainrun frequency (trainrun window or Perlenkette, select another frequency) => TrainrunOperation(update)
- modify Trainrun direction (trainrun window, set round trip or one-way) => TrainrunOperation(update)
- modify Trainrun timeCategory (trainrun window or Perlenkette, select another time range) => TrainrunOperation(update)
- modify Trainrun transition stop (main window or Perlenkette, click on the hexagon in the middle of a node) => TrainrunOperation(update)
- (if it does not exist, create and) add Trainrun label (trainrun window, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update)
Expand Down
Binary file not shown.
8 changes: 8 additions & 0 deletions src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@ import {ColumnLayoutComponent} from "./view/column-layout/column-layout.componen
import {NetzgrafikApplicationComponent} from "./netzgrafik-application/netzgrafik-application.component";
import {TrainrunTabComponent} from "./view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component";
import {TrainrunSectionTabComponent} from "./view/dialogs/trainrun-and-section-dialog/trainrunsection-tab/trainrun-section-tab.component";
import {TrainrunSectionCardComponent} from "./view/dialogs/trainrun-and-section-dialog/trainrunsection-card/trainrun-section-card.component";
import {EditorNodeDetailViewComponent} from "./view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component";
import {EditorFilterViewComponent} from "./view/editor-filter-view/editor-filter-view.component";
import {EditorMenuComponent} from "./view/editor-menu/editor-menu.component";
import {EditorSideViewComponent} from "./view/editor-side-view/editor-side-view.component";
import {StammdatenDialogComponent} from "./view/dialogs/stammdaten-dialog/stammdaten-dialog.component";
import {TrainrunAndSectionDialogComponent} from "./view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component";
import {ConfirmationDialogComponent} from "./view/dialogs/confirmation-dialog/confirmation-dialog.component";
import {SymmetrySelectionDialogComponent} from "./view/dialogs/symmetry-selection-dialog/symmetry-selection-dialog.component";
import {FilterMainSideViewComponent} from "./view/filter-main-side-view/filter-main-side-view.component";
import {KnotenAuslastungViewComponent} from "./view/knoten-auslastung-view/knoten-auslastung-view.component";
import {environment} from "../environments/environment";
Expand Down Expand Up @@ -71,6 +73,7 @@ import {PreviewButtonComponent} from "./view/variant/variant-view/variant-histor
import {NavigationBarComponent} from "./view/navigation-bar/navigation-bar.component";
import {EditorPropertiesViewComponent} from "./view/editor-properties-view-component/editor-properties-view.component";
import {TrainrunFilterTabComponent} from "./view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component";
import {TrainrunRoundtripTabComponent} from "./view/dialogs/trainrun-and-section-dialog/trainrun-roundtrip-tab/trainrun-roundtrip-tab.component";
import {EditorEditToolsViewComponent} from "./view/editor-edit-tools-view-component/editor-edit-tools-view.component";
import {FilterableLabelFormComponent} from "./view/dialogs/filterable-labels-dialog/filterable-labels-form/filterable-label-form.component";
import {FilterableLabelDialogComponent} from "./view/dialogs/filterable-labels-dialog/filterable-label-dialog.component";
Expand Down Expand Up @@ -103,6 +106,7 @@ import {TrainRunNodeComponent} from "./streckengrafik/components/train-run-node/
import {ActionMenuComponent} from "./view/action-menu/action-menu/action-menu.component";
import {I18nModule} from "./core/i18n/i18n.module";
import {OriginDestinationComponent} from "./services/analytics/origin-destination/components/origin-destination.component";
import {SbbToggleModule} from "@sbb-esta/angular/toggle";

@NgModule({
declarations: [
Expand All @@ -112,14 +116,17 @@ import {OriginDestinationComponent} from "./services/analytics/origin-destinatio
NetzgrafikApplicationComponent,
TrainrunTabComponent,
TrainrunFilterTabComponent,
TrainrunRoundtripTabComponent,
TrainrunSectionTabComponent,
TrainrunSectionCardComponent,
EditorNodeDetailViewComponent,
EditorFilterViewComponent,
StammdatenDialogComponent,
EditorMenuComponent,
EditorSideViewComponent,
TrainrunAndSectionDialogComponent,
ConfirmationDialogComponent,
SymmetrySelectionDialogComponent,
FilterMainSideViewComponent,
KnotenAuslastungViewComponent,
ProjectsViewComponent,
Expand Down Expand Up @@ -216,6 +223,7 @@ import {OriginDestinationComponent} from "./services/analytics/origin-destinatio
SbbSelectModule,
SbbCheckboxModule,
SbbRadioButtonModule,
SbbToggleModule,
SbbTableModule,
SbbIconModule,
SbbAccordionModule,
Expand Down
20 changes: 18 additions & 2 deletions src/app/data-structures/business.data.structures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,14 @@ export interface TrainrunSectionDto {
targetNodeId: number; // reference to the node by Node.id
targetPortId: number; // reference to the node by Node.id

sourceSymmetry: boolean; // binds sourceDeparture and sourceArrival times
targetSymmetry: boolean; // binds targetDeparture and targetArrival times
sourceArrival: TimeLockDto; // declares the soruce arrival time
sourceDeparture: TimeLockDto; // declares the soruce departure time
targetArrival: TimeLockDto; // declares the target arrival time
targetDeparture: TimeLockDto; // declares the target departure time
travelTime: TimeLockDto; // declares the travel arrival time
travelTime: TimeLockDto; // declares the travel time (forward direction)
backwardTravelTime: TimeLockDto; // declares the travel time in the opposite direction

numberOfStops: number; // number of stops - not declared in detail (no node attached)

Expand Down Expand Up @@ -198,8 +201,8 @@ export interface TrainrunDto {
categoryId: number; // reference to the trainrun category
frequencyId: number; // reference to the trainrun frequency
trainrunTimeCategoryId: number; // reference to the trainrun time category

labelIds: number[];
direction: Direction; // direction of the trainrun
}

/**
Expand Down Expand Up @@ -290,14 +293,19 @@ export interface FilterSettingDto {
filterNodeLabels: number[]; // labels to filter out (labels only of type - LabelRef: node)
filterNoteLabels: number[]; // labels to filter out (labels only of type - LabelRef: note)
filterTrainrunLabels: number[]; // labels to filter out (labels only of type - LabelRef: trainrun)
filterDirectionArrows: boolean; // flag for trainrun direction arrows (hide/show)
filterAsymmetryArrows: boolean; // flag for trainrun section asymmetry arrows (hide/show)
filterArrivalDepartureTime: boolean; // flag for arrival and departure time filtering (hide/show)
filterTravelTime: boolean; // flag for travel time filter (hide/show)
filterBackwardTravelTime: boolean; // flag for trainrun section backward travel times (hide/show)
filterTrainrunName: boolean; // flag for trainrun time filter (hide/show)
filterConnections: boolean; // flag for connections filtering (hide/show)
filterShowNonStopTime: boolean; // flag for non-stop time filtering (hide/show)
filterTrainrunCategory: TrainrunCategory[]; // list of category to filter out
filterTrainrunFrequency: TrainrunFrequency[]; // list of frequency to filter out
filterTrainrunTimeCategory: TrainrunTimeCategory[]; // list of time categroy to filter out
filterDirection: Direction[]; // list of trainrun direction to filter out
filterSymmetry: boolean[]; // list of trainrun symmetry values (true/false) to filter out
filterAllEmptyNodes: boolean; // flag to filter all empty nodes (hide/show)
filterAllNonStopNodes: boolean; // flag to filter all only non-stop nodes (hide/show)
filterNotes: boolean; // flag to filter notes (hide/show)
Expand Down Expand Up @@ -327,3 +335,11 @@ export interface NetzgrafikDto {
labelGroups: LabelGroupDto[]; // list of all label groups - DB table (filterable groups)
filterData: FilterDataDto; // reference to the filter settings (predefined filters)
}

/**
* Represents the trainrun direction.
*/
export enum Direction {
ROUND_TRIP = "round_trip",
ONE_WAY = "one_way",
}
2 changes: 2 additions & 0 deletions src/app/data-structures/technical.data.structures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export enum TrainrunSectionText {
TargetDeparture,
TrainrunSectionName,
TrainrunSectionTravelTime,
TrainrunSectionBackwardTravelTime,
TrainrunSectionNumberOfStops,
}

Expand All @@ -38,6 +39,7 @@ export interface TrainrunSectionTextPositions {
[TrainrunSectionText.TargetDeparture]: PointDto;
[TrainrunSectionText.TrainrunSectionName]: PointDto;
[TrainrunSectionText.TrainrunSectionTravelTime]: PointDto;
[TrainrunSectionText.TrainrunSectionBackwardTravelTime]: PointDto;
[TrainrunSectionText.TrainrunSectionNumberOfStops]: PointDto;
}

Expand Down
31 changes: 31 additions & 0 deletions src/app/models/filterSettings.model.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
FilterSettingDto,
TrainrunCategory,
Direction,
TrainrunFrequency,
TrainrunTimeCategory,
} from "../data-structures/business.data.structures";
Expand All @@ -18,14 +19,19 @@ export class FilterSetting {
public filterNodeLabels: number[];
public filterNoteLabels: number[];
public filterTrainrunLabels: number[];
public filterDirectionArrows: boolean;
public filterAsymmetryArrows: boolean;
public filterArrivalDepartureTime;
public filterTravelTime;
public filterBackwardTravelTime: boolean;
public filterTrainrunName;
public filterConnections;
public filterShowNonStopTime;
public filterTrainrunCategory: TrainrunCategory[];
public filterTrainrunFrequency: TrainrunFrequency[];
public filterTrainrunTimeCategory: TrainrunTimeCategory[];
public filterDirection: Direction[];
public filterSymmetry: boolean[];
public filterAllEmptyNodes;
public filterAllNonStopNodes;
public filterNotes;
Expand All @@ -41,14 +47,19 @@ export class FilterSetting {
filterNodeLabels,
filterNoteLabels,
filterTrainrunLabels,
filterDirectionArrows,
filterAsymmetryArrows,
filterArrivalDepartureTime,
filterTravelTime,
filterBackwardTravelTime,
filterTrainrunName,
filterConnections,
filterShowNonStopTime,
filterTrainrunCategory,
filterTrainrunFrequency,
filterTrainrunTimeCategory,
filterDirection: filterDirection,
filterSymmetry: filterSymmetry,
filterAllEmptyNodes,
filterAllNonStopNodes,
filterNotes,
Expand All @@ -62,14 +73,19 @@ export class FilterSetting {
filterNodeLabels: [],
filterNoteLabels: [],
filterTrainrunLabels: [],
filterDirectionArrows: true,
filterAsymmetryArrows: true,
filterArrivalDepartureTime: true,
filterTravelTime: true,
filterBackwardTravelTime: true,
filterTrainrunName: true,
filterConnections: true,
filterShowNonStopTime: true,
filterTrainrunCategory: null,
filterTrainrunFrequency: null,
filterTrainrunTimeCategory: null,
filterDirection: null,
filterSymmetry: null,
filterAllEmptyNodes: false,
filterAllNonStopNodes: false,
filterNotes: false,
Expand All @@ -84,14 +100,19 @@ export class FilterSetting {
this.filterNodeLabels = filterNodeLabels;
this.filterNoteLabels = filterNoteLabels;
this.filterTrainrunLabels = filterTrainrunLabels;
this.filterDirectionArrows = filterDirectionArrows;
this.filterAsymmetryArrows = filterAsymmetryArrows;
this.filterArrivalDepartureTime = filterArrivalDepartureTime;
this.filterTravelTime = filterTravelTime;
this.filterBackwardTravelTime = filterBackwardTravelTime;
this.filterTrainrunName = filterTrainrunName;
this.filterConnections = filterConnections;
this.filterShowNonStopTime = filterShowNonStopTime;
this.filterTrainrunCategory = filterTrainrunCategory;
this.filterTrainrunFrequency = filterTrainrunFrequency;
this.filterTrainrunTimeCategory = filterTrainrunTimeCategory;
this.filterDirection = filterDirection;
this.filterSymmetry = filterSymmetry;
this.filterAllEmptyNodes = filterAllEmptyNodes;
this.filterAllNonStopNodes = filterAllNonStopNodes;
this.filterNotes = filterNotes;
Expand Down Expand Up @@ -163,14 +184,19 @@ export class FilterSetting {
this.filterNodeLabels.length === 0 &&
this.filterNoteLabels.length === 0 &&
this.filterTrainrunLabels.length === 0 &&
this.filterDirectionArrows === true &&
this.filterAsymmetryArrows === true &&
this.filterArrivalDepartureTime === true &&
this.filterTravelTime === true &&
this.filterBackwardTravelTime === true &&
this.filterTrainrunName === true &&
this.filterConnections === true &&
this.filterShowNonStopTime === true &&
this.filterTrainrunCategory.length === trainrunCategoriesLength &&
this.filterTrainrunFrequency.length === frainrunFrequenciesLength &&
this.filterTrainrunTimeCategory.length === trainrunTimeCategoryLength &&
this.filterDirection.length === Object.values(Direction).length &&
this.filterSymmetry.length === 2 &&
this.filterAllEmptyNodes === false &&
this.filterAllNonStopNodes === false &&
this.filterNotes === false &&
Expand All @@ -188,14 +214,19 @@ export class FilterSetting {
filterNodeLabels: this.filterNodeLabels,
filterNoteLabels: this.filterNoteLabels,
filterTrainrunLabels: this.filterTrainrunLabels,
filterDirectionArrows: this.filterDirectionArrows,
filterAsymmetryArrows: this.filterAsymmetryArrows,
filterArrivalDepartureTime: this.filterArrivalDepartureTime,
filterTravelTime: this.filterTravelTime,
filterBackwardTravelTime: this.filterBackwardTravelTime,
filterTrainrunName: this.filterTrainrunName,
filterConnections: this.filterConnections,
filterShowNonStopTime: this.filterShowNonStopTime,
filterTrainrunCategory: this.filterTrainrunCategory,
filterTrainrunFrequency: this.filterTrainrunFrequency,
filterTrainrunTimeCategory: this.filterTrainrunTimeCategory,
filterDirection: this.filterDirection,
filterSymmetry: this.filterSymmetry,
filterAllEmptyNodes: this.filterAllEmptyNodes,
filterAllNonStopNodes: this.filterAllNonStopNodes,
filterNotes: this.filterNotes,
Expand Down
18 changes: 18 additions & 0 deletions src/app/models/trainrun.model.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
LinePatternRefs,
TrainrunCategory,
Direction,
TrainrunDto,
TrainrunFrequency,
TrainrunTimeCategory,
Expand All @@ -23,6 +24,7 @@ export class Trainrun {
private trainrunTimeCategory: TrainrunTimeCategory;
private isSelected: boolean;
private labelIds: number[];
private direction: Direction;

constructor(
{
Expand All @@ -32,13 +34,15 @@ export class Trainrun {
frequencyId,
trainrunTimeCategoryId,
labelIds,
direction = Direction.ROUND_TRIP, // temporary, to allow migration of old trainruns from file
}: TrainrunDto = {
id: Trainrun.incrementId(),
name: Trainrun.DEFAULT_TRAINRUN_NAME,
categoryId: Trainrun.DEFAULT_TRAINRUN_CATEGORY,
frequencyId: Trainrun.DEFAULT_TRAINRUN_FREQUENCY,
trainrunTimeCategoryId: Trainrun.DEFAULT_TRAINRUN_TIME_CATEGORY,
labelIds: [],
direction: Direction.ROUND_TRIP
},
) {
this.id = id;
Expand All @@ -48,6 +52,7 @@ export class Trainrun {
this.isSelected = false;
this.trainrunTimeCategoryId = trainrunTimeCategoryId;
this.labelIds = labelIds;
this.direction = direction;

if (Trainrun.currentId < this.id) {
Trainrun.currentId = this.id;
Expand Down Expand Up @@ -148,6 +153,18 @@ export class Trainrun {
this.labelIds = labelIds;
}

isRoundTrip(): boolean {
return this.direction === Direction.ROUND_TRIP;
}

getDirection(): Direction {
return this.direction;
}

setDirection(direction: Direction) {
this.direction = direction;
}

getDto(): TrainrunDto {
return {
id: this.id,
Expand All @@ -156,6 +173,7 @@ export class Trainrun {
frequencyId: this.trainrunFrequency.id,
trainrunTimeCategoryId: this.trainrunTimeCategory.id,
labelIds: this.labelIds,
direction: this.direction,
};
}
}
Loading