chore(deps): upgrade Angular 20 → 21
Migrates to Angular 21.0.0: updates tsconfig lib to es2022, migrates bootstrap options in main.ts, and completes control flow migration (*ngFor/*ngIf → @for/@if) in jumps and jumps-by-month templates to resolve duplicate ng-template name conflicts skipped by the schematic. Also fixes pre-commit hook to load nvm before running tests.
This commit is contained in:
+4
-1
@@ -1,2 +1,5 @@
|
|||||||
|
export NVM_DIR="$HOME/.nvm"
|
||||||
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||||
|
nvm use 20.19.6
|
||||||
npm test -- --watch=false
|
npm test -- --watch=false
|
||||||
npx lint-staged
|
npx lint-staged
|
||||||
|
|||||||
Generated
+1873
-1843
File diff suppressed because it is too large
Load Diff
+20
-20
@@ -21,18 +21,18 @@
|
|||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "^20.3.19",
|
"@angular/animations": "^21.2.10",
|
||||||
"@angular/cdk": "^20.2.14",
|
"@angular/cdk": "^21.2.8",
|
||||||
"@angular/common": "^20.3.19",
|
"@angular/common": "^21.2.10",
|
||||||
"@angular/compiler": "^20.3.19",
|
"@angular/compiler": "^21.2.10",
|
||||||
"@angular/core": "^20.3.19",
|
"@angular/core": "^21.2.10",
|
||||||
"@angular/forms": "^20.3.19",
|
"@angular/forms": "^21.2.10",
|
||||||
"@angular/google-maps": "^20.2.14",
|
"@angular/google-maps": "^21.2.8",
|
||||||
"@angular/localize": "^20.3.19",
|
"@angular/localize": "^21.2.10",
|
||||||
"@angular/material": "^20.2.14",
|
"@angular/material": "^21.2.8",
|
||||||
"@angular/platform-browser": "^20.3.19",
|
"@angular/platform-browser": "^21.2.10",
|
||||||
"@angular/platform-browser-dynamic": "^20.3.19",
|
"@angular/platform-browser-dynamic": "^21.2.10",
|
||||||
"@angular/router": "^20.3.19",
|
"@angular/router": "^21.2.10",
|
||||||
"bootstrap": "^5.3.7",
|
"bootstrap": "^5.3.7",
|
||||||
"chart.js": "^4.4.2",
|
"chart.js": "^4.4.2",
|
||||||
"chartist": "^1.3.0",
|
"chartist": "^1.3.0",
|
||||||
@@ -43,14 +43,14 @@
|
|||||||
"zone.js": "^0.15.1"
|
"zone.js": "^0.15.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "^20.3.24",
|
"@angular-devkit/build-angular": "^21.2.8",
|
||||||
"@angular-eslint/builder": "20.7.0",
|
"@angular-eslint/builder": "21.3.1",
|
||||||
"@angular-eslint/eslint-plugin": "20.7.0",
|
"@angular-eslint/eslint-plugin": "21.3.1",
|
||||||
"@angular-eslint/eslint-plugin-template": "20.7.0",
|
"@angular-eslint/eslint-plugin-template": "21.3.1",
|
||||||
"@angular-eslint/schematics": "20.7.0",
|
"@angular-eslint/schematics": "21.3.1",
|
||||||
"@angular-eslint/template-parser": "20.7.0",
|
"@angular-eslint/template-parser": "21.3.1",
|
||||||
"@angular/cli": "^20.3.24",
|
"@angular/cli": "^21.2.8",
|
||||||
"@angular/compiler-cli": "^20.3.19",
|
"@angular/compiler-cli": "^21.2.10",
|
||||||
"@types/jasmine": "~5.1.0",
|
"@types/jasmine": "~5.1.0",
|
||||||
"@typescript-eslint/eslint-plugin": "7.2.0",
|
"@typescript-eslint/eslint-plugin": "7.2.0",
|
||||||
"@typescript-eslint/parser": "7.2.0",
|
"@typescript-eslint/parser": "7.2.0",
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
<div @flyInOut>
|
<div @flyInOut>
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<div class="flex-fill">
|
<div class="flex-fill">
|
||||||
<h1 class="mb-1">{{title}}</h1>
|
<h1 class="mb-1">{{ title }}</h1>
|
||||||
<span [hidden]="!lastJump.numero" class="me-2 fs-6">
|
<span [hidden]="!lastJump.numero" class="me-2 fs-6">
|
||||||
Dernier saut enregistré : <span class="fs-5 mx-1 text-primary">{{ lastJump.numero }}<sup>ème</sup></span> à <span class="fs-5 mx-1 text-primary">{{ lastJump.lieu }}</span> le <span class="fs-5 mx-1 text-primary">{{ lastJump.date | date: 'dd/MM/yyyy' }}</span>
|
Dernier saut enregistré :
|
||||||
|
<span class="fs-5 mx-1 text-primary">{{ lastJump.numero }}<sup>ème</sup></span> à
|
||||||
|
<span class="fs-5 mx-1 text-primary">{{ lastJump.lieu }}</span> le
|
||||||
|
<span class="fs-5 mx-1 text-primary">{{ lastJump.date | date: "dd/MM/yyyy" }}</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="flex-spacer"></span>
|
<span class="flex-spacer"></span>
|
||||||
@@ -13,10 +16,10 @@
|
|||||||
</button>
|
</button>
|
||||||
<mat-menu #menuJumps="matMenu">
|
<mat-menu #menuJumps="matMenu">
|
||||||
@for (menuitem of menuItems.getMenuPanel(); track menuitem) {
|
@for (menuitem of menuItems.getMenuPanel(); track menuitem) {
|
||||||
<button mat-menu-item>
|
<button mat-menu-item>
|
||||||
<mat-icon [fontIcon]="menuitem.icon"></mat-icon>
|
<mat-icon [fontIcon]="menuitem.icon"></mat-icon>
|
||||||
<span>{{ menuitem.name }}</span>
|
<span>{{ menuitem.name }}</span>
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</div>
|
</div>
|
||||||
@@ -27,15 +30,26 @@
|
|||||||
<mat-card-title>{{ subtitle }}</mat-card-title>
|
<mat-card-title>{{ subtitle }}</mat-card-title>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content class="mt-2">
|
<mat-card-content class="mt-2">
|
||||||
@if(displayCharts) {
|
@if (displayCharts) {
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xxl-6 col-xs-12">
|
<div class="col-xxl-6 col-xs-12">
|
||||||
<app-linearea-chart [headers]="seriesHeader" [names]="seriesName" [values]="seriesRow" [colors]="seriesColor"></app-linearea-chart>
|
<app-linearea-chart
|
||||||
|
[headers]="seriesHeader"
|
||||||
|
[names]="seriesName"
|
||||||
|
[values]="seriesRow"
|
||||||
|
[colors]="seriesColor"
|
||||||
|
></app-linearea-chart>
|
||||||
|
</div>
|
||||||
|
<div class="col-xxl-6 col-xs-12">
|
||||||
|
<app-bars-chart
|
||||||
|
[headers]="seriesHeader"
|
||||||
|
[names]="seriesName"
|
||||||
|
[values]="seriesRow"
|
||||||
|
[colors]="seriesColor"
|
||||||
|
[legend]="true"
|
||||||
|
></app-bars-chart>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xxl-6 col-xs-12">
|
|
||||||
<app-bars-chart [headers]="seriesHeader" [names]="seriesName" [values]="seriesRow" [colors]="seriesColor" [legend]="true"></app-bars-chart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
@@ -44,44 +58,70 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th *ngFor='let name of seriesHeader; let i=index' class="text-end"> {{ name }} </th>
|
@for (name of seriesHeader; track name) {
|
||||||
|
<th class="text-end">{{ name }}</th>
|
||||||
|
}
|
||||||
<th class="text-end">Total</th>
|
<th class="text-end">Total</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor='let values of seriesRow; let i=index'>
|
@for (values of seriesRow; track $index; let i = $index) {
|
||||||
<th class="{{seriesColorClass[i]}} text-end"> ● {{ seriesName[i] }} </th>
|
<tr>
|
||||||
<td *ngFor='let value of values; let i=index' class="font-monospace text-end">
|
<th class="{{ seriesColorClass[i] }} text-end">● {{ seriesName[i] }}</th>
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value }}</span>
|
@for (value of values; track $index) {
|
||||||
<ng-template #elseBlock><span class="text-empty pr-1">{{ value }}</span></ng-template>
|
<td class="font-monospace text-end">
|
||||||
</td>
|
@if (value) {
|
||||||
<th class="{{seriesColorClass[i]}} font-monospace text-end">{{ seriesRowTotal[i] }}</th>
|
<span class="pr-1">{{ value }}</span>
|
||||||
</tr>
|
} @else {
|
||||||
|
<span class="text-empty pr-1">{{ value }}</span>
|
||||||
|
}
|
||||||
|
</td>
|
||||||
|
}
|
||||||
|
<th class="{{ seriesColorClass[i] }} font-monospace text-end">
|
||||||
|
{{ seriesRowTotal[i] }}
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Total</th>
|
<th class="text-end">Total</th>
|
||||||
<th *ngFor='let value of seriesColTotal; let i=index' class="font-monospace text-end">
|
@for (value of seriesColTotal; track $index) {
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value }}</span>
|
<th class="font-monospace text-end">
|
||||||
<ng-template #elseBlock><span class="text-empty pr-1">{{ value }}</span></ng-template>
|
@if (value) {
|
||||||
</th>
|
<span class="pr-1">{{ value }}</span>
|
||||||
|
} @else {
|
||||||
|
<span class="text-empty pr-1">{{ value }}</span>
|
||||||
|
}
|
||||||
|
</th>
|
||||||
|
}
|
||||||
<th class="font-monospace text-end">{{ grandTotal }}</th>
|
<th class="font-monospace text-end">{{ grandTotal }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Moyenne</th>
|
<th class="text-end">Moyenne</th>
|
||||||
<th *ngFor='let value of seriesRowAvg; let i=index' class="font-monospace text-end">
|
@for (value of seriesRowAvg; track $index) {
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value | number : '1.0-1' }}</span>
|
<th class="font-monospace text-end">
|
||||||
<ng-template #elseBlock><span class="text-empty pr-1">{{ value | number : '1.0-1' }}</span></ng-template>
|
@if (value) {
|
||||||
</th>
|
<span class="pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
<th class="font-monospace text-end">{{ grandAvg | number : '1.0-1' }}</th>
|
} @else {
|
||||||
|
<span class="text-empty pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
|
}
|
||||||
|
</th>
|
||||||
|
}
|
||||||
|
<th class="font-monospace text-end">{{ grandAvg | number: "1.0-1" }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Moyenne <small>3 dernières années</small></th>
|
<th class="text-end">Moyenne <small>3 dernières années</small></th>
|
||||||
<th *ngFor='let value of seriesRowAvgLastYears; let i=index' class="font-monospace text-end">
|
@for (value of seriesRowAvgLastYears; track $index) {
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value | number : '1.0-1' }}</span>
|
<th class="font-monospace text-end">
|
||||||
<ng-template #elseBlock><span class="text-empty pr-1">{{ value | number : '1.0-1' }}</span></ng-template>
|
@if (value) {
|
||||||
</th>
|
<span class="pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
<th class="font-monospace text-end">{{ grandAvgLastYears | number : '1.0-1' }}</th>
|
} @else {
|
||||||
|
<span class="text-empty pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
|
}
|
||||||
|
</th>
|
||||||
|
}
|
||||||
|
<th class="font-monospace text-end">{{ grandAvgLastYears | number: "1.0-1" }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
@@ -94,27 +134,46 @@
|
|||||||
<mat-card-title>Types de sauts</mat-card-title>
|
<mat-card-title>Types de sauts</mat-card-title>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content class="mt-2">
|
<mat-card-content class="mt-2">
|
||||||
@if(displayCharts) {
|
@if (displayCharts) {
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRowCumulated" [colors]="seriesTypesColor" [legend]="true" [hideZero]="true"></app-line-chart>
|
<app-line-chart
|
||||||
|
[headers]="seriesTypesHeader"
|
||||||
|
[names]="seriesTypesName"
|
||||||
|
[values]="seriesTypesRowCumulated"
|
||||||
|
[colors]="seriesTypesColor"
|
||||||
|
[legend]="true"
|
||||||
|
[hideZero]="true"
|
||||||
|
></app-line-chart>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<mat-divider class="mt-2 mb-3"></mat-divider>
|
||||||
<mat-divider class="mt-2 mb-3"></mat-divider>
|
<div class="row">
|
||||||
<div class="row">
|
@for (item of getCategories(); track $index) {
|
||||||
@for (item of getCategories(); track $index) {
|
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
<app-circle-chart
|
||||||
<app-circle-chart [headers]="seriesHeader" [names]="seriesName" [values]="[item.count, (lastJump.numero-item.count)]" [color]="$index" [label]="item.categorie"></app-circle-chart>
|
[headers]="seriesHeader"
|
||||||
</div>
|
[names]="seriesName"
|
||||||
}
|
[values]="[item.count, lastJump.numero - item.count]"
|
||||||
@for (item of getModules(); track $index) {
|
[color]="$index"
|
||||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
[label]="item.categorie"
|
||||||
<app-circle-chart [headers]="seriesHeader" [names]="seriesName" [values]="[item.count, (lastJump.numero-item.count)]" [color]="getModuleColor($index)" [label]="item.module"></app-circle-chart>
|
></app-circle-chart>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
@for (item of getModules(); track $index) {
|
||||||
<mat-divider class="my-3"></mat-divider>
|
<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="row">
|
||||||
<div class="col-xxl-6 col-xs-12">
|
<div class="col-xxl-6 col-xs-12">
|
||||||
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRow" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
<app-line-chart [headers]="seriesTypesHeader" [names]="seriesTypesName" [values]="seriesTypesRow" [colors]="seriesTypesColor" [legend]="true"></app-line-chart>
|
||||||
@@ -127,4 +186,4 @@
|
|||||||
}
|
}
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { trigger, state, style, animate, transition } from '@angular/animations'
|
|||||||
import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core';
|
import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core';
|
||||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { CommonModule } from '@angular/common';
|
import { DatePipe, DecimalPipe } from '@angular/common';
|
||||||
import { MatButtonModule } from '@angular/material/button';
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
import { MatCardModule } from '@angular/material/card';
|
import { MatCardModule } from '@angular/material/card';
|
||||||
import { MatDividerModule } from '@angular/material/divider';
|
import { MatDividerModule } from '@angular/material/divider';
|
||||||
@@ -25,7 +25,8 @@ import { Jump, JumpByCategorie, JumpByDate, JumpByDateByModule, JumpByModule, Ju
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'app-jumps',
|
selector: 'app-jumps',
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
DatePipe,
|
||||||
|
DecimalPipe,
|
||||||
MatButtonModule,
|
MatButtonModule,
|
||||||
MatCardModule,
|
MatCardModule,
|
||||||
MatDividerModule,
|
MatDividerModule,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Component, Input } from '@angular/core';
|
import { Component, Input } from '@angular/core';
|
||||||
import { NgForOf, NgIf } from '@angular/common';
|
|
||||||
import { MatCardModule } from '@angular/material/card';
|
import { MatCardModule } from '@angular/material/card';
|
||||||
|
|
||||||
import { CardColors } from 'src/app/core';
|
import { CardColors } from 'src/app/core';
|
||||||
@@ -7,7 +7,7 @@ import { CardColors } from 'src/app/core';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'app-card-container',
|
selector: 'app-card-container',
|
||||||
templateUrl: './card-container.component.html',
|
templateUrl: './card-container.component.html',
|
||||||
imports: [NgIf, NgForOf, MatCardModule],
|
imports: [MatCardModule],
|
||||||
})
|
})
|
||||||
export class CardContainerComponent {
|
export class CardContainerComponent {
|
||||||
errorList: string[] = [];
|
errorList: string[] = [];
|
||||||
|
|||||||
+51
-33
@@ -7,10 +7,12 @@
|
|||||||
<mat-icon fontIcon="more_vert"></mat-icon>
|
<mat-icon fontIcon="more_vert"></mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<mat-menu #menuJumpBar="matMenu">
|
<mat-menu #menuJumpBar="matMenu">
|
||||||
<button mat-menu-item *ngFor="let menuitem of menuItems.getMenuPanel()">
|
@for (menuitem of menuItems.getMenuPanel(); track menuitem) {
|
||||||
<mat-icon [fontIcon]="menuitem.icon"></mat-icon>
|
<button mat-menu-item>
|
||||||
<span>{{ menuitem.name }}</span>
|
<mat-icon [fontIcon]="menuitem.icon"></mat-icon>
|
||||||
</button>
|
<span>{{ menuitem.name }}</span>
|
||||||
|
</button>
|
||||||
|
}
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-divider class="my-3"></mat-divider>
|
<mat-divider class="my-3"></mat-divider>
|
||||||
@@ -34,51 +36,67 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th *ngFor="let name of seriesHeader; let i = index" class="text-end">{{ name }}</th>
|
@for (name of seriesHeader; track name) {
|
||||||
|
<th class="text-end">{{ name }}</th>
|
||||||
|
}
|
||||||
<th class="text-end">Total</th>
|
<th class="text-end">Total</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor="let values of seriesRow; let i = index">
|
@for (values of seriesRow; track $index; let i = $index) {
|
||||||
<th class="{{ seriesColorClass[i] }} text-end">● {{ seriesName[i] }}</th>
|
<tr>
|
||||||
<td *ngFor="let value of values; let i = index" class="font-monospace text-end">
|
<th class="{{ seriesColorClass[i] }} text-end">● {{ seriesName[i] }}</th>
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value }}</span>
|
@for (value of values; track $index) {
|
||||||
<ng-template #elseBlock
|
<td class="font-monospace text-end">
|
||||||
><span class="text-empty pr-1">{{ value }}</span></ng-template
|
@if (value) {
|
||||||
>
|
<span class="pr-1">{{ value }}</span>
|
||||||
</td>
|
} @else {
|
||||||
<th class="{{ seriesColorClass[i] }} font-monospace text-end">{{ seriesRowTotal[i] }}</th>
|
<span class="text-empty pr-1">{{ value }}</span>
|
||||||
</tr>
|
}
|
||||||
|
</td>
|
||||||
|
}
|
||||||
|
<th class="{{ seriesColorClass[i] }} font-monospace text-end">{{ seriesRowTotal[i] }}</th>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Total</th>
|
<th class="text-end">Total</th>
|
||||||
<th *ngFor="let value of seriesColTotal; let i = index" class="font-monospace text-end">
|
@for (value of seriesColTotal; track $index) {
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value }}</span>
|
<th class="font-monospace text-end">
|
||||||
<ng-template #elseBlock
|
@if (value) {
|
||||||
><span class="text-empty pr-1">{{ value }}</span></ng-template
|
<span class="pr-1">{{ value }}</span>
|
||||||
>
|
} @else {
|
||||||
</th>
|
<span class="text-empty pr-1">{{ value }}</span>
|
||||||
|
}
|
||||||
|
</th>
|
||||||
|
}
|
||||||
<th class="font-monospace text-end">{{ grandTotal }}</th>
|
<th class="font-monospace text-end">{{ grandTotal }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Moyenne</th>
|
<th class="text-end">Moyenne</th>
|
||||||
<th *ngFor="let value of seriesRowAvg; let i = index" class="font-monospace text-end">
|
@for (value of seriesRowAvg; track $index) {
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value | number: "1.0-1" }}</span>
|
<th class="font-monospace text-end">
|
||||||
<ng-template #elseBlock
|
@if (value) {
|
||||||
><span class="text-empty pr-1">{{ value | number: "1.0-1" }}</span></ng-template
|
<span class="pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
>
|
} @else {
|
||||||
</th>
|
<span class="text-empty pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
|
}
|
||||||
|
</th>
|
||||||
|
}
|
||||||
<th class="font-monospace text-end">{{ grandAvg | number: "1.0-1" }}</th>
|
<th class="font-monospace text-end">{{ grandAvg | number: "1.0-1" }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Moyenne <small>3 dernières années</small></th>
|
<th class="text-end">Moyenne <small>3 dernières années</small></th>
|
||||||
<th *ngFor="let value of seriesRowAvgLastYears; let i = index" class="font-monospace text-end">
|
@for (value of seriesRowAvgLastYears; track $index) {
|
||||||
<span *ngIf="value; else elseBlock" class="pr-1">{{ value | number: "1.0-1" }}</span>
|
<th class="font-monospace text-end">
|
||||||
<ng-template #elseBlock
|
@if (value) {
|
||||||
><span class="text-empty pr-1">{{ value | number: "1.0-1" }}</span></ng-template
|
<span class="pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
>
|
} @else {
|
||||||
</th>
|
<span class="text-empty pr-1">{{ value | number: "1.0-1" }}</span>
|
||||||
|
}
|
||||||
|
</th>
|
||||||
|
}
|
||||||
<th class="font-monospace text-end">{{ grandAvgLastYears | number: "1.0-1" }}</th>
|
<th class="font-monospace text-end">{{ grandAvgLastYears | number: "1.0-1" }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
|
|||||||
+1
-3
@@ -1,6 +1,6 @@
|
|||||||
import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core';
|
import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core';
|
||||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||||
import { NgFor, NgIf, DecimalPipe } from '@angular/common';
|
import { DecimalPipe } from '@angular/common';
|
||||||
import { MatButtonModule } from '@angular/material/button';
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
import { MatCardModule } from '@angular/material/card';
|
import { MatCardModule } from '@angular/material/card';
|
||||||
import { MatDividerModule } from '@angular/material/divider';
|
import { MatDividerModule } from '@angular/material/divider';
|
||||||
@@ -17,8 +17,6 @@ import { JumpByDate } from '@models';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'app-jumps-by-month',
|
selector: 'app-jumps-by-month',
|
||||||
imports: [
|
imports: [
|
||||||
NgFor,
|
|
||||||
NgIf,
|
|
||||||
DecimalPipe,
|
DecimalPipe,
|
||||||
MatButtonModule,
|
MatButtonModule,
|
||||||
MatCardModule,
|
MatCardModule,
|
||||||
|
|||||||
@@ -2,28 +2,36 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th *ngFor='let name of headers; let i=index' class="text-end"> {{name}} </th>
|
@for (name of headers; track name; let i = $index) {
|
||||||
|
<th class="text-end">{{ name }}</th>
|
||||||
|
}
|
||||||
<th class="text-end">Total</th>
|
<th class="text-end">Total</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor='let row of rows; let i=index'>
|
@for (row of rows; track row; let i = $index) {
|
||||||
<th class="{{colors[i]}} text-end"> ● {{ names[i] }} </th>
|
<tr>
|
||||||
<td *ngFor='let value of row; let i=index' class="font-monospace text-end">
|
<th class="{{ colors[i] }} text-end">● {{ names[i] }}</th>
|
||||||
<span class="{{ value === 0 ? 'text-empty pe-1' : 'pe-1'}}">{{ value }}</span>
|
@for (value of row; track value; let i = $index) {
|
||||||
</td>
|
<td class="font-monospace text-end">
|
||||||
<th class="{{colors[i]}} font-monospace text-end">
|
<span class="{{ value === 0 ? 'text-empty pe-1' : 'pe-1' }}">{{ value }}</span>
|
||||||
<span class="{{ values[i] === 0 ? 'text-empty pe-1' : 'pe-1'}}">{{ values[i] }}</span>
|
</td>
|
||||||
</th>
|
}
|
||||||
</tr>
|
<th class="{{ colors[i] }} font-monospace text-end">
|
||||||
|
<span class="{{ values[i] === 0 ? 'text-empty pe-1' : 'pe-1' }}">{{ values[i] }}</span>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-end">Total</th>
|
<th class="text-end">Total</th>
|
||||||
<th *ngFor='let value of seriesColTotal; let i=index' class="font-monospace text-end">
|
@for (value of seriesColTotal; track value; let i = $index) {
|
||||||
<span class="{{ value === 0 ? 'text-empty pe-1' : 'pe-1'}}">{{ value }}</span>
|
<th class="font-monospace text-end">
|
||||||
</th>
|
<span class="{{ value === 0 ? 'text-empty pe-1' : 'pe-1' }}">{{ value }}</span>
|
||||||
|
</th>
|
||||||
|
}
|
||||||
<th class="font-monospace text-end">{{ grandTotal }}</th>
|
<th class="font-monospace text-end">{{ grandTotal }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import { Component, Input, AfterContentChecked } from '@angular/core';
|
import { Component, Input, AfterContentChecked } from '@angular/core';
|
||||||
import { NgIf, NgFor } from '@angular/common';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
imports: [NgIf, NgFor],
|
imports: [],
|
||||||
selector: 'app-history-table',
|
selector: 'app-history-table',
|
||||||
templateUrl: './history-table.component.html',
|
templateUrl: './history-table.component.html',
|
||||||
styleUrls: [],
|
styleUrls: [],
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Component, Input } from '@angular/core';
|
import { Component, Input } from '@angular/core';
|
||||||
import { NgForOf, NgIf } from '@angular/common';
|
|
||||||
import { MatCardModule } from '@angular/material/card';
|
import { MatCardModule } from '@angular/material/card';
|
||||||
|
|
||||||
import { Errors } from 'src/app/core';
|
import { Errors } from 'src/app/core';
|
||||||
@@ -7,7 +7,7 @@ import { Errors } from 'src/app/core';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'app-list-errors',
|
selector: 'app-list-errors',
|
||||||
templateUrl: './list-errors.component.html',
|
templateUrl: './list-errors.component.html',
|
||||||
imports: [NgIf, NgForOf, MatCardModule],
|
imports: [MatCardModule],
|
||||||
})
|
})
|
||||||
export class ListErrorsComponent {
|
export class ListErrorsComponent {
|
||||||
errorList: string[] = [];
|
errorList: string[] = [];
|
||||||
|
|||||||
+2
-1
@@ -1,8 +1,9 @@
|
|||||||
|
import { provideZoneChangeDetection } from '@angular/core';
|
||||||
import { bootstrapApplication } from '@angular/platform-browser';
|
import { bootstrapApplication } from '@angular/platform-browser';
|
||||||
import { AppComponent } from './app/app.component';
|
import { AppComponent } from './app/app.component';
|
||||||
import { appConfig } from './app/app.config';
|
import { appConfig } from './app/app.config';
|
||||||
import '@angular/common/locales/global/fr';
|
import '@angular/common/locales/global/fr';
|
||||||
|
|
||||||
bootstrapApplication(AppComponent, appConfig)
|
bootstrapApplication(AppComponent, { ...appConfig, providers: [provideZoneChangeDetection(), ...appConfig.providers] })
|
||||||
.then(() => console.log(`Bootstrap success`))
|
.then(() => console.log(`Bootstrap success`))
|
||||||
.catch((err) => console.error(err));
|
.catch((err) => console.error(err));
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"module": "ES2022",
|
"module": "ES2022",
|
||||||
"useDefineForClassFields": false,
|
"useDefineForClassFields": false,
|
||||||
"lib": ["ES2022", "dom"],
|
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"resolveJsonModule": true
|
"resolveJsonModule": true
|
||||||
|
|||||||
Reference in New Issue
Block a user