diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts index 2a1e305afa902ee19e67ddc945b4945ff7767a27..f27c653b5f4240ac5ae5de8255fd49069620ea3e 100644 --- a/src/app/formulaire/definition/form-definition.ts +++ b/src/app/formulaire/definition/form-definition.ts @@ -517,6 +517,42 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs } } + /** + * MAJ des liens entre paramètres lors de la désérialisation JSON + */ + + private getNthFieldset(n: number): FieldSet { + let i = 0; + for (const e of this.topFormElements) { + if (e instanceof FieldSet) { + if (i === n) + return e; + i++; + } + } + + return undefined; + } + + /** + * @param json conf du formulaire + * @param uidMap table de correspondance uid dans le fichier de conf <-> uid en mémoire + */ + public updateParamsLinks(json: {}, uidMap: {}[]) { + for (const ks in json) + switch (ks) { + case "elements": + let n = 0; + for (const e of json[ks]) { + if (Object.keys(e)[0] === "fieldset") { + this.getNthFieldset(n).updateParamsLinks(e["fieldset"], uidMap); + n++; + } + } + break; + } + } + // interface Observer public update(sender: any, data: any) { diff --git a/src/app/formulaire/fieldset.ts b/src/app/formulaire/fieldset.ts index 64bbcf197b24934c531d313e0f15e11f9752f61f..d4272e313c4a74cab049614f902596880271ea51 100644 --- a/src/app/formulaire/fieldset.ts +++ b/src/app/formulaire/fieldset.ts @@ -441,4 +441,42 @@ export class FieldSet extends FormulaireElement implements Observer { } } } + + /** + * MAJ des liens entre paramètres lors de la désérialisation JSON + * @param json conf du fieldset issue du fichier + * @param uidMap table de correspondance uid dans le fichier de conf <-> uid en mémoire + */ + public updateParamsLinks(json: {}, uidMap: {}[]) { + for (const ks in json) + switch (ks) { + case "elements": + for (const e of json[ks]) + if (Object.keys(e)[0] === "param") { + const prm = e["param"]; + if (prm["values"]["mode"] === "LINK") { + // id du formulaire cible dans le fichier + const oldFormUid = +prm["values"]["form_uid"]; + + // correspondance avec l'objet mémoire + let newFormUid; + for (const m of uidMap) + if (m["type"] === "form" && m["old"] == oldFormUid) { + newFormUid = m["new"]; + break; + } + + // formulaire dont le Nub est la cible du lien + const destForm: FormulaireDefinition = ServiceFactory.instance.formulaireService.getFormulaireFromId(newFormUid); + + // paramètre source (celui qui est lié à une valeur) + const src: NgParameter = this.getFormulaireNodeById(prm["id"]) as NgParameter; + + // création du lien + src.paramDefinition.defineReference(destForm.currentSessionNub.nub, prm["values"]["ref"]); + } + break; + } + } + } } diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts index c6856de9ab04abb10684b5f15ee4a42dd4a4a037..7f25ebf3768ac277215029fc2429e44440e55c02 100644 --- a/src/app/formulaire/ngparam.ts +++ b/src/app/formulaire/ngparam.ts @@ -375,6 +375,9 @@ export class NgParameter extends InputField implements Observer { this._paramValues.valueMode = ParamValueMode.CALCUL; break; + case ParamValueMode.LINK: + break; // cf FormulaireService.updateParamsLinks() + default: throw new Error(`session file : invalid value mode '${json["mode"]}' in param object`); } diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts index c66096a4fb655cfc48cf6aad8bf7624a67bf0165..6a08c55462f4dfbb6168911f5b4ee2ce68085203 100644 --- a/src/app/services/formulaire/formulaire.service.ts +++ b/src/app/services/formulaire/formulaire.service.ts @@ -165,7 +165,6 @@ export class FormulaireService extends Observable { f.parseConfig(); if (jsonState !== undefined) { f.deserialiseJSON(jsonState); - const props = jsonState["props"]; } // la méthode loadUpdateFormulaireLocalisation retourne une Promise; le fait de retourner une Promise dans un then // fait que le then suivant est exécuté juste après. @@ -414,13 +413,13 @@ export class FormulaireService extends Observable { }); } - private deserialiseForm(elements: {}) { + private deserialiseForm(elements: {}): Promise<FormulaireDefinition> { const props = elements["props"]; const ct: CalculatorType = props["calcType"]; - this.createFormulaire(ct, elements); + return this.createFormulaire(ct, elements); } - private deserialiseSessionElement(element: {}, formInfos: any[]) { + private deserialiseSessionElement(element: {}, formInfos: any[]): Promise<FormulaireDefinition> { const keys = Object.keys(element); if (keys.length !== 1) { throw new Error(`session file : invalid session object '${element}'`); @@ -432,7 +431,7 @@ export class FormulaireService extends Observable { for (const i of formInfos) { if (i["uid"] === form["uid"] && i["selected"]) { - this.deserialiseForm(form); + return this.deserialiseForm(form); } } break; @@ -442,12 +441,85 @@ export class FormulaireService extends Observable { } } + /** + * met à jour les liens d'un formulaire + * @param json conf du formulaire + * @param formInfos métadonnées sur les formulaires chargés + * @param form formulaire dont on met à jour les liens + * @param uidMap table de correspondance uid dans le fichier de conf <-> uid en mémoire + */ + private updateFormLinks(json: {}, formInfos: any[], form: FormulaireDefinition, uidMap: {}[]) { + for (const i of formInfos) { + if (i["uid"] === json["uid"] && i["selected"]) { + form.updateParamsLinks(json, uidMap); + } + } + } + + /** + * MAJ des liens entre paramètres lors de la désérialisation JSON + */ + + private updateParamsLinks(json: {}, formInfos: any[], oldFormCount: number) { + // table de correspondance des uid fichier <-> objets mémoire + // forme : tableau d'objets de la forme : + // { "type" : <type de l'objet. "form" pour formulaire>, + // "old": <uid dans le fichier>, + // "new": <uid de l'objet mémoire>} + + const uidMap = []; + for (const ks in json) { + switch (ks) { + case "elements": + let n = oldFormCount; + for (const e of json[ks]) { + if (Object.keys(e)[0] === "form") { + uidMap.push({ + "type": "form", + "old": e["form"]["uid"], + "new": this._formulaires[n].uid + }); + n++; + } + } + } + } + + // MAJ liens + + for (const ks in json) { + switch (ks) { + case "elements": + let n = 0; + for (const e of json[ks]) { + if (Object.keys(e)[0] === "form") { + this.updateFormLinks(e["form"], formInfos, this._formulaires[n + oldFormCount], uidMap); + n++; + } + } + break; + + default: + throw new Error(`session file : invalid key '${ks}' in session object`); + } + } + } + private deserialiseSession(elements: {}, formInfos: any[]) { + let p: Promise<FormulaireDefinition>; + + const oldFormCount = this._formulaires.length; for (const ks in elements) { switch (ks) { case "elements": for (const e of elements[ks]) { - this.deserialiseSessionElement(e, formInfos); + if (p === undefined) { + p = this.deserialiseSessionElement(e, formInfos); + } else { + p = p.then(_ => { + return this.deserialiseSessionElement(e, formInfos); + }); + } } break; @@ -455,6 +527,7 @@ export class FormulaireService extends Observable { throw new Error(`session file : invalid key '${ks}' in session object`); } } + p.then(_ => this.updateParamsLinks(elements, formInfos, oldFormCount)); } /**