diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts index 6972f2b26354b00f539ba5e42cf02533018b1fde..bc6effb9a833ecd80dff7a7e6b445ebae07c399a 100644 --- a/src/app/formulaire/ngparam.ts +++ b/src/app/formulaire/ngparam.ts @@ -1,10 +1,9 @@ -import { ParamDefinition, Pair, ParamDomain, ParamValues, ParamValueMode, ParamValueIterator, Nub } from "jalhyd"; +import { ParamDefinition, Pair, ParamDomain, ParamValueMode, ParamValueIterator, Nub, Observer, asObservable } from "jalhyd"; import { InputField } from "./input-field"; import { Dependency } from "./dependency/dependency"; import { DependencyConditionType } from "./dependency/dependency-condition"; import { ValueDependencyCondition } from "./dependency/value-dependency-condition"; -import { FormulaireDefinition } from "./definition/form-definition"; import { ServiceFactory } from "../services/service-factory"; import { ApplicationSetupService } from "../services/app-setup/app-setup.service"; import { StringMap } from "../stringmap"; @@ -35,7 +34,7 @@ export enum ParamRadioConfig { /** * classe englobante de ParamDefinition (champs supplémentaires pour l'affichage, radio boutons, ...) */ -export class NgParameter extends InputField { +export class NgParameter extends InputField implements Observer { public unit: string; public radioConfig: ParamRadioConfig; @@ -112,18 +111,39 @@ export class NgParameter extends InputField { * @param val */ public setValue(sender: any, val: number) { - this._paramDef.v = val; + this._paramDef.setValue(val, sender); this.notifyValueModified(sender); } + /** + * supprime un lien avec un paramètre + */ + private unlinkParameter() { + let o = asObservable(this._paramDef.referencedObject); + if (this.valueMode === ParamValueMode.LINK) { + this._paramDef.undefineReference(); + if (o !== undefined) + o.removeObserver(this); + } + } + /** * crée le lien avec un paramètre */ public linkToParameter(n: Nub, p: ParamDefinition) { - const changed: boolean = this.paramDefinition.referencedNub !== n || this.paramDefinition.referenceDefinition !== p.symbol; + const changed: boolean = this._paramDef.valueMode !== ParamValueMode.LINK || this._paramDef.referencedNub !== n || this._paramDef.referenceDefinition !== p.symbol; if (changed) { + let o = asObservable(this._paramDef.referencedObject); + if (o !== undefined) + o.removeObserver(this); + this.valueMode = ParamValueMode.LINK; this._paramDef.defineReference(n, p.symbol); + + o = asObservable(this._paramDef.referencedObject); + if (o !== undefined) + o.addObserver(this); // pour être prévenu des changements de valeur de l'object référencé + this.notifyObservers({ "action": "valueLinkChange", "value": this._paramDef.getValue() @@ -152,6 +172,7 @@ export class NgParameter extends InputField { // 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 && this._paramDef.valueMode !== m) { + this.unlinkParameter(); this._paramDef.valueMode = m; this.notifyObservers({ "action": "valueModeChange", @@ -352,4 +373,14 @@ export class NgParameter extends InputField { } } } + + // interface Observer + + public update(sender: any, data: any) { + switch (data["action"]) { + case "baseparamAfterValue": // changement de valeur envoyé par l'objet référencé + this.notifyValueModified(sender); + break; + } + } }