Newer
Older
francois.grand
committed
import { Component, Input, Output, EventEmitter, QueryList, ViewChildren, DoCheck, AfterViewInit } from "@angular/core";
import { FieldsetContainer } from "../../formulaire/elements/fieldset-container";
francois.grand
committed
import { FieldSetComponent } from "../field-set/field-set.component";
import { FieldSet } from "../../formulaire/elements/fieldset";
francois.grand
committed
import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
import { I18nService } from "../../services/internationalisation.service";
import { ApplicationSetupService } from "../../services/app-setup.service";
@Component({
selector: "fieldset-container",
templateUrl: "./fieldset-container.component.html",
styleUrls: [
"./fieldset-container.component.scss"
]
francois.grand
committed
export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
public get title(): string {
if (this._container) {
return this._container.label;
return this._container.fieldsets;
}
public get isValid() {
return this._isValid;
}
private _container: FieldsetContainer;
francois.grand
committed
/**
* liste des composants FieldSet enfants
*/
@ViewChildren(FieldSetComponent)
private _fieldsetComponents: QueryList<FieldSetComponent>;
/**
* flag de validité des FieldSet enfants
*/
francois.grand
committed
/**
* événément de changement d'état d'un radio
*/
@Output()
private radio = new EventEmitter<any>();
/**
* événément de changement de validité
*/
@Output()
private validChange = new EventEmitter();
/**
* événément de changement de valeur d'un input
*/
@Output()
private inputChange = new EventEmitter();
/** événement signalant un appui sur TAB ou SHIFT+TAB */
@Output()
protected tabPressed = new EventEmitter<any>();
public constructor(
private i18nService: I18nService,
private appSetupService: ApplicationSetupService
) {}
mathias.chouet
committed
* Ajoute un nouveau sous-nub (Structure, PabCloisons, YAXN… selon le cas)
* dans un nouveau fieldset
*/
const newFs = this._container.addFromTemplate(0, after.indexAsKid());
if (this.appSetupService.enableEmptyFieldsOnFormInit && ! clone) {
newFs.emptyFields();
}
if (clone) {
// replace in-place to change properties (overkill)
newFs.setPropValue("structureType", after.properties.getPropValue("structureType"));
newFs.setPropValue("loiDebit", after.properties.getPropValue("loiDebit"));
mathias.chouet
committed
// copy param values
mathias.chouet
committed
newFs.nub.getParameter(p.symbol).loadObjectRepresentation(p.objectRepresentation());
const newFs = this._container.addFromTemplate(0);
if (this.appSetupService.enableEmptyFieldsOnFormInit && ! clone) {
newFs.emptyFields();
}
francois.grand
committed
private onFieldsetListChange() {
francois.grand
committed
}
public ngAfterViewInit() {
this.onFieldsetListChange();
this._fieldsetComponents.changes.subscribe(_ => this.onFieldsetListChange());
francois.grand
committed
}
/*
* gestion des événements clic sur les radios :
* réception d'un message du composant enfant (field-set)
* cf. https://angular.io/guide/component-interaction#parent-listens-for-child-event
*/
// on renvoie l'info au parent
this.radio.emit(info);
}
francois.grand
committed
public ngDoCheck() {
this.updateValidity();
}
/**
* calcul de la validité de tous les FieldSet de la vue
*/
private updateValidity() {
this._isValid = false;
if (this._fieldsetComponents !== undefined && this._fieldsetComponents.length > 0) {
francois.grand
committed
this._isValid = this._fieldsetComponents.reduce(
// callback
(
// accumulator (valeur précédente du résultat)
acc,
// currentValue (élément courant dans le tableau)
fieldset,
francois.grand
committed
// currentIndex (indice courant dans le tableau)
currIndex,
// array (tableau parcouru)
array
) => {
return acc && fieldset.isValid;
francois.grand
committed
}
// valeur initiale
, this._fieldsetComponents.length > 0);
} else {
// empty / hidden container ? everything OK.
this._isValid = true;
francois.grand
committed
this.validChange.emit();
}
/**
* réception d'un événement de validité de FieldSet
*/
francois.grand
committed
this.updateValidity();
}
/**
* réception d'un événement de changement de valeur d'un input
*/
this.inputChange.emit($event);
francois.grand
committed
/**
* met à jour les paramètres liés
*/
public updateLinkedParameters() {
this._fieldsetComponents.forEach(fsc => fsc.updateLinkedParameters());
}
francois.grand
committed
/**
* réception d'un événement de demande d'ajout d'un FieldSet
*/
public onAddFieldset(evt: { fs: FieldSet, clone: boolean }) {
francois.grand
committed
}
francois.grand
committed
/**
* réception d'un événement de demande de suppression d'un FieldSet
*/
francois.grand
committed
const form = this._container.parent as FormulaireDefinition;
form.removeFieldset(fs);
}
francois.grand
committed
/**
* réception d'un événement de demande de remontée d'un FieldSet
*/
francois.grand
committed
const form = this._container.parent as FormulaireDefinition;
form.moveFieldsetUp(fs);
}
francois.grand
committed
/**
* réception d'un événement de demande de descente d'un FieldSet
*/
francois.grand
committed
const form = this._container.parent as FormulaireDefinition;
form.moveFieldsetDown(fs);
}
/**
* Renvoie l'événement au composant du dessus
*/
public onTabPressed(event) {
this.tabPressed.emit(event);
}
public openHelp() {
window.open("assets/docs/" + this.appSetupService.language + "/calculators/" + this._container.helpLink, "_blank");
}
public get enableHelpButton() {
return this._container && this._container.helpLink;
}
public get uitextOpenHelp() {
return this.i18nService.localizeText("INFO_CALCULATOR_OPEN_HELP");
}