chore(async-table): implemented destroy method in async table

This commit is contained in:
Johannes Eder 2021-06-28 11:40:10 +02:00 committed by Sarah Vaupel
parent e2aa913ff3
commit 29da3d795f
3 changed files with 49 additions and 18 deletions

View File

@ -6,6 +6,7 @@ export const EVENT_TYPE = {
CHANGE : 'change', CHANGE : 'change',
MOUSE_OVER : 'mouseover', MOUSE_OVER : 'mouseover',
SUBMIT : 'submit', SUBMIT : 'submit',
INPUT : 'input',
//more to be added //more to be added
}; };

View File

@ -2,6 +2,7 @@ import { Utility } from '../../core/utility';
import { StorageManager, LOCATION } from '../../lib/storage-manager/storage-manager'; import { StorageManager, LOCATION } from '../../lib/storage-manager/storage-manager';
import { Datepicker } from '../form/datepicker'; import { Datepicker } from '../form/datepicker';
import { HttpClient } from '../../services/http-client/http-client'; import { HttpClient } from '../../services/http-client/http-client';
import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager';
import * as debounce from 'lodash.debounce'; import * as debounce from 'lodash.debounce';
import * as throttle from 'lodash.throttle'; import * as throttle from 'lodash.throttle';
import './async-table-filter.sass'; import './async-table-filter.sass';
@ -30,6 +31,8 @@ export class AsyncTable {
_element; _element;
_app; _app;
_eventManager;
_asyncTableHeader; _asyncTableHeader;
_asyncTableId; _asyncTableId;
@ -66,6 +69,8 @@ export class AsyncTable {
this._element = element; this._element = element;
this._app = app; this._app = app;
this._eventManager = new EventManager();
if (this._element.classList.contains(ASYNC_TABLE_INITIALIZED_CLASS)) { if (this._element.classList.contains(ASYNC_TABLE_INITIALIZED_CLASS)) {
return false; return false;
} }
@ -144,7 +149,12 @@ export class AsyncTable {
} }
destroy() { destroy() {
console.log('TBD: Destroy AsyncTable'); this._windowStorage.clear();
this._historyStorage.clear();
this._eventManager.removeAllEventListenersFromUtil();
this._active = false;
if (this._element.classList.contains(ASYNC_TABLE_INITIALIZED_CLASS))
this._element.classList.remove(ASYNC_TABLE_INITIALIZED_CLASS);
} }
_startSortableHeaders() { _startSortableHeaders() {
@ -156,7 +166,8 @@ export class AsyncTable {
this._windowStorage.save('horizPos', (this._scrollTable || {}).scrollLeft); this._windowStorage.save('horizPos', (this._scrollTable || {}).scrollLeft);
this._linkClickHandler(event); this._linkClickHandler(event);
}; };
th.element.addEventListener('click', th.clickHandler); const linkClickEvent = new EventWrapper(EVENT_TYPE.CLICK, th.clickHandler.bind(this), th.element);
this._eventManager.registerNewListener(linkClickEvent);
}); });
} }
@ -179,7 +190,9 @@ export class AsyncTable {
} }
this._linkClickHandler(event); this._linkClickHandler(event);
}; };
link.element.addEventListener('click', link.clickHandler);
const clickEvent = new EventWrapper(EVENT_TYPE.CLICK, link.clickHandler.bind(this), link.element);
this._eventManager.registerNewListener(clickEvent);
}); });
} }
} }
@ -190,7 +203,8 @@ export class AsyncTable {
if (this._pagesizeForm) { if (this._pagesizeForm) {
const pagesizeSelect = this._pagesizeForm.querySelector('[name=' + this._asyncTableId + '-pagesize]'); const pagesizeSelect = this._pagesizeForm.querySelector('[name=' + this._asyncTableId + '-pagesize]');
pagesizeSelect.addEventListener('change', this._changePagesizeHandler); const pageSizeChangeEvent = new EventWrapper(EVENT_TYPE.CHANGE, this._changePagesizeHandler.bind(this), pagesizeSelect);
this._eventManager.registerNewListener(pageSizeChangeEvent);
} }
} }
@ -254,33 +268,42 @@ export class AsyncTable {
} }
}, INPUT_DEBOUNCE); }, INPUT_DEBOUNCE);
this._cancelPendingUpdates.push(debouncedInput.cancel); this._cancelPendingUpdates.push(debouncedInput.cancel);
input.addEventListener('input', () => { const inputHandler =() => {
this._ignoreRequest = true; this._ignoreRequest = true;
debouncedInput(); debouncedInput();
}); };
const inputEvent = new EventWrapper(EVENT_TYPE.INPUT, inputHandler.bind(this), input );
this._eventManager.registerNewListener(inputEvent);
}); });
this._tableFilterInputs.change.forEach((input) => { this._tableFilterInputs.change.forEach((input) => {
input.addEventListener('change', () => {
const changeHandler = () => {
//if (this._element.classList.contains(ASYNC_TABLE_LOADING_CLASS)) //if (this._element.classList.contains(ASYNC_TABLE_LOADING_CLASS))
this._ignoreRequest = true; this._ignoreRequest = true;
debouncedUpdateFromTableFilter(); debouncedUpdateFromTableFilter();
}); };
const changeEvent = new EventWrapper(EVENT_TYPE.CHANGE, changeHandler.bind(this), input);
this._eventManager.registerNewListener(changeEvent);
}); });
this._tableFilterInputs.select.forEach((input) => { this._tableFilterInputs.select.forEach((input) => {
input.addEventListener('change', () => { const selectChangeHandler = () => {
this._ignoreRequest = true; this._ignoreRequest = true;
debouncedUpdateFromTableFilter(); debouncedUpdateFromTableFilter();
}); };
const selectEvent = new EventWrapper(EVENT_TYPE.CHANGE, selectChangeHandler.bind(this), input);
this._eventManager.registerNewListener(selectEvent);
}); });
tableFilterForm.addEventListener('submit', (event) =>{ const submitEventHandler = (event) =>{
event.preventDefault(); event.preventDefault();
this._ignoreRequest = true; this._ignoreRequest = true;
debouncedUpdateFromTableFilter(); debouncedUpdateFromTableFilter();
}); };
const submitEvent = new EventWrapper(EVENT_TYPE.SUBMIT, submitEventHandler.bind(this), tableFilterForm);
this._eventManager.registerNewListener(submitEvent);
} }
_updateFromTableFilter(tableFilterForm) { _updateFromTableFilter(tableFilterForm) {
@ -439,10 +462,10 @@ export class AsyncTable {
).finally(() => this._element.classList.remove(ASYNC_TABLE_LOADING_CLASS)); ).finally(() => this._element.classList.remove(ASYNC_TABLE_LOADING_CLASS));
} }
_debugLog() {} //_debugLog() {}
// _debugLog(fName, ...args) { _debugLog(fName, ...args) {
// console.log(`[DEBUGLOG] AsyncTable.${fName}`, { args: args, instance: this }); console.log(`[DEBUGLOG] AsyncTable.${fName}`, { args: args, instance: this });
// } }
} }

View File

@ -1,4 +1,4 @@
import { AsyncTable } from './async-table'; import { AsyncTable, ASYNC_TABLE_INITIALIZED_CLASS } from './async-table';
const AppTestMock = { const AppTestMock = {
httpClient: { httpClient: {
@ -50,4 +50,11 @@ describe('AsyncTable', () => {
new AsyncTable(); new AsyncTable();
}).toThrow(); }).toThrow();
}); });
it('should destroy Async Table', () => {
//asyncTable.destroy();
asyncTable.start();
expect(asyncTable._eventManager._registeredListeners.length).toBe(0);
expect(asyncTable._element.classList).not.toContain(ASYNC_TABLE_INITIALIZED_CLASS);
});
}); });