/*
|
Baum-Demo
|
von Ulrich Hilger, https://uhilger.de
|
8. Juli 2021
|
*/
|
|
var vorlage = 'baum-inhalt.mustache';
|
|
/**
|
* Den Baum initial befuellen
|
*/
|
function baum_init() {
|
http_get('liste.json', function(antwort) {
|
html_erzeugen(vorlage, JSON.parse(antwort), function(html) {
|
var baumdiv = document.querySelector('.baum');
|
baumdiv.appendChild(html_to_element(html));
|
addEvtListener('.baum-elem', 'click', baum_klick);
|
});
|
});
|
}
|
|
/**
|
* Einen Klick auf ein Baum-Element verarbeiten
|
*/
|
function baum_klick(event) {
|
var t = event.target;
|
var bereich = t.nodeName;
|
if(bereich.toLowerCase() === 'i') {
|
info_zeigen('Piktogramm von ' + text_zu_bild(t) + ' geklickt');
|
baum_pikto_klick(t);
|
} else if(bereich.toLowerCase() === 'span') {
|
info_zeigen(t.textContent + ' gewaehlt');
|
baum_text_klick(t);
|
} else {
|
// tue nichts
|
}
|
}
|
|
/**
|
* Klick auf Piktogramm
|
*
|
* Wenn Ordner:
|
*
|
* Wenn geoeffnet: Ordner schliessen
|
* Inhalt verbergen oder entfernen (je nach Modus)
|
*
|
* Wenn geschlossen: Ordner oeffnen
|
* wenn leer, ggf. Inhalt laden
|
* wenn nicht leer: Inhalt darstellen
|
*
|
* Wenn Datei:
|
* tue nichts
|
*/
|
function baum_pikto_klick(iElem) {
|
var typ = baum_element_typ(iElem);
|
switch(typ) {
|
case 1:
|
// Klick auf geschlossenen Ordner
|
info_anfuegen(', geschlossen, wurde geoffnet');
|
baum_pikto_wechseln(iElem, 'icon-folder', 'icon-folder-open');
|
var c = iElem.parentNode.querySelector('.baum-zweig');
|
if(c === undefined || c === null) {
|
var neue = baum_elemente();
|
html_erzeugen(vorlage, neue, function(html) {
|
iElem.parentNode.appendChild(html_to_element(html));
|
});
|
} else {
|
baum_toggle_children(iElem.parentNode, 'block');
|
}
|
break;
|
case 2:
|
// Klick auf geoeffneten Ordner
|
info_anfuegen(', geoeffnet, wurde geschlossen');
|
baum_pikto_wechseln(iElem, 'icon-folder-open', 'icon-folder');
|
baum_toggle_children(iElem.parentNode, 'none');
|
break;
|
case 3:
|
// Klick auf Datei
|
break;
|
}
|
}
|
|
/**
|
* Den Text zu einem Piktogramm ermitteln
|
*/
|
function text_zu_bild(iElem) {
|
return iElem.parentNode.querySelector('.baum-text').textContent;
|
}
|
|
/**
|
* Klick auf Text
|
*
|
* Wenn Datei:
|
* a) noch nicht gewaehlt: Auswahl der Datei
|
* b) gewaehlt: Aktion ausloesen, z.B. Datei oeffnen
|
*
|
* Wenn Ordner:
|
* a) noch nicht gewaehlt: Auswahl des Ordners
|
* b) gewaehlt: -
|
*/
|
function baum_text_klick(tElem) {
|
var gewaehlt = document.querySelector('.gewaehlt');
|
if(gewaehlt !== undefined && gewaehlt !== null) {
|
if(tElem !== gewaehlt) {
|
gewaehlt.classList.remove('gewaehlt');
|
} else {
|
info_zeigen('zweiter Klick auf ' + tElem.textContent);
|
}
|
}
|
if(tElem.classList.contains('gewaehlt')) {
|
tElem.classList.remove('gewaehlt');
|
} else {
|
tElem.classList.add('gewaehlt');
|
}
|
}
|
|
/**
|
* Kind-Elemente eines Baum-Elements umschalten
|
*/
|
function baum_toggle_children(elem, visibility) {
|
var c = elem.querySelector('.baum-zweig');
|
var anz = c.children.length;
|
for(var i = 0; i < anz; i++) {
|
c.children[i].style.display = visibility;
|
}
|
}
|
|
/**
|
* Piktogramm eines Baum-Elements wechseln
|
*/
|
function baum_pikto_wechseln(iElem, weg, neu) {
|
iElem.classList.remove(weg);
|
iElem.classList.add(neu);
|
}
|
|
/**
|
* Anhand der Typklasse den Typ des Baumelements ermitteln
|
*
|
* elem: Das Element, das die Typklasse des Baumelements enthaelt
|
* return: 1 (ordner geschlossen), 2 (ordner geoeffnet), 3 (datei)
|
*/
|
function baum_element_typ(elem) {
|
if(elem.classList.contains('icon-folder')) {
|
return 1;
|
} else if(elem.classList.contains('icon-folder-open')) {
|
return 2;
|
} else if(elem.classList.contains('icon-doc-inv')) {
|
return 3;
|
}
|
}
|
|
/**
|
* Baum-Elemente aus Datenobjekten erzeugen
|
*/
|
function baum_elemente() {
|
var dateien = new Array();
|
dateien.push(new Datei('datei.txt', 'datei', 'icon-doc-inv'));
|
dateien.push(new Datei('Ordner', 'ordner', 'icon-folder'));
|
dateien.push(new Datei('index.html', 'datei', 'icon-doc-inv'));
|
dateien.push(new Datei('stile.css', 'datei', 'icon-doc-inv'));
|
var elem = new BaumElem('/meine-app/cms/test', dateien);
|
return elem;
|
}
|
|
/**
|
* Eine Info-Nachricht anzeigen
|
*/
|
function info_zeigen(text) {
|
document.querySelector('.msg').textContent = text;
|
}
|
|
/**
|
* Einen Text zur Infonachricht hinzufuegen
|
*/
|
function info_anfuegen(text) {
|
var vorhanden = document.querySelector('.msg').textContent;
|
document.querySelector('.msg').textContent = vorhanden + text;
|
}
|
|
/* ---- Objekte ---- */
|
|
function BaumElem(p, d) {
|
this.pfad = p;
|
this.dateien = d;
|
}
|
|
function Datei(n, t, k) {
|
this.name = n;
|
this.typ = t;
|
this.typKlasse = k;
|
}
|
|
|
|
/* ========= HELFERLEIN =========== */
|
|
|
|
/* ---- JS ---- */
|
|
function addEvtListener(selector, eventName, func) {
|
document.querySelectorAll(selector).forEach(elem => { elem.addEventListener(eventName, func); });
|
};
|
|
/* ---- DOM ---- */
|
|
function html_to_element(html) {
|
let temp = document.createElement('template');
|
html = html.trim(); // Never return a space text node as a result
|
temp.innerHTML = html;
|
return temp.content.firstChild;
|
};
|
|
/* ---- Vorlagen ---- */
|
|
var cache = new Array();
|
|
function html_erzeugen(vurl, inhalt, cb) {
|
var vorlage = cache[vurl];
|
if (vorlage === undefined) {
|
vorlage_laden_und_fuellen(vurl, inhalt, cb);
|
} else {
|
vorlage_fuellen(vurl, inhalt, cb);
|
}
|
}
|
|
function vorlage_fuellen(vurl, inhalt, cb) {
|
cb(Mustache.render(cache[vurl], inhalt));
|
}
|
|
function vorlage_laden_und_fuellen(vurl, inhalt, cb) {
|
http_get(vurl, function(antwort, status) {
|
cache[vurl] = antwort;
|
vorlage_fuellen(vurl, inhalt, cb);
|
});
|
}
|
|
/* ---- HTTP ----- */
|
|
function http_get(callurl, cb) {
|
//http_call('GET', u, null, cb);
|
var xhr = new XMLHttpRequest();
|
xhr.onreadystatechange = function () {
|
if (this.readyState === 4 && this.status === 200) {
|
cb(this.responseText);
|
}
|
};
|
xhr.open('GET', callurl);
|
xhr.setRequestHeader('Content-type', 'application/text');
|
xhr.send();
|
}
|