From 11057ede998c3093de5373764f749add17e9f36b Mon Sep 17 00:00:00 2001
From: Mathias Chouet <mathias.chouet@irstea.fr>
Date: Tue, 5 May 2020 11:46:54 +0200
Subject: [PATCH] Added new component log-drawer

update Verificateur results with log-drawer
---
 src/app/app.module.ts                         |  4 +-
 .../log-drawer/log-drawer.component.html      | 24 +++++++++
 .../log-drawer/log-drawer.component.scss      | 41 ++++++++++++++++
 .../log-drawer/log-drawer.component.ts        | 49 +++++++++++++++++++
 .../pab-results-table.component.ts            |  4 +-
 .../verificateur-results.component.html       |  2 +-
 .../verificateur-results.component.ts         | 29 ++++++++---
 src/locale/messages.en.json                   | 27 +++++-----
 src/locale/messages.fr.json                   | 37 ++++++++------
 9 files changed, 178 insertions(+), 39 deletions(-)
 create mode 100644 src/app/components/log-drawer/log-drawer.component.html
 create mode 100644 src/app/components/log-drawer/log-drawer.component.scss
 create mode 100644 src/app/components/log-drawer/log-drawer.component.ts

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 2fb9161a8..5d9fd69fc 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -75,13 +75,14 @@ import { PabResultsComponent } from "./components/pab-results/pab-results.compon
 import { VerificateurResultsComponent } from "./components/verificateur-results/verificateur-results.component";
 import { PabResultsTableComponent } from "./components/pab-results/pab-results-table.component";
 import { ChartTypeSelectComponent } from "./components/results-chart/chart-type.component";
-import { LogComponent } from "./components/log/log.component";
 import { CalculatorListComponent } from "./components/calculator-list/calculator-list.component";
 import { ApplicationSetupComponent } from "./components/app-setup/app-setup.component";
 import { BaseParamInputComponent } from "./components/base-param-input/base-param-input.component";
 import { FixedResultsComponent } from "./components/fixedvar-results/fixed-results.component";
 import { VarResultsComponent } from "./components/fixedvar-results/var-results.component";
+import { LogComponent } from "./components/log/log.component";
 import { LogEntryComponent } from "./components/log-entry/log-entry.component";
+import { LogDrawerComponent } from './components/log-drawer/log-drawer.component';
 import { ParamLinkComponent } from "./components/param-link/param-link.component";
 import { PabProfileChartComponent } from "./components/pab-profile-chart/pab-profile-chart.component";
 import { PabTableComponent } from "./components/pab-table/pab-table.component";
