calculator.component.ts 17.53 KiB
import { Component, OnInit, DoCheck, OnDestroy, ViewChild, ViewChildren,
         QueryList, AfterViewChecked, ElementRef } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { Observer, Session, Cloisons, Pab, ParamValueMode, CalculatorType } from "jalhyd";
import { FormulaireService } from "../../services/formulaire/formulaire.service";
import { I18nService } from "../../services/internationalisation/internationalisation.service";
import { FieldSet } from "../../formulaire/fieldset";
import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
import { CalculatorResultsComponent } from "../../components/calculator-results/calculator-results.component";
import { Subscription } from "rxjs";
import { FieldSetComponent } from "../field-set/field-set.component";
import { BaseComponent } from "../base/base.component";
import { CalculatorNameComponent } from "./calc-name.component";
import { FormulaireElement } from "../../formulaire/formulaire-element";
import { FieldsetContainer } from "../../formulaire/fieldset-container";
import { FieldsetContainerComponent } from "../fieldset-container/fieldset-container.component";
import { PabTableComponent } from "../pab-table/pab-table.component";
import { ServiceFactory } from "../../services/service-factory";
import { MatDialog } from "@angular/material";
import { DialogConfirmCloseCalcComponent } from "../dialog-confirm-close-calc/dialog-confirm-close-calc.component";
import { DialogGeneratePABComponent } from "../dialog-generate-pab/dialog-generate-pab.component";
import { PabTable } from "../../formulaire/pab-table";
@Component({
    selector: "hydrocalc",
    templateUrl: "./calculator.component.html",
    styleUrls: ["./calculator.component.scss"]
export class GenericCalculatorComponent extends BaseComponent implements OnInit, DoCheck, AfterViewChecked, OnDestroy, Observer {
    /**
     * liste des FieldSetComponent
    @ViewChildren(FieldSetComponent)
    private _fieldsetComponents: QueryList<FieldSetComponent>;
    /**
     * liste des FieldsetContainerComponent
    @ViewChildren(FieldsetContainerComponent)
    private _fieldsetContainerComponents: QueryList<FieldsetContainerComponent>;
    /**
     * PabTableComponent if any
    @ViewChild(PabTableComponent)
    private _pabTableComponent: PabTableComponent;
    /**
     * composant d'affichage des résultats
    @ViewChild(CalculatorResultsComponent)
    private resultsComponent: CalculatorResultsComponent;
    /**
     * composant "nom du module de calcul"
    @ViewChild(CalculatorNameComponent)
    private _calculatorNameComponent: CalculatorNameComponent;
    /**
     * formulaire affiché
    private _formulaire: FormulaireDefinition;
    private _subscription: Subscription; // pour souscrire aux changements d'URL envoyés par le routeur
    /**
     * true si on a cliqué sur le bouton de lancement de calcul
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
*/ private _computeClicked: boolean; /** * flag de validité gloable de la saisie * NB : la validité du bouton "calculer" dépend de la validité de la saisie dans l'UI et de celle indiquée par le formulaire. * La validité de l'UI comprend la forme (pas de chaîne alpha dans les champs numériques, etc..). * La validité formulaire comprend le domaine de définition des valeurs saisies. */ private _isUIValid = false; /** * flag disabled du bouton "calculer" */ public isCalculateDisabled = true; /** * flag (+info) indiquant un événement radio à traiter * nécessaire avec l'introduction du mode de valeur LINK des paramètres car quand on modifie le mode à LINK, les possibles * paramètres liables ne sont pas encore connus */ private _pendingRadioClick = false; private _pendingRadioClickInfo: any; // services private intlService: I18nService; private formulaireService: FormulaireService; public get ID() { if (this._formulaire) { return this._formulaire.uid; } else { return "calculator_1"; } } constructor( private route: ActivatedRoute, private router: Router, private confirmCloseCalcDialog: MatDialog, private generatePABDialog: MatDialog, private _elementRef: ElementRef ) { super(); this.intlService = ServiceFactory.instance.i18nService; this.formulaireService = ServiceFactory.instance.formulaireService; } public get formElements(): FormulaireElement[] { if (this._formulaire === undefined) { return []; } return this._formulaire.kids as FormulaireElement[]; } /** * détermine si un FormulaireElement est du type FieldSet */ public isFieldset(fe: any): boolean { return fe instanceof FieldSet; } /** * détermine si un FormulaireElement est du type FieldsetContainer */ public isFieldsetContainer(fe: any): boolean { return fe instanceof FieldsetContainer; }
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
/** * détermine si un FormulaireElement est du type PabTable */ public isPabTable(fe: any): boolean { return fe instanceof PabTable; } public get hasForm() { return this._formulaire !== undefined; } public get hasResults() { if (this.hasForm) { return this._formulaire.hasResults; } return false; } public get uitextTitre() { if (this.hasForm) { return this.formulaireService.getLocalisedTitleFromCalculatorType(this._formulaire.calculatorType); } } public get uitextCalculer() { return this.intlService.localizeText("INFO_CALCULATOR_CALCULER"); } public get uitextCalculatorName() { return this.intlService.localizeText("INFO_CALCULATOR_CALC_NAME"); } public get uitextResultsTitle() { return this.intlService.localizeText("INFO_CALCULATOR_RESULTS_TITLE"); } public get uitextGeneratePAB() { return this.intlService.localizeText("INFO_CALCULATOR_RESULTS_GENERATE_PAB"); } /** * Triggered at calculator instanciation */ ngOnInit() { this.formulaireService.addObserver(this); this.subscribeRouter(); } ngDoCheck() { this.isCalculateDisabled = ! this._isUIValid; } ngOnDestroy() { this.unsubscribeRouter(); this.formulaireService.removeObserver(this); this.intlService.removeObserver(this); } private subscribeRouter() { // récupération des paramètres passés avec la route (URL) this._subscription = this.route.params.subscribe(params => { const uid: string = params["uid"]; this.formulaireService.setCurrentForm(uid); }); } private unsubscribeRouter() { if (this._subscription) { this._subscription.unsubscribe(); }