Skip to content
Snippets Groups Projects
Commit 5996ec78 authored by mathias.chouet's avatar mathias.chouet
Browse files

Fix #167

parent 209b9cbc
No related branches found
No related tags found
1 merge request!40Resolve "Amélioration du système de paramètres liés"
...@@ -19,6 +19,7 @@ import { ...@@ -19,6 +19,7 @@ import {
MatCardModule, MatCardModule,
MatTableModule, MatTableModule,
MatSnackBarModule, MatSnackBarModule,
MatBadgeModule,
ErrorStateMatcher, ErrorStateMatcher,
MatButtonToggleModule MatButtonToggleModule
} from "@angular/material"; } from "@angular/material";
...@@ -104,6 +105,7 @@ const appRoutes: Routes = [ ...@@ -104,6 +105,7 @@ const appRoutes: Routes = [
ChartModule, ChartModule,
HttpClientModule, HttpClientModule,
FlexLayoutModule, FlexLayoutModule,
MatBadgeModule,
MatButtonModule, MatButtonModule,
MatButtonToggleModule, MatButtonToggleModule,
MatCardModule, MatCardModule,
......
...@@ -13,7 +13,8 @@ ...@@ -13,7 +13,8 @@
</mat-form-field> </mat-form-field>
<div class="cb-container"> <div class="cb-container">
<mat-checkbox [name]="c.uid" *ngFor="let c of calculators" [(ngModel)]="c.selected" [ngModelOptions]="{standalone: true}"> <mat-checkbox [name]="c.uid" *ngFor="let c of calculators" (change)="checkLinkedParamsDependencies()"
[(ngModel)]="c.selected" [ngModelOptions]="{standalone: true}">
{{ c.title }} {{ c.title }}
</mat-checkbox> </mat-checkbox>
</div> </div>
...@@ -26,6 +27,20 @@ ...@@ -26,6 +27,20 @@
{{ uitextNone }} {{ uitextNone }}
</button> </button>
</div> </div>
<div class="dependencies-problems" *ngIf="dependenciesProblems.length > 0">
<mat-list role="list">
<mat-list-item role="listitem" *ngFor="let dp of dependenciesProblems">
<mat-icon color="warn">error_outline</mat-icon> {{ dp.message }}
</mat-list-item>
</mat-list>
<p>
<button mat-raised-button (click)="fixDependencies()"
[matBadge]="dependenciesProblems.length" matBadgeColor="warn">
{{ uitextFixMissingDependencies }}
</button>
</p>
</div>
</div> </div>
<div mat-dialog-actions> <div mat-dialog-actions>
......
...@@ -17,3 +17,24 @@ mat-form-field { ...@@ -17,3 +17,24 @@ mat-form-field {
margin-right: 5px; margin-right: 5px;
} }
} }
.dependencies-problems {
.mat-list-base {
padding-top: 0;
.mat-list-item {
height: 32px;
font-size: .9em;
::ng-deep .mat-list-item-content {
padding-left: 0;
mat-icon {
transform: scale(0.8);
margin-right: 5px;
}
}
}
}
}
...@@ -17,6 +17,8 @@ export class DialogLoadSessionComponent { ...@@ -17,6 +17,8 @@ export class DialogLoadSessionComponent {
public loadSessionForm: FormGroup; public loadSessionForm: FormGroup;
public dependenciesProblems: any[] = [];
constructor( constructor(
public dialogRef: MatDialogRef<DialogLoadSessionComponent>, public dialogRef: MatDialogRef<DialogLoadSessionComponent>,
private intlService: I18nService, private intlService: I18nService,
...@@ -40,6 +42,74 @@ export class DialogLoadSessionComponent { ...@@ -40,6 +42,74 @@ export class DialogLoadSessionComponent {
} }
} }
public checkLinkedParamsDependencies() {
this.dependenciesProblems = [];
// for all checked Nubs
this.calculators.forEach((c) => {
if (c.selected) {
// do all required nubs are checked ?
c.requires.forEach((r) => {
if (! this.isCalculatorOrParentSelected(r)) {
const realUid = this.getUidOrParentUid(r);
const depTitle = this.getTitleFromUid(realUid);
this.dependenciesProblems.push({
requiring: c.title,
required: depTitle,
requiredUid: realUid,
message: c.title + " " + this.intlService.localizeText("INFO_REQUIRES") + " " + depTitle
});
}
});
}
});
}
public fixDependencies() {
for (const dp of this.dependenciesProblems) {
this.selectRequiredModule(dp.requiredUid);
}
}
private isCalculatorOrParentSelected(uid: string): boolean {
let isSelected = false;
this.calculators.forEach((c) => {
if (c.uid === uid || c.children.includes(uid)) {
isSelected = c.selected;
}
});
return isSelected;
}
private getUidOrParentUid(uid: string): string {
let realUid: string;
this.calculators.forEach((c) => {
if (c.uid === uid || c.children.includes(uid)) {
realUid = c.uid;
}
});
return realUid;
}
private getTitleFromUid(uid: string): string {
let title: string;
this.calculators.forEach((c) => {
if (c.uid === uid) {
title = c.title;
}
});
return title;
}
private selectRequiredModule(uid: string) {
this.calculators.forEach((c) => {
if (c.uid === uid) {
c.selected = true;
}
});
// re-run dependency checking
this.checkLinkedParamsDependencies();
}
public onFileSelected(event: any) { public onFileSelected(event: any) {
if (event.target.files && event.target.files.length) { if (event.target.files && event.target.files.length) {
this.file = event.target.files[0]; this.file = event.target.files[0];
...@@ -94,4 +164,8 @@ export class DialogLoadSessionComponent { ...@@ -94,4 +164,8 @@ export class DialogLoadSessionComponent {
public get uitextLoadSessionTitle() { public get uitextLoadSessionTitle() {
return this.intlService.localizeText("INFO_DIALOG_LOAD_SESSION_TITLE"); return this.intlService.localizeText("INFO_DIALOG_LOAD_SESSION_TITLE");
} }
public get uitextFixMissingDependencies() {
return this.intlService.localizeText("INFO_DIALOG_FIX_MISSING_DEPENDENCIES");
}
} }
...@@ -451,16 +451,13 @@ export class FormulaireService extends Observable { ...@@ -451,16 +451,13 @@ export class FormulaireService extends Observable {
private readSingleFile(file: File): Promise<any> { private readSingleFile(file: File): Promise<any> {
return new Promise<any>((resolve, reject) => { return new Promise<any>((resolve, reject) => {
const fr = new FileReader(); const fr = new FileReader();
fr.onload = () => { fr.onload = () => {
resolve(fr.result); resolve(fr.result);
}; };
fr.onerror = () => { fr.onerror = () => {
fr.abort(); fr.abort();
reject(new Error(`Erreur de lecture du fichier ${file.name}`)); reject(new Error(`Erreur de lecture du fichier ${file.name}`));
}; };
fr.readAsText(file); fr.readAsText(file);
}); });
} }
...@@ -507,10 +504,27 @@ export class FormulaireService extends Observable { ...@@ -507,10 +504,27 @@ export class FormulaireService extends Observable {
// liste des noms de modules de calcul // liste des noms de modules de calcul
if (data.session && Array.isArray(data.session)) { if (data.session && Array.isArray(data.session)) {
data.session.forEach((e: any) => { data.session.forEach((e: any) => {
res.push({ const nubInfo = {
uid: e.uid, uid: e.uid,
title: e.meta && e.meta.title ? e.meta.title : undefined title: e.meta && e.meta.title ? e.meta.title : undefined,
}); requires: [],
children: []
};
// list linked params dependencies for each Nub
if (e.parameters) {
e.parameters.forEach((p) => {
if (p.targetNub && ! nubInfo.requires.includes(p.targetNub)) {
nubInfo.requires.push(p.targetNub);
}
});
}
// list children nubs for each Nub
if (e.structures) {
e.structures.forEach((p) => {
nubInfo.children.push(p.uid);
});
}
res.push(nubInfo);
}); });
} }
return res; return res;
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
"INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_2": "Submerged", "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_2": "Submerged",
"INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_3": "Zero flow", "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_3": "Zero flow",
"INFO_DIALOG_COMPUTED_VALUE_TITLE": "Edit initial value", "INFO_DIALOG_COMPUTED_VALUE_TITLE": "Edit initial value",
"INFO_DIALOG_FIX_MISSING_DEPENDENCIES": "Fix missing dependencies",
"INFO_DIALOG_LOAD_SESSION_FILENAME": "Choose a file", "INFO_DIALOG_LOAD_SESSION_FILENAME": "Choose a file",
"INFO_DIALOG_LOAD_SESSION_TITLE": "Load calculator modules", "INFO_DIALOG_LOAD_SESSION_TITLE": "Load calculator modules",
"INFO_DIALOG_SAVE_SESSION_FILENAME": "File name", "INFO_DIALOG_SAVE_SESSION_FILENAME": "File name",
...@@ -196,6 +197,7 @@ ...@@ -196,6 +197,7 @@
"INFO_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m", "INFO_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m",
"INFO_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m", "INFO_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m",
"INFO_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin% and %xmax% m", "INFO_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin% and %xmax% m",
"INFO_REQUIRES": "requires",
"INFO_SECTIONPARAMETREE_TITRE": "Parametric section", "INFO_SECTIONPARAMETREE_TITRE": "Parametric section",
"INFO_SECTIONPARAMETREE_TITRE_COURT": "Param. section", "INFO_SECTIONPARAMETREE_TITRE_COURT": "Param. section",
"INFO_SETUP_NEWTON_MAX_ITER": "Newton iteration limit", "INFO_SETUP_NEWTON_MAX_ITER": "Newton iteration limit",
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
"INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_2": "Noyé", "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_2": "Noyé",
"INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_3": "Débit nul", "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_3": "Débit nul",
"INFO_DIALOG_COMPUTED_VALUE_TITLE": "Modifier la valeur initiale", "INFO_DIALOG_COMPUTED_VALUE_TITLE": "Modifier la valeur initiale",
"INFO_DIALOG_FIX_MISSING_DEPENDENCIES": "Résoudre les dépendances",
"INFO_DIALOG_LOAD_SESSION_FILENAME": "Choisir un fichier", "INFO_DIALOG_LOAD_SESSION_FILENAME": "Choisir un fichier",
"INFO_DIALOG_LOAD_SESSION_TITLE": "Charger des modules de calcul", "INFO_DIALOG_LOAD_SESSION_TITLE": "Charger des modules de calcul",
"INFO_DIALOG_SAVE_SESSION_FILENAME": "Nom de fichier", "INFO_DIALOG_SAVE_SESSION_FILENAME": "Nom de fichier",
...@@ -196,6 +197,7 @@ ...@@ -196,6 +197,7 @@
"INFO_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m", "INFO_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m",
"INFO_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m", "INFO_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m",
"INFO_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin% et %xmax% m", "INFO_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin% et %xmax% m",
"INFO_REQUIRES": "dépend de",
"INFO_SECTIONPARAMETREE_TITRE": "Section paramétrée", "INFO_SECTIONPARAMETREE_TITRE": "Section paramétrée",
"INFO_SECTIONPARAMETREE_TITRE_COURT": "Sec. param.", "INFO_SECTIONPARAMETREE_TITRE_COURT": "Sec. param.",
"INFO_SETUP_NEWTON_MAX_ITER": "Newton : nombre d'itérations maximum", "INFO_SETUP_NEWTON_MAX_ITER": "Newton : nombre d'itérations maximum",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment