From ca950aca9e0d950400dcd49caf32fafb06ab4768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= <francois.grand@irstea.fr> Date: Mon, 16 Jul 2018 17:29:53 +0200 Subject: [PATCH] =?UTF-8?q?=20#89=20d=C3=A9s=C3=A9rialisation=20de=20sessi?= =?UTF-8?q?on=20:=20modifs=20pour=20les=20param=C3=A8tres=20li=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../formulaire/definition/form-definition.ts | 36 ++++++++ src/app/formulaire/fieldset.ts | 38 +++++++++ src/app/formulaire/ngparam.ts | 3 + .../services/formulaire/formulaire.service.ts | 85 +++++++++++++++++-- 4 files changed, 156 insertions(+), 6 deletions(-) diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts index 2a1e305af..f27c653b5 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 64bbcf197..d4272e313 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 c6856de9a..7f25ebf37 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 c66096a4f..6a08c5546 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)); } /** -- GitLab