From e48ad732385f5c08f763ce1dc6480123b1ffd039 Mon Sep 17 00:00:00 2001
From: Eugen Neuber <eugen.neuber@tugraz.at>
Date: Mon, 20 Jan 2020 15:00:10 +0100
Subject: [PATCH] Search in column 1 AND column 2 and sum up

See issue #3
---
 packages/data-table-view/package.json         |  2 +-
 .../src/vpu-data-table-view-demo.js           | 13 ++--
 .../src/vpu-data-table-view.js                | 59 +++++++++++--------
 3 files changed, 43 insertions(+), 31 deletions(-)

diff --git a/packages/data-table-view/package.json b/packages/data-table-view/package.json
index 50068131..021a26f6 100644
--- a/packages/data-table-view/package.json
+++ b/packages/data-table-view/package.json
@@ -30,7 +30,7 @@
     "@webcomponents/webcomponentsjs": "^2.2.10",
     "keycloak-js": "^8.0.0",
     "event-target-shim": "^5.0.1",
-    "datatables.net-dt": "^1.10.19",
+    "datatables.net-dt": "^1.10.20",
     "datatables.net-responsive": "^2.2.3",
     "datatables.net-responsive-dt": "^2.2.3",
     "datatables.net-buttons": "^1.6.1",
diff --git a/packages/data-table-view/src/vpu-data-table-view-demo.js b/packages/data-table-view/src/vpu-data-table-view-demo.js
index 8cba2896..6a9aa78e 100644
--- a/packages/data-table-view/src/vpu-data-table-view-demo.js
+++ b/packages/data-table-view/src/vpu-data-table-view-demo.js
@@ -42,7 +42,7 @@ class DataTableViewDemo extends LitElement {
                 vdtv1.set_columns([{title:'Bezeichnung'}, {title:'Nummer'}, {title:'Datum'}, null, null])
                     .set_columnDefs(vdtv1_columnDefs)
                     .set_datatable(tbl)
-                    .on('draw', this.vdtv_preDraw.bind(this));
+                    .on('draw', this.vdtv_draw.bind(this));
             }
 
             /*
@@ -87,12 +87,11 @@ class DataTableViewDemo extends LitElement {
         ];
     }
 
-    vdtv_preDraw() {
+    vdtv_draw() {
         const vdtv1 = this.shadowRoot.querySelector('#vdtv1');
         const value = vdtv1.columnReduce(1, function (a, b) {
-            return a + b;
+            return a * 1 + b * 1;
         });
-        console.log('preDraw sum=' + value);
         this.shadowRoot.querySelector('#id-sum').value = value;
     }
 
@@ -173,15 +172,15 @@ class DataTableViewDemo extends LitElement {
                 <div class="content">
                     <h4>DataTable: with data, paging and searching AND exportable</h4>
                      <div class="box">
-                        <label for="id-sum">Sum of Number</label>
+                        <label for="id-sum">Sum of column <b>Number</b> is</label>
                         <input type="text" readonly value="" name="sum" id="id-sum">
                         <vpu-data-table-view paging searching exportable export-name="Demo Export" column-searching
                                              lang="${this.lang}" id="vdtv1"></vpu-data-table-view>
                     </div>
                     <h4>DataTable: no data, no paging, no searching</h4>
                     <div class="box">
-                    <button class="button is-small" @click="${this.vdtv2_add_rows}">noch etwas...</button>
-                        <vpu-data-table-view lang="${this.lang}" id="vdtv2">></vpu-data-table-view>
+                        <button class="button is-small" @click="${this.vdtv2_add_rows}">add something...</button>
+                        <vpu-data-table-view lang="${this.lang}" id="vdtv2"></vpu-data-table-view>
                     </div>
                 </div>
                 <div class="content">
diff --git a/packages/data-table-view/src/vpu-data-table-view.js b/packages/data-table-view/src/vpu-data-table-view.js
index d1a82b4c..23a426f6 100644
--- a/packages/data-table-view/src/vpu-data-table-view.js
+++ b/packages/data-table-view/src/vpu-data-table-view.js
@@ -98,6 +98,31 @@ class DataTableView extends LitElement {
             return this;
         }
 
+        if (this.columnSearching) {
+            const existing_tfoot = this.shadowRoot.querySelector('table tfoot');
+            if (existing_tfoot === null || !existing_tfoot.hasChildNodes()) {
+                const fragment = document.createDocumentFragment();
+                const tfoot = document.createElement('tfoot');
+                const tr = document.createElement('tr');
+                this.columns.forEach(function (element, index) {
+                    const th = document.createElement('td');
+                    if (element !== null
+                        && (typeof element.visible === 'undefined' || element.visible !== false)
+                        && (typeof element.searchable === 'undefined' || element.searchable !== false)) {
+                        const input = document.createElement('input');
+                        input.type = 'text';
+                        input.id = 'input-col-' + index;
+                        input.placeholder = 'Search in ' + element.title;
+                        th.appendChild(input);
+                    }
+                    tr.appendChild(th);
+                });
+                tfoot.appendChild(tr);
+                fragment.appendChild(tfoot);
+                this.shadowRoot.querySelector('table').appendChild(fragment);
+            }
+        }
+
         this.table = $(this.shadowRoot.querySelector('table')).DataTable({
             destroy: true,
             autoWidth: true,
@@ -157,37 +182,25 @@ class DataTableView extends LitElement {
         });
 
         if (this.columnSearching) {
-            const existing_tfoot = this.shadowRoot.querySelector('table tfoot');
-            if (existing_tfoot === null || !existing_tfoot.hasChildNodes()) {
                 const thisTable = this.table;
-                const fragment = document.createDocumentFragment();
-                const tfoot = document.createElement('tfoot');
-                const tr = document.createElement('tr');
                 const that = this;
                 this.columns.forEach(function (element, index) {
-                    const th = document.createElement('th');
                     if (element !== null
                         && (typeof element.visible === 'undefined' || element.visible !== false)
                         && (typeof element.searchable === 'undefined' || element.searchable !== false)) {
-                        const inp = document.createElement('input');
-                        inp.type = 'text';
-                        inp.placeholder = 'Search ' + element.title;
-                        inp.addEventListener('keyup', function () {
-                            thisTable.column(index).search(inp.value).draw();
-//                            console.log('on keyup: '+index+','+inp.value+' sum = '+that.columnReduce(index, function(a,b){return a+b;}));
-
-                        });
-                        th.appendChild(inp);
-                        console.log('inp for ' + element.title);
+                        const input = that.shadowRoot.querySelector('#input-col-' + index);
+                        if (input) {
+                            ['keyup', 'change', 'clear'].forEach(function (event) {
+                                input.addEventListener(event, function () {
+                                    const column = thisTable.column(index);
+                                    if (column.search() !== input.value) {
+                                        column.search(input.value).draw();
+                                    }
+                                });
+                            });
+                        }
                     }
-                    tr.appendChild(th);
-                    //fragment.appendChild(th);
                 });
-                tfoot.appendChild(tr);
-                fragment.appendChild(tfoot);
-                //this.shadowRoot.querySelector('tfoot').appendChild(fragment);
-                this.shadowRoot.querySelector('table').appendChild(fragment);
-            }
         }
         return this;
     }
-- 
GitLab