From 565f99415784a169f1474881dc9a8d07cb687ae4 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 22 May 2019 13:10:52 +0200
Subject: [PATCH] =?UTF-8?q?Fix=20#204=20:=20fullscreen=20r=C3=A9trocompati?=
 =?UTF-8?q?ble,=20factorisation=20de=20code?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 package.json                                  |  1 +
 .../fixedvar-results/results.component.ts     | 33 +++++++++++++++++++
 .../fixedvar-results/var-results.component.ts | 20 +++--------
 .../pab-results-table.component.ts            | 20 +++--------
 .../remous-results.component.ts               | 23 +++----------
 .../results-graph/results-graph.component.ts  | 20 +++--------
 .../section-results.component.ts              | 20 +++--------
 7 files changed, 59 insertions(+), 78 deletions(-)
 create mode 100644 src/app/components/fixedvar-results/results.component.ts

diff --git a/package.json b/package.json
index 57219b5b6..3a0cdd9e4 100644
--- a/package.json
+++ b/package.json
@@ -50,6 +50,7 @@
     "roboto-fontface": "^0.10.0",
     "rxjs": "^6.3.3",
     "rxjs-compat": "^6.3.3",
+    "screenfull": "^4.2.0",
     "tslib": "^1.9.0",
     "xlsx": "^0.14.1",
     "zone.js": "^0.8.28"
diff --git a/src/app/components/fixedvar-results/results.component.ts b/src/app/components/fixedvar-results/results.component.ts
new file mode 100644
index 000000000..57c95d10a
--- /dev/null
+++ b/src/app/components/fixedvar-results/results.component.ts
@@ -0,0 +1,33 @@
+import * as screenfull from "screenfull";
+import { Screenfull } from "screenfull"; // @see https://github.com/sindresorhus/screenfull.js/issues/126#issuecomment-488796645
+
+/**
+ * Base class for results components, including common features
+ */
+export class ResultsComponent {
+
+    /** tracks the fullscreen state */
+    public get isFullscreen() {
+        // return (document["fullscreenElement"] !== null);
+        const sf = <Screenfull>screenfull;
+        if (sf.enabled) {
+            return sf.isFullscreen;
+        }
+    }
+
+    public setFullscreen(element) {
+        // element.requestFullscreen();
+        const sf = <Screenfull>screenfull;
+        if (sf.enabled) {
+            sf.request(element);
+        }
+    }
+
+    public exitFullscreen() {
+        // document.exitFullscreen();
+        const sf = <Screenfull>screenfull;
+        if (sf.enabled) {
+            sf.exit();
+        }
+    }
+}
diff --git a/src/app/components/fixedvar-results/var-results.component.ts b/src/app/components/fixedvar-results/var-results.component.ts
index b8185119d..2151ddd92 100644
--- a/src/app/components/fixedvar-results/var-results.component.ts
+++ b/src/app/components/fixedvar-results/var-results.component.ts
@@ -4,6 +4,7 @@ import { ApplicationSetupService } from "../../services/app-setup/app-setup.serv
 import { ResultElement } from "jalhyd";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
 import * as XLSX from "xlsx";
+import { ResultsComponent } from "./results.component";
 
 @Component({
     selector: "var-results",
@@ -12,7 +13,7 @@ import * as XLSX from "xlsx";
         "./var-results.component.scss"
     ]
 })
