From df4b073915fe015bd5c22e67926b101ad2e336da Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Fri, 15 Jun 2018 14:56:36 +0200
Subject: [PATCH] =?UTF-8?q?=20#48=20MAJ=20de=20la=20valeur=20dans=20le=20c?=
 =?UTF-8?q?hamp=20de=20saisie=20d'un=20param=C3=A8tre=20quand=20on=20chang?=
 =?UTF-8?q?e=20la=20valeur=20point=C3=A9e=20dans=20le=20select?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ngparam-input/ngparam-input.component.ts   | 12 ++++++++++++
 .../param-link/param-link.component.ts         | 13 +++++++++++--
 src/app/formulaire/ngparam.ts                  | 18 +++++++++++++++---
 3 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/src/app/components/ngparam-input/ngparam-input.component.ts b/src/app/components/ngparam-input/ngparam-input.component.ts
index abce24cdf..3db763c94 100644
--- a/src/app/components/ngparam-input/ngparam-input.component.ts
+++ b/src/app/components/ngparam-input/ngparam-input.component.ts
@@ -115,6 +115,18 @@ export class NgParamInputComponent extends GenericInputComponent implements Obse
                     this._tmp = data["value"];
                     this.updateAndValidateUI();
                 }
+                break;
+
+            // changement de valueMode du paramètre ou de valeur à laquelle il est lié
+            case "valueModeChange":
+            case "valueLinkChange":
+                this._tmp = data["value"];
+                this.updateAndValidateUI();
+                break;
         }
     }
+
+    public ngOnDestroy() {
+        this._paramDef.removeObserver(this);
+    }
 }
diff --git a/src/app/components/param-link/param-link.component.ts b/src/app/components/param-link/param-link.component.ts
index 0ce835b5d..4ea99b759 100644
--- a/src/app/components/param-link/param-link.component.ts
+++ b/src/app/components/param-link/param-link.component.ts
@@ -1,4 +1,4 @@
-import { Component, Input, Output, EventEmitter, OnChanges } from "@angular/core";
+import { Component, Input, Output, EventEmitter, OnChanges, OnDestroy } from "@angular/core";
 
 import { NgParameter } from "../../formulaire/ngparam";
 import { ServiceFactory } from "../../services/service-factory";
@@ -9,7 +9,8 @@ import { FormulaireService } from "../../services/formulaire/formulaire.service"
     selector: "param-link",
     templateUrl: "./param-link.component.html"
 })
-export class ParamLinkComponent implements OnChanges, Observer {
+export class ParamLinkComponent implements OnChanges, Observer, OnDestroy {
+    // paramètre géré (qui sera lié à une valeur, cad qui importe cette valeur)
     @Input("param")
     private _param: NgParameter;
 
@@ -116,9 +117,17 @@ export class ParamLinkComponent implements OnChanges, Observer {
     }
 
     public ngOnChanges() {
+        if (this._param !== undefined)
+            this._param.removeObserver(this);
+        this._param.addObserver(this);
+
         this.updateParamList();
     }
 
+    public ngOnDestroy() {
+        this._param.removeObserver(this);
+    }
+
     // interface Observer 
 
     public update(sender: any, data: any) {
diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts
index b48b72503..fee5e2f71 100644
--- a/src/app/formulaire/ngparam.ts
+++ b/src/app/formulaire/ngparam.ts
@@ -120,8 +120,15 @@ export class NgParameter extends InputField {
      * crée le lien avec un paramètre
      */
     public linkToParameter(n: Nub, p: ParamDefinition) {
-        this.valueMode = ParamValueMode.LINK;
-        this.paramDefinition.defineReference(n, p.symbol);
+        const changed: boolean = this.paramDefinition.referencedObject !== n || this.paramDefinition.referenceDesc !== p.symbol;
+        if (changed) {
+            this.valueMode = ParamValueMode.LINK;
+            this._paramDef.defineReference(n, p.symbol);
+            this.notifyObservers({
+                "action": "valueLinkChange",
+                "value": this._paramDef.getValue()
+            });
+        }
     }
 
     get isDefined(): boolean {
@@ -144,8 +151,13 @@ export class NgParameter extends InputField {
     public set valueMode(m: ParamValueMode) {
         // undefined si on clique en dehors du select après l'avoir ouvert (cad sans avoir fait de sélection)
         // et au même niveau, cad à côté du bouton et non à côté du menu déroulant
-        if (m != undefined)
+        if (m !== undefined && this._paramDef.valueMode !== m) {
             this._paramDef.valueMode = m;
+            this.notifyObservers({
+                "action": "valueModeChange",
+                "value": this._paramDef.getValue()
+            });
+        }
     }
 
     public checkMin(min: number): boolean {
-- 
GitLab