@@ -211,6 +212,7 @@ const appRoutes: Routes = [
     JetResultsComponent,
     JetTrajectoryChartComponent,
     LogComponent,
+    LogDrawerComponent,
     LogEntryComponent,
     ModulesDiagramComponent,
     NgParamInputComponent,
diff --git a/src/app/components/log-drawer/log-drawer.component.html b/src/app/components/log-drawer/log-drawer.component.html
new file mode 100644
index 000000000..4b9bbd8ee
--- /dev/null
+++ b/src/app/components/log-drawer/log-drawer.component.html
@@ -0,0 +1,24 @@
+<div *ngIf="hasEntries">
+    <div class="hyd_log_drawer">
+        <!-- titre -->
+        <div class="titre">{{ uitextTitreJournal }}</div>
+        <!-- entrées du journal -->
+        <div class="log-entry" *ngFor="let entry of log">
+            <log-entry [_message]="entry.message"></log-entry>
+            <div *ngIf="entry.subLog.messages.length" class="drawer">
+                <div class="open-drawer">
+                    <span *ngIf="! entry.isOpen">
+                        <a (click)="entry.isOpen = true;">{{ uitextShowDetails }}</a>
+                    </span>
+                    <span *ngIf="entry.isOpen">
+                        <a (click)="entry.isOpen = false">{{ uitextHideDetails }}</a>
+                    </span>
+                </div>
+                <div class="drawer-contents" [hidden]="! entry.isOpen">
+                    <log-entry *ngFor="let m of entry.subLog.messages" [_message]="m"></log-entry>
+                </div>
+            </div>
+        </div>
+        
+    </div>
+</div>
diff --git a/src/app/components/log-drawer/log-drawer.component.scss b/src/app/components/log-drawer/log-drawer.component.scss
new file mode 100644
index 000000000..2ae464717
--- /dev/null
+++ b/src/app/components/log-drawer/log-drawer.component.scss
@@ -0,0 +1,41 @@
+:host {
+    display: block;
+}
+
+.hyd_log_drawer {
+    margin-top: 2.5em;
+    border: solid #ccc 1px;
+    border-radius: 2px;
+    padding: 1em;
+    padding-top : 1.3em;
+
+    > .log-entry {
+        margin-bottom: 1.5em;
+    }
+}
+
+.titre {
+    background-color: white;
+    border: 1px solid #ccc;
+    border-radius: 2px;
+    float: left;
+    font-weight: bold;
+    margin-bottom: -1em;
+    margin-top: -2.3em;
+    padding: 0.2em 0.5em;
+}
+
+.open-drawer {
+    margin-top: -6px;
+
+    a {
+        // text-decoration: underline;
+        cursor: pointer;
+    }
+}
+
+.drawer-contents {
+    margin-left: 1em;
+    border-left: solid #ddd 1px;
+    padding-left: 1em;
+}
diff --git a/src/app/components/log-drawer/log-drawer.component.ts b/src/app/components/log-drawer/log-drawer.component.ts
new file mode 100644
index 000000000..2394e46b8
--- /dev/null
+++ b/src/app/components/log-drawer/log-drawer.component.ts
@@ -0,0 +1,49 @@
+import { Component, Input } from "@angular/core";
+
+import { cLog, Message } from "jalhyd";
+
+import { I18nService } from "../../services/internationalisation.service";
+
+@Component({
+    selector: "log-drawer",
+    templateUrl: "./log-drawer.component.html",
+    styleUrls: [
+        "./log-drawer.component.scss"
+    ]
+})
+/** le log à tiroirs ! */
+export class LogDrawerComponent {
+
+    /** A list of log messages accompanied by a sub-log (multiple messages) */
+    public log: Array<{ message: Message, subLog: cLog }>;
+
+    // title to display above the log
+    @Input()
+    public logTitle: string;
+
+    constructor(
+        private intlService: I18nService,
+    ) {
+        this.log = [];
+    }
+
+    public get uitextTitreJournal(): string {
+        if (this.logTitle) {
+            return this.logTitle;
+        } else {
+            return this.intlService.localizeText("INFO_TITREJOURNAL");
+        }
+    }
+
+    public get hasEntries(): boolean {
+        return this.log !== undefined && this.log.length !== 0;
+    }
+
+    public get uitextShowDetails(): string {
+        return this.intlService.localizeText("INFO_LOG_SHOW_DETAILS");
+    }
+
+    public get uitextHideDetails(): string {
+        return this.intlService.localizeText("INFO_LOG_HIDE_DETAILS");
+    }
+}
diff --git a/src/app/components/pab-results/pab-results-table.component.ts b/src/app/components/pab-results/pab-results-table.component.ts
index 8fb591b99..45418cf16 100644
--- a/src/app/components/pab-results/pab-results-table.component.ts
+++ b/src/app/components/pab-results/pab-results-table.component.ts
@@ -1,6 +1,6 @@
 import { Component, ViewChild, ElementRef } from "@angular/core";
 
-import { CloisonAval, Result } from "jalhyd";
+import { CloisonAval, Result, capitalize } from "jalhyd";
 
 import { PabResults } from "../../results/pab-results";
 import { I18nService } from "../../services/internationalisation.service";
@@ -40,7 +40,7 @@ export class PabResultsTableComponent extends ResultsComponentDirective {
         const devices = re.sourceNub.getChildren();
         const jetTypes: string[] = devices.map((device) => {
             const jt = device.result.resultElements[vi].getValue("ENUM_StructureJetType");
-            let jetType = this.intlService.localizeText("INFO_ENUM_STRUCTUREJETTYPE_" + jt);
+            let jetType = capitalize(this.intlService.localizeText("INFO_ENUM_STRUCTUREJETTYPE_" + jt));
             if (devices.length > 1) {
                 // evil HTML injection in table cell (simpler)
                 jetType = this.intlService.localizeText("INFO_LIB_FS_OUVRAGE") + " n°"
diff --git a/src/app/components/verificateur-results/verificateur-results.component.html b/src/app/components/verificateur-results/verificateur-results.component.html
index dbe866617..1d0f78479 100644
--- a/src/app/components/verificateur-results/verificateur-results.component.html
+++ b/src/app/components/verificateur-results/verificateur-results.component.html
@@ -4,5 +4,5 @@
     <variable-results-selector [results]="verificateurResults" (indexChange)="variableIndexChanged()">
     </variable-results-selector>
 
-    <log #iterationLog></log>
+    <log-drawer #iterationLog></log-drawer>
 </div>
diff --git a/src/app/components/verificateur-results/verificateur-results.component.ts b/src/app/components/verificateur-results/verificateur-results.component.ts
index 8a00642cc..c79542673 100644
--- a/src/app/components/verificateur-results/verificateur-results.component.ts
+++ b/src/app/components/verificateur-results/verificateur-results.component.ts
@@ -1,6 +1,6 @@
 import { Component, ViewChild, DoCheck } from "@angular/core";
 
-import { cLog } from "jalhyd";
+import { cLog, Message } from "jalhyd";
 
 import { LogComponent } from "../log/log.component";
 import { CalculatorResults } from "../../results/calculator-results";
@@ -8,6 +8,7 @@ import { VariableResultsSelectorComponent } from "../variable-results-selector/v
 import { I18nService } from "../../services/internationalisation.service";
 import { VerificateurResults } from "../../results/verificateur-results";
 import { ResultsComponentDirective } from '../fixedvar-results/results.component';
+import { LogDrawerComponent } from "../log-drawer/log-drawer.component";
 
 @Component({
     selector: "verificateur-results",
@@ -31,7 +32,7 @@ export class VerificateurResultsComponent extends ResultsComponentDirective impl
     private generalLogComponent: LogComponent;
 
     @ViewChild("iterationLog")
-    private iterationLogComponent: LogComponent;
+    private iterationLogComponent: LogDrawerComponent;
 
     constructor(
         private i18nService: I18nService,
@@ -95,24 +96,36 @@ export class VerificateurResultsComponent extends ResultsComponentDirective impl
      * Retourne les messages à afficher dans le composant de log "du bas" : logs de l'itération
      * en cours (messages non-globaux du Vérificateur et eds Espèce), que le résultat varie ou non
      */
-    private get iterationLog(): cLog {
-        const l = new cLog();
+    private get iterationLog(): Array<{ message: Message, subLog: cLog }> {
+        const l: Array<{ message: Message, subLog: cLog }> = [];
         if (this._verificateurResults) {
             // = 0 lorsque rien ne varie
             const vi = this._verificateurResults.variableIndex;
             // log du Verificateur pour l'itération en cours
+            const element = { message: Message, subLog: cLog };
             if (
                 this._verificateurResults.result
                 && this._verificateurResults.result.hasResultElements()
                 && this._verificateurResults.result.resultElements[vi]
                 && this._verificateurResults.result.resultElements[vi].hasLog()
             ) {
-                l.addLog(this._verificateurResults.result.resultElements[vi].log);
+                // every log message of Verificateur is supposed to always be a status message for the nth Espece
+                const verLog: cLog = this._verificateurResults.result.resultElements[vi].log;
+                for (const vm of verLog.messages) {
+                    l.push({
+                        message: vm,
+                        subLog: new cLog()
+                    });
+                }
+            }
+            // logs des Espece pour l'itération en cours; l.length devrait toujours être égal à this._verificateurResults.especeResults.length
+            if (l.length !== this._verificateurResults.especeResults.length) {
+                throw new Error("VerificateurResultsComponent: l.length !== this._verificateurResults.especeResults.length (" + l.length + " / " + this._verificateurResults.especeResults.length) + ")";
             }
-            // logs des Espece pour l'itération en cours
-            for (const er of this._verificateurResults.especeResults) {
+            for (let i = 0; i < this._verificateurResults.especeResults.length; i++) {
+                const er = this._verificateurResults.especeResults[i];
                 if (er && er.hasResultElements() && er.resultElements[vi].hasLog()) {
-                    l.addLog(er.resultElements[vi].log);
+                    l[i].subLog.addLog(er.resultElements[vi].log);
                 }
             }
         }
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 9184c785d..8f6a2e6fa 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -168,9 +168,9 @@
     "INFO_ENUM_STRUCTUREFLOWREGIME_1": "Partially submerged",
     "INFO_ENUM_STRUCTUREFLOWREGIME_2": "Submerged",
     "INFO_ENUM_STRUCTUREFLOWREGIME_3": "Zero flow",
-    "INFO_ENUM_STRUCTUREJETTYPE_0": "Diving",
-    "INFO_ENUM_STRUCTUREJETTYPE_1": "Surface",
-    "INFO_ENUM_STRUCTUREJETTYPE_2": "Not applicable",
+    "INFO_ENUM_STRUCTUREJETTYPE_0": "diving",
+    "INFO_ENUM_STRUCTUREJETTYPE_1": "surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_2": "not applicable",
     "INFO_CHART_BUTTON_TITLE_RESET_ZOOM": "Restore default zoom",
     "INFO_CHART_BUTTON_TITLE_EXPORT_IMAGE": "Save picture",
     "INFO_CHART_BUTTON_TITLE_ENTER_FS": "Display fullscreen",
@@ -612,17 +612,19 @@
     "WARNING_VERIF_MRC_VMAX_APRON_N": "Apron #%N%: maximum speed %V% too high (maximum: %maxV%)",
     "WARNING_VERIF_MRC_YMIN_APRON_N": "Apron #%N%: water level %Y% too low (minimum: %minY%)",
     "ERROR_VERIF_NO_PRESET": "This species group is not compatible with this pass type",
-    "ERROR_VERIF_PAB_DHMAX": "Wall #%N%: fall %DH% too high (maximum for surface jet: %maxDHS%, maximum for diving jet&nbsp;: %maxDHP%)",
-    "ERROR_VERIF_PAB_DHMAX_DW": "Downwall: fall %DH% too high (maximum for surface jet: %maxDHS%, maximum for diving jet&nbsp;: %maxDHP%)",
-    "ERROR_VERIF_PAB_DHMAX_JET": "Wall #%N%: fall %DH% too high for jet type %jetType% (maximum: %maxDH%)",
-    "ERROR_VERIF_PAB_DHMAX_JET_DW":"Downwall: fall %DH% too high for jet type %jetType% (maximum: %maxDH%)",
-    "WARNING_VERIF_PAB_DHMAX_JET": "Wall #%N%: fall %DH% too high for jet type %jetType% (maximum: %maxDH%)",
-    "WARNING_VERIF_PAB_DHMAX_JET_DW": "Downwall: fall %DH% too high for jet type %jetType% (maximum: %maxDH%)",
+    "ERROR_VERIF_PAB_DHMAX": "Wall #%N%: fall %DH% too high (maximum for surface jet: %maxDHS%, maximum for diving jet: %maxDHP%)",
+    "ERROR_VERIF_PAB_DHMAX_DW": "Downwall: fall %DH% too high (maximum for surface jet: %maxDHS%, maximum for diving jet: %maxDHP%)",
+    "ERROR_VERIF_PAB_DHMAX_JET": "Wall #%N%: fall %DH% too high for jet type ENUM_STRUCTUREJETTYPE_%jetType% (maximum: %maxDH%)",
+    "ERROR_VERIF_PAB_DHMAX_JET_DW":"Downwall: fall %DH% too high for jet type ENUM_STRUCTUREJETTYPE_%jetType% (maximum: %maxDH%)",
+    "WARNING_VERIF_PAB_DHMAX_JET": "Wall #%N%: fall %DH% too high for jet type ENUM_STRUCTUREJETTYPE_%jetType% (maximum: %maxDH%)",
+    "WARNING_VERIF_PAB_DHMAX_JET_DW": "Downwall: fall %DH% too high for jet type ENUM_STRUCTUREJETTYPE_%jetType% (maximum: %maxDH%)",
     "ERROR_VERIF_PAB_BMIN": "Wall #%NC%, structure %NS%: slot/weir width %L% too low (minimum: %minB%)",
     "ERROR_VERIF_PAB_BMIN_DW": "Downwall, structure %NS%: slot/weir width %L% too low (minimum: %minB%)",
     "WARNING_VERIF_PAB_BMIN": "Wall #%NC%, structure %NS%: slot/weir width %L% too low (minimum: %minB%)",
     "WARNING_VERIF_PAB_BMIN_DW": "Downwall, structure %NS%: slot/weir width %L% too low (minimum: %minB%)",
-    "ERROR_VERIF_PAB_LMIN": "Wall #%N%: basin length %LB% too low (minimum: %minLB%)",
+    "ERROR_VERIF_PAB_LMIN": "Wall #%N%: basin length %LB% too low (minimum for surface jet: %minLBS%, minimum for diving jet: %minLBS%)",
+    "ERROR_VERIF_PAB_LMIN_JET": "Wall #%N%: basin length %LB% too low for jet type ENUM_STRUCTUREJETTYPE_%jetType% (minimum: %minLB%)",
+    "WARNING_VERIF_PAB_LMIN_JET": "Wall #%N%: basin length %LB% too low for jet type ENUM_STRUCTUREJETTYPE_%jetType% (minimum: %minLB%)",
     "ERROR_VERIF_PAB_HMIN": "Wall #%NC%, structure %NS%: head on weir %h1% too low (minimum: %minH%)",
     "ERROR_VERIF_PAB_HMIN_DW": "Downwall, structure %NS%: head on weir %h1% too low (minimum: %minH%)",
     "WARNING_VERIF_PAB_HMIN": "Wall #%NC%, structure %NS%: head on weir %h1% too low (minimum: %minH%)",
@@ -631,8 +633,11 @@
     "ERROR_VERIF_PAB_SMIN_DW": "Downwall, structure %NS%: orifice surface %S% is too low (minimum: %minS%)",
     "WARNING_VERIF_PAB_SMIN": "Wall #%NC%, structure %NS%: orifice surface %S% is too low (minimum: %minS%)",
     "WARNING_VERIF_PAB_SMIN_DW": "Downwall, structure %NS%: orifice surface %S% is too low (minimum: %minS%)",
-    "ERROR_VERIF_PAB_YMOY": "Wall #%N%: basin depth %PB% too low (minimum: %minPB%)",
+    "ERROR_VERIF_PAB_YMOY": "Wall #%N%: basin depth %PB% too low (minimum for surface jet: %minPBS%, minimum for diving jet: %minPBP%)",
+    "ERROR_VERIF_PAB_YMOY_JET": "Wall #%N%: basin depth %PB% too low for jet type ENUM_STRUCTUREJETTYPE_%jetType% (minimum: %minPB%)",
+    "WARNING_VERIF_PAB_YMOY_JET": "Wall #%N%: basin depth %PB% too low for jet type ENUM_STRUCTUREJETTYPE_%jetType% (minimum: %minPB%)",
     "ERROR_VERIF_PAB_YMOY_2_DH": "Wall #%N%: basin depth %PB% lower than 2x fall %DH%",
+    "WARNING_VERIF_PAB_YMOY_2_DH": "Wall #%N%: basin depth %PB% lower than 2x fall %DH%",
     "ERROR_VERIF_PAR_DH": "Downstream pass fall prevents crossability",
     "ERROR_VERIF_PAR_YMIN": "Water level %h% too low (minimum: %minY%)",
     "ERROR_VERIF_KO": "Crossability criteria are not met for at least one species group",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index fb1deb92f..14a4a2934 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -168,9 +168,9 @@
     "INFO_ENUM_STRUCTUREFLOWREGIME_1": "Partiellement noyé",
     "INFO_ENUM_STRUCTUREFLOWREGIME_2": "Noyé",
     "INFO_ENUM_STRUCTUREFLOWREGIME_3": "Débit nul",
-    "INFO_ENUM_STRUCTUREJETTYPE_0": "Plongeant",
-    "INFO_ENUM_STRUCTUREJETTYPE_1": "De surface",
-    "INFO_ENUM_STRUCTUREJETTYPE_2": "Sans objet",
+    "INFO_ENUM_STRUCTUREJETTYPE_0": "plongeant",
+    "INFO_ENUM_STRUCTUREJETTYPE_1": "de surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_2": "sans objet",
     "INFO_CHART_BUTTON_TITLE_RESET_ZOOM": "Réinitialiser le zoom",
     "INFO_CHART_BUTTON_TITLE_EXPORT_IMAGE": "Enregistrer l'image",
     "INFO_CHART_BUTTON_TITLE_ENTER_FS": "Afficher en plein écran",
@@ -615,15 +615,17 @@
     "ERROR_VERIF_NO_PRESET": "Ce groupe d'espèces n'est pas compatible avec ce type de passe",
     "ERROR_VERIF_PAB_DHMAX": "Cloison n°%N%&nbsp;: chute %DH% trop importante (maximum pour jet de surface&nbsp;: %maxDHS%, maximum pour jet plongeant&nbsp;: %maxDHP%)",
     "ERROR_VERIF_PAB_DHMAX_DW": "Cloison aval&nbsp;: chute %DH% trop importante (maximum pour jet de surface&nbsp;: %maxDHS%, maximum pour jet plongeant&nbsp;: %maxDHP%)",
-    "ERROR_VERIF_PAB_DHMAX_JET": "Cloison n°%N%&nbsp;: chute %DH% trop importante pour le jet %jetType% (maximum&nbsp;: %maxDH%)",
-    "ERROR_VERIF_PAB_DHMAX_JET_DW":"Cloison aval&nbsp;: chute %DH% trop importante pour le jet %jetType% (maximum&nbsp;: %maxDH%)",
-    "WARNING_VERIF_PAB_DHMAX_JET": "Cloison n°%N%&nbsp;: chute %DH% trop importante pour le jet %jetType% (maximum&nbsp;: %maxDH%)",
-    "WARNING_VERIF_PAB_DHMAX_JET_DW": "Cloison aval&nbsp;: chute %DH% trop importante pour le jet %jetType% (maximum&nbsp;: %maxDH%)",
+    "ERROR_VERIF_PAB_DHMAX_JET": "Cloison n°%N%&nbsp;: chute %DH% trop importante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (maximum&nbsp;: %maxDH%)",
+    "ERROR_VERIF_PAB_DHMAX_JET_DW":"Cloison aval&nbsp;: chute %DH% trop importante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (maximum&nbsp;: %maxDH%)",
+    "WARNING_VERIF_PAB_DHMAX_JET": "Cloison n°%N%&nbsp;: chute %DH% trop importante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (maximum&nbsp;: %maxDH%)",
+    "WARNING_VERIF_PAB_DHMAX_JET_DW": "Cloison aval&nbsp;: chute %DH% trop importante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (maximum&nbsp;: %maxDH%)",
     "ERROR_VERIF_PAB_BMIN": "Cloison n°%NC%, ouvrage %NS%&nbsp;: largeur de l'échancrure ou de la fente %L% insuffisante (minimum&nbsp;: %minB%)",
     "ERROR_VERIF_PAB_BMIN_DW": "Cloison aval, ouvrage %NS%&nbsp;: largeur de l'échancrure ou de la fente %L% insuffisante (minimum&nbsp;: %minB%)",
     "WARNING_VERIF_PAB_BMIN": "Cloison n°%NC%, ouvrage %NS%&nbsp;: largeur de l'échancrure ou de la fente %L% insuffisante (minimum&nbsp;: %minB%)",
     "WARNING_VERIF_PAB_BMIN_DW": "Cloison aval, ouvrage %NS%&nbsp;: largeur de l'échancrure ou de la fente %L% insuffisante (minimum&nbsp;: %minB%)",
-    "ERROR_VERIF_PAB_LMIN": "Cloison n°%N%&nbsp;: longueur de bassin %LB% insuffisante (minimum&nbsp;: %minLB%)",
+    "ERROR_VERIF_PAB_LMIN": "Cloison n°%N%&nbsp;: longueur de bassin %LB% insuffisante (minimum pour jet de surface&nbsp;: %minLBS%, minimum pour jet plongeant&nbsp;: %minLBP%)",
+    "ERROR_VERIF_PAB_LMIN_JET": "Cloison n°%N%&nbsp;: longueur de bassin %LB% insuffisante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (minimum&nbsp;: %minLB%)",
+    "WARNING_VERIF_PAB_LMIN_JET": "Cloison n°%N%&nbsp;: longueur de bassin %LB% insuffisante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (minimum&nbsp;: %minLB%)",
     "ERROR_VERIF_PAB_HMIN": "Cloison n°%NC%, ouvrage %NS%&nbsp;: charge sur l'échancrure %h1% insuffisante (minimum&nbsp;: %minH%)",
     "ERROR_VERIF_PAB_HMIN_DW": "Cloison aval, ouvrage %NS%&nbsp;: charge sur l'échancrure %h1% insuffisante (minimum&nbsp;: %minH%)",
     "WARNING_VERIF_PAB_HMIN": "Cloison n°%NC%, ouvrage %NS%&nbsp;: charge sur l'échancrure %h1% insuffisante (minimum&nbsp;: %minH%)",
@@ -632,18 +634,21 @@
     "ERROR_VERIF_PAB_SMIN_DW": "Cloison aval, ouvrage %NS%&nbsp;: surface de l'orifice %S% insuffisante (minimum: %minS%)",
     "WARNING_VERIF_PAB_SMIN": "Cloison n°%NC%, ouvrage %NS%&nbsp;: surface de l'orifice %S% insuffisante (minimum: %minS%)",
     "WARNING_VERIF_PAB_SMIN_DW": "Cloison aval, ouvrage %NS%&nbsp;: surface de l'orifice %S% insuffisante (minimum: %minS%)",
-    "ERROR_VERIF_PAB_YMOY": "Cloison n°%N%&nbsp;: profondeur de bassin %PB% insuffisante (minimum&nbsp;: %minPB%)",
+    "ERROR_VERIF_PAB_YMOY": "Cloison n°%N%&nbsp;: profondeur de bassin %PB% insuffisante (minimum pour jet de surface&nbsp;: %minPBS%, minimum pour jet plongeant&nbsp;: %minPBP%)",
+    "ERROR_VERIF_PAB_YMOY_JET": "Cloison n°%N%&nbsp;: profondeur de bassin %PB% insuffisante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (minimum&nbsp;: %minPB%)",
+    "WARNING_VERIF_PAB_YMOY_JET": "Cloison n°%N%&nbsp;: profondeur de bassin %PB% insuffisante pour le jet ENUM_STRUCTUREJETTYPE_%jetType% (minimum&nbsp;: %minPB%)",
     "ERROR_VERIF_PAB_YMOY_2_DH": "Cloison n°%N%&nbsp;: profondeur de bassin %PB% inférieure à 2x la chute %DH%",
+    "WARNING_VERIF_PAB_YMOY_2_DH": "Cloison n°%N%&nbsp;: profondeur de bassin %PB% inférieure à 2x la chute %DH%",
     "ERROR_VERIF_PAR_DH": "La chute en pied de passe empêche le franchissement",
     "ERROR_VERIF_PAR_YMIN": "Tirant d'eau %h% insuffisant (minimum&nbsp;: %minY%)",
     "ERROR_VERIF_KO": "Le franchissement est impossible pour au moins un groupe d'espèces",
-    "ERROR_VERIF_SPECIES_GROUP_KO": "Le franchissement est impossible pour le groupe d'espèces ENUM_%speciesGroup%",
-    "WARNING_VERIF_SPECIES_GROUP_OK_BUT": "Le franchissement est possible pour le groupe d'espèces ENUM_%speciesGroup%, mais il y a des avertissements",
-    "INFO_VERIF_SPECIES_GROUP_OK": "Le franchissement est possible pour le groupe d'espèces ENUM_%speciesGroup%",
-    "ERROR_VERIF_SPECIES_NUB_KO": "Le franchissement est impossible pour l'espèce personnalisée FORM_ID_%uid%",
-    "WARNING_VERIF_SPECIES_NUB_OK_BUT": "Le franchissement est possible pour l'espèce personnalisée FORM_ID_%uid%, mais il y a des avertissements",
-    "INFO_VERIF_SPECIES_NUB_OK": "Le franchissement est possible pour l'espèce personnalisée FORM_ID_%uid%",
-    "ERROR_VERIF_PAB_WALLS_NOT_CROSSABLE": "La cloison n°%N% n'est pas franchissable",
+    "ERROR_VERIF_SPECIES_GROUP_KO": "ENUM_%speciesGroup% : franchissement impossible",
+    "WARNING_VERIF_SPECIES_GROUP_OK_BUT": "ENUM_%speciesGroup% : OK, avec des avertissements",
+    "INFO_VERIF_SPECIES_GROUP_OK": "ENUM_%speciesGroup% : OK",
+    "ERROR_VERIF_SPECIES_NUB_KO": "FORM_ID_%uid%&nbsp;: franchissement impossible",
+    "WARNING_VERIF_SPECIES_NUB_OK_BUT": "FORM_ID_%uid%&nbsp;: OK, avec des avertissements",
+    "INFO_VERIF_SPECIES_NUB_OK": "FORM_ID_%uid%&nbsp;: OK",
+    "ERROR_VERIF_PAB_WALL_NOT_CROSSABLE": "La cloison n°%N% n'est pas franchissable",
     "ERROR_VERIF_PAB_DW_NOT_CROSSABLE": "La cloison aval n'est pas franchissable",
     "WARNING_VERIF_PAR_SPECIES_GROUP": "Les groupes d'espèces 3a, 3b et 7b sont déconseillés pour ce type de passe"
 }
-- 
GitLab