param-field-line.component.ts 9.21 KiB
import { Component, ViewChild, Input, Output, EventEmitter, OnChanges } from "@angular/core";
import { I18nService } from "../../services/internationalisation/internationalisation.service";
import { NgParameter, ParamRadioConfig } from "../../formulaire/ngparam";
import { NgParamInputComponent } from "../ngparam-input/ngparam-input.component";
import { ServiceFactory } from "../../services/service-factory";
import { ParamValueMode, CalculatorType, ParallelStructure } from "jalhyd";
import { FormulaireService } from "../../services/formulaire/formulaire.service";
import { ParamLinkComponent } from "../param-link/param-link.component";
import { ParamComputedComponent } from "../param-computed/param-computed.component";
import { ParamValuesComponent } from "../param-values/param-values.component";
/**
 * Sélecteur de mode pour chaque paramètre: fixé, varier, calculer, lié
@Component({
    selector: "param-field-line",
    templateUrl: "./param-field-line.component.html",
    styleUrls: [
        "./param-field-line.component.scss"
export class ParamFieldLineComponent implements OnChanges {
    constructor() {
        this.intlService = ServiceFactory.instance.i18nService;
        this._formService = ServiceFactory.instance.formulaireService;
        this.valid = new EventEmitter();
        this.inputChange = new EventEmitter();
    private get uitextParamFixe() {
        return this.intlService.localizeText("INFO_PARAMFIELD_PARAMFIXE");
    private get uitextParamVarier() {
        return this.intlService.localizeText("INFO_PARAMFIELD_PARAMVARIER");
    private get uitextParamCalculer() {
        return this.intlService.localizeText("INFO_PARAMFIELD_PARAMCALCULER");
    private get uitextParamLie() {
        return this.intlService.localizeText("INFO_PARAMFIELD_PARAMLIE");
    /**
     * Parameter symbol (Q, Ks, B, ...) input attribute
    private get symbol(): string {
        return this.param.symbol;
    // états des boutons pour l'interface
    private get radioFixCheck(): string {
        return this.isRadioFixChecked ? "checked" : undefined;
    private get radioVarCheck(): string {
        return this.isRadioVarChecked ? "checked" : undefined;
    private get radioCalCheck(): string {
        return this.isRadioCalChecked ? "checked" : undefined;
    private get radioLinkCheck(): string {
        return this.isRadioLinkChecked ? "checked" : undefined;
    // états booléens des boutons
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
public get isRadioFixChecked(): boolean { return this.param.radioState === ParamRadioConfig.FIX; } public get isRadioVarChecked(): boolean { return this.param.radioState === ParamRadioConfig.VAR; } public get isRadioCalChecked(): boolean { return this.param.radioState === ParamRadioConfig.CAL; } public get isRadioLinkChecked(): boolean { return this.param.radioState === ParamRadioConfig.LINK; } /** * validité des saisies du composant */ public get isValid(): boolean { switch (this.param.radioState) { case ParamRadioConfig.FIX: return this._isInputValid; case ParamRadioConfig.VAR: return this._isRangeValid; case ParamRadioConfig.LINK: // at first this._paramLinkComponent is undefined until view is refreshed return this._paramLinkComponent ? this._paramLinkComponent.isValid : true; default: return true; } } public get formHasResults(): boolean { return ServiceFactory.instance.formulaireService.currentFormHasResults; } @Input() public param: NgParameter; @ViewChild(NgParamInputComponent) private _ngParamInputComponent: NgParamInputComponent; @ViewChild(ParamComputedComponent) private _paramComputedComponent: ParamComputedComponent; @ViewChild(ParamValuesComponent) private _paramValuesComponent: ParamValuesComponent; @ViewChild(ParamLinkComponent) private _paramLinkComponent: ParamLinkComponent; @Output() private valid: EventEmitter<void>; @Output() private inputChange: EventEmitter<void>; /** true si la valeur saisie est valide */ private _isInputValid = false; /** true si le min-max/liste est valide */ private _isRangeValid = true; private intlService: I18nService; private _formService: FormulaireService; /*
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
* gestion des événements clic sur les radios : * envoi d'un message au composant parent * cf. https://angular.io/guide/component-interaction#parent-listens-for-child-event */ @Output() private radio = new EventEmitter<any>(); /** * classe du radio "fixé" */ private on = true; private onClass = "btn-on"; private offClass = "btn-off"; /** * calcule la présence du radio "paramètre fixé" */ public hasRadioFix(): boolean { switch (this.param.radioConfig) { case ParamRadioConfig.FIX: return this.hasRadioLink(); // gné ? default: return true; } } /** * calcule la présence du radio "paramètre à varier" */ public hasRadioVar(): boolean { switch (this.param.radioConfig) { case ParamRadioConfig.VAR: case ParamRadioConfig.CAL: return true; default: return false; } } /** * calcule la présence du radio "paramètre à calculer" */ public hasRadioCal(): boolean { switch (this.param.radioConfig) { case ParamRadioConfig.CAL: return true; default: return false; } } /** * calcule la présence du radio "paramètre lié" (importé d'un autre module de calcul) */ public hasRadioLink(): boolean { if (this._formService.formulaires.length > 0) { // au moins 2 modules de calcul ouverts if (this._formService.formulaires.length > 1) { return this._formService.getLinkableValues(this.param).length > 0; } // ou un seul module de calcul "ouvrages parallèles" if (this._formService.formulaires[0].calculatorType === CalculatorType.ParallelStructure) { const ps: ParallelStructure = this._formService.formulaires[0].currentNub as ParallelStructure; if (ps.structures.length > 1) { return this._formService.getLinkableValues(this.param).length > 0; }
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
} } return false; } private onRadioClick(option: string) { const oldValue = this.param.valueMode; switch (option) { case "fix": this.param.valueMode = ParamValueMode.SINGLE; // @WTF why do we reset the value here ? this.param.setValue(this, this.param.paramDefinition.paramValues.singleValue); break; case "var": // prevent setting LISTE mode back to MINMAX if someone clicks "variable" again // after setting variable mode to LISTE if (oldValue !== ParamValueMode.MINMAX && oldValue !== ParamValueMode.LISTE) { this.param.valueMode = ParamValueMode.MINMAX; // min/max par défaut } if (this._paramValuesComponent) { // re-open modal when clicking the "var" mode button again (PoLS) this._paramValuesComponent.openDialog(); } break; case "cal": this.param.valueMode = ParamValueMode.CALCUL; break; case "link": this.param.valueMode = ParamValueMode.LINK; break; } this.radio.emit({ "param": this.param, "oldValueMode": oldValue }); // MAJ validité this.emitValidity(); } /** * émission d'un événement de validité */ private emitValidity() { this.valid.emit(); } /** * réception d'un événement de NgParamInputComponent */ public onInputChange(event: any) { switch (event.action) { case "valid": this._isInputValid = event.value; this.emitValidity(); break; case "model": this.inputChange.emit(); break; } } /** * réception d'un événement de validité de ParamValuesComponent */ private onParamValuesValid(event: boolean) {
281282283284285286287288289290291292293294295296297298299300301302303304305306
this._isRangeValid = event; this.emitValidity(); } public ngOnChanges() { this._ngParamInputComponent.model = this.param; this._ngParamInputComponent.showError = this.isRadioFixChecked; } /** * relit la valeur dans l'interface et met à jour le NgParameter */ public updateParameterFromUI() { this._ngParamInputComponent.updateModelFromUI(); } /** * met à jour les paramètres liés */ public updateLinkedParameter() { if (this._paramLinkComponent !== undefined) { this._paramLinkComponent.updateParamList(); } } }