Add a page to show the hours of tunnel
This commit is contained in:
39
Front/skydivelogs-app/package-lock.json
generated
39
Front/skydivelogs-app/package-lock.json
generated
@@ -21,6 +21,8 @@
|
|||||||
"@angular/router": "^16.1.1",
|
"@angular/router": "^16.1.1",
|
||||||
"@ngx-translate/core": "^14.0.0",
|
"@ngx-translate/core": "^14.0.0",
|
||||||
"@ngx-translate/http-loader": "^7.0.0",
|
"@ngx-translate/http-loader": "^7.0.0",
|
||||||
|
"chart.js": "^4.3.0",
|
||||||
|
"ng2-charts": "^4.1.1",
|
||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
"tslib": "^2.3.0",
|
"tslib": "^2.3.0",
|
||||||
"zone.js": "~0.13.1"
|
"zone.js": "~0.13.1"
|
||||||
@@ -2957,6 +2959,11 @@
|
|||||||
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
|
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@kurkle/color": {
|
||||||
|
"version": "0.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
|
||||||
|
"integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
|
||||||
|
},
|
||||||
"node_modules/@leichtgewicht/ip-codec": {
|
"node_modules/@leichtgewicht/ip-codec": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
|
||||||
@@ -5098,6 +5105,17 @@
|
|||||||
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
|
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/chart.js": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.0.tgz",
|
||||||
|
"integrity": "sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==",
|
||||||
|
"dependencies": {
|
||||||
|
"@kurkle/color": "^0.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"pnpm": ">=7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/chokidar": {
|
"node_modules/chokidar": {
|
||||||
"version": "3.5.3",
|
"version": "3.5.3",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
|
||||||
@@ -8286,6 +8304,11 @@
|
|||||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/lodash-es": {
|
||||||
|
"version": "4.17.21",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
||||||
|
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
|
||||||
|
},
|
||||||
"node_modules/lodash.debounce": {
|
"node_modules/lodash.debounce": {
|
||||||
"version": "4.0.8",
|
"version": "4.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
|
||||||
@@ -8954,6 +8977,22 @@
|
|||||||
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/ng2-charts": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-4.1.1.tgz",
|
||||||
|
"integrity": "sha512-iHwXDbmX86lfeH8VRcsaW2tJATsuAZo4kvvC/Yk2l35zOHjevja1qBvO6BAibiDazi9r9aS6ZRJOqWPsz1pP2w==",
|
||||||
|
"dependencies": {
|
||||||
|
"lodash-es": "^4.17.15",
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/cdk": ">=14.0.0",
|
||||||
|
"@angular/common": ">=14.0.0",
|
||||||
|
"@angular/core": ">=14.0.0",
|
||||||
|
"chart.js": "^3.4.0 || ^4.0.0",
|
||||||
|
"rxjs": "^6.5.3 || ^7.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/nice-napi": {
|
"node_modules/nice-napi": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
"@angular/router": "^16.1.1",
|
"@angular/router": "^16.1.1",
|
||||||
"@ngx-translate/core": "^14.0.0",
|
"@ngx-translate/core": "^14.0.0",
|
||||||
"@ngx-translate/http-loader": "^7.0.0",
|
"@ngx-translate/http-loader": "^7.0.0",
|
||||||
|
"chart.js": "^4.3.0",
|
||||||
|
"ng2-charts": "^4.1.1",
|
||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
"tslib": "^2.3.0",
|
"tslib": "^2.3.0",
|
||||||
"zone.js": "~0.13.1"
|
"zone.js": "~0.13.1"
|
||||||
@@ -41,4 +43,4 @@
|
|||||||
"karma-jasmine-html-reporter": "~2.0.0",
|
"karma-jasmine-html-reporter": "~2.0.0",
|
||||||
"typescript": "~4.9.4"
|
"typescript": "~4.9.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,10 @@
|
|||||||
<a routerLink="/newjump" routerLinkActive="active" (click)="snav.toggle()" skipLocationChange>{{ 'App_Nav_NewJump' | translate }}</a>
|
<a routerLink="/newjump" routerLinkActive="active" (click)="snav.toggle()" skipLocationChange>{{ 'App_Nav_NewJump' | translate }}</a>
|
||||||
<hr class="splitter">
|
<hr class="splitter">
|
||||||
</mat-nav-list>
|
</mat-nav-list>
|
||||||
|
<mat-nav-list>
|
||||||
|
<mat-icon aria-hidden="false" aria-label="List of tunnel flights">list_alt</mat-icon>
|
||||||
|
<a routerLink="/tunnelFlights" routerLinkActive="active" (click)="snav.toggle()" skipLocationChange>{{ 'App_Nav_TunnelFlights' | translate }}</a>
|
||||||
|
</mat-nav-list>
|
||||||
<mat-nav-list>
|
<mat-nav-list>
|
||||||
<mat-icon aria-hidden="false" aria-label="Add flights in tunnel">add_circle</mat-icon>
|
<mat-icon aria-hidden="false" aria-label="Add flights in tunnel">add_circle</mat-icon>
|
||||||
<a routerLink="/newTunnelFlight" routerLinkActive="active" (click)="snav.toggle()" skipLocationChange>{{ 'App_Nav_NewTunnelFlight' | translate }}</a>
|
<a routerLink="/newTunnelFlight" routerLinkActive="active" (click)="snav.toggle()" skipLocationChange>{{ 'App_Nav_NewTunnelFlight' | translate }}</a>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import { UserProfileComponent } from "./user-profile/user-profile.component";
|
|||||||
import { ListOfImagesComponent } from "./list-of-images/list-of-images.component";
|
import { ListOfImagesComponent } from "./list-of-images/list-of-images.component";
|
||||||
import { JumpInfosComponent } from './jump-infos/jump-infos.component';
|
import { JumpInfosComponent } from './jump-infos/jump-infos.component';
|
||||||
import { NewTunnelFlightComponent } from './new-tunnel-flight/new-tunnel-flight.component';
|
import { NewTunnelFlightComponent } from './new-tunnel-flight/new-tunnel-flight.component';
|
||||||
|
import { ListOfTunnelFlightsComponent } from './list-of-tunnel-flights/list-of-tunnel-flights.component';
|
||||||
|
|
||||||
import { DateService } from "../services/date.service";
|
import { DateService } from "../services/date.service";
|
||||||
import { AircraftService } from "../services/aircraft.service";
|
import { AircraftService } from "../services/aircraft.service";
|
||||||
@@ -67,6 +68,7 @@ import { MatRadioModule } from "@angular/material/radio";
|
|||||||
import { MatSidenavModule } from '@angular/material/sidenav';
|
import { MatSidenavModule } from '@angular/material/sidenav';
|
||||||
import { MatListModule } from '@angular/material/list';
|
import { MatListModule } from '@angular/material/list';
|
||||||
import { MatToolbarModule } from '@angular/material/toolbar';
|
import { MatToolbarModule } from '@angular/material/toolbar';
|
||||||
|
import { NgChartsModule } from 'ng2-charts';
|
||||||
|
|
||||||
import { JwtAuthInterceptor } from "../interceptor/jwt-auth.interceptor";
|
import { JwtAuthInterceptor } from "../interceptor/jwt-auth.interceptor";
|
||||||
import { ErrorInterceptor } from "../interceptor/error.interceptor";
|
import { ErrorInterceptor } from "../interceptor/error.interceptor";
|
||||||
@@ -118,6 +120,12 @@ const appRoutes: Routes = [
|
|||||||
component: NewTunnelFlightComponent,
|
component: NewTunnelFlightComponent,
|
||||||
canActivate: [AuthGuardService]
|
canActivate: [AuthGuardService]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "tunnelFlights",
|
||||||
|
component: ListOfTunnelFlightsComponent,
|
||||||
|
canActivate: [AuthGuardService]
|
||||||
|
},
|
||||||
|
|
||||||
{ path: "login", component: LoginComponent },
|
{ path: "login", component: LoginComponent },
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -152,7 +160,8 @@ export function initConfig(configService: ConfigurationHelper) {
|
|||||||
UserProfileComponent,
|
UserProfileComponent,
|
||||||
ListOfImagesComponent,
|
ListOfImagesComponent,
|
||||||
JumpInfosComponent,
|
JumpInfosComponent,
|
||||||
NewTunnelFlightComponent
|
NewTunnelFlightComponent,
|
||||||
|
ListOfTunnelFlightsComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
RouterModule.forRoot(
|
RouterModule.forRoot(
|
||||||
@@ -191,7 +200,8 @@ export function initConfig(configService: ConfigurationHelper) {
|
|||||||
MatRadioModule,
|
MatRadioModule,
|
||||||
MatSidenavModule,
|
MatSidenavModule,
|
||||||
MatListModule,
|
MatListModule,
|
||||||
MatToolbarModule
|
MatToolbarModule,
|
||||||
|
NgChartsModule
|
||||||
],
|
],
|
||||||
exports: [HttpClientModule],
|
exports: [HttpClientModule],
|
||||||
providers: [
|
providers: [
|
||||||
|
|||||||
@@ -1,76 +1,82 @@
|
|||||||
<div class="content">
|
<div class="content">
|
||||||
<div>
|
<div>
|
||||||
<button mat-raised-button color="accent" [routerLink]="['/newjump']" [routerLinkActive]="['active']" skipLocationChange>{{ 'List_Jump_Add' | translate }}</button>
|
<button mat-raised-button color="accent" [routerLink]="['/newjump']" [routerLinkActive]="['active']"
|
||||||
</div>
|
skipLocationChange>{{ 'List_Jump_Add' | translate }}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<mat-progress-bar [mode]="'indeterminate'" *ngIf="isLoading"></mat-progress-bar>
|
<mat-progress-bar [mode]="'indeterminate'" *ngIf="isLoading"></mat-progress-bar>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<table mat-table [dataSource]="dataSourceTable">
|
<table mat-table [dataSource]="dataSourceTable">
|
||||||
<ng-container matColumnDef="infos">
|
<ng-container matColumnDef="infos">
|
||||||
<th mat-header-cell *matHeaderCellDef style="min-width: 80px;"></th>
|
<th mat-header-cell *matHeaderCellDef style="min-width: 80px;"></th>
|
||||||
<td mat-cell *matCellDef="let element" style="text-align: left;">
|
<td mat-cell *matCellDef="let element" style="text-align: left;">
|
||||||
<mat-icon aria-hidden="false" aria-label="Additional informations of the jump"
|
<mat-icon aria-hidden="false" aria-label="Additional informations of the jump"
|
||||||
style="cursor: pointer;" (click)='openDialog(element, false)'>info</mat-icon>
|
style="cursor: pointer;" (click)='openDialog(element, false)'>info</mat-icon>
|
||||||
<mat-icon aria-hidden="false" aria-label="Special jump" [style.visibility]="element.notes != undefined ? 'visible' : 'hidden'">sticky_note_2</mat-icon>
|
<mat-icon aria-hidden="false" aria-label="Special jump"
|
||||||
<mat-icon aria-hidden="false" aria-label="Special jump" [style.visibility]="element.isSpecial ? 'visible' : 'hidden'">celebration</mat-icon>
|
[style.visibility]="element.notes != undefined ? 'visible' : 'hidden'">sticky_note_2</mat-icon>
|
||||||
</td>
|
<mat-icon aria-hidden="false" aria-label="Special jump"
|
||||||
</ng-container>
|
[style.visibility]="element.isSpecial ? 'visible' : 'hidden'">celebration</mat-icon>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="id">
|
<ng-container matColumnDef="id">
|
||||||
<th mat-header-cell *matHeaderCellDef style="min-width: 70px;">{{ 'List_Jump_Header_Num' | translate }}</th>
|
<th mat-header-cell *matHeaderCellDef style="min-width: 70px;">{{ 'List_Jump_Header_Num' | translate }}
|
||||||
<td mat-cell *matCellDef="let element; let i = index">
|
</th>
|
||||||
{{ paginator.length - ( (paginator.pageIndex * paginator.pageSize ) + i ) }}
|
<td mat-cell *matCellDef="let element; let i = index">
|
||||||
</td>
|
{{ paginator.length - ( (paginator.pageIndex * paginator.pageSize ) + i ) }}
|
||||||
</ng-container>
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="jumpDate">
|
<ng-container matColumnDef="jumpDate">
|
||||||
<th mat-header-cell *matHeaderCellDef>{{ 'List_Jump_Header_Date' | translate }}</th>
|
<th mat-header-cell *matHeaderCellDef>{{ 'List_Jump_Header_Date' | translate }}</th>
|
||||||
<td mat-cell *matCellDef="let element">
|
<td mat-cell *matCellDef="let element">
|
||||||
<span class="smallSpanWithBreakWord" [innerHTML]="element.jumpDate | date: 'yyyy-MM-dd'"></span>
|
<span class="smallSpanWithBreakWord" [innerHTML]="element.jumpDate | date: 'yyyy-MM-dd'"></span>
|
||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="jumpType">
|
<ng-container matColumnDef="jumpType">
|
||||||
<th mat-header-cell *matHeaderCellDef style="min-width: 100px;">{{ 'List_Jump_Header_JumpType' | translate }}</th>
|
<th mat-header-cell *matHeaderCellDef style="min-width: 100px;">{{ 'List_Jump_Header_JumpType' |
|
||||||
<td mat-cell *matCellDef="let element">
|
translate }}</th>
|
||||||
<span class="smallSpanWithBreakWord" [innerHTML]="element.jumpType.name"></span>
|
<td mat-cell *matCellDef="let element">
|
||||||
</td>
|
<span class="smallSpanWithBreakWord" [innerHTML]="element.jumpType.name"></span>
|
||||||
</ng-container>
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="aircraft">
|
<ng-container matColumnDef="aircraft">
|
||||||
<th mat-header-cell *matHeaderCellDef style="min-width: 110px;">{{ 'List_Jump_Header_Aircraft' | translate }}</th>
|
<th mat-header-cell *matHeaderCellDef style="min-width: 110px;">{{ 'List_Jump_Header_Aircraft' |
|
||||||
<td mat-cell *matCellDef="let element">
|
translate }}</th>
|
||||||
<span class="smallSpanWithBreakWord" [innerHTML]="element.aircraft.name"></span>
|
<td mat-cell *matCellDef="let element">
|
||||||
</td>
|
<span class="smallSpanWithBreakWord" [innerHTML]="element.aircraft.name"></span>
|
||||||
</ng-container>
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="dropZone">
|
<ng-container matColumnDef="dropZone">
|
||||||
<th mat-header-cell *matHeaderCellDef>{{ 'List_Jump_Header_Dz' | translate }}</th>
|
<th mat-header-cell *matHeaderCellDef>{{ 'List_Jump_Header_Dz' | translate }}</th>
|
||||||
<td mat-cell *matCellDef="let element">
|
<td mat-cell *matCellDef="let element">
|
||||||
<span class="spanWithBreakWord" [innerHTML]="element.dropZone.name"></span>
|
<span class="spanWithBreakWord" [innerHTML]="element.dropZone.name"></span>
|
||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="gear">
|
<ng-container matColumnDef="gear">
|
||||||
<th mat-header-cell *matHeaderCellDef>{{ 'List_Jump_Header_Id' | translate }}</th>
|
<th mat-header-cell *matHeaderCellDef>{{ 'List_Jump_Header_Id' | translate }}</th>
|
||||||
<td mat-cell *matCellDef="let element">{{element.gear.name}}</td>
|
<td mat-cell *matCellDef="let element">{{element.gear.name}}</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="actions">
|
<ng-container matColumnDef="actions">
|
||||||
<th mat-header-cell *matHeaderCellDef style="min-width: 70px;"></th>
|
<th mat-header-cell *matHeaderCellDef style="min-width: 70px;"></th>
|
||||||
<td mat-cell *matCellDef="let element" style="text-align: left;">
|
<td mat-cell *matCellDef="let element" style="text-align: left;">
|
||||||
<mat-icon aria-hidden="false" aria-label="Delete this jump" style="cursor: pointer;"
|
<mat-icon aria-hidden="false" aria-label="Delete this jump" style="cursor: pointer;"
|
||||||
(click)='delete(element)'>delete</mat-icon>
|
(click)='delete(element)'>delete</mat-icon>
|
||||||
<mat-icon aria-hidden="false" aria-label="Update some informations of the jump" style="cursor: pointer; margin-left: 10px;"
|
<mat-icon aria-hidden="false" aria-label="Update some informations of the jump"
|
||||||
(click)='openDialog(element, true)'>edit</mat-icon>
|
style="cursor: pointer; margin-left: 10px;" (click)='openDialog(element, true)'>edit</mat-icon>
|
||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
|
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
|
||||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<mat-paginator #paginator [pageSize]="20" (page)="pageChanged($event)" showFirstLastButtons></mat-paginator>
|
<mat-paginator #paginator [pageSize]="20" (page)="pageChanged($event)" showFirstLastButtons></mat-paginator>
|
||||||
</div>
|
</div>
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<div class="content">
|
||||||
|
<mat-progress-bar [mode]="'indeterminate'" *ngIf="isLoading"></mat-progress-bar>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<canvas baseChart style="width: 50%;"
|
||||||
|
[data]="barChartData"
|
||||||
|
[options]="barChartOptions"
|
||||||
|
[plugins]="barChartPlugins"
|
||||||
|
[legend]="barChartLegend"
|
||||||
|
[type]="barChartType" >
|
||||||
|
</canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ListOfTunnelFlightsComponent } from './list-of-tunnel-flights.component';
|
||||||
|
|
||||||
|
describe('ListOfTunnelFlightsComponent', () => {
|
||||||
|
let component: ListOfTunnelFlightsComponent;
|
||||||
|
let fixture: ComponentFixture<ListOfTunnelFlightsComponent>;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ListOfTunnelFlightsComponent]
|
||||||
|
});
|
||||||
|
fixture = TestBed.createComponent(ListOfTunnelFlightsComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
import { ChartConfiguration, ChartData } from 'chart.js';
|
||||||
|
|
||||||
|
import { TunnelService } from '../../services/tunnel.service';
|
||||||
|
import { ServiceComm } from '../../services/service-comm.service';
|
||||||
|
import { TunnelFlightService } from "../../services/tunnel-flight.service";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-list-of-tunnel-flights',
|
||||||
|
templateUrl: './list-of-tunnel-flights.component.html',
|
||||||
|
styleUrls: ['./list-of-tunnel-flights.component.css']
|
||||||
|
})
|
||||||
|
export class ListOfTunnelFlightsComponent implements OnInit {
|
||||||
|
public barChartLegend = true;
|
||||||
|
public barChartPlugins = [];
|
||||||
|
public barChartData: ChartData<'bar'>;
|
||||||
|
public barChartOptions: ChartConfiguration['options'];
|
||||||
|
public barChartType: string;
|
||||||
|
public isLoading: boolean = false;
|
||||||
|
|
||||||
|
constructor(private serviceComm: ServiceComm,
|
||||||
|
private serviceTunnel: TunnelService,
|
||||||
|
private serviceTunnelFlight: TunnelFlightService,
|
||||||
|
private translateService: TranslateService) { }
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.serviceComm.forceTranslateTitle.subscribe((data) => {
|
||||||
|
if (data === true) {
|
||||||
|
this.updateTitle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.updateTitle();
|
||||||
|
|
||||||
|
this.isLoading = true;
|
||||||
|
this.getData();
|
||||||
|
}
|
||||||
|
|
||||||
|
private updateTitle() {
|
||||||
|
this.translateService.get("ListTunnelFlight_Title").subscribe(
|
||||||
|
data => { this.serviceComm.UpdatedComponentTitle(data); }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private getData(): void {
|
||||||
|
this.barChartType = "bar";
|
||||||
|
this.barChartData = {
|
||||||
|
labels: ['2006', '2007', '2008', '2009', '2010', '2011', '2012'],
|
||||||
|
datasets: [
|
||||||
|
{ data: [65, 59, 80, 81, 56, 55, 40], label: 'Series A' },
|
||||||
|
{ data: [28, 48, 40, 19, 86, 27, 90], label: 'Series B' }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.barChartOptions = {
|
||||||
|
responsive: false,
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
callbacks: {
|
||||||
|
footer: this.footer,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
mode: 'nearest',
|
||||||
|
axis: 'x'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
x: {
|
||||||
|
stacked: true
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
stacked: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private footer = (tooltipItems) => {
|
||||||
|
let sum = 0;
|
||||||
|
|
||||||
|
tooltipItems.forEach(function (tooltipItem) {
|
||||||
|
sum += tooltipItem.parsed.y;
|
||||||
|
});
|
||||||
|
return 'Sum: ' + sum;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -47,10 +47,10 @@ export class NewTunnelFlightComponent implements OnInit {
|
|||||||
private pendingAddRequest: boolean;
|
private pendingAddRequest: boolean;
|
||||||
|
|
||||||
constructor(private serviceComm: ServiceComm,
|
constructor(private serviceComm: ServiceComm,
|
||||||
private serviceTunnel: TunnelService,
|
private serviceTunnel: TunnelService,
|
||||||
private serviceTunnelFlight: TunnelFlightService,
|
private serviceTunnelFlight: TunnelFlightService,
|
||||||
private translateService: TranslateService,
|
private translateService: TranslateService,
|
||||||
private statsService: StatsService) { }
|
private statsService: StatsService) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.serviceComm.forceTranslateTitle.subscribe((data) => {
|
this.serviceComm.forceTranslateTitle.subscribe((data) => {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
"ListGears_Title" : "List of gears",
|
"ListGears_Title" : "List of gears",
|
||||||
"ListAircrafts_Title" : "List of aircrafts",
|
"ListAircrafts_Title" : "List of aircrafts",
|
||||||
"NewTunnelFlight_Title" : "New tunnel flights",
|
"NewTunnelFlight_Title" : "New tunnel flights",
|
||||||
|
"ListTunnelFlight_Title" : "List of hours of tunnel",
|
||||||
|
|
||||||
"App_Footer" : "Web software to log your skydive jumps - v",
|
"App_Footer" : "Web software to log your skydive jumps - v",
|
||||||
"App_Nav_Summary" : "Summary",
|
"App_Nav_Summary" : "Summary",
|
||||||
@@ -48,6 +49,7 @@
|
|||||||
"App_Nav_Gears" : "List of gears",
|
"App_Nav_Gears" : "List of gears",
|
||||||
"App_Nav_Logout" : "Logout",
|
"App_Nav_Logout" : "Logout",
|
||||||
"App_Nav_NewTunnelFlight" : "Add tunnel time",
|
"App_Nav_NewTunnelFlight" : "Add tunnel time",
|
||||||
|
"App_Nav_TunnelFlights": "The tunnel flights",
|
||||||
|
|
||||||
"List_Aircrafts_Add" : "Add a aircraft",
|
"List_Aircrafts_Add" : "Add a aircraft",
|
||||||
"List_Aircrafts_Header_Id" : "ID",
|
"List_Aircrafts_Header_Id" : "ID",
|
||||||
@@ -116,5 +118,8 @@
|
|||||||
"NewTunnelFlight_ChooseTunnel": "Choose the tunnel",
|
"NewTunnelFlight_ChooseTunnel": "Choose the tunnel",
|
||||||
"NewTunnelFlight_Minutes": "Minutes of the flight",
|
"NewTunnelFlight_Minutes": "Minutes of the flight",
|
||||||
"NewTunnelFlight_Comments": "Comments",
|
"NewTunnelFlight_Comments": "Comments",
|
||||||
"NewTunnelFlight_Submit": "Submit"
|
"NewTunnelFlight_Submit": "Submit",
|
||||||
|
"NewTunnelFlight_Comments_Lbl": "Comments",
|
||||||
|
"NewTunnelFlight_Minutes_Lbl": "Time of flight (minutes)",
|
||||||
|
"NewTunnelFlight_Date_Lbl": "Date of flight"
|
||||||
}
|
}
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
"ListGears_Title" : "Liste des pièges",
|
"ListGears_Title" : "Liste des pièges",
|
||||||
"ListAircrafts_Title" : "Liste des avions",
|
"ListAircrafts_Title" : "Liste des avions",
|
||||||
"NewTunnelFlight_Title" : "Nouveaux créneaux de soufflerie",
|
"NewTunnelFlight_Title" : "Nouveaux créneaux de soufflerie",
|
||||||
|
"ListTunnelFlight_Title" : "Heures de tunnel",
|
||||||
|
|
||||||
"App_Footer" : "Application pour enregistrer ses sauts de parachutisme - v",
|
"App_Footer" : "Application pour enregistrer ses sauts de parachutisme - v",
|
||||||
"App_Nav_Summary" : "Récapitulatif",
|
"App_Nav_Summary" : "Récapitulatif",
|
||||||
@@ -48,6 +49,7 @@
|
|||||||
"App_Nav_Gears" : "Pièges",
|
"App_Nav_Gears" : "Pièges",
|
||||||
"App_Nav_Logout" : "Se déconnecter",
|
"App_Nav_Logout" : "Se déconnecter",
|
||||||
"App_Nav_NewTunnelFlight" : "Ajouter du temps en tunnel",
|
"App_Nav_NewTunnelFlight" : "Ajouter du temps en tunnel",
|
||||||
|
"App_Nav_TunnelFlights": "Les vols en soufflerie",
|
||||||
|
|
||||||
"List_Aircrafts_Add" : "Ajouter un avion",
|
"List_Aircrafts_Add" : "Ajouter un avion",
|
||||||
"List_Aircrafts_Header_Id" : "ID",
|
"List_Aircrafts_Header_Id" : "ID",
|
||||||
@@ -116,5 +118,8 @@
|
|||||||
"NewTunnelFlight_ChooseTunnel": "Choisir le tunnel",
|
"NewTunnelFlight_ChooseTunnel": "Choisir le tunnel",
|
||||||
"NewTunnelFlight_Minutes": "Temps de vol(minutes)",
|
"NewTunnelFlight_Minutes": "Temps de vol(minutes)",
|
||||||
"NewTunnelFlight_Comments": "Commentaires",
|
"NewTunnelFlight_Comments": "Commentaires",
|
||||||
"NewTunnelFlight_Submit": "Ajouter"
|
"NewTunnelFlight_Submit": "Ajouter",
|
||||||
|
"NewTunnelFlight_Comments_Lbl": "Commentaires",
|
||||||
|
"NewTunnelFlight_Minutes_Lbl": "Temps de vol(minutes)",
|
||||||
|
"NewTunnelFlight_Date_Lbl": "Date des vols"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user