-export class VarResultsComponent {
+export class VarResultsComponent extends ResultsComponent {
 
     /** rÊsultats non mis en forme */
     protected _varResults: VarResults;
@@ -23,17 +24,14 @@ export class VarResultsComponent {
     /** entÃĒtes des colonnes (param à varier, à calculer + extraResults) */
     protected _headers: string[];
 
-    /** tracks the fullscreen state */
-    public get isFullscreen() {
-        return (document["fullscreenElement"] !== null);
-    }
-
     @ViewChild("tableContainer") table: ElementRef;
 
     constructor(
         protected appSetupService: ApplicationSetupService,
         protected intlService: I18nService
-    ) { }
+    ) {
+        super();
+    }
 
     public set results(r: VarResults) {
         this._varResults = r;
@@ -106,14 +104,6 @@ export class VarResultsComponent {
         return data;
     }
 
-    public setFullscreen(element) {
-        element.requestFullscreen();
-    }
-
-    public exitFullscreen() {
-        document.exitFullscreen();
-    }
-
     public exportAsSpreadsheet() {
         // automagic <table> extraction
         const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(this.table.nativeElement);
diff --git a/src/app/components/pab-results/pab-results-table.component.ts b/src/app/components/pab-results/pab-results-table.component.ts
index 2d66c877f..af0ebe4df 100644
--- a/src/app/components/pab-results/pab-results-table.component.ts
+++ b/src/app/components/pab-results/pab-results-table.component.ts
@@ -5,6 +5,7 @@ import { PabResults } from "../../results/pab-results";
 import * as XLSX from "xlsx";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
+import { ResultsComponent } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "pab-results-table",
@@ -13,7 +14,7 @@ import { I18nService } from "../../services/internationalisation/internationalis
         "./pab-results-table.component.scss"
     ]
 })
-export class PabResultsTableComponent {
+export class PabResultsTableComponent extends ResultsComponent {
 
     /** rÊsultats non mis en forme */
     private _pabResults: PabResults;
@@ -24,17 +25,14 @@ export class PabResultsTableComponent {
     /** rÊsultats mis en forme */
     private _dataSet: any[];
 
-    /** tracks the fullscreen state */
-    public get isFullscreen() {
-        return (document["fullscreenElement"] !== null);
-    }
-
     @ViewChild("tableContainer") table: ElementRef;
 
     constructor(
         protected appSetupService: ApplicationSetupService,
         protected intlService: I18nService
-    ) { }
+    ) {
+        super();
+    }
 
     public set results(r: PabResults) {
         this._pabResults = r;
@@ -138,14 +136,6 @@ export class PabResultsTableComponent {
         return this._dataSet;
     }
 
-    public setFullscreen(element) {
-        element.requestFullscreen();
-    }
-
-    public exitFullscreen() {
-        document.exitFullscreen();
-    }
-
     public exportAsSpreadsheet() {
         // automagic <table> extraction
         const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(this.table.nativeElement);
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index 8192b2397..f11fa831b 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -10,6 +10,7 @@ import { VarResultsComponent } from "../fixedvar-results/var-results.component";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
 import { ServiceFactory } from "../../services/service-factory";
 import { FormulaireService } from "../../services/formulaire/formulaire.service";
+import { ResultsComponent } from "../fixedvar-results/results.component";
 
 /**
  * donnÊes pour une ligne dans le graphe
@@ -35,8 +36,6 @@ class LineData {
      */
     private _data = {};
 
-    private appSetup: ApplicationSetupService;
-
     /**
      * profondeur à laquelle est dessinÊe la ligne
      * les profondeurs les plus petites sont dessinÊes derrière les profondeurs les plus grandes
@@ -49,7 +48,6 @@ class LineData {
         for (let i = this._tx.length - 1; i >= 0; i--) {
             this._ty.push(null);
         }
-        this.appSetup = ServiceFactory.instance.applicationSetupService;
     }
 
     public getYat(x: number) {
@@ -198,7 +196,7 @@ class GraphData {
         "./remous-results.component.scss"
     ]
 })
-export class RemousResultsComponent implements DoCheck {
+export class RemousResultsComponent extends ResultsComponent implements DoCheck {
     private _remousResults: RemousResults;
 
     /*
@@ -237,16 +235,13 @@ export class RemousResultsComponent implements DoCheck {
     @ViewChild(LogComponent)
     private logComponent: LogComponent;
 
-    /** tracks the fullscreen state */
-    public get isFullscreen() {
-        return (document["fullscreenElement"] !== null);
-    }
-
     constructor(
         private intlService: I18nService,
         private appSetup: ApplicationSetupService,
         private formService: FormulaireService
-    ) { }
+    ) {
+        super();
+    }
 
     private get uitextLigneFluviale() {
         // calculator type for translation
@@ -655,14 +650,6 @@ export class RemousResultsComponent implements DoCheck {
         }
     }
 
-    public setFullscreen(element) {
-        element.requestFullscreen();
-    }
-
-    public exitFullscreen() {
-        document.exitFullscreen();
-    }
-
     public exportAsImage(element: HTMLDivElement) {
         const canvas: HTMLCanvasElement = element.querySelector("canvas");
         canvas.toBlob((blob) => {
diff --git a/src/app/components/results-graph/results-graph.component.ts b/src/app/components/results-graph/results-graph.component.ts
index 1180e2e1e..efd025288 100644
--- a/src/app/components/results-graph/results-graph.component.ts
+++ b/src/app/components/results-graph/results-graph.component.ts
@@ -7,6 +7,7 @@ import { ApplicationSetupService } from "../../services/app-setup/app-setup.serv
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
 import { PlottableData } from "../../results/plottable-data";
 import { GraphType } from "../../results/graph-type";
+import { ResultsComponent } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "results-graph",
@@ -15,7 +16,7 @@ import { GraphType } from "../../results/graph-type";
         "./results-graph.component.scss"
     ]
 })
-export class ResultsGraphComponent implements AfterContentInit, Observer {
+export class ResultsGraphComponent extends ResultsComponent implements AfterContentInit, Observer {
     private _results: PlottableData;
 
     /** used to briefly destroy/rebuild the chart component, to refresh axis labels (@see bug #137) */
@@ -49,15 +50,12 @@ export class ResultsGraphComponent implements AfterContentInit, Observer {
         }
     };
 
-    /** tracks the fullscreen state */
-    public get isFullscreen() {
-        return (document["fullscreenElement"] !== null);
-    }
-
     public constructor(
         private appSetup: ApplicationSetupService,
         private intlService: I18nService
-    ) { }
+    ) {
+        super();
+    }
 
     public set results(r: PlottableData) {
         this.forceRebuild();
@@ -260,14 +258,6 @@ export class ResultsGraphComponent implements AfterContentInit, Observer {
         };
     }
 
-    public setFullscreen(element) {
-        element.requestFullscreen();
-    }
-
-    public exitFullscreen() {
-        document.exitFullscreen();
-    }
-
     public exportAsImage(element: HTMLDivElement) {
         const canvas: HTMLCanvasElement = element.querySelector("canvas");
         canvas.toBlob((blob) => {
diff --git a/src/app/components/section-results/section-results.component.ts b/src/app/components/section-results/section-results.component.ts
index 40eb93801..1309ab2ab 100644
--- a/src/app/components/section-results/section-results.component.ts
+++ b/src/app/components/section-results/section-results.component.ts
@@ -6,6 +6,7 @@ import { SectionCanvasComponent } from "../section-canvas/section-canvas.compone
 import { SectionResults } from "../../results/section-results";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
 import { CalculatorResults } from "../../results/calculator-results";
+import { ResultsComponent } from "../fixedvar-results/results.component";
 
 @Component({
     selector: "section-results",
@@ -14,11 +15,13 @@ import { CalculatorResults } from "../../results/calculator-results";
         "./section-results.component.scss"
     ]
 })
-export class SectionResultsComponent implements DoCheck {
+export class SectionResultsComponent extends ResultsComponent implements DoCheck {
 
     constructor(
         private appSetupService: ApplicationSetupService
-    ) { }
+    ) {
+        super();
+    }
 
     public set results(rs: CalculatorResults[]) {
         this._resultElement = undefined;
@@ -65,11 +68,6 @@ export class SectionResultsComponent implements DoCheck {
     @ViewChild(SectionCanvasComponent)
     private _sectionCanvas: SectionCanvasComponent;
 
-    /** tracks the fullscreen state */
-    public get isFullscreen() {
-        return (document["fullscreenElement"] !== null);
-    }
-
     public updateView() {
         if (this._sectionCanvas) {
             this._sectionCanvas.reset();
@@ -126,14 +124,6 @@ export class SectionResultsComponent implements DoCheck {
         return "result_id_" + String(i & 1);
     }
 
-    public setFullscreen(element) {
-        element.requestFullscreen();
-    }
-
-    public exitFullscreen() {
-        document.exitFullscreen();
-    }
-
     public exportAsImage(element: HTMLDivElement) {
         const canvas: HTMLCanvasElement = element.querySelector("canvas");
         canvas.toBlob((blob) => {
-- 
GitLab