From ce8b402ebb22e43275cb836f747c8d1ae3a09e1e Mon Sep 17 00:00:00 2001 From: Eugen Neuber <eugen.neuber@tugraz.at> Date: Mon, 12 Aug 2019 17:06:12 +0200 Subject: [PATCH] Fix data reload, better demo --- .../data-table-view/src/data-table-view.js | 141 +++++++++++++----- packages/data-table-view/src/demo.js | 41 +++-- 2 files changed, 139 insertions(+), 43 deletions(-) diff --git a/packages/data-table-view/src/data-table-view.js b/packages/data-table-view/src/data-table-view.js index 74d954af..0cf806e2 100644 --- a/packages/data-table-view/src/data-table-view.js +++ b/packages/data-table-view/src/data-table-view.js @@ -19,6 +19,15 @@ class DataTableView extends LitElement { this.apiUrl = null; this.whitelist_cols = '*'; this.blacklist_cols = ''; + this.table_columns = []; // all possible columns, defined by API entity + this.show_columns = []; // all columns visible in table, defined by property whhitelist/blacklist + this.display_columns = []; // all possible columns, in desired order for the table + // datatable properties + this.table = null; + this.paging = 1; + this.searching = 1; + // + this.is_loading = false; } static get properties() { @@ -30,6 +39,13 @@ class DataTableView extends LitElement { apiUrl: { type: String, attribute: false }, whitelist_cols: { type: String, attribute: 'whitelisted-columns' }, blacklist_cols: { type: String, attribute: 'blacklisted-columns' }, + table_columns: { type: Array, attribute: false }, + show_columns: { type: Array, attribute: false }, + display_columns: { type: Array, attribute: false }, + table: { type: Object, attribute: false }, + paging: { type: String }, + searching: { type: String }, + is_loading: { type: Boolean }, }; } @@ -40,12 +56,71 @@ class DataTableView extends LitElement { JSONLD.initialize(this.entryPointUrl, function (jsonld) { that.jsonld = jsonld; that.apiUrl = that.jsonld.getApiUrlForIdentifier("http://schema.org/" + that.value); + that.table_columns = that.jsonld.entities[that.value]['hydra:supportedProperty'].map(obj => obj['hydra:title']); + + // display empty table + that.setup_columns(); + let columns = []; + for (let i = 0; i < that.display_columns.length; ++i) { + columns[i] = { + title: that.display_columns[i], + visible: that.show_columns.indexOf(that.display_columns[i]) > -1 + }; + } + that.set_datatable(columns); + if (that.filter) { + that.loadWebPageElement(); + } }); // disabled, load first on toggle to visible window.addEventListener("vpu-auth-init", () => that.loadWebPageElement()); } + setup_columns() { + //let cols = this.table_columns.slice(); + + if (this.whitelist_cols === '*') { + const blacklist_cols = this.blacklist_cols.split(' '); + this.show_columns = this.table_columns.filter(col => blacklist_cols.indexOf(col) === -1); + } else { + this.show_columns = this.whitelist_cols.split(' '); + } + this.display_columns = this.show_columns.slice(); + for(let i=0; i < this.table_columns.length; ++i) { + if (this.display_columns.indexOf(this.table_columns[i]) === -1) + this.display_columns.push(this.table_columns[i]); + } + + } + + set_datatable(columns) { + const lang_de_url = 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/German.json'; + const lang_en_url = 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/English.json'; + + this.table = $(this.shadowRoot.querySelector('#dt')).DataTable({ + destroy: true, + language: { + url: this.lang === 'de' ? lang_de_url : lang_en_url, + }, + columns: columns, + data: [], + paging: this.paging > 0, + searching: this.searching > 0, + }); + } + + update_datatable(columns, rows) { + //console.log('rows = ' + rows); + const that = this; + if (this.table) { + this.table.clear(); + columns.forEach(function (item, index) { that.table.columns([index]).visible(item.visible === true); }); + rows.forEach(row => this.table.row.add(row)); + this.table.draw(); + } + } + loadWebPageElement() { if (window.VPUAuthToken === undefined || window.VPUAuthToken === "") { return; @@ -57,7 +132,8 @@ class DataTableView extends LitElement { const apiUrlWithFilter = this.apiUrl + '?search=' + this.filter; console.log('apiUrlWithFilter = ' + apiUrlWithFilter); - var that = this; + const that = this; + this.is_loading = true; fetch(apiUrlWithFilter, { headers: { @@ -68,44 +144,26 @@ class DataTableView extends LitElement { .then(res => res.json()) .then(function (data) { // TODO - console.log(data['hydra:member']); - const persons = data['hydra:member']; - let cols = []; - if (that.whitelist_cols === '*') { - const blacklist_cols = that.blacklist_cols.split(' '); - for (let i = 0; i < persons.length; ++i) { - let new_cols = Object.keys(persons[i]); - cols = cols.concat(new_cols.filter(item => (!~cols.indexOf(item) && !~blacklist_cols.indexOf(item)))); - } - } else { - cols = that.whitelist_cols.split(' '); - } - console.log('cols = ' + cols); + that.setup_columns(); + + const items = data['hydra:member']; let rows = []; let columns = []; - for(let i=0; i < cols.length; ++i) { - columns[i] = { title: cols[i] }; - for(let j=0; j < persons.length; ++j) { + for(let i=0; i < that.display_columns.length; ++i) { + columns[i] = { + title: that.display_columns[i], + visible: that.show_columns.indexOf(that.display_columns[i]) > -1 + }; + for(let j=0; j < items.length; ++j) { if (rows[j] === undefined) { rows[j] = []; } - rows[j][i] = persons[j][cols[i]] || ''; + rows[j][i] = items[j][that.display_columns[i]] || ''; } } - const lang_de_url = 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/German.json'; - const lang_en_url = 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/English.json'; - - const table = $(that.shadowRoot.querySelector('#dt')).DataTable({ - destroy: true, - language: { - url: that.lang === 'de' ? lang_de_url : lang_en_url, - }, - columns: columns, - data: rows, - } - ); - + that.update_datatable(columns, rows); + that.is_loading = false; }) .catch(); } @@ -120,6 +178,8 @@ class DataTableView extends LitElement { case "filter": case "whitelist_cols": case "blacklist_cols": + case "paging": + case "searching": this.loadWebPageElement(); break; case "value": @@ -138,13 +198,26 @@ class DataTableView extends LitElement { } render() { - var dt_css = getAssetURL('datatables/css/jquery.dataTables.min.css') + let dt_css = getAssetURL('datatables/css/jquery.dataTables.min.css'); return html` <link rel="stylesheet" href="${dt_css}"> <style> + #cover { + min-width: 100px; + display: ${this.is_loading ? 'block' : 'none'}; + position: relative; height: 100%; width: 100%; top: 0; left: 0; background: #fff; z-index:9999; + } + #cover img { + display: block; + margin 0 auto; + } </style> - <table id="dt" class="display" style="width:100%"> - </table> + <div id="dt-parent"> + <div id="cover"> + <img src="data:image/gif;base64,R0lGODlhEAAQAPQAAP///wAAAPj4+Dg4OISEhAYGBiYmJtbW1qioqBYWFnZ2dmZmZuTk5JiYmMbGxkhISFZWVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAAKAAEALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkEAAoAAgAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoLLoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkEAAoAAwAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAAKAAQALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYAqrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAAKAAUALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0UaFBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA=="> + </div> + <table id="dt" class="display" style="width:100%"></table> + </div> `; } } diff --git a/packages/data-table-view/src/demo.js b/packages/data-table-view/src/demo.js index beb6725b..8dc1c336 100644 --- a/packages/data-table-view/src/demo.js +++ b/packages/data-table-view/src/demo.js @@ -33,7 +33,6 @@ class DataTableViewDemo extends LitElement { } colsChange(e) { - alert('colsChange: ' + e.target.value); let datatable = this.shadowRoot.querySelector('#dt1'); if (datatable === undefined) { alter('datatable not found'); return; } datatable.setAttribute('whitelisted-columns', e.target.value); @@ -47,6 +46,11 @@ class DataTableViewDemo extends LitElement { padding: 10px; border: 1px solid orange; } + .box2 { + margin: 10px; + padding: 10px; + border: 1px solid green; + } </style> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css"> @@ -58,6 +62,7 @@ class DataTableViewDemo extends LitElement { <vpu-auth lang="${this.lang}" client-id="${setting('keyCloakClientId')}" load-person force-login></vpu-auth> </div> <div class="content"> + <h4>DataTable: paging and searching</h4> <p> <label for="filter">Filter für die Suche:</label> <input type="text" name="filter" id="filter" value="" placeholder="Geben Sie mindestens 3 Zeichen ein" @change="${this.filterChange}"> @@ -67,14 +72,32 @@ class DataTableViewDemo extends LitElement { <input type="text" name="columns" id="columns" value="*" placeholder="Geben Sie einen Stern * für alle ein" @change="${this.colsChange}"> </p> <div class="box"> - <vpu-data-table-view - lang="${this.lang}" - value="Person" - filter="" - whitelisted-columns="*" - blacklisted-columns="@id @type functions roles accountTypes" - id="dt1" - ></vpu-data-table-view> + <vpu-data-table-view + lang="${this.lang}" + value="Person" + filter="" + whitelisted-columns="*" + blacklisted-columns="phoneExtension name" + id="dt1" + paging="1" + ></vpu-data-table-view> + </div> + </div> + </section> + <section class="section"> + <div class="content"> + <h4>DataTable: no paging, no searching</h4> + <div class="box2"> + <vpu-data-table-view + lang="${this.lang}" + value="Person" + filter="Ab" + whitelisted-columns="name telephone email" + blacklisted-columns="" + id="dt2" + paging="0" + searching="0" + ></vpu-data-table-view> </div> </div> </section> -- GitLab