@digital-blueprint/sublibrary-app
Version:
[GitHub Repository](https://github.com/digital-blueprint/sublibrary-app) | [npmjs package](https://www.npmjs.com/package/@digital-blueprint/sublibrary-app) | [Unpkg CDN](https://unpkg.com/browse/@digital-blueprint/sublibrary-app/) | [Sublibrary Bundle](ht
340 lines (305 loc) • 11.8 kB
JavaScript
import $ from 'jquery';
import dt from 'datatables.net';
import resp from 'datatables.net-responsive';
import resp2 from 'datatables.net-responsive-dt';
import jszip from 'jszip/dist/jszip.js';
import bttn from 'datatables.net-buttons-dt';
import bttn2 from 'datatables.net-buttons';
import bttnHtml5 from 'datatables.net-buttons/js/buttons.html5.js';
import bttnPrint from 'datatables.net-buttons/js/buttons.print.js';
import {createInstance} from './i18n';
import {css, html} from 'lit';
import de from '../assets/datatables/i18n/German';
import en from '../assets/datatables/i18n/English';
import * as commonUtils from '@dbp-toolkit/common/utils';
import * as commonStyles from '@dbp-toolkit/common/styles';
import {name as pkgName} from './../package.json';
import {AdapterLitElement} from '@dbp-toolkit/common';
dt(window, $);
resp(window, $);
resp2(window, $);
bttn(window, $);
bttn2(window, $);
bttnHtml5(window, $, jszip);
bttnPrint(window, $);
export class DataTableView extends AdapterLitElement {
constructor() {
super();
this._i18n = createInstance();
this.lang = this._i18n.language;
// datatable properties
this.table = null;
this.responsive = null;
this.paging = false;
this.searching = false;
this.columns = [];
this.columnDefs = [];
this.data = [];
this.cssStyle = '';
this.exportable = false;
this.exportName = 'Data Export';
this.columnSearching = false;
this.defaultOrder = [];
}
setCSSStyle(style) {
this.cssStyle = style;
}
static get properties() {
return {
...super.properties,
lang: {type: String},
table: {type: Object, attribute: false},
paging: {type: Boolean},
searching: {type: Boolean},
columns: {type: Array, attribute: false},
columnDefs: {type: Array, attribute: false},
data: {type: Array, attribute: false},
cssStyle: {type: String, attribute: false},
exportable: {type: Boolean},
exportName: {type: String, attribute: 'export-name'},
columnSearching: {type: Boolean, attribute: 'column-searching'},
defaultOrder: {type: Array, attribute: 'default-order'},
};
}
set_columns(cols) {
this.columns = cols;
return this;
}
set_columnDefs(defs) {
this.columnDefs = defs;
return this;
}
set_defaultOrder(order) {
this.defaultOrder = order;
return this;
}
add_row(row) {
this.data.push(row);
this.table.row.add(row);
return this;
}
draw() {
this.table.draw();
return this;
}
columnSearch(col, str) {
this.table.column(col).search(str).draw();
}
columnReduce(col, func, init = 0) {
return this.table.column(col, {search: 'applied'}).data().reduce(func, init);
}
on(eventName, func) {
this.table.on(eventName, func);
return this;
}
set_datatable(data, languageChange = false) {
const lang_obj = this.lang === 'de' ? de : en;
const i18n = this._i18n;
if (typeof this.columns === 'undefined' || !this.columns.length) {
if (data.length) throw new Error('columns not set-up');
return this;
}
if (this.columnSearching) {
const existing_tfoot = this.shadowRoot.querySelector('table tfoot');
if (existing_tfoot === null || !existing_tfoot.hasChildNodes() || languageChange) {
if (existing_tfoot !== null) {
existing_tfoot.remove();
}
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.className = 'column-search-line';
input.id = 'input-col-' + index;
input.placeholder = i18n.t('column-search-placeholder', {
fieldName: 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,
language: lang_obj,
paging: this.paging,
searching: this.searching,
columns: this.columns,
columnDefs: this.columnDefs,
dom: (this.exportable ? '<"export-btn"B>' : '') + 'lfrtip',
buttons: [
{
extend: 'excelHtml5',
text: i18n.t('export-excel'),
title: this.exportName,
filename: this.exportName,
className: 'button is-small',
},
{
extend: 'csvHtml5',
text: i18n.t('export-csv'),
title: this.exportName,
filename: this.exportName,
className: 'button is-small',
charset: 'UTF-8',
bom: true,
fieldSeparator: this.lang === 'en' ? ',' : ';',
},
{
extend: 'print',
text: i18n.t('print'),
title: this.exportName,
className: 'button is-small',
},
],
});
const dataTableLength = sessionStorage.getItem('dbp-data-table-length');
//Retrieve page length from session storage
if (dataTableLength !== null) {
this.table.page.len(dataTableLength);
}
//Save page length in session storage
this.table.on('length.dt', function (e, settings, len) {
sessionStorage.setItem('dbp-data-table-length', len);
});
this.data = data;
this.table.clear();
if (this.data.length) {
this.table.rows.add(this.data);
}
new $.fn.dataTable.Responsive(this.table, {
details: true,
});
if (this.columnSearching) {
const thisTable = this.table;
const that = this;
this.columns.forEach(function (element, index) {
if (
element !== null &&
(typeof element.visible === 'undefined' || element.visible !== false) &&
(typeof element.searchable === 'undefined' || element.searchable !== false)
) {
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();
}
});
});
}
}
});
}
this.table.order(this.defaultOrder);
this.table.draw();
return this;
}
update(changedProperties) {
let languageChange = false;
changedProperties.forEach((oldValue, propName) => {
if (propName === 'lang') {
this._i18n.changeLanguage(this.lang).catch((e) => {
console.log(e);
});
languageChange = true;
}
});
this.updateComplete.then(this.set_datatable(this.data, languageChange)).catch((e) => {
console.log(e);
});
super.update(changedProperties);
}
static get styles() {
// language=css
const orderExpandIconOverrides = css`
table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control::before,
table.dataTable.dtr-inline.collapsed > tbody > tr > th.dtr-control::before {
all: initial;
top: 0.7em;
left: 0.4em;
height: 1em;
width: 1em;
display: block;
cursor: pointer;
position: absolute;
box-sizing: content-box;
text-align: center;
text-indent: 0 ;
line-height: 0.9em;
color: var(--dbp-on-primary-surface);
background-color: var(--dbp-primary-surface);
content: '+';
}
table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child::before,
table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child::before {
content: '-';
background-color: var(--dbp-primary-surface);
}
`;
// language=css
return css`
${commonStyles.getThemeCSS()}
${commonStyles.getGeneralCSS()}
${commonStyles.getButtonCSS()}
${orderExpandIconOverrides}
.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
color: var(--dbp-muted-text-dark);
border-radius: var(--dbp-border-radius);
background: transparent;
}
.export-btn {
margin-bottom: 0.6rem;
}
select {
border-radius: calc(var(--dbp-border-radius) / 2);
height: 28px;
margin-left: 3px;
}
:host {
display: block;
}
.dataTables_filter input {
border-radius: 0;
border:;
padding: 0.1em;
color: var(--dbp-content);
}
.dataTables_wrapper .dataTables_info {
color: var(--dbp-content);
}
table.dataTable .column-search-line {
width: 100%;
}
`;
}
render() {
let dt_css = commonUtils.getAssetURL(pkgName, 'css/jquery.dataTables.min.css');
let rs_css = commonUtils.getAssetURL(pkgName, 'css/responsive.dataTables.min.css');
let bt_css = commonUtils.getAssetURL(pkgName, 'css/buttons.dataTables.min.css');
return html`
<link rel="stylesheet" href="${dt_css}" />
<link rel="stylesheet" href="${rs_css}" />
<link rel="stylesheet" href="${bt_css}" />
<style>
${this.cssStyle}
</style>
<div><table width="100%"></table></div>
`;
}
}