Refactoring
This commit is contained in:
@@ -1,23 +0,0 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AeronefComponent } from './aeronef.component';
|
||||
|
||||
describe('AeronefComponent', () => {
|
||||
let component: AeronefComponent;
|
||||
let fixture: ComponentFixture<AeronefComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [AeronefComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(AeronefComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
Executable → Regular
Executable → Regular
+5
-7
@@ -1,4 +1,4 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AeronefsComponent } from './aeronefs.component';
|
||||
|
||||
@@ -6,14 +6,12 @@ describe('AeronefsComponent', () => {
|
||||
let component: AeronefsComponent;
|
||||
let fixture: ComponentFixture<AeronefsComponent>;
|
||||
|
||||
beforeEach(waitForAsync(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [AeronefsComponent]
|
||||
})
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [AeronefsComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AeronefsComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
+4
-4
@@ -21,7 +21,7 @@ import { UtilitiesService } from 'src/app/core/services';
|
||||
import { AeronefByImat, AeronefByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-aeronef',
|
||||
selector: 'app-aeronefs',
|
||||
standalone: true,
|
||||
imports: [
|
||||
DatePipe,
|
||||
@@ -29,8 +29,8 @@ import { AeronefByImat, AeronefByYear } from 'src/app/core/models';
|
||||
MatExpansionModule, MatGridListModule, MatIconModule, MatMenuModule,
|
||||
BarsChartComponent, HistoryTableComponent, PieChartComponent
|
||||
],
|
||||
templateUrl: './aeronef.component.html',
|
||||
styleUrl: './aeronef.component.scss',
|
||||
templateUrl: './aeronefs.component.html',
|
||||
styleUrl: './aeronefs.component.scss',
|
||||
animations: [
|
||||
trigger('flyInOut', [
|
||||
state('in', style({ transform: 'translateX(0)' })),
|
||||
@@ -45,7 +45,7 @@ import { AeronefByImat, AeronefByYear } from 'src/app/core/models';
|
||||
])
|
||||
]
|
||||
})
|
||||
export class AeronefComponent implements OnInit, OnDestroy {
|
||||
export class AeronefsComponent implements OnInit, OnDestroy {
|
||||
private _data: Subscription = new Subscription();
|
||||
private _aeronefsByImat!: Array<AeronefByImat>;
|
||||
private _aeronefsByYear!: Array<AeronefByYear>;
|
||||
+6
-6
@@ -1,18 +1,18 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CanopyComponent } from './canopy.component';
|
||||
import { CanopiesComponent } from './canopies.component';
|
||||
|
||||
describe('CanopyComponent', () => {
|
||||
let component: CanopyComponent;
|
||||
let fixture: ComponentFixture<CanopyComponent>;
|
||||
describe('CanopiesComponent', () => {
|
||||
let component: CanopiesComponent;
|
||||
let fixture: ComponentFixture<CanopiesComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [CanopyComponent]
|
||||
imports: [CanopiesComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(CanopyComponent);
|
||||
fixture = TestBed.createComponent(CanopiesComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
+4
-4
@@ -20,7 +20,7 @@ import { UtilitiesService } from 'src/app/core/services';
|
||||
import { CanopyBySize, CanopyByYear, CanopyModelBySize, CanopyModelByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-canopy',
|
||||
selector: 'app-canopies',
|
||||
standalone: true,
|
||||
imports: [
|
||||
DatePipe,
|
||||
@@ -28,8 +28,8 @@ import { CanopyBySize, CanopyByYear, CanopyModelBySize, CanopyModelByYear } from
|
||||
MatGridListModule, MatIconModule, MatMenuModule,
|
||||
HistoryTableComponent, BarsChartComponent, PieChartComponent
|
||||
],
|
||||
templateUrl: './canopy.component.html',
|
||||
styleUrl: './canopy.component.scss',
|
||||
templateUrl: './canopies.component.html',
|
||||
styleUrl: './canopies.component.scss',
|
||||
animations: [
|
||||
trigger('flyInOut', [
|
||||
state('in', style({ transform: 'translateX(0)' })),
|
||||
@@ -44,7 +44,7 @@ import { CanopyBySize, CanopyByYear, CanopyModelBySize, CanopyModelByYear } from
|
||||
])
|
||||
]
|
||||
})
|
||||
export class CanopyComponent implements OnInit, OnDestroy {
|
||||
export class CanopiesComponent implements OnInit, OnDestroy {
|
||||
private _data: Subscription = new Subscription();
|
||||
private _canopiesModelBySize!: Array<CanopyModelBySize>;
|
||||
private _canopiesModelByYear!: Array<CanopyModelByYear>;
|
||||
@@ -11,15 +11,15 @@
|
||||
</div>
|
||||
<div class="row mt-sm-2 mt-lg-3">
|
||||
<div class="col-md-4 col-sm-12">
|
||||
<app-drop-zones></app-drop-zones>
|
||||
<app-dropzones-pie></app-dropzones-pie>
|
||||
</div>
|
||||
<div class="col-md-8 col-sm-12">
|
||||
<app-drop-zones-bar></app-drop-zones-bar>
|
||||
<app-dropzones-bar></app-dropzones-bar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-sm-2 mt-lg-3">
|
||||
<div class="col-md-4 col-sm-12">
|
||||
<app-aeronefs></app-aeronefs>
|
||||
<app-aeronefs-pie></app-aeronefs-pie>
|
||||
</div>
|
||||
<div class="col-md-8 col-sm-12">
|
||||
<app-aeronefs-bar></app-aeronefs-bar>
|
||||
@@ -27,10 +27,10 @@
|
||||
</div>
|
||||
<div class="row mt-sm-2 mt-lg-3">
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<app-canopy-models></app-canopy-models>
|
||||
<app-canopies-models></app-canopies-models>
|
||||
</div>
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<app-canopy-sizes></app-canopy-sizes>
|
||||
<app-canopies-sizes></app-canopies-sizes>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
@@ -12,9 +12,9 @@ import { Aeronef, AeronefByImat, Canopy, CanopyModelBySize, DropZone, DropZoneBy
|
||||
import { JumpsService, UserService } from 'src/app/core/services';
|
||||
import { ShowAuthedDirective } from 'src/app/components/shared/show-authed.directive';
|
||||
import {
|
||||
AeronefsComponent, AeronefsBarComponent,
|
||||
CanopyModelsComponent, CanopySizesComponent,
|
||||
DropZonesComponent, DropZonesBarComponent,
|
||||
AeronefsPieComponent, AeronefsBarComponent,
|
||||
CanopiesModelsComponent, CanopiesSizesComponent,
|
||||
DropzonesPieComponent, DropzonesBarComponent,
|
||||
JumpsByMonthComponent
|
||||
} from 'src/app/components/shared/dashboard-components';
|
||||
|
||||
@@ -22,9 +22,9 @@ import {
|
||||
standalone: true,
|
||||
imports: [
|
||||
DatePipe, ShowAuthedDirective, MatDividerModule,
|
||||
AeronefsComponent, AeronefsBarComponent,
|
||||
CanopyModelsComponent, CanopySizesComponent,
|
||||
DropZonesComponent, DropZonesBarComponent,
|
||||
AeronefsPieComponent, AeronefsBarComponent,
|
||||
CanopiesModelsComponent, CanopiesSizesComponent,
|
||||
DropzonesPieComponent, DropzonesBarComponent,
|
||||
JumpsByMonthComponent
|
||||
],
|
||||
selector: 'app-dashboard',
|
||||
|
||||
+6
-6
@@ -1,18 +1,18 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { DropzoneComponent } from './dropzone.component';
|
||||
import { DropzonesComponent } from './dropzones.component';
|
||||
|
||||
describe('DropzoneComponent', () => {
|
||||
let component: DropzoneComponent;
|
||||
let fixture: ComponentFixture<DropzoneComponent>;
|
||||
describe('DropzonesComponent', () => {
|
||||
let component: DropzonesComponent;
|
||||
let fixture: ComponentFixture<DropzonesComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [DropzoneComponent]
|
||||
imports: [DropzonesComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(DropzoneComponent);
|
||||
fixture = TestBed.createComponent(DropzonesComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
+4
-4
@@ -21,7 +21,7 @@ import { DropZoneByOaci, DropZoneByYear, DropZonesPageData, Jump } from 'src/app
|
||||
import { UtilitiesService } from 'src/app/core/services';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dropzone',
|
||||
selector: 'app-dropzones',
|
||||
standalone: true,
|
||||
imports: [
|
||||
DatePipe,
|
||||
@@ -30,8 +30,8 @@ import { UtilitiesService } from 'src/app/core/services';
|
||||
//ChartistModule,
|
||||
HistoryTableComponent, BarsChartComponent, PieChartComponent
|
||||
],
|
||||
templateUrl: './dropzone.component.html',
|
||||
styleUrl: './dropzone.component.scss',
|
||||
templateUrl: './dropzones.component.html',
|
||||
styleUrl: './dropzones.component.scss',
|
||||
animations: [
|
||||
trigger('flyInOut', [
|
||||
state('in', style({ transform: 'translateX(0)' })),
|
||||
@@ -46,7 +46,7 @@ import { UtilitiesService } from 'src/app/core/services';
|
||||
])
|
||||
]
|
||||
})
|
||||
export class DropzoneComponent implements OnInit, OnDestroy {
|
||||
export class DropzonesComponent implements OnInit, OnDestroy {
|
||||
private _data: Subscription = new Subscription();
|
||||
private _lastjump: Subscription = new Subscription();
|
||||
private _dropzonesByOaci!: Array<DropZoneByOaci>;
|
||||
@@ -1,9 +1,9 @@
|
||||
export * from './auth/auth.component';
|
||||
export * from './aeronef/aeronef.component';
|
||||
export * from './aeronefs/aeronefs.component';
|
||||
export * from './calculator/calculator.component';
|
||||
export * from './canopy/canopy.component';
|
||||
export * from './canopies/canopies.component';
|
||||
export * from './dashboard/dashboard.component';
|
||||
export * from './dropzone/dropzone.component';
|
||||
export * from './dropzones/dropzones.component';
|
||||
export * from './home/home.component';
|
||||
export * from './jump/jump.component';
|
||||
export * from './jumps/jumps.component';
|
||||
|
||||
@@ -23,6 +23,44 @@
|
||||
</div>
|
||||
<mat-divider class="my-3"></mat-divider>
|
||||
<mat-card>
|
||||
<mat-card-header>
|
||||
<mat-card-title>Types de sauts</mat-card-title>
|
||||
</mat-card-header>
|
||||
<mat-card-content class="mt-2">
|
||||
@if(displayCharts) {
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRowCumulated" [colors]="seriesTypesColor" [legend]="true" [hideZero]="true"></app-line-chart>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider class="mt-2 mb-3"></mat-divider>
|
||||
<div class="row">
|
||||
@for (item of getCategories(); track $index) {
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<app-circle-chart [headers]="seriesHeader" [names]="seriesName" [values]="[item.count, (lastJump.numero-item.count)]" [color]="$index" [label]="item.categorie"></app-circle-chart>
|
||||
</div>
|
||||
}
|
||||
@for (item of getModules(); track $index) {
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<app-circle-chart [headers]="seriesHeader" [names]="seriesName" [values]="[item.count, (lastJump.numero-item.count)]" [color]="getModuleColor($index)" [label]="item.module"></app-circle-chart>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<mat-divider class="my-3"></mat-divider>
|
||||
<!--
|
||||
<div class="row">
|
||||
<div class="col-xxl-6 col-xs-12">
|
||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRow" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
||||
</div>
|
||||
<div class="col-xxl-6 col-xs-12">
|
||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRowCumulated" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
}
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
<mat-card class="mt-3">
|
||||
<mat-card-header>
|
||||
<mat-card-title>{{ subtitle }}</mat-card-title>
|
||||
</mat-card-header>
|
||||
@@ -89,42 +127,4 @@
|
||||
</div>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
<mat-card class="mt-3">
|
||||
<mat-card-header>
|
||||
<mat-card-title>Types de sauts</mat-card-title>
|
||||
</mat-card-header>
|
||||
<mat-card-content class="mt-2">
|
||||
@if(displayCharts) {
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRowCumulated" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
||||
</div>
|
||||
</div>
|
||||
<mat-divider class="mt-2 mb-3"></mat-divider>
|
||||
<div class="row">
|
||||
@for (item of getCategories(); track $index) {
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<app-circle-chart [headers]="seriesHeader" [names]="seriesName" [values]="[item.count, (lastJump.numero-item.count)]" [color]="$index" [label]="item.categorie"></app-circle-chart>
|
||||
</div>
|
||||
}
|
||||
@for (item of getModules(); track $index) {
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<app-circle-chart [headers]="seriesHeader" [names]="seriesName" [values]="[item.count, (lastJump.numero-item.count)]" [color]="getModuleColor($index)" [label]="item.module"></app-circle-chart>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<mat-divider class="my-3"></mat-divider>
|
||||
<!--
|
||||
<div class="row">
|
||||
<div class="col-xxl-6 col-xs-12">
|
||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRow" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
||||
</div>
|
||||
<div class="col-xxl-6 col-xs-12">
|
||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRowCumulated" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
}
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
@@ -28,11 +28,9 @@
|
||||
<div class="mx-3 my-5">
|
||||
<mat-progress-bar [mode]="loading ? 'query' : 'determinate'" [value]="loading ? 0 : (totalAnswer/questionsCount*100)" color="accent"></mat-progress-bar>
|
||||
<mat-progress-bar class="mt-0" [mode]="loading ? 'query' : 'determinate'" [value]="loading ? 0 : ((timeProgress/timeMax)*100)" [color]="timeProgressColor"></mat-progress-bar>
|
||||
<ol class="squareItem clearfix">
|
||||
@for (category of qcm.categories; track category.num) {
|
||||
@for (question of category.questions; track question.num) {
|
||||
<li class="rounded-0">{{ question.num }}</li>
|
||||
}
|
||||
<ol class="squareItems clearfix">
|
||||
@for (answer of answers; track $index) {
|
||||
<li [class]="answer">{{ ($index + 1) }}</li>
|
||||
}
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* QCM */
|
||||
@use 'variable' as var;
|
||||
|
||||
ol.squareItem {
|
||||
ol.squareItems {
|
||||
padding: 0;
|
||||
margin: 1rem 0;
|
||||
li {
|
||||
|
||||
@@ -16,7 +16,7 @@ import { take } from 'rxjs/operators';
|
||||
|
||||
import { MenuItems } from 'src/app/components/shared';
|
||||
import { ListErrorsComponent } from 'src/app/components/shared';
|
||||
import { Errors, Qcm, QcmCategory, QcmQuestion, User } from 'src/app/core/models';
|
||||
import { Errors, Qcm, QcmCategory, QcmQuestion, QcmQuestionState, User } from 'src/app/core/models';
|
||||
import { QcmService, UserService } from 'src/app/core/services';
|
||||
import data from 'src/qcm-bpa.json';
|
||||
|
||||
@@ -47,6 +47,7 @@ export class QcmComponent implements OnInit, OnDestroy {
|
||||
public destroyRef = inject(DestroyRef);
|
||||
public expandedIndex = 0;
|
||||
public questionsCount = 0;
|
||||
public answers: Array<QcmQuestionState> = [];
|
||||
public qcmForm!: FormGroup;
|
||||
public loading = true;
|
||||
public totalAnswer = 0;
|
||||
@@ -131,6 +132,7 @@ export class QcmComponent implements OnInit, OnDestroy {
|
||||
id: [question.num],
|
||||
choice: ['']
|
||||
});
|
||||
this.answers.push(QcmQuestionState.UNANSWERED);
|
||||
this.questions.push(item);
|
||||
}
|
||||
|
||||
@@ -146,8 +148,10 @@ export class QcmComponent implements OnInit, OnDestroy {
|
||||
this.qcm.categories[(category.num-1)].questions[(question.num-1)].choices.forEach(choice => {
|
||||
if (choice.index === value) {
|
||||
if (choice.correct) {
|
||||
this.answers[(question.num-1)] = QcmQuestionState.VALID;
|
||||
console.log(`Réponse à la question ${question.num} de la catégorie ${category.num} : correcte`);
|
||||
} else {
|
||||
this.answers[(question.num-1)] = QcmQuestionState.ERROR;
|
||||
console.log(`Réponse à la question ${question.num} de la catégorie ${category.num} : incorrecte`);
|
||||
}
|
||||
}
|
||||
|
||||
Regular → Executable
Executable
+25
@@ -0,0 +1,25 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AeronefsPieComponent } from './aeronefs-pie.component';
|
||||
|
||||
describe('AeronefsPieComponent', () => {
|
||||
let component: AeronefsPieComponent;
|
||||
let fixture: ComponentFixture<AeronefsPieComponent>;
|
||||
|
||||
beforeEach(waitForAsync(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [AeronefsPieComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AeronefsPieComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
+3
-3
@@ -16,16 +16,16 @@ import { UtilitiesService, AeronefsService } from 'src/app/core/services';
|
||||
import { AeronefByImat, AeronefByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-aeronefs',
|
||||
selector: 'app-aeronefs-pie',
|
||||
standalone: true,
|
||||
imports: [
|
||||
MatBadgeModule, MatButtonModule, MatCardModule, MatDividerModule,
|
||||
MatExpansionModule, MatIconModule, MatMenuModule,
|
||||
HistoryTableComponent, PieChartComponent
|
||||
],
|
||||
templateUrl: './aeronefs.component.html'
|
||||
templateUrl: './aeronefs-pie.component.html'
|
||||
})
|
||||
export class AeronefsComponent implements OnInit, OnDestroy {
|
||||
export class AeronefsPieComponent implements OnInit, OnDestroy {
|
||||
private _aeronefByImat: Subscription = new Subscription();
|
||||
private _aeronefByYear: Subscription = new Subscription();
|
||||
private _aeronefsByImat!: Array<AeronefByImat>;
|
||||
+6
-6
@@ -1,20 +1,20 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { DropZonesComponent } from './drop-zones.component';
|
||||
import { CanopiesModelsComponent } from './canopies-models.component';
|
||||
|
||||
describe('DropZonesComponent', () => {
|
||||
let component: DropZonesComponent;
|
||||
let fixture: ComponentFixture<DropZonesComponent>;
|
||||
describe('CanopiesModelsComponent', () => {
|
||||
let component: CanopiesModelsComponent;
|
||||
let fixture: ComponentFixture<CanopiesModelsComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [DropZonesComponent]
|
||||
imports: [CanopiesModelsComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(DropZonesComponent);
|
||||
fixture = TestBed.createComponent(CanopiesModelsComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
+3
-3
@@ -15,16 +15,16 @@ import { UtilitiesService, CanopiesService } from 'src/app/core/services';
|
||||
import { CanopyModelBySize, CanopyModelByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-canopy-models',
|
||||
selector: 'app-canopies-models',
|
||||
standalone: true,
|
||||
imports: [
|
||||
MatButtonModule, MatCardModule, MatDividerModule,
|
||||
MatExpansionModule, MatIconModule, MatMenuModule,
|
||||
PieChartComponent, HistoryTableComponent
|
||||
],
|
||||
templateUrl: './canopy-models.component.html'
|
||||
templateUrl: './canopies-models.component.html'
|
||||
})
|
||||
export class CanopyModelsComponent implements OnInit, OnDestroy {
|
||||
export class CanopiesModelsComponent implements OnInit, OnDestroy {
|
||||
private _canopyBySize: Subscription = new Subscription();
|
||||
private _canopyByYear: Subscription = new Subscription();
|
||||
private _canopiesBySize!: Array<CanopyModelBySize>;
|
||||
+6
-6
@@ -1,20 +1,20 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { DropZonesBarComponent } from './drop-zones-bar.component';
|
||||
import { CanopiesSizesComponent } from './canopies-sizes.component';
|
||||
|
||||
describe('DropZonesBarComponent', () => {
|
||||
let component: DropZonesBarComponent;
|
||||
let fixture: ComponentFixture<DropZonesBarComponent>;
|
||||
describe('CanopiesSizesComponent', () => {
|
||||
let component: CanopiesSizesComponent;
|
||||
let fixture: ComponentFixture<CanopiesSizesComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [DropZonesBarComponent]
|
||||
imports: [CanopiesSizesComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(DropZonesBarComponent);
|
||||
fixture = TestBed.createComponent(CanopiesSizesComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
+3
-3
@@ -16,16 +16,16 @@ import { UtilitiesService, CanopiesService } from 'src/app/core/services';
|
||||
import { CanopyBySize, CanopyByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-canopy-sizes',
|
||||
selector: 'app-canopies-sizes',
|
||||
standalone: true,
|
||||
imports: [
|
||||
MatButtonModule, MatCardModule, MatDividerModule,
|
||||
MatExpansionModule, MatIconModule, MatMenuModule,
|
||||
PieChartComponent, HistoryTableComponent
|
||||
],
|
||||
templateUrl: './canopy-sizes.component.html'
|
||||
templateUrl: './canopies-sizes.component.html'
|
||||
})
|
||||
export class CanopySizesComponent implements OnInit, OnDestroy {
|
||||
export class CanopiesSizesComponent implements OnInit, OnDestroy {
|
||||
private _canopyBySize: Subscription = new Subscription();
|
||||
private _canopyByYear: Subscription = new Subscription();
|
||||
private _canopiesBySize!: Array<CanopyBySize>;
|
||||
+6
-6
@@ -1,20 +1,20 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CanopyModelsComponent } from './canopy-models.component';
|
||||
import { DropzonesBarComponent } from './dropzones-bar.component';
|
||||
|
||||
describe('CanopyModelsComponent', () => {
|
||||
let component: CanopyModelsComponent;
|
||||
let fixture: ComponentFixture<CanopyModelsComponent>;
|
||||
describe('DropzonesBarComponent', () => {
|
||||
let component: DropzonesBarComponent;
|
||||
let fixture: ComponentFixture<DropzonesBarComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [CanopyModelsComponent]
|
||||
imports: [DropzonesBarComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(CanopyModelsComponent);
|
||||
fixture = TestBed.createComponent(DropzonesBarComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
+3
-3
@@ -17,7 +17,7 @@ import { UtilitiesService, DropZonesService } from 'src/app/core/services';
|
||||
import { DropZoneByOaci, DropZoneByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-drop-zones-bar',
|
||||
selector: 'app-dropzones-bar',
|
||||
standalone: true,
|
||||
imports: [
|
||||
MatButtonModule, MatCardModule, MatDividerModule,
|
||||
@@ -25,9 +25,9 @@ import { DropZoneByOaci, DropZoneByYear } from 'src/app/core/models';
|
||||
BaseChartDirective, ChartistModule,
|
||||
HistoryTableComponent
|
||||
],
|
||||
templateUrl: './drop-zones-bar.component.html'
|
||||
templateUrl: './dropzones-bar.component.html'
|
||||
})
|
||||
export class DropZonesBarComponent implements OnInit, OnDestroy {
|
||||
export class DropzonesBarComponent implements OnInit, OnDestroy {
|
||||
private _dropzoneByOaci: Subscription = new Subscription();
|
||||
private _dropzoneByYear: Subscription = new Subscription();
|
||||
private _dropzonesByOaci!: Array<DropZoneByOaci>;
|
||||
+6
-6
@@ -1,20 +1,20 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CanopySizesComponent } from './canopy-sizes.component';
|
||||
import { DropzonesPieComponent } from './dropzones-pie.component';
|
||||
|
||||
describe('CanopySizesComponent', () => {
|
||||
let component: CanopySizesComponent;
|
||||
let fixture: ComponentFixture<CanopySizesComponent>;
|
||||
describe('DropzonesPieComponent', () => {
|
||||
let component: DropzonesPieComponent;
|
||||
let fixture: ComponentFixture<DropzonesPieComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [CanopySizesComponent]
|
||||
imports: [DropzonesPieComponent]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(CanopySizesComponent);
|
||||
fixture = TestBed.createComponent(DropzonesPieComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
+3
-3
@@ -16,16 +16,16 @@ import { UtilitiesService, DropZonesService } from 'src/app/core/services';
|
||||
import { DropZoneByOaci, DropZoneByYear } from 'src/app/core/models';
|
||||
|
||||
@Component({
|
||||
selector: 'app-drop-zones',
|
||||
selector: 'app-dropzones-pie',
|
||||
standalone: true,
|
||||
imports: [
|
||||
MatButtonModule, MatCardModule, MatDividerModule,
|
||||
MatExpansionModule, MatIconModule, MatMenuModule,
|
||||
PieChartComponent, HistoryTableComponent
|
||||
],
|
||||
templateUrl: './drop-zones.component.html'
|
||||
templateUrl: './dropzones-pie.component.html'
|
||||
})
|
||||
export class DropZonesComponent implements OnInit, OnDestroy {
|
||||
export class DropzonesPieComponent implements OnInit, OnDestroy {
|
||||
private _dropzoneByOaci: Subscription = new Subscription();
|
||||
private _dropzoneByYear: Subscription = new Subscription();
|
||||
private _dropzonesByOaci!: Array<DropZoneByOaci>;
|
||||
@@ -1,7 +1,7 @@
|
||||
export * from './aeronefs/aeronefs.component';
|
||||
export * from './aeronefs-pie/aeronefs-pie.component';
|
||||
export * from './aeronefs-bar/aeronefs-bar.component';
|
||||
export * from './canopy-models/canopy-models.component';
|
||||
export * from './canopy-sizes/canopy-sizes.component';
|
||||
export * from './drop-zones/drop-zones.component';
|
||||
export * from './drop-zones-bar/drop-zones-bar.component';
|
||||
export * from './canopies-models/canopies-models.component';
|
||||
export * from './canopies-sizes/canopies-sizes.component';
|
||||
export * from './dropzones-pie/dropzones-pie.component';
|
||||
export * from './dropzones-bar/dropzones-bar.component';
|
||||
export * from './jumps-by-month/jumps-by-month.component';
|
||||
@@ -39,7 +39,7 @@ export class BarChartComponent implements OnChanges {
|
||||
}
|
||||
|
||||
private _loadBarChart(): void {
|
||||
const data: ChartDataset<'bar'> = {
|
||||
const dataset: ChartDataset<'bar'> = {
|
||||
data: [...this.values],
|
||||
label: this.label,
|
||||
backgroundColor: this.colors.backgroundColor,
|
||||
@@ -47,7 +47,7 @@ export class BarChartComponent implements OnChanges {
|
||||
borderWidth: 1
|
||||
};
|
||||
this.chartConfig.barChartData.labels = [...this.names];
|
||||
this.chartConfig.barChartData.datasets!.push(data);
|
||||
this.chartConfig.barChartData.datasets!.push(dataset);
|
||||
/*this.chartConfig.barChartOptions!.scales = {
|
||||
x: {display: false},
|
||||
y: {display: true}
|
||||
|
||||
@@ -39,7 +39,7 @@ export class BarHorizontalChartComponent implements OnChanges {
|
||||
}
|
||||
|
||||
private _loadBarChart(): void {
|
||||
const data: ChartDataset<'bar'> = {
|
||||
const dataset: ChartDataset<'bar'> = {
|
||||
data: [...this.values],
|
||||
label: this.label,
|
||||
backgroundColor: this.colors.backgroundColor,
|
||||
@@ -47,7 +47,7 @@ export class BarHorizontalChartComponent implements OnChanges {
|
||||
borderWidth: 1
|
||||
};
|
||||
this.chartConfig.barChartData.labels = [...this.names];
|
||||
this.chartConfig.barChartData.datasets!.push(data);
|
||||
this.chartConfig.barChartData.datasets!.push(dataset);
|
||||
this.chartConfig.barChartLegend = this.legend;
|
||||
this.displayCharts = true;
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ export class BarsChartComponent implements OnChanges, AfterContentChecked {
|
||||
@Input() legend: boolean = false;
|
||||
|
||||
ngOnChanges() {
|
||||
//this._loadBarChart();
|
||||
this._loadBarChart();
|
||||
}
|
||||
|
||||
ngAfterContentChecked() {
|
||||
@@ -63,7 +63,7 @@ export class BarsChartComponent implements OnChanges, AfterContentChecked {
|
||||
}
|
||||
};
|
||||
this.names.forEach((label: string, index: number) => {
|
||||
const data: ChartDataset<'bar'> = {
|
||||
const dataset: ChartDataset<'bar'> = {
|
||||
data: [...this.values[index]],
|
||||
label: label,
|
||||
backgroundColor: this.colors.backgroundColor[index],
|
||||
@@ -71,7 +71,7 @@ export class BarsChartComponent implements OnChanges, AfterContentChecked {
|
||||
borderWidth: 1,
|
||||
//stack: 'Stack 0'
|
||||
};
|
||||
this.chartConfig.barChartData.datasets!.push(data);
|
||||
this.chartConfig.barChartData.datasets!.push(dataset);
|
||||
});
|
||||
this.chartConfig.barChartLegend = this.legend;
|
||||
this.displayCharts = true;
|
||||
|
||||
@@ -50,7 +50,7 @@ export class CircleChartComponent implements OnChanges {
|
||||
}
|
||||
|
||||
/*private _loadCircleChart(): void {
|
||||
const data: ChartDataset<'circle'> = {
|
||||
const dataset: ChartDataset<'circle'> = {
|
||||
data: [...this.values],
|
||||
label: 'Nombre total de sauts',
|
||||
backgroundColor: this._utilitiesService.getSeriesColors(0.8),
|
||||
@@ -58,7 +58,7 @@ export class CircleChartComponent implements OnChanges {
|
||||
borderWidth: 1
|
||||
};
|
||||
this.chartConfig.circleChartLabels = [...this.names];
|
||||
this.chartConfig.circleChartDatasets!.push(data);
|
||||
this.chartConfig.circleChartDatasets!.push(dataset);
|
||||
this.displayCharts = true;
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Component, Input, OnChanges } from '@angular/core';
|
||||
import { ChartDataset } from 'chart.js';
|
||||
import { ChartDataset, Point } from 'chart.js';
|
||||
import { BaseChartDirective } from 'ng2-charts';
|
||||
|
||||
import { UtilitiesService } from 'src/app/core/services';
|
||||
@@ -32,6 +32,7 @@ export class LineChartComponent implements OnChanges {
|
||||
borderColor: this._utilitiesService.getSeriesColors(1)
|
||||
};
|
||||
@Input() legend: boolean = false;
|
||||
@Input() hideZero: boolean = false;
|
||||
|
||||
ngOnChanges() {
|
||||
this._loadLineChart();
|
||||
@@ -40,8 +41,14 @@ export class LineChartComponent implements OnChanges {
|
||||
private _loadLineChart(): void {
|
||||
this.chartConfig.lineChartData.labels = [...this.headers];
|
||||
this.names.forEach((label: string, index: number) => {
|
||||
const data: ChartDataset<'line'> = {
|
||||
data: [...this.values[index]],
|
||||
let data: Array<(number | Point | null)> = [];
|
||||
if (this.hideZero) {
|
||||
data = [...this.values[index].map(value => value === 0 ? null : value)];
|
||||
} else {
|
||||
data = [...this.values[index]];
|
||||
}
|
||||
const dataset: ChartDataset<'line'> = {
|
||||
data: data,
|
||||
label: label,
|
||||
backgroundColor: this.colors.backgroundColor[index],
|
||||
borderColor: this.colors.borderColor[index],
|
||||
@@ -49,7 +56,7 @@ export class LineChartComponent implements OnChanges {
|
||||
cubicInterpolationMode: 'monotone',
|
||||
tension: 0
|
||||
};
|
||||
this.chartConfig.lineChartData.datasets!.push(data);
|
||||
this.chartConfig.lineChartData.datasets!.push(dataset);
|
||||
});
|
||||
this.chartConfig.lineChartLegend = this.legend;
|
||||
this.displayCharts = true;
|
||||
|
||||
@@ -44,7 +44,7 @@ export class LineAreaChartComponent implements OnChanges {
|
||||
if (index === 0) {
|
||||
fill = true;
|
||||
}
|
||||
const data: ChartDataset<'line'> = {
|
||||
const dataset: ChartDataset<'line'> = {
|
||||
data: [...this.values[index]],
|
||||
label: label,
|
||||
backgroundColor: this.colors.backgroundColor[index],
|
||||
@@ -55,7 +55,7 @@ export class LineAreaChartComponent implements OnChanges {
|
||||
cubicInterpolationMode: 'monotone',
|
||||
tension: 0
|
||||
};
|
||||
this.chartConfig.lineChartData.datasets!.push(data);
|
||||
this.chartConfig.lineChartData.datasets!.push(dataset);
|
||||
});
|
||||
this.chartConfig.lineChartLegend = this.legend;
|
||||
this.displayCharts = true;
|
||||
|
||||
@@ -49,7 +49,7 @@ export class PieChartComponent implements OnChanges {
|
||||
}
|
||||
|
||||
/*private _loadDoughnutChart(): void {
|
||||
const data: ChartDataset<'doughnut'> = {
|
||||
const dataset: ChartDataset<'doughnut'> = {
|
||||
data: [...this.values],
|
||||
label: 'Nombre total de sauts',
|
||||
backgroundColor: this._utilitiesService.getSeriesColors(0.8),
|
||||
@@ -57,7 +57,7 @@ export class PieChartComponent implements OnChanges {
|
||||
borderWidth: 1
|
||||
};
|
||||
this.chartConfig.doughnutChartLabels = [...this.names];
|
||||
this.chartConfig.doughnutChartDatasets!.push(data);
|
||||
this.chartConfig.doughnutChartDatasets!.push(dataset);
|
||||
this.displayCharts = true;
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@ const MENUAUTH: Menu[] = [
|
||||
const MENUITEMS: Menu[] = [
|
||||
{ state: 'dashboard', type: 'link', name: 'Dashboard', icon: 'dashboard', desc: '' },
|
||||
{ state: 'logbook', type: 'link', name: 'Carnet de saut', icon: 'assignment_turned_in', desc: '' },
|
||||
{ state: 'aeronef', type: 'link', name: 'Aéronefs', icon: 'flight', desc: '' },
|
||||
{ state: 'canopy', type: 'link', name: 'Voiles', icon: 'paragliding', desc: '' },
|
||||
{ state: 'dropzone', type: 'link', name: 'Drop Zones', icon: 'flight_takeoff', desc: '' },
|
||||
{ state: 'jumps', type: 'link', name: 'Sauts', icon: 'cloud', desc: '' },
|
||||
{ state: 'aeronefs', type: 'link', name: 'Aéronefs', icon: 'flight', desc: '' },
|
||||
{ state: 'dropzones', type: 'link', name: 'Drop Zones', icon: 'flight_takeoff', desc: '' },
|
||||
{ state: 'canopies', type: 'link', name: 'Voiles', icon: 'paragliding', desc: '' },
|
||||
{ state: 'jumps', type: 'link', name: 'Sauts', icon: 'filter_drama', desc: '' },
|
||||
{ state: 'calculator', type: 'link', name: 'Taille de voile', icon: 'calculate', desc: '' },
|
||||
{ state: 'qcm', type: 'menu', name: 'QCM Brevets', icon: 'rule_folder', desc: '' }
|
||||
];
|
||||
|
||||
@@ -32,12 +32,14 @@ export interface Jump {
|
||||
//isEdit?: boolean;
|
||||
isSelected?: boolean;
|
||||
}
|
||||
|
||||
export enum JumpFileType {
|
||||
CSV = "csv",
|
||||
IMAGE = "image",
|
||||
KML = "kml",
|
||||
VIDEO = "video",
|
||||
VIDEO = "video"
|
||||
}
|
||||
|
||||
export interface JumpFile {
|
||||
slug: string;
|
||||
name: string;
|
||||
|
||||
@@ -15,81 +15,15 @@ export interface QcmQuestion {
|
||||
choices: Array<QcmChoice>;
|
||||
}
|
||||
|
||||
export enum QcmQuestionState {
|
||||
UNANSWERED = "unanswered",
|
||||
DEFERED = "defer",
|
||||
VALID = "valid",
|
||||
ERROR = "error"
|
||||
}
|
||||
|
||||
export interface QcmChoice {
|
||||
index: string;
|
||||
libelle: string;
|
||||
correct: boolean;
|
||||
}
|
||||
|
||||
/*
|
||||
{
|
||||
"num": 1,
|
||||
"name": "Aéronefs",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 2,
|
||||
"name": "Altimètre",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 3,
|
||||
"name": "Déclencheurs et matériels",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 4,
|
||||
"name": "Largage",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 5,
|
||||
"name": "Règlementation",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 6,
|
||||
"name": "Pilotage et mécanique de vol",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 7,
|
||||
"name": "Physiologie",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 8,
|
||||
"name": "Connaissances générales",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 9,
|
||||
"name": "Unités de mesure",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 10,
|
||||
"name": "Altimétrie",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 11,
|
||||
"name": "Météorologie et aérologie",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 12,
|
||||
"name": "Sauts spéciaux",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 13,
|
||||
"name": "Questions spécifiques au brevet C",
|
||||
"questions": []
|
||||
},
|
||||
{
|
||||
"num": 14,
|
||||
"name": "Questions spécifiques au brevet D",
|
||||
"questions": []
|
||||
}
|
||||
*/
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Routes } from '@angular/router';
|
||||
|
||||
import {
|
||||
AeronefComponent, CalculatorComponent, CanopyComponent, CredentialsComponent,
|
||||
DashboardComponent, DropzoneComponent, JumpComponent, JumpsComponent,
|
||||
AeronefsComponent, CalculatorComponent, CanopiesComponent, CredentialsComponent,
|
||||
DashboardComponent, DropzonesComponent, JumpComponent, JumpsComponent,
|
||||
LogbookComponent, ProfileComponent, QcmComponent, SettingsComponent
|
||||
} from 'src/app/components';
|
||||
import { authGuard } from 'src/app/core/guards';
|
||||
@@ -13,8 +13,8 @@ import {
|
||||
|
||||
export const AUTH_ROUTES: Routes = [
|
||||
{
|
||||
path: 'aeronef',
|
||||
component: AeronefComponent,
|
||||
path: 'aeronefs',
|
||||
component: AeronefsComponent,
|
||||
canActivate: [ authGuard ],
|
||||
resolve: {
|
||||
aeronefsPageData: aeronefsPageResolver
|
||||
@@ -29,8 +29,8 @@ export const AUTH_ROUTES: Routes = [
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'canopy',
|
||||
component: CanopyComponent,
|
||||
path: 'canopies',
|
||||
component: CanopiesComponent,
|
||||
canActivate: [ authGuard ],
|
||||
resolve: {
|
||||
canopiesPageData: canopiesPageResolver
|
||||
@@ -45,8 +45,8 @@ export const AUTH_ROUTES: Routes = [
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'dropzone',
|
||||
component: DropzoneComponent,
|
||||
path: 'dropzones',
|
||||
component: DropzonesComponent,
|
||||
canActivate: [ authGuard ],
|
||||
resolve: {
|
||||
dropZonesPageData: dropZonesPageResolver
|
||||
|
||||
Reference in New Issue
Block a user