From 8a2dd6b54e7f5d5294a5ed1e338b74efce674cfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr>
Date: Wed, 1 Feb 2023 10:15:01 +0100
Subject: [PATCH] fix: session file with single Lechapt-Calmon nub not properly
 imported

refs #334
---
 src/session.ts | 56 ++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 45 insertions(+), 11 deletions(-)

diff --git a/src/session.ts b/src/session.ts
index ac886dc3..f9f6ef3b 100644
--- a/src/session.ts
+++ b/src/session.ts
@@ -322,22 +322,56 @@ export class Session {
         return foundNub;
     }
 
+    private static parameterIndex(obj: any, symbol: string): number {
+        let i;
+        const prms = obj["parameters"];
+        for (i in prms) {
+            if (prms[i]["symbol"] === symbol) {
+                return +i;
+            }
+        }
+        return -1;
+    }
+
     /**
      * Calcule le type de calculette compatible et modifie les propriétés en conséquence.
      * Permet de charger des fichiers session avec une version antérieure.
      * Par ex : Lechapt-Calmon -> PressureLoss
      */
-    public static compatibleCalculatorProps(props: IProperties): IProperties {
-        const ct: CalculatorType = props.getPropValue("calcType");
-        switch (ct) {
+    private compatibleCalculator(obj: any): any {
+        switch (obj["props"]["calcType"]) {
             case CalculatorType.LechaptCalmon:
-                const newProps: Props = new Props(props);
-                newProps.setPropValue("calcType", CalculatorType.PressureLoss);
-                newProps.setPropValue("pressureLossType", PressureLossType.LechaptCalmon);
-                return newProps;
+                // create parent PressureLoss nub
+                const plProps = new Props();
+                plProps.setPropValue("calcType", CalculatorType.PressureLoss);
+                const pl = this.createNub(plProps);
+
+                // JSON representation
+                let res: any = pl.objectRepresentation();
+
+                // set Lechapt-Calmon as child
+                res["children"] = [obj];
+
+                // move PressureLoss parameters from Lechapt-Calmon
+                const movedParams = ["Q", "D", "J", "Lg", "Kloc"];
+                for (const p of movedParams) {
+                    // if child has parameter
+                    const cp = Session.parameterIndex(obj, p);
+                    if (cp !== -1) {
+                        const pp = Session.parameterIndex(res, p);
+                        if (pp === -1) {
+                            res["parameters"].push(obj["parameters"][cp]);
+                        } else {
+                            res["parameters"][pp] = obj["parameters"][cp];
+                        }
+                        // delete obj["parameters"][pp];
+                        obj["parameters"].splice(cp, 1);
+                    }
+                }
+                return res;
 
             default:
-                return props;
+                return obj;
         }
     }
 
@@ -351,9 +385,7 @@ export class Session {
      *    définies dans le constructeur du Nub créé
      * @param dbg activer débogage
      */
-    public createNub(props: IProperties, parentNub?: Nub, dbg: boolean = false): Nub {
-        const params = Session.compatibleCalculatorProps(props);
-
+    public createNub(params: IProperties, parentNub?: Nub, dbg: boolean = false): Nub {
         // true if provided values to parameter creation must be ignored
         const nullParams: boolean = params.getPropValue(Prop_NullParameters) === undefined ? false : params.getPropValue(Prop_NullParameters);
 
@@ -1015,6 +1047,8 @@ export class Session {
             meta: undefined,
             hasErrors: false
         };
+        // get upward compatible calculator
+        obj = this.compatibleCalculator(obj);
         // decode properties
         const props = Props.invertEnumKeysAndValuesInProperties(obj.props, true);
         // create the Nub
-- 
GitLab