From 12d1701bb0fbd196bd4c55246cd3e5124ef0c9ca Mon Sep 17 00:00:00 2001 From: Eugen Neuber <eugen.neuber@tugraz.at> Date: Wed, 14 Aug 2019 16:41:01 +0200 Subject: [PATCH] Merge branch 'ajax-pipeline' --- packages/data-table-view/README.md | 6 ++ .../data-table-view/src/data-table-view.js | 100 +++++++++++------- packages/data-table-view/src/demo.js | 6 +- 3 files changed, 71 insertions(+), 41 deletions(-) diff --git a/packages/data-table-view/README.md b/packages/data-table-view/README.md index fabd86b1..a7447942 100644 --- a/packages/data-table-view/README.md +++ b/packages/data-table-view/README.md @@ -19,6 +19,12 @@ - example `<vpu-data-table-view lang="de"></vpu-data-table-view>` - `entry-point-url` (optional, default is the TU Graz entry point url): entry point url to access the api - example `<vpu-data-table-view entry-point-url="http://127.0.0.1:8000"></vpu-data-table-view>` +- `paging` (optional, required to let datatable do the paging of loaded rows) + - example `<vpu-data-table-view paging></vpu-data-table-view>` +- `searching` (optional, required if a search box is desired) + - example `<vpu-data-table-view searching></vpu-data-table-view>` +- `wait-until-all-loaded` (optional, required if all rows must load before use) + - example `<vpu-data-table-view wait-until-all-loaded></vpu-data-table-view>` # Local development ```bash diff --git a/packages/data-table-view/src/data-table-view.js b/packages/data-table-view/src/data-table-view.js index e803693e..d1e4a0bd 100644 --- a/packages/data-table-view/src/data-table-view.js +++ b/packages/data-table-view/src/data-table-view.js @@ -5,12 +5,14 @@ import resp2 from 'datatables.net-responsive-dt'; import {setting, getAPiUrl, getAssetURL, } from './utils.js'; import {i18n} from './i18n'; import {html, LitElement} from 'lit-element'; +import {unsafeHTML} from 'lit-html/directives/unsafe-html.js'; import JSONLD from 'vpu-common/jsonld'; import commonUtils from 'vpu-common/utils'; import {unsafeHTML} from 'lit-html/directives/unsafe-html.js'; dt(window, $); resp(window, $); +resp2(window, $); class DataTableView extends LitElement { constructor() { @@ -28,10 +30,12 @@ class DataTableView extends LitElement { this.display_columns = []; // all possible columns, in desired order for the table // datatable properties this.table = null; - this.paging = 1; - this.searching = 1; + this.responsive = null; + this.paging = false; + this.searching = false; // this.is_loading = false; + this.wait_until_all_loaded = false; } static get properties() { @@ -47,9 +51,10 @@ class DataTableView extends LitElement { 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 }, + paging: { type: Boolean }, + searching: { type: Boolean }, + is_loading: { type: Boolean, attribute: false }, + wait_until_all_loaded: { type: Boolean, attribute: 'wait-until-all-loaded'} }; } @@ -82,8 +87,6 @@ class DataTableView extends LitElement { } 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); @@ -92,10 +95,10 @@ class DataTableView extends LitElement { } 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) + if (this.display_columns.indexOf(this.table_columns[i]) === -1) { this.display_columns.push(this.table_columns[i]); + } } - } set_datatable(columns) { @@ -110,8 +113,8 @@ class DataTableView extends LitElement { }, columns: columns, data: [], - paging: this.paging > 0, - searching: this.searching > 0, + paging: this.paging, + searching: this.searching, }); try { @@ -127,29 +130,23 @@ class DataTableView extends LitElement { //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); }); + columns.forEach(function (item, index) { + let i = that.display_columns.indexOf(item.title); + // console.log('item = {' + item.title + ', ' + item.visible + '} i = ' + i); + that.table.columns([i]).visible(item.visible == true); + // TODO that.table.columns([index]).title = item.title; + }); rows.forEach(row => this.table.row.add(row)); // now ready to draw this.table.draw(); } } - loadWebPageElement() { - if (window.VPUAuthToken === undefined || window.VPUAuthToken === "") { - return; - } - if (this.apiUrl === null || this.jsonld === null) { - return; - } - - const apiUrlWithFilter = this.apiUrl + '?search=' + this.filter; - console.log('apiUrlWithFilter = ' + apiUrlWithFilter); - + async loader(page) { + const apiUrlWithFilter = this.apiUrl + '?search=' + this.filter + '&page=' + page; const that = this; - this.is_loading = true; - fetch(apiUrlWithFilter, { + return await fetch(apiUrlWithFilter, { headers: { 'Content-Type': 'application/ld+json', 'Authorization': 'Bearer ' + window.VPUAuthToken, @@ -163,23 +160,45 @@ class DataTableView extends LitElement { const items = data['hydra:member']; let rows = []; let columns = []; - for(let i=0; i < that.display_columns.length; ++i) { + 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] = []; + if (items) { + for (let j = 0; j < items.length; ++j) { + if (rows[j] === undefined) { + rows[j] = []; + } + rows[j][i] = items[j][that.display_columns[i]] || ''; } - rows[j][i] = items[j][that.display_columns[i]] || ''; } } that.update_datatable(columns, rows); - that.is_loading = false; - }) - .catch(); + + if (!that.wait_until_all_loaded) + that.is_loading = false; + + return items.length; + }); + } + async call_loader(page) { + return await this.loader(page); + } + + async loadWebPageElement() { + if (window.VPUAuthToken === undefined || window.VPUAuthToken === "") { + return; + } + if (this.apiUrl === null || this.jsonld === null) { + return; + } + + this.is_loading = true; + let page = 1; + while (await this.call_loader(page++) === 50) {} + this.is_loading = false; } update(changedProperties) { @@ -187,14 +206,17 @@ class DataTableView extends LitElement { // noinspection FallThroughInSwitchStatementJS switch (propName) { case "lang": - i18n.changeLanguage(this.lang); + i18n.changeLanguage(this.lang).catch(e => { console.log(e)}); break; - case "filter": case "whitelist_cols": case "blacklist_cols": + this.setup_columns(); + case "filter": case "paging": case "searching": - this.loadWebPageElement(); + if (this.table) + this.table.clear(); + this.loadWebPageElement().catch(e => { console.log(e)}); break; case "value": case "entryPointUrl": @@ -203,8 +225,10 @@ class DataTableView extends LitElement { that.jsonld = jsonld; that.apiUrl = that.jsonld.getApiUrlForIdentifier("http://schema.org/" + that.value); }); - this.loadWebPageElement(); + this.loadWebPageElement().catch(e => { console.log(e)}); break; + default: + // nothing to do for this properties } }); diff --git a/packages/data-table-view/src/demo.js b/packages/data-table-view/src/demo.js index 8dc1c336..b2b50195 100644 --- a/packages/data-table-view/src/demo.js +++ b/packages/data-table-view/src/demo.js @@ -79,7 +79,8 @@ class DataTableViewDemo extends LitElement { whitelisted-columns="*" blacklisted-columns="phoneExtension name" id="dt1" - paging="1" + paging + searching ></vpu-data-table-view> </div> </div> @@ -95,8 +96,7 @@ class DataTableViewDemo extends LitElement { whitelisted-columns="name telephone email" blacklisted-columns="" id="dt2" - paging="0" - searching="0" + wait-until-all-loaded ></vpu-data-table-view> </div> </div> -- GitLab