import {WebComponent} from '../../decorators'; import { VetproviehBasicRepeat, VetproviehBinding, VetproviehElement} from '../../core'; import {Indexable} from '../../interfaces'; import {ViewHelper} from '../../helpers'; import Sortable from 'sortablejs'; // eslint-disable-next-line new-cap @WebComponent({ template: VetproviehElement.template + `
`, tag: 'vp-table', }) /** * Vetprovieh-Table * Generates a Table with Headers to show */ export class VetproviehTable extends VetproviehBasicRepeat { /** * ConnectedCallback */ public connectedCallback() { super.connectedCallback(); const tbody = this.getByIdFromShadowRoot('listElements'); if (tbody) { Sortable.create(tbody, { onEnd: (event) => { if (event.oldIndex !== event.newIndex && event.oldIndex != undefined && event.newIndex != undefined) { const movedObject = this.objects[event.oldIndex]; const placedObject = this.objects[event.newIndex]; const tempPosition = movedObject.position; movedObject.position = placedObject.position; placedObject.position = tempPosition; this.objects[event.oldIndex] = placedObject; this.objects[event.newIndex] = movedObject; let i = 0; this.objects.forEach((obj) => { obj.position = ++i; }); this.clearAndRender(); } }, }); } } /** * Getting Element by Index * @param {number} index * @return {HTMLElement | null | undefined} */ getElementByIndex(index: number) : HTMLElement | null | undefined { const itemBox = this.getByIdFromShadowRoot('listElements'); console.log(itemBox); const selector = `[data-index="${index == 0 ? '' : index}"]`; return itemBox?.querySelector(selector); } /** * Inserts Element to List * @param {any} dataItem * @param {number} index * @protected */ protected _attachToList(dataItem: any, index = 0) { if (this.shadowRoot) { const item = {item: dataItem}; const newListItem: HTMLElement = this._generateListItem(item); dataItem['index'] = index; ViewHelper.replacePlaceholders(newListItem, item); VetproviehBinding.bindFormElements(newListItem, item); const deleteBtn = this.deleteButtonFromItem(newListItem); if (deleteBtn) { (deleteBtn as Indexable)['data-id'] = index; deleteBtn.addEventListener('click', (event) => { this.delete((event.target as Indexable)['data-id']); }); } this._attachParamsToLink(newListItem, item); const list = this.list; if (list) { list.appendChild(newListItem.children[0]); } } } /** * @private * Get Delete_Button from List_Item * @param {HTMLElement} listItem * @return {HTMLButtonElement} */ private deleteButtonFromItem(listItem: HTMLElement): HTMLButtonElement { const tagSearch = 'button[data-action="delete"]'; return listItem.querySelector(tagSearch) as HTMLButtonElement; } /** * Attaching Parameters to Link * @param {HTMLElement} newListItem * @param {any} dataItem */ private _attachParamsToLink(newListItem: HTMLElement, dataItem: any) { const a = newListItem.getElementsByTagName('a')[0]; if (a) { (a as any).params = dataItem; } } /** * Generate new Item for List which is based on the template * @param {any} dataItem * @param {boolean} activatedEventListener * @return {HTMLDivElement} * @private */ protected _generateListItem(dataItem: any, activatedEventListener = false) { const newNode = document.importNode(this._listTemplate, true); const div = document.createElement('tbody'); console.debug(dataItem); console.debug(activatedEventListener); div.appendChild(newNode); return div; } }