From 3d15d605f4d8910a623212371bedf23a58f5c94b Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Fri, 29 Nov 2019 15:19:20 +0100
Subject: [PATCH] Fix jalhyd#170 : export PAB geometry as XLSX

---
 src/app/app.component.ts                      |  2 +-
 .../pab-table/pab-table.component.html        |  8 +++++-
 .../pab-table/pab-table.component.ts          | 25 +++++++++++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 5e170d3bf..1c668cb82 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -165,7 +165,7 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     AppComponent.download(
       new Blob([wbout], {type: "application/octet-stream"}),
       "cassiopee-results.xlsx",
-      "application/vnd.ms-excel" // @TODO try "application/vnd.ms-excel"
+      "application/vnd.ms-excel"
     );
   }
 
diff --git a/src/app/components/pab-table/pab-table.component.html b/src/app/components/pab-table/pab-table.component.html
index d6d6d956b..ea43a0fb5 100644
--- a/src/app/components/pab-table/pab-table.component.html
+++ b/src/app/components/pab-table/pab-table.component.html
@@ -44,10 +44,16 @@
                 <mat-icon *ngIf="! selectionIsOneDevice">arrow_downward</mat-icon>
                 <mat-icon *ngIf="selectionIsOneDevice">arrow_forward</mat-icon>
             </button>
+            |
+            <button type="button" mat-icon-button color="primary" (click)="exportAsSpreadsheet()"
+              [title]="uitextExportAsSpreadsheet">
+                <mat-icon color="primary">file_download</mat-icon>
+            </button>
         </div>
     </div>
 
-    <p-table [columns]="cols" [value]="rows" class="pab-data-table">
+
+    <p-table id="geometry" [columns]="cols" [value]="rows" class="pab-data-table">
 
         <ng-template pTemplate="header" let-columns>
             <tr>
diff --git a/src/app/components/pab-table/pab-table.component.ts b/src/app/components/pab-table/pab-table.component.ts
index f867c9c20..3c965c103 100644
--- a/src/app/components/pab-table/pab-table.component.ts
+++ b/src/app/components/pab-table/pab-table.component.ts
@@ -24,6 +24,7 @@ import { ApplicationSetupService } from "../../services/app-setup.service";
 import { NotificationsService } from "../../services/notifications.service";
 import { PabTable } from "../../formulaire/pab-table";
 import { DialogEditPabComponent } from "../dialog-edit-pab/dialog-edit-pab.component";
+import { AppComponent } from "../../app.component";
 
 /**
  * The big editable data grid for calculator type "Pab" (component)
@@ -1410,4 +1411,28 @@ export class PabTableComponent implements AfterViewInit, OnInit {
     public get uitextEditPabTable() {
         return this.i18nService.localizeText("INFO_PAB_EDIT_VALUES");
     }
+
+    public exportAsSpreadsheet() {
+        const elem: any = document.getElementById("geometry");
+        const elemCopy = (elem as HTMLElement).cloneNode(true) as HTMLElement;
+        // enrich element copy: replace inputs by their values, so that it appears in the exported spreadsheet
+        const tables: any = elemCopy.getElementsByTagName("table");
+        for (const table of tables) {
+            const tds: any = table.getElementsByTagName("td");
+            for (const td of tds) {
+                // if it contains an input, replace it with the input value
+                const inputs = td.getElementsByTagName("input");
+                if (inputs.length > 0) {
+                    const input = inputs[0];
+                    td.innerHTML = input.value;
+                }
+            }
+        }
+        // export the enriched element copy
+        AppComponent.exportAsSpreadsheet(elemCopy as any);
+    }
+
+    public get uitextExportAsSpreadsheet() {
+        return this.i18nService.localizeText("INFO_RESULTS_EXPORT_AS_SPREADSHEET");
+    }
 }
-- 
GitLab