0
0
Fork 0
mirror of https://github.com/kevinpapst/kimai2.git synced 2025-01-10 19:47:35 +00:00
kevinpapst_kimai2/assets/js/plugins/KimaiDatatable.js

97 lines
2.7 KiB
JavaScript

/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/*!
* [KIMAI] KimaiDatatable: handles functionality for the datatable
*/
import KimaiPlugin from "../KimaiPlugin";
import KimaiContextMenu from "../widgets/KimaiContextMenu";
export default class KimaiDatatable extends KimaiPlugin {
constructor(contentAreaSelector, tableSelector) {
super();
this._contentArea = contentAreaSelector;
this._selector = tableSelector;
}
getId() {
return 'datatable';
}
init() {
const dataTable = document.querySelector(this._selector);
// not every page contains a dataTable
if (dataTable === null) {
return;
}
this.registerContextMenu(this._selector);
const events = dataTable.dataset['reloadEvent'];
if (events === undefined) {
return;
}
const handle = () => { this.reloadDatatable(); };
for (let eventName of events.split(' ')) {
document.addEventListener(eventName, handle);
}
document.addEventListener('pagination-change', handle);
document.addEventListener('filter-change', handle);
}
/**
* @param {string} selector
* @private
*/
registerContextMenu(selector)
{
KimaiContextMenu.createForDataTable(selector);
}
reloadDatatable()
{
const toolbarSelector = this.getContainer().getPlugin('toolbar').getSelector();
/** @type {HTMLFormElement} form */
const form = document.querySelector(toolbarSelector);
const callback = (text) => {
const temp = document.createElement('div');
temp.innerHTML = text;
const newContent = temp.querySelector(this._contentArea);
document.querySelector(this._contentArea).replaceWith(newContent);
this.registerContextMenu(this._selector);
document.dispatchEvent(new Event('kimai.reloadedContent'));
};
document.dispatchEvent(new CustomEvent('kimai.reloadContent', {detail: this._contentArea}));
if (form === null) {
this.fetch(document.location)
.then(response => {
response.text().then(callback);
})
.catch(() => {
document.location.reload();
});
return;
}
this.fetchForm(form)
.then(response => {
response.text().then(callback);
})
.catch(() => {
form.submit();
});
}
}