From 2e760e476c16ed377ceb8c1fcc068584486e889b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr>
Date: Thu, 8 Sep 2022 09:47:34 +0200
Subject: [PATCH] refactor: make FieldsetContainerComponent generic, create
 StructureFieldsetContainerComponent inherited class

refs #522
---
 e2e/calculator.po.ts                          |  4 +--
 src/app/app.module.ts                         |  2 ++
 .../fieldset-container.component.ts           | 14 ++------
 .../calculator.component.html                 | 13 +++++--
 .../calculator.component.ts                   | 21 +++++++++--
 .../structure-fieldset-container.component.ts | 36 +++++++++++++++++++
 6 files changed, 72 insertions(+), 18 deletions(-)
 create mode 100644 src/app/components/structure-fieldset-container/structure-fieldset-container.component.ts

diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts
index 757a2fa70..a0648690a 100644
--- a/e2e/calculator.po.ts
+++ b/e2e/calculator.po.ts
@@ -64,11 +64,11 @@ export class CalculatorPage {
     }
 
     getAddStructureButton() {
-        return element(by.css("fieldset-container .hyd-window-btns button.add-structure"));
+        return element(by.css("structure-fieldset-container .hyd-window-btns button.add-structure"));
     }
 
     getCopyStructureButton() {
-        return element(by.css("fieldset-container .hyd-window-btns button.copy-structure"));
+        return element(by.css("structure-fieldset-container .hyd-window-btns button.copy-structure"));
     }
 
     getAllLinkButtons() {
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 468ee73c9..cfcff201e 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -120,6 +120,7 @@ import { ImmediateErrorStateMatcher } from "./formulaire/immediate-error-state-m
 import { LoadSessionURLComponent } from "./components/load-session-url/load-session-url.component";
 import { DialogShowMessageComponent } from "./components/dialog-show-message/dialog-show-message.component";
 import { DialogConfirmLoadSessionURLComponent } from "./components/dialog-confirm-load-session-url/dialog-confirm-load-session-url.component";
+import { StructureFieldsetContainerComponent } from "./components/structure-fieldset-container/structure-fieldset-container.component";
 
 const appRoutes: Routes = [
     { path: "list/search", component: CalculatorListComponent },
@@ -209,6 +210,7 @@ const appRoutes: Routes = [
         DialogConfirmLoadSessionURLComponent,
         FieldSetComponent,
         FieldsetContainerComponent,
+        StructureFieldsetContainerComponent,
         FixedResultsComponent,
         FixedVarResultsComponent,
         FlexGtXxsShowHideDirective,
diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts
index add37e2be..bbaa490da 100644
--- a/src/app/components/fieldset-container/fieldset-container.component.ts
+++ b/src/app/components/fieldset-container/fieldset-container.component.ts
@@ -31,7 +31,7 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
         return this._isValid.value;
     }
     @Input()
-    private _container: FieldsetContainer;
+    protected _container: FieldsetContainer;
 
     /**
      * liste des composants FieldSet enfants
@@ -82,16 +82,8 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
      * Ajoute un nouveau sous-nub (Structure, PabCloisons, YAXN… selon le cas)
      * dans un nouveau fieldset
      */
-    private addSubNub(after: FieldSet, clone: boolean = false) {
-        const newFs = this._container.addFromTemplate(0, after.indexAsKid());
-        if (clone) {
-            const prms = after.backupParameters();
-            // replace in-place to change properties (overkill)
-            // @WTF why only those two ?
-            newFs.setPropValue("structureType", after.properties.getPropValue("structureType"));
-            newFs.setPropValue("loiDebit", after.properties.getPropValue("loiDebit"));
-            newFs.restoreParameters(prms);
-        }
+    protected addSubNub(after: FieldSet, clone: boolean = false) {
+        this._container.addFromTemplate(0, after.indexAsKid());
     }
 
     private onFieldsetListChange() {
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index a560138f5..b713123c1 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -104,11 +104,11 @@
                                     (tabPressed)="onTabPressed($event)">
                                 </field-set>
 
-                                <fieldset-container *ngIf="isFieldsetContainer(fe)"
+                                <structure-fieldset-container *ngIf="isStructureFieldsetContainer(fe)"
                                     [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
                                     (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                     (tabPressed)="onTabPressed($event)">
-                                </fieldset-container>
+                                </structure-fieldset-container>
                             </ng-template>
                         </div>
 
@@ -130,6 +130,13 @@
                                 fxFlex="1 0 auto">
                             </fieldset-container>
 
+                            <structure-fieldset-container *ngIf="isStructureFieldsetContainer(fe)"
+                                [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
+                                (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                                (tabPressed)="onTabPressed($event)"
+                                fxFlex="1 0 auto">
+                            </structure-fieldset-container>
+
                             <pab-table *ngIf="isPabTable(fe)" [pabTable]=fe (radio)=onRadioClick($event)
                                 (validChange)=onElementValid() (inputChange)=onInputChange($event)
                                 fxFlex="1 0 auto">
@@ -206,4 +213,4 @@
 
     </form>
 
-</mat-card>
\ No newline at end of file
+</mat-card>
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 06c2735f6..c72aa6cbc 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -199,9 +199,26 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return fe instanceof FieldSet;
     }
 
-    /** détermine si un FormulaireElement est du type FieldsetContainer */
+    /** détermine si un FormulaireElement est du type FieldsetContainer et générique */
     public isFieldsetContainer(fe: any): boolean {
-        return fe instanceof FieldsetContainer;
+        if (fe instanceof FieldsetContainer) {
+            switch (fe.getTemplate(0).calcTypeFromConfig) {
+                case CalculatorType.Structure:
+                    return false;
+
+                default:
+                    return true;
+            }
+        }
+        return false;
+    }
+
+    /** détermine si un FormulaireElement est du type FieldsetContainer contenant des structures */
+    public isStructureFieldsetContainer(fe: any): boolean {
+        if (fe instanceof FieldsetContainer) {
+            return fe.getTemplate(0).calcTypeFromConfig === CalculatorType.Structure;
+        }
+        return false;
     }
 
     /** détermine si un FormulaireElement est du type PabTable */
diff --git a/src/app/components/structure-fieldset-container/structure-fieldset-container.component.ts b/src/app/components/structure-fieldset-container/structure-fieldset-container.component.ts
new file mode 100644
index 000000000..4b18a21f4
--- /dev/null
+++ b/src/app/components/structure-fieldset-container/structure-fieldset-container.component.ts
@@ -0,0 +1,36 @@
+import { Component } from "@angular/core";
+
+import { FieldSet } from "../../formulaire/elements/fieldset";
+import { I18nService } from "../../services/internationalisation.service";
+import { ApplicationSetupService } from "../../services/app-setup.service";
+import { FieldsetContainerComponent } from "../fieldset-container/fieldset-container.component";
+
+@Component({
+    selector: "structure-fieldset-container",
+    templateUrl: "../fieldset-container/fieldset-container.component.html",
+    styleUrls: [
+        "../fieldset-container/fieldset-container.component.scss"
+    ]
+})
+export class StructureFieldsetContainerComponent extends FieldsetContainerComponent {
+
+    constructor(i18nService: I18nService, appSetupService: ApplicationSetupService) {
+        super(i18nService, appSetupService);
+    }
+
+    /**
+     * Ajoute un nouveau sous-nub (Structure, PabCloisons, YAXN… selon le cas)
+     * dans un nouveau fieldset
+     */
+    protected addSubNub(after: FieldSet, clone: boolean = false) {
+        const newFs = this._container.addFromTemplate(0, after.indexAsKid());
+        if (clone) {
+            const prms = after.backupParameters();
+            // replace in-place to change properties (overkill)
+            // @WTF why only those two ?
+            newFs.setPropValue("structureType", after.properties.getPropValue("structureType"));
+            newFs.setPropValue("loiDebit", after.properties.getPropValue("loiDebit"));
+            newFs.restoreParameters(prms);
+        }
+    }
+}
-- 
GitLab