diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 9cd3266d597dad4bdd213f71b5a484c600954c01..a1024c868d05344d233cecae6379cc88486e7880 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -201,11 +201,6 @@ export class AppComponent implements OnInit, OnDestroy, Observer { this._calculators[formIndex]["title"] = title; } - private loadSession() { - this.formulaireService.loadSession(); - this.closeNav(); - } - /** * sauvegarde du/des formulaires * @param form formulaire à sélectionner par défaut dans la liste @@ -336,6 +331,19 @@ export class AppComponent implements OnInit, OnDestroy, Observer { this.toList(); } + private loadSession() { + this.closeNav(); + + // création du dialogue de sélection des formulaires à sauver + const compRef: ComponentRef<LoadCalculatorComponent> = this.loadCalcDialogAnchor.createDialog(); + + const prom: Promise<any[]> = compRef.instance.run(); + prom.then(list => { + this.formulaireService.loadSession(compRef.instance.selectedFile); + compRef.destroy(); + }); + } + private params() { this.closeNav(); this.router.navigate(['/setup']); diff --git a/src/app/formulaire/fieldset-container.ts b/src/app/formulaire/fieldset-container.ts index 64aaee77a898620470bc3529cc90b23b81497dd3..1f384a140395d38231d64f8a7bb3e4a439e4a615 100644 --- a/src/app/formulaire/fieldset-container.ts +++ b/src/app/formulaire/fieldset-container.ts @@ -28,6 +28,16 @@ export class FieldsetContainer extends FormulaireElement { return this._templates[index]; } + private getTemplateIndex(id: string): number { + let i = 0; + for (const t of this._templates) { + if (t.config["id"] == id) + return i; + i++; + } + throw new Error(`template ${id} non trouvé`); + } + public addFieldset(fs: FieldSet) { this.fieldsets.push(fs); } @@ -68,7 +78,7 @@ export class FieldsetContainer extends FormulaireElement { * @param templateIndex indice du template dans la liste * @param after insère le nouveau FieldSet après cette position, à la fin sinon */ - public addFromTemplate(templateIndex: number, after?: number) { + public addFromTemplate(templateIndex: number, after?: number): FieldSet { const templ: FieldsetTemplate = this._templates[templateIndex]; const inst: FieldSet = templ.instantiateTemplate(this, after); @@ -80,6 +90,8 @@ export class FieldsetContainer extends FormulaireElement { "action": "newFieldset", "fieldset": inst }, this); + + return inst; } public get fieldsets(): FieldSet[] { diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts index 194b0cb099d4df2e2ce444f9ff7613be8f4ee297..c08bb630ebb535b4e72b273d394ae9a7fe4e18b0 100644 --- a/src/app/services/formulaire/formulaire.service.ts +++ b/src/app/services/formulaire/formulaire.service.ts @@ -146,7 +146,7 @@ export class FormulaireService extends Observable { return this._httpService.httpGetRequest(undefined, undefined, undefined, f, processData); } - public createFormulaire(ct: CalculatorType): Promise<FormulaireDefinition> { + private newFormulaire(ct: CalculatorType, jsonState?: {}): FormulaireDefinition { let f: FormulaireDefinition; switch (ct) { case CalculatorType.ConduiteDistributrice: @@ -185,10 +185,31 @@ export class FormulaireService extends Observable { throw new Error(`FormulaireService.createFormulaire() : type de calculette ${ct} non pris en charge`) } - f.calculatorName = decode(this.getLocalisedTitleFromCalculatorType(ct) + " (" + f.uid + ")"); + if (jsonState !== undefined) { + const props = jsonState["props"]; + f.initSessionNub(props); + } + else + f.initSessionNub(); + + return f; + } + + /** + * crée un formulaire d'un type donné + * @param ct type de formulaire + * @param jsonState + */ + public createFormulaire(ct: CalculatorType, jsonState?: {}): Promise<FormulaireDefinition> { + const f: FormulaireDefinition = this.newFormulaire(ct, jsonState); + + if (jsonState === undefined) + f.calculatorName = decode(this.getLocalisedTitleFromCalculatorType(ct) + " (" + f.uid + ")"); this._formulaires.push(f); let prom: Promise<Response> = this.loadConfig(f, ct); return prom.then(_ => { + if (jsonState !== undefined) + f.deserialiseJSON(jsonState); return f; }).then(f => { this.loadUpdateFormulaireLocalisation(f); @@ -328,7 +349,38 @@ export class FormulaireService extends Observable { return false; } - public loadSession() { + private readSingleFile(file: File): Promise<any> { + return new Promise<any>((resolve, reject) => { + var fr = new FileReader(); + + fr.onload = () => { + resolve(fr.result); + }; + + fr.onerror = () => { + fr.abort(); + reject(new Error(`Erreur de lecture du fichier ${file.name}`)); + }; + + fr.readAsText(file); + }); + } + + public loadSession(f: File) { + this.readSingleFile(f).then(s => { + const session = JSON.parse(s); + for (const k in session) + switch (k) { + case "session": + this.deserialiseSession(session[k]); + break; + + default: + throw new Error(`session file : invalid key '${k}'`); + } + }).catch(err => { + throw err; + }); } public saveForm(f: FormulaireDefinition) {