diff --git a/src/app/app.component.ts b/src/app/app.component.ts index a1024c868d05344d233cecae6379cc88486e7880..2f6879d8a7507c5cc58584b49c1bb8ea58e3ffdc 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -30,6 +30,11 @@ import { SaveCalculatorComponent } from './components/save-calculator/save-calcu export class AppComponent implements OnInit, OnDestroy, Observer { private _displayErrorDialog: boolean = false; + /** + * liste des calculettes. Forme des objets : + * "title": nom de la calculette + * "uid": id unique du formulaire + */ private _calculators: any[] = []; /** @@ -339,7 +344,7 @@ export class AppComponent implements OnInit, OnDestroy, Observer { const prom: Promise<any[]> = compRef.instance.run(); prom.then(list => { - this.formulaireService.loadSession(compRef.instance.selectedFile); + this.formulaireService.loadSession(compRef.instance.selectedFile, compRef.instance.calculators); compRef.destroy(); }); } diff --git a/src/app/components/load-calculator/load-calculator.component.html b/src/app/components/load-calculator/load-calculator.component.html index d6ee5866c554c2a394cfaab26a21477abe2fd45b..b596cadbf55f04ffd5ee4cf376c706549d00654d 100644 --- a/src/app/components/load-calculator/load-calculator.component.html +++ b/src/app/components/load-calculator/load-calculator.component.html @@ -16,6 +16,8 @@ </div> <div class="modal-footer"> <button type="button" class="btn btn-danger relative waves-light" (click)="loadDialog.hide();cancelLoad()" mdbRippleRadius>{{uitextCancel}}</button> + <button type="button" class="btn btn-success waves-light" [disabled]="disableLoadButton" (click)="loadDialog.hide();confirmLoad()" + mdbRippleRadius>{{uitextLoad}}</button> </div> </div> </div> diff --git a/src/app/components/load-calculator/load-calculator.component.ts b/src/app/components/load-calculator/load-calculator.component.ts index f07ecb22a90290260044dbff4a0e6f4b0bd9d383..c1a3f8b710f1e50228323e7a7c9b8457f1f8a0c7 100644 --- a/src/app/components/load-calculator/load-calculator.component.ts +++ b/src/app/components/load-calculator/load-calculator.component.ts @@ -12,6 +12,11 @@ export class LoadCalculatorComponent { private _selectFile: File; + /** + * liste des calculettes affichées. Forme des objets : + * "title": nom de la calculette + * "selected": flag de sélection pour la sauvegarde + */ private _calculators: any[]; /** @@ -36,6 +41,11 @@ export class LoadCalculatorComponent { return "Annuler"; } + private get uitextLoad() { + // return this.intlService.localizeText("INFO_OPTION_NO"); + return "Charger"; + } + private get uitextSelectAll() { return "Toutes"; } @@ -44,6 +54,24 @@ export class LoadCalculatorComponent { return "Aucune"; } + /** + * calcule l'état du bouton charger + */ + private get disableLoadButton() { + // pas de fichier sélectionné -> bouton grisé + if (this._selectFile === undefined) + return true; + + // au moins une calculette sélectionnée -> dégrisé + if (this._calculators !== undefined) + for (const c of this._calculators) + if (c.selected) + return false; + + // grisé sinon + return true; + } + public run(): Promise<any[]> { // promise de gestion de la confirmation/annulation de la sauvegarde return new Promise((resolve, reject) => { @@ -61,29 +89,44 @@ export class LoadCalculatorComponent { return this._calculators && this._calculators.length != 0; } - private onFileSelect() { + private getSelectedFile(): File { const files: { [key: string]: File } = this.fileSelector.nativeElement.files; - for (let key in files) { - if (!isNaN(parseInt(key))) { - this._selectFile = files[key]; - this.confirmLoad(); - break; - } - } + for (const key in files) + if (!isNaN(parseInt(key))) + return files[key]; + return undefined; + } + + private onFileSelect() { + const formService = ServiceFactory.instance.formulaireService; + this._selectFile = this.getSelectedFile(); + if (this._selectFile !== undefined) + formService.calculatorInfosFromSessionFile(this._selectFile).then( + calcInfos => { + this._calculators = calcInfos; + for (const n of this._calculators) + n["selected"] = true; + }); } public get selectedFile(): File { return this._selectFile; } + public get calculators(): any[] { + return this._calculators; + } + private isSelected(c: any) { return c.selected ? "checked" : undefined; } private onCheckCalc(event: any) { for (const c of this._calculators) - if (c.uid == +event.target.value) + if (c.uid == +event.target.value) { c.selected = event.target.checked; + break; + } } private selectAll() { @@ -110,7 +153,7 @@ export class LoadCalculatorComponent { } /** - * appelé quand on clique sur sauver + * appelé quand on clique sur charger */ private confirmLoad() { this.confirmed = true; diff --git a/src/app/components/save-calculator/save-calculator.component.ts b/src/app/components/save-calculator/save-calculator.component.ts index 99babe24c344b877a0a2417d4eddb581f134826c..f00fd173eae723d0b3c322d70ecdabd1b6ef5e2c 100644 --- a/src/app/components/save-calculator/save-calculator.component.ts +++ b/src/app/components/save-calculator/save-calculator.component.ts @@ -7,6 +7,12 @@ import { InternationalisationService } from "../../services/internationalisation templateUrl: "./save-calculator.component.html" }) export class SaveCalculatorComponent { + /** + * liste des calculettes affichées. Forme des objets : + * "title": nom de la calculette + * "selected": flag de sélection pour la sauvegarde + * "uid": id unique du formulaire + */ private _calculators: any[]; /** diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts index 7d577b03da01de75cecd1d97d0c94ea3f3085d23..1a43403007d74910984da7d1ad9fdb08868d2e56 100644 --- a/src/app/formulaire/definition/form-definition.ts +++ b/src/app/formulaire/definition/form-definition.ts @@ -442,6 +442,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs public JSONserialise(): {} { let res = {}; res["id"] = this.calculatorName; + res["uid"] = this.uid; res["props"] = this._currentSessionNub.properties.props; res["elements"] = this.serialiseKids(); return { "form": res }; @@ -488,6 +489,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs this._calculatorName = elements[k]; break; + case "uid": case "props": break; diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts index c08bb630ebb535b4e72b273d394ae9a7fe4e18b0..b89e1baaa14433aa8e4c48f92abf4e5539435695 100644 --- a/src/app/services/formulaire/formulaire.service.ts +++ b/src/app/services/formulaire/formulaire.service.ts @@ -366,13 +366,18 @@ export class FormulaireService extends Observable { }); } - public loadSession(f: File) { + /** + * charge une session en tenant compte des calculettes sélectionnées + * @param f fichier session + * @param formInfos infos sur les calculettes @see LoadCalculatorComponent._calculators + */ + public loadSession(f: File, formInfos: any[]) { this.readSingleFile(f).then(s => { const session = JSON.parse(s); for (const k in session) switch (k) { case "session": - this.deserialiseSession(session[k]); + this.deserialiseSession(session[k], formInfos); break; default: @@ -383,6 +388,36 @@ export class FormulaireService extends Observable { }); } + /** + * obtient des infos (nom, uid des calculettes) d'un fichier session + * @param f fichier session + */ + public calculatorInfosFromSessionFile(f: File): Promise<any[]> { + return this.readSingleFile(f).then(s => { + const res: any[] = []; + const session = JSON.parse(s); + + // liste des noms de calculettes + for (const k in session) + switch (k) { + case "session": + const sess = session[k]; + const elems = sess["elements"]; + for (const e of elems) + for (const k in e) + if (k === "form") { + const form = e[k]; + res.push({ "uid": form["uid"], "title": form["id"] }); + } + break; + + default: + throw new Error(`session file : invalid key '${k}'`); + } + return res; + }); + } + public saveForm(f: FormulaireDefinition) { this.notifyObservers({ "action": "saveForm", @@ -396,14 +431,18 @@ export class FormulaireService extends Observable { this.createFormulaire(ct, elements); } - private deserialiseSessionElement(element: {}) { + private deserialiseSessionElement(element: {}, formInfos: any[]) { const keys = Object.keys(element); if (keys.length !== 1) throw new Error(`session file : invalid session object '${element}'`); switch (keys[0]) { case "form": - this.deserialiseForm(element[keys[0]]); + const form = element[keys[0]]; + + for (const i of formInfos) + if (i["uid"] == form["uid"] && i["selected"]) + this.deserialiseForm(form); break; default: @@ -411,12 +450,12 @@ export class FormulaireService extends Observable { } } - private deserialiseSession(elements: {}) { + private deserialiseSession(elements: {}, formInfos: any[]) { for (const ks in elements) switch (ks) { case "elements": for (const e of elements[ks]) - this.deserialiseSessionElement(e); + this.deserialiseSessionElement(e, formInfos); break; default: