param-field-line.component.ts 10.48 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";
@Component({
    selector: "param-field-line",
    templateUrl: "./param-field-line.component.html",
    styles: [
        `.btn-on {
            color:#505050;
            border: 3px solid #505050;
            background-color:white;
            text-transform: uppercase;
            font-size: 0.8em;
        }`,
        `.btn-off {
            color:white;
            border: 3px solid #505050;
            background-color:#505050;
            text-transform: uppercase;
            font-size: 0.8em;
export class ParamFieldLineComponent implements OnChanges {
    constructor() {
        this.intlService = ServiceFactory.instance.i18nService;
        this._formService = ServiceFactory.instance.formulaireService;
        this.valid = new EventEmitter();
        this.inputChange = new EventEmitter();
    public get title(): string {
        let t = "";
        if (this.param.label !== undefined) {
            t = this.param.label;
        if (this.param.unit !== undefined && this.param.unit !== "") {
            t = t + " (" + this.param.unit + ")";
        return t;
    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 {
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
return this.param.symbol; } /** * calcule l'état du radio "paramètre fixé" */ private get radioFixCheck(): string { return this.isRadioFixChecked ? "checked" : undefined; } /** * calcule l'état du radio "paramètre à varier" */ private get radioVarCheck(): string { return this.isRadioVarChecked ? "checked" : undefined; } /** * calcule l'état du radio "paramètre à calculer" */ private get radioCalCheck(): string { if (this.param.radioState === ParamRadioConfig.CAL) { return "checked"; } return undefined; } /** * calcule l'état du radio "paramètre lié" */ private get radioLinkCheck(): string { if (this.param.radioState === ParamRadioConfig.LINK) { return "checked"; } return undefined; } /** * retourne l'état du radio "paramètre fixé" sous forme booléenne */ public get isRadioFixChecked(): boolean { return this.param.radioState === ParamRadioConfig.FIX; } /** * retourne l'état du radio "paramètre à varier" sous forme booléenne */ public get isRadioVarChecked(): boolean { return this.param.radioState === ParamRadioConfig.VAR; } /** * retourne l'état du radio "paramètre lié" sous forme booléenne */ public get isRadioLinkChecked(): boolean { return this.param.radioState === ParamRadioConfig.LINK; } /** * désactivation de tous les boutons radio si paramètre par défaut à "CAL" */ private get isDisabled(): boolean { return this.param.isDefault && this.param.radioState === ParamRadioConfig.CAL; } /** * désactivation du champ de saisie */ public get isInputDisabled(): boolean { return this.param.radioState !== ParamRadioConfig.FIX;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
} private get radioFixClass(): string { if (this.on) { return this.radioFixCheck ? this.onClass : this.offClass; } return ""; } /** * classe du radio "varier" */ private get radioVarClass(): string { if (this.on) { return this.radioVarCheck ? this.onClass : this.offClass; } return ""; } /** * classe du radio "calculer" */ private get radioCalClass(): string { if (this.on) { return this.radioCalCheck ? this.onClass : this.offClass; } return ""; } /** * classe du radio "lié" */ private get radioLinkClass(): string { if (this.on) { return this.radioLinkCheck ? this.onClass : this.offClass; } return ""; } /** * 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; default: return true; } } public get formHasResults(): boolean { return ServiceFactory.instance.formulaireService.currentFormHasResults; } @Input() private param: NgParameter; @ViewChild(NgParamInputComponent) private _ngParamInputComponent: NgParamInputComponent; @ViewChild(ParamLinkComponent) private _paramLinkComponent: ParamLinkComponent; @Output() private valid: EventEmitter<void>;
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
@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; /* * 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(); 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:
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
return false; } } /** * calcule la présence du radio "paramètre lié" (importé d'une autre calculette) */ public hasRadioLink(): boolean { if (this._formService.formulaires.length > 0) { // au moins 2 calculettes ouvertes if (this._formService.formulaires.length > 1) { return this._formService.filterLinkableValues(this._formService.getLinkableValues(this.param)).length > 0; } // ou une seule calculette "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.filterLinkableValues(this._formService.getLinkableValues(this.param)).length > 0; } } } return false; } private onRadioClick(option: string) { const oldValue = this.param.valueMode; switch (option) { case "fix": const oldValueMode = this.param.valueMode; this.param.valueMode = ParamValueMode.SINGLE; this.param.setValue(this, this.param.paramDefinition.paramValues.singleValue); break; case "var": this.param.valueMode = ParamValueMode.MINMAX; // min/max par défaut 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) {
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
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) { 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(); } } }