class MRMBEDKZSELECTOR{
constructor(el, AjaxRequestClass){
this._rootEl = el;
this._AjaxRequestClass = AjaxRequestClass;
this._fetchCodeNrs();
this._createTabsView();
this._createTreeView();
this._createSearchView();
this._createResultView();
this._createLoaderView();
this._vdom = {};
this._idSuffix = '__mrm_be_dkz_pagetreeview__';
this.sendBranchRequest({branch: "root"});
this.updateResults();
}
_createLoaderView(){
this._$loader = document.createElement("div");
this._$loader.classList.add("mrm_be_dkz_loader");
this._$loader.innerHTML = `loading
`;
this._rootEl.parentNode.insertBefore(this._$loader, this._rootEl);
}
_createResultView(){
this._$resultView = document.createElement('div');
this._$resultView.classList.add('mrm_be_dkz_pagetree_result_holder');
this._$resultView.innerHTML = `
Ausgewählte Suchwörter: ()
`;
this._rootEl.parentNode.insertBefore(this._$resultView, this._rootEl);
}
_createSearchView(){
this._$searchView = document.createElement('div');
this._$searchView.classList.add('mrm_be_dkz_search_holder');
this._$searchView.classList.add('out');
this._$searchView.innerHTML = ``;
let $searchForm = document.createElement('form');
$searchForm.innerHTML = ``;
let $results = this._$searchView.querySelectorAll(".search-results")[0];
$searchForm.addEventListener('submit', (e) => {
e.preventDefault();
e.stopPropagation();
this._$loader.classList.add("in");
$results.innerHTML = '';
let query = e.target.querySelectorAll('#searchQuery')[0].value;
this.sendRequest(TYPO3.settings.ajaxUrls.mrm_be_dkz_search, {query})
.then(response => {
if(!response) return $par.innerHTML = 'Keine Ergebnisse';
response.list.forEach((item, i) => {
let x = new MRMBEDKZPageTreeView($results, item, this.handleCallbacks.bind(this), "search");
if(this._codenrs.includes(item.codenr)) x.check();
});
})
.finally(() => {
this._$loader.classList.remove("in");
})
});
this._$searchView.prepend($searchForm);
this._rootEl.parentNode.insertBefore(this._$searchView, this._rootEl);
}
_createTreeView(){
this._view = document.createElement("div");
this._view.classList.add('mrm_be_dkz_pagetree_holder');
this._rootEl.parentNode.insertBefore(this._view, this._rootEl);
}
_createTabsView(){
this._$tabs = document.createElement("div");
this._$tabs.classList.add('mrm_be_dkz_pagetree_tabs');
[["tree", "Baum"], ["search", "Suche"]].forEach((item, i) => {
let $tab = document.createElement("div");
$tab.classList.add(item[0]);
$tab.classList.add('tab');
if(i == 0)
$tab.classList.add('active');
$tab.innerHTML = item[1];
this._$tabs.append($tab);
$tab.addEventListener("click", this._changeView.bind(this));
});
this._rootEl.parentNode.insertBefore(this._$tabs, this._rootEl);
}
_changeView(e){
e.preventDefault();
e.stopPropagation();
let $target = e.target;
this._$tabs.querySelectorAll(".tab").forEach((itm) => {
itm.classList.remove("active");
if(itm == $target) itm.classList.add("active");
})
if($target.classList.contains('search')){
this._$searchView.classList.remove('out');
this._view.classList.add('out');
this._$searchView.querySelectorAll("input")[0].value = '';
this._$searchView.querySelectorAll(".search-results")[0].innerHTML = '';
}
if($target.classList.contains('tree')){
this._$searchView.classList.add('out');
this._view.classList.remove('out');
}
}
sendRequest(url, args){
this._$loader.classList.add("in");
return new this._AjaxRequestClass(url)
.withQueryArguments(args)
.get()
.then(function(response){ return response.resolve() })
.then(function(resolved){
//console.log("response", resolved);
let data = JSON.parse(resolved.data);
if(!data.success) return null;
return data.data;
})
.finally(() => {
this._$loader.classList.remove("in");
})
}
sendBranchRequest(args){
return this.sendRequest(TYPO3.settings.ajaxUrls.mrm_be_dkz_branch, args)
.then(data => this.refreshVDOM(data))
.then((x) => this.runCheckerStatus())
.catch(function(e){
console.log("e", e);
})
}
updateResults(){
this.sendRequest(TYPO3.settings.ajaxUrls.mrm_be_dkz_lists, {codenrs: this._codenrs.join(',')})
.then(response => {
if(!response) response = {};
if(!response.berufe) response.berufe = [];
if(!response.sws) response.sws = [];
let $ulSelections = this._$resultView.querySelectorAll('.selections ul')[0];
if($ulSelections){
$ulSelections.innerHTML = '';
if(response.berufe.length > 0){
response.berufe.forEach(b => { $ulSelections.innerHTML += `${b.codenr}: ${b.bezeichnung}` });
}
let $spanSelections = this._$resultView.querySelectorAll('.selections strong span')[0];
if($spanSelections){
$spanSelections.innerHTML = response.berufe.length;
}
}
let $ulSws = this._$resultView.querySelectorAll('.sws ul')[0];
if($ulSws){
$ulSws.innerHTML = '';
if(response.sws.length > 0){
response.sws.forEach(b => { $ulSws.innerHTML += `${b}` });
}
let $spanSws = this._$resultView.querySelectorAll('.sws strong span')[0];
if($spanSws){
$spanSws.innerHTML = response.sws.length;
}
}
})
;
}
getView(){ return this._view }
_fetchCodeNrs(){
this._codenrs = this._rootEl.value.trim(" ,").split(",");
this._codenrs.forEach(nr => { nr = nr.trim(); });
}
_generateId(nr){
let _id = nr.split(" ").join("");
let hash = 0, i, chr;
for (i = 0; i < _id.length; i++) {
chr = _id.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
return `${this._idSuffix}${hash}`;
}
refreshVDOM(data) {
data.list.forEach(itm => {
let _id = this._generateId(itm.codenr);
let parentId = itm.obercodenr ? this._generateId(itm.obercodenr) : null;
let parent = parentId ? this._vdom[parentId] : null;
if(!this._vdom[_id]){
this._vdom[_id] = new MRMBEDKZPageTreeView((parent || this).getView(), itm, this.handleCallbacks.bind(this));
}
});
//console.log(this._vdom);
return true;
}
handleCallbacks(msg, data){
//console.log("hcb", msg, data);
switch(msg){
case "codenr_add":
this._codenrs.push(data.data);
this.updateResults();
break;
case "codenr_remove":
let index = this._codenrs.indexOf(data.data);
this._codenrs.splice(index, 1);
this.updateResults();
break;
case "codenr_toggle":
let elementId = this._generateId(data.data.codenr);
let element = this._vdom[elementId];
if(data.data.fetch && (!element || (!element.hasItems() && element.isCollapsible())))
this.sendBranchRequest({branch: data.data.codenr});
break;
}
this._rootEl.value = this._codenrs.join(",");
}
runCheckerStatus(){
this._codenrs.forEach(nr => {
let _id = this._generateId(nr);
if(this._vdom[_id]) this._vdom[_id].check();
});
}
}
class MRMBEDKZPageTreeView{
constructor(parentView, rootData, callback, type = "tree"){
this._callback = callback;
this._$parentView = parentView;
this._$el = null;
this._isChecked = false;
this._$checker = null;
this._$detail = null;
this._rootData = rootData;
this._type = type;
this._render();
}
check(status = true, emitCallback = false){
if(!this._$checker) return;
this._isChecked = status;
let whattodo = status ? "add" : "remove";
this._$checker.classList[whattodo]("checked");
if(emitCallback)
this._callback(`codenr_${whattodo}`, {data: this._rootData.codenr, type: this._type});
}
_render(){
const collapsible = this._type == "tree" && this._rootData.codenr.indexOf('-') == -1;
const _id = `mrm_be_dkz_pagetree_item-${this._rootData.codenr.split(" ").join("_")}`;
let $itm = document.createElement("div");
let $checker = document.createElement("a");
$checker.innerHTML = `❌✅`;
$checker.setAttribute("href", "#");
$checker.classList.add("itm-checker");
this.check(this._isChecked);
$checker.addEventListener("click", (e) => {
e.preventDefault();
e.stopPropagation();
this.check(!this._isChecked, true);
});
let $text = document.createElement("span");
$text.innerHTML = `${this._rootData.codenr}: ${this._rootData.bezeichnung} (${this._rootData.swcount} SWs)`;
$itm.setAttribute("id", _id);
if(collapsible){
let $detail = document.createElement("details");
let $summary = document.createElement("summary");
$summary.append($checker);
$summary.append($text);
$detail.append($summary);
$itm.append($detail);
$detail.addEventListener('click', e => {
e.preventDefault();
e.stopPropagation();
$detail.open = !$detail.open;
this._callback(`codenr_toggle`, {data: {codenr: this._rootData.codenr, fetch: $detail.open}, type: this._type});
});
this._$detail = $detail;
}
else{
$itm.classList.add("not-collapsible");
$itm.append($checker);
$itm.append($text);
}
this._$parentView.append($itm);
this._$checker = $checker;
this._$el = $itm;
}
hasItems(){ return this._$detail != null && this._$detail.querySelectorAll('div').length > 0; }
isCollapsible(){ return !this._$el.classList.contains("not-collapsible"); }
getView(){ return this._$detail ? this._$detail : this._$el; }
getRootData(){ return this._rootData; }
}
require(['TYPO3/CMS/Core/DocumentService'], function (DocumentService) {
DocumentService.ready().then(() => {
var el = document.getElementById(window.dkzFormElementId);
if(!el) return;
require(['TYPO3/CMS/Core/Ajax/AjaxRequest'], function (AjaxRequest) {
new MRMBEDKZSELECTOR(el, AjaxRequest);
});
});
});