diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 789305b9a752777438355337e8e700c0dada3eb0..4d3c377cecef1177c19f7f8e1a13b9c65ecd523c 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -330,19 +330,22 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     }
 
     public doCompute() {
-        this.matomoTracker.trackEvent("userAction", "triggerCalculation", CalculatorType[this._formulaire.currentNub.calcType]);
-        this._formulaire.resetResults([]);
-        this.appComponent.showProgressBar = true;
-        this._computeClicked = true;
-        // send resetForm to clear log
-        this._formulaire.notifyObservers({
-            "action": "resetForm",
-        }, this._formulaire);
-        // calculate module
-        setTimeout(() => {
-            this._formulaire.doCompute();
-            this.appComponent.showProgressBar = false;
-        }, 100); // 100ms is important, a lower value may make the progress bar never appear :/
+        // check again, to prevent Alt+Enter to calculate an invalid form
+        if (! this.isCalculateDisabled) {
+            this.matomoTracker.trackEvent("userAction", "triggerCalculation", CalculatorType[this._formulaire.currentNub.calcType]);
+            this._formulaire.resetResults([]);
+            this.appComponent.showProgressBar = true;
+            this._computeClicked = true;
+            // send resetForm to clear log
+            this._formulaire.notifyObservers({
+                "action": "resetForm",
+            }, this._formulaire);
+            // calculate module
+            setTimeout(() => {
+                this._formulaire.doCompute();
+                this.appComponent.showProgressBar = false;
+            }, 100); // 100ms is important, a lower value may make the progress bar never appear :/
+        }
     }
 
     public onCalcResultsViewChecked() {
@@ -439,49 +442,50 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     private updateUIValidity() {
         this._isUIValid = false;
         if (! this._formulaire.calculateDisabled) {
-        if (this._fieldsetComponents !== undefined) {
-            this._isUIValid = this._fieldsetComponents.reduce(
-                // callback
-                (
-                    // accumulator (valeur précédente du résultat)
-                    acc,
-                    // currentValue (élément courant dans le tableau)
-                    fieldset,
-                    // currentIndex (indice courant dans le tableau)
-                    currIndex,
-                    // array (tableau parcouru)
-                    array
-                ) => {
-                    return acc && fieldset.isValid;
-                }
-                // valeur initiale
-                , this._fieldsetComponents.length > 0);
-        }
-
-        if (this._fieldsetContainerComponents !== undefined) {
-            this._isUIValid = this._isUIValid && this._fieldsetContainerComponents.reduce<boolean>(
-                // callback
-                (
-                    // accumulator (valeur précédente du résultat)
-                    acc,
-                    // currentValue (élément courant dans le tableau)
-                    fieldsetContainer,
-                    // currentIndex (indice courant dans le tableau)
-                    currIndex,
-                    // array (tableau parcouru)
-                    array
-                ): boolean => {
-                    return acc && fieldsetContainer.isValid;
-                }
-                // valeur initiale
-                , true);
-        }
-
-        if (this._pabTableComponent !== undefined) {
-            this._isUIValid = this._isUIValid && this._pabTableComponent.isValid;
+            // all fieldsets must be valid
+            if (this._fieldsetComponents !== undefined) {
+                this._isUIValid = this._fieldsetComponents.reduce(
+                    // callback
+                    (
+                        // accumulator (valeur précédente du résultat)
+                        acc,
+                        // currentValue (élément courant dans le tableau)
+                        fieldset,
+                        // currentIndex (indice courant dans le tableau)
+                        currIndex,
+                        // array (tableau parcouru)
+                        array
+                    ) => {
+                        return acc && fieldset.isValid;
+                    }
+                    // valeur initiale
+                    , this._fieldsetComponents.length > 0);
+            }
+            // all fieldset containers must be valid
+            if (this._fieldsetContainerComponents !== undefined) {
+                this._isUIValid = this._isUIValid && this._fieldsetContainerComponents.reduce<boolean>(
+                    // callback
+                    (
+                        // accumulator (valeur précédente du résultat)
+                        acc,
+                        // currentValue (élément courant dans le tableau)
+                        fieldsetContainer,
+                        // currentIndex (indice courant dans le tableau)
+                        currIndex,
+                        // array (tableau parcouru)
+                        array
+                    ): boolean => {
+                        return acc && fieldsetContainer.isValid;
+                    }
+                    // valeur initiale
+                    , true);
+            }
+            // special components must be valid
+            if (this._pabTableComponent !== undefined) {
+                this._isUIValid = this._isUIValid && this._pabTableComponent.isValid;
+            }
         }
     }
-    }
 
     public getElementStyleDisplay(id: string) {
         const isDisplayed: boolean = this._formulaire.isDisplayed(id);