Skip to content
Snippets Groups Projects
Commit bfd239d4 authored by francois.grand's avatar francois.grand
Browse files

#45 modif composant LoadCalculatorComponent pour afficher et permettre de...

 #45 modif composant LoadCalculatorComponent pour afficher et permettre de sélectionner les calculettes trouvées dans le fichier session
- ajout du champ "uid" pour les "form" dans les fichiers session
parent 3a2f4683
No related branches found
No related tags found
1 merge request!20Resolve "Ouvrir / Enregistrer une session / une calculette"
......@@ -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();
});
}
......
......@@ -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>
......
......@@ -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;
......
......@@ -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[];
/**
......
......@@ -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;
......
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment