Skip to content

Commit 4a85f51

Browse files
authored
Merge pull request #318 from iteratec/feature/timeseriesChart
Feature/timeseries chart
2 parents 7198e46 + a330655 commit 4a85f51

17 files changed

+681
-124
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
<div class="time-series-line-chart-container">
22
<div class="card">
3-
<svg #svg />
3+
<svg #svg/>
44
</div>
55
</div>
6+
7+
<ngx-smart-modal id="pointSelectionErrorModal" identifier="pointSelectionErrorModal">
8+
<header>
9+
<h2>{{ "frontend.de.iteratec.chart.errorHeader" | translate }}</h2>
10+
</header>
11+
<main>
12+
<div>{{ "frontend.de.iteratec.chart.datapointSelection.error.multipleServer" | translate }}</div>
13+
</main>
14+
<footer>
15+
<button (click)="this.ngxSmartModalService.close('pointSelectionErrorModal')" class="btn btn-default">
16+
{{ "frontend.default.button.cancel.label" | translate }}
17+
</button>
18+
</footer>
19+
</ngx-smart-modal>

frontend/src/app/modules/time-series/components/time-series-line-chart/time-series-line-chart.component.scss

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,21 @@ osm-time-series-line-chart {
7575
.legend-text {
7676
font-size: 12px;
7777
}
78+
79+
#pointSelectionErrorModal {
80+
header {
81+
padding: 15px;
82+
border-bottom: 1px solid #e5e5e5;
83+
}
84+
85+
main {
86+
position: relative;
87+
padding: 15px;
88+
}
89+
90+
footer {
91+
padding: 15px;
92+
text-align: right;
93+
border-top: 1px solid #e5e5e5;
94+
}
95+
}

frontend/src/app/modules/time-series/components/time-series-line-chart/time-series-line-chart.component.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212

1313
import {EventResultData} from '../../models/event-result-data.model';
1414
import {LineChartService} from '../../services/line-chart.service';
15+
import {NgxSmartModalService} from "ngx-smart-modal";
1516

1617

1718
@Component({
@@ -30,13 +31,12 @@ export class TimeSeriesLineChartComponent implements AfterContentInit, OnChanges
3031

3132
private _resizeTimeoutId: number;
3233

33-
constructor(
34-
private lineChartService: LineChartService
35-
) {
34+
constructor(private lineChartService: LineChartService,
35+
private ngxSmartModalService: NgxSmartModalService) {
3636
}
3737

3838
ngAfterContentInit(): void {
39-
this.lineChartService.initChart(this.svgElement);
39+
this.lineChartService.initChart(this.svgElement, () => this.handlePointSelectionError());
4040
}
4141

4242
ngOnChanges(changes: SimpleChanges): void {
@@ -61,4 +61,8 @@ export class TimeSeriesLineChartComponent implements AfterContentInit, OnChanges
6161
this.lineChartService.setLegendData(this.timeSeriesResults);
6262
this.lineChartService.drawLineChart(this.timeSeriesResults);
6363
}
64+
65+
handlePointSelectionError() {
66+
this.ngxSmartModalService.open("pointSelectionErrorModal");
67+
}
6468
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1+
import {WptInfo} from "./wpt-info.model";
2+
13
export interface EventResultPointDTO {
24
date: Date;
35
value: number;
46
agent: string;
7+
wptInfo: WptInfo;
58
}
69

710
export class EventResultPoint implements EventResultPointDTO {
811
date: Date;
912
value: number;
1013
agent: string;
14+
wptInfo: WptInfo;
1115

1216
constructor(dto: EventResultPointDTO) {
1317
this.date = dto.date;
1418
this.value = dto.value;
1519
this.agent = dto.agent;
20+
this.wptInfo = dto.wptInfo;
1621
}
1722
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import {TimeSeriesPoint} from "./time-series-point.model";
2+
3+
export class PointsSelection {
4+
5+
private selectedPoints: TimeSeriesPoint[] = [];
6+
7+
public unselectAll() {
8+
this.selectedPoints = [];
9+
}
10+
11+
public selectPoint(pointToSelect: TimeSeriesPoint) {
12+
this.selectedPoints.push(pointToSelect);
13+
}
14+
15+
public isPointSelected(pointToCheck: TimeSeriesPoint): boolean {
16+
return this.selectedPoints.some(elem => elem.equals(pointToCheck));
17+
}
18+
19+
public unselectPoint(pointToSelect: TimeSeriesPoint) {
20+
this.selectedPoints = this.selectedPoints.filter(elem => !elem.equals(pointToSelect))
21+
}
22+
23+
public count(): number {
24+
return this.selectedPoints.length;
25+
}
26+
27+
public getAll(): TimeSeriesPoint[] {
28+
return this.selectedPoints;
29+
}
30+
31+
public getFirst(): TimeSeriesPoint {
32+
if(this.count() === 0) {
33+
return null;
34+
}
35+
return this.selectedPoints[0];
36+
}
37+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
/**
22
* Representation of one point on the y-axis (value) with additional informations.
33
*/
4+
import {WptInfo} from "./wpt-info.model";
5+
46
export class TimeSeriesPoint {
57
date: Date;
68
value: number;
79
tooltipText: string;
10+
wptInfo: WptInfo;
811

912
constructor() {}
13+
14+
public equals(other: TimeSeriesPoint) {
15+
return other && this.date.getTime() == other.date.getTime() && this.tooltipText == other.tooltipText && this.value == other.value;
16+
}
1017
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export class WptInfo {
2+
baseUrl: string;
3+
testId: string;
4+
runNumber: number;
5+
indexInJourney: number;
6+
}

0 commit comments

Comments
 (0)