Major refactoring: Unified result display, improved personas system, and enhanced markdown rendering
- Moved result display outside tabs for unified experience - Fixed dropdown disappearing issue in personas - Implemented mapping-files system in personas.yml - Cleaned up personas.yml structure (removed unused fields) - Updated ausbildung-value codes (AUSBILDUNG/HS/LA) - Enhanced markdown rendering with proper link support - Fixed path resolution for Bundeslaender content - Improved tab persistence and content reset functionality - Added proper marginal sidebar support for both tabs - Streamlined HTML structure and removed duplicate elements
This commit is contained in:
parent
3a2240b8a2
commit
ee0ce7fcff
BIN
www/.DS_Store
vendored
BIN
www/.DS_Store
vendored
Binary file not shown.
BIN
www/Steuerungsdateien/.DS_Store
vendored
Normal file
BIN
www/Steuerungsdateien/.DS_Store
vendored
Normal file
Binary file not shown.
|
|
@ -16,8 +16,9 @@ async function loadFinderStructure() {
|
|||
resetFinder();
|
||||
renderBundeslandStep();
|
||||
|
||||
// Zeige Empfehlungsbereich beim Finder-Tab an
|
||||
showFinderRecommendation();
|
||||
// Verstecke Persona-Empfehlungen beim Finder-Tab (nicht mehr benötigt)
|
||||
|
||||
// Zeige Empfehlungsbereich beim Finder-Tab an (nicht mehr benötigt)
|
||||
} catch (err) {
|
||||
console.error("Fehler beim Laden der structure.yml:", err);
|
||||
}
|
||||
|
|
@ -320,8 +321,25 @@ async function loadResult(code) {
|
|||
let codeFile = `Bundeslaender/${code}.md`;
|
||||
|
||||
const resultContainer = document.getElementById('result');
|
||||
const mainSection = resultContainer.querySelector('.main-section');
|
||||
mainSection.innerHTML = '';
|
||||
if (!resultContainer) {
|
||||
console.error('Result container nicht gefunden');
|
||||
return;
|
||||
}
|
||||
|
||||
// Zeige Result-Container an
|
||||
resultContainer.style.display = 'block';
|
||||
|
||||
// Setze Headline
|
||||
const headlineElement = document.getElementById('finder-headline');
|
||||
if (headlineElement) {
|
||||
headlineElement.textContent = 'Finder Ergebnis';
|
||||
}
|
||||
|
||||
// Leere bisherigen Inhalt
|
||||
const textContentElement = document.getElementById('finder-text-content');
|
||||
if (textContentElement) {
|
||||
textContentElement.innerHTML = '';
|
||||
}
|
||||
|
||||
// Hilfsfunktion: Markdown-Abschnitt parsen und als Article rendern
|
||||
function renderMarkdownArticle(mdText) {
|
||||
|
|
@ -352,12 +370,22 @@ async function loadResult(code) {
|
|||
textStart = 2;
|
||||
}
|
||||
|
||||
let text = lines.slice(textStart).join('\n');
|
||||
let textContent = lines.slice(textStart).join('\n');
|
||||
textContent = textContent
|
||||
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
|
||||
.replace(/\*(.*?)\*/g, '<em>$1</em>')
|
||||
// Markdown-Links verarbeiten: [Text](URL)
|
||||
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>')
|
||||
.replace(/\n\n/g, '</p><p>')
|
||||
.replace(/^(?!<[h1-6])/gm, '<p>')
|
||||
.replace(/$/gm, '</p>')
|
||||
.replace(/<p><\/p>/g, '');
|
||||
|
||||
return `<article class="content-article">
|
||||
<div class="layout">
|
||||
<div class="main-content">
|
||||
<h2>${headline}</h2>
|
||||
<div class="text-content">${marked.parse(text)}</div>
|
||||
<div class="text-content">${textContent}</div>
|
||||
</div>
|
||||
<div class="sidebar">${marginal}</div>
|
||||
</div>
|
||||
|
|
@ -386,21 +414,26 @@ async function loadResult(code) {
|
|||
allArticles += `<article class="content-article"><div class='main-content'><h2>Datei nicht gefunden</h2><div class='text-content'>${mdFile}</div></div></article>`;
|
||||
}
|
||||
}
|
||||
mainSection.innerHTML = allArticles;
|
||||
|
||||
// Zeige alle Artikel im Text-Content-Bereich an
|
||||
if (textContentElement) {
|
||||
textContentElement.innerHTML = allArticles;
|
||||
}
|
||||
|
||||
resultContainer.style.display = 'block';
|
||||
resultContainer.scrollIntoView({ behavior: 'smooth' });
|
||||
} catch (err) {
|
||||
mainSection.innerHTML = `<article class="content-article"><div class='main-content'><h2>Fehler</h2><div class='text-content'>${err.message}</div></div></article>`;
|
||||
if (textContentElement) {
|
||||
textContentElement.innerHTML = `<article class="content-article"><div class='main-content'><h2>Fehler</h2><div class='text-content'>${err.message}</div></div></article>`;
|
||||
}
|
||||
resultContainer.style.display = 'block';
|
||||
}
|
||||
}
|
||||
|
||||
// Lädt und zeigt die zusätzlichen Abschnitte an
|
||||
// Lädt und zeigt die zusätzlichen Abschnitte an (nicht mehr verwendet)
|
||||
function loadAdditionalSections(sections, resultContainer) {
|
||||
if (!resultContainer) {
|
||||
console.error('[ERROR] Kein gültiger Container für zusätzliche Abschnitte');
|
||||
return;
|
||||
}
|
||||
// Funktion nicht mehr benötigt
|
||||
return;
|
||||
|
||||
// Trennlinie hinzufügen vor den zusätzlichen Abschnitten
|
||||
const divider = document.createElement('hr');
|
||||
|
|
@ -465,6 +498,8 @@ function addResetButton() {
|
|||
resetBtn.onclick = () => {
|
||||
resetFinder();
|
||||
renderBundeslandStep();
|
||||
// Stelle sicher, dass der Finder-Tab aktiv bleibt
|
||||
ensureFinderTabActive();
|
||||
if (typeof showTab === 'function') showTab('tab2');
|
||||
};
|
||||
|
||||
|
|
@ -472,12 +507,19 @@ function addResetButton() {
|
|||
}
|
||||
}
|
||||
|
||||
// Zeigt den Empfehlungsbereich für den Finder-Tab an
|
||||
function showFinderRecommendation() {
|
||||
const recommendation = document.querySelector('.recommendation');
|
||||
if (recommendation) {
|
||||
recommendation.style.display = 'block';
|
||||
}
|
||||
// Empfehlungsbereich-Funktion entfernt, da Button nicht mehr existiert
|
||||
|
||||
// Stellt sicher, dass der Finder-Tab aktiv bleibt
|
||||
function ensureFinderTabActive() {
|
||||
// Aktiviere Finder-Tab
|
||||
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
||||
document.querySelectorAll('.button-tab').forEach(btn => btn.classList.remove('active'));
|
||||
|
||||
const finderTab = document.querySelector('.tab2');
|
||||
const finderButton = document.querySelector('.button-tab[onclick*="tab2"]');
|
||||
|
||||
if (finderTab) finderTab.classList.add('active');
|
||||
if (finderButton) finderButton.classList.add('active');
|
||||
}
|
||||
|
||||
// Initialisierung beim Seitenladen
|
||||
|
|
|
|||
|
|
@ -44,7 +44,12 @@ function initializePersonas() {
|
|||
if (personasData[currentPersona]) {
|
||||
updateMainPortrait(personasData[currentPersona]);
|
||||
updateBundeslandDropdown(personasData[currentPersona]);
|
||||
updatePersonaButton(personasData[currentPersona]);
|
||||
// updatePersonaButton entfernt
|
||||
|
||||
// Lade automatisch die Texte für die initiale Persona
|
||||
setTimeout(() => {
|
||||
loadPersonaMarkdownContentOnly(currentPersona);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -71,8 +76,12 @@ function selectPersona(personaName) {
|
|||
// Bundesland-Dropdown aktualisieren
|
||||
updateBundeslandDropdown(persona);
|
||||
|
||||
// Button-Text aktualisieren
|
||||
updatePersonaButton(persona);
|
||||
// Button-Text aktualisieren (entfernt)
|
||||
|
||||
// Lade automatisch die Texte für die ausgewählte Persona
|
||||
setTimeout(() => {
|
||||
loadPersonaMarkdownContentOnly(currentPersona);
|
||||
}, 200);
|
||||
|
||||
console.log('[DEBUG] Persona gewechselt von', previousPersona, 'zu:', personaName);
|
||||
}
|
||||
|
|
@ -110,7 +119,7 @@ function updateMainPortrait(persona) {
|
|||
text = text.replace(/\{\{AUSBILDUNG_SELECT\}\}/g, persona.ausbildung);
|
||||
|
||||
// Informatik-Placeholder ersetzen
|
||||
text = text.replace(/\{\{INFORMATIK_SELECT\}\}/g, persona.informatik || 'Informatik');
|
||||
// INFORMATIK_SELECT wird nicht mehr verwendet
|
||||
|
||||
// Abschluss-Placeholder ersetzen
|
||||
text = text.replace(/\{\{ABSCHLUSS_SELECT\}\}/g, getAbschlussName(persona['abschluss-value']));
|
||||
|
|
@ -237,9 +246,13 @@ function updateBundeslandDropdown(persona) {
|
|||
// Dropdowns existieren bereits - nur Werte aktualisieren
|
||||
existingBundeslandSelect.value = persona.bundesland;
|
||||
existingAusbildungSelect.value = persona['ausbildung-value'];
|
||||
console.log('[DEBUG] Dropdown-Werte aktualisiert:', persona.bundesland, persona['ausbildung-value']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Dropdowns existieren nicht - erstelle sie
|
||||
console.log('[DEBUG] Erstelle neue Dropdowns für Persona:', persona.name);
|
||||
|
||||
// Ersetze die Platzhalter im Text mit echten Dropdowns
|
||||
let textContent = persona.text;
|
||||
|
||||
|
|
@ -270,12 +283,7 @@ function updateBundeslandDropdown(persona) {
|
|||
ausbildungSelectElement.addEventListener('change', handleAusbildungChange);
|
||||
}
|
||||
|
||||
// Button Event Listener hinzufügen
|
||||
const empfehlungButton = document.getElementById('persona-empfehlung-button');
|
||||
if (empfehlungButton) {
|
||||
empfehlungButton.removeEventListener('click', handleEmpfehlungButtonClick);
|
||||
empfehlungButton.addEventListener('click', handleEmpfehlungButtonClick);
|
||||
}
|
||||
// Button Event Listener entfernt, da Button nicht mehr existiert
|
||||
}, 100);
|
||||
}
|
||||
|
||||
|
|
@ -285,8 +293,12 @@ function handleBundeslandChange() {
|
|||
if (persona) {
|
||||
persona.bundesland = this.value;
|
||||
console.log('[DEBUG] Bundesland geändert zu:', this.value);
|
||||
// Lade nur die Texte, nicht die Dropdowns
|
||||
loadPersonaMarkdownContentOnly(currentPersona);
|
||||
// Lade nur die Texte, NICHT die Dropdowns neu erstellen
|
||||
setTimeout(() => {
|
||||
loadPersonaMarkdownContentOnly(currentPersona);
|
||||
}, 100);
|
||||
// Stelle sicher, dass der Personas-Tab aktiv bleibt
|
||||
ensurePersonasTabActive();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -296,23 +308,26 @@ function handleAusbildungChange() {
|
|||
if (persona) {
|
||||
persona['ausbildung-value'] = this.value;
|
||||
console.log('[DEBUG] Ausbildung geändert zu:', this.value);
|
||||
// Lade nur die Texte, nicht die Dropdowns
|
||||
loadPersonaMarkdownContentOnly(currentPersona);
|
||||
// Lade nur die Texte, NICHT die Dropdowns neu erstellen
|
||||
setTimeout(() => {
|
||||
loadPersonaMarkdownContentOnly(currentPersona);
|
||||
}, 100);
|
||||
// Stelle sicher, dass der Personas-Tab aktiv bleibt
|
||||
ensurePersonasTabActive();
|
||||
}
|
||||
}
|
||||
|
||||
// Aktualisiert den Button-Text mit dem Persona-Namen
|
||||
// Button-Funktion entfernt, da Button nicht mehr existiert
|
||||
function updatePersonaButton(persona) {
|
||||
const buttonNameElement = document.getElementById('persona-button-name');
|
||||
if (buttonNameElement) {
|
||||
buttonNameElement.textContent = persona.name;
|
||||
}
|
||||
// Funktion nicht mehr benötigt
|
||||
}
|
||||
|
||||
// Event Handler für Empfehlung-Button
|
||||
// Event Handler für Empfehlung-Button (nicht mehr verwendet, da Button entfernt)
|
||||
function handleEmpfehlungButtonClick() {
|
||||
console.log('[DEBUG] Empfehlung-Button geklickt für:', currentPersona);
|
||||
loadPersonaMarkdownContent(currentPersona);
|
||||
// Stelle sicher, dass der Personas-Tab aktiv bleibt
|
||||
ensurePersonasTabActive();
|
||||
}
|
||||
|
||||
// Bundesland-Namen aus Code generieren
|
||||
|
|
@ -373,9 +388,9 @@ function getAllBundeslandOptions(selectedBundesland) {
|
|||
// Alle Ausbildung-Optionen generieren
|
||||
function getAllAusbildungOptions(selectedAusbildung) {
|
||||
const ausbildungOptions = {
|
||||
'B': 'Berufserfahrung',
|
||||
'H': 'Hochschulstudium',
|
||||
'S': 'Lehramtsstudium'
|
||||
'AUSBILDUNG': 'Berufserfahrung',
|
||||
'HS': 'Hochschulstudium',
|
||||
'LA': 'Lehramtsstudium'
|
||||
};
|
||||
|
||||
let options = '';
|
||||
|
|
@ -428,6 +443,19 @@ function addPersonasStyles() {
|
|||
document.head.appendChild(style);
|
||||
}
|
||||
|
||||
// Stellt sicher, dass der Personas-Tab aktiv bleibt
|
||||
function ensurePersonasTabActive() {
|
||||
// Aktiviere Personas-Tab
|
||||
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
||||
document.querySelectorAll('.button-tab').forEach(btn => btn.classList.remove('active'));
|
||||
|
||||
const personasTab = document.querySelector('.tab1');
|
||||
const personasButton = document.querySelector('.button-tab[onclick*="tab1"]');
|
||||
|
||||
if (personasTab) personasTab.classList.add('active');
|
||||
if (personasButton) personasButton.classList.add('active');
|
||||
}
|
||||
|
||||
// Initialisierung beim Laden der Seite
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
addPersonasStyles();
|
||||
|
|
@ -441,33 +469,21 @@ function showPersonasTab() {
|
|||
loadPersonasData();
|
||||
}
|
||||
|
||||
// Verstecke Empfehlungsbereich beim Wechsel zu Personas-Tab
|
||||
hideRecommendation();
|
||||
// Verstecke Empfehlungsbereich beim Wechsel zu Personas-Tab (nicht mehr benötigt)
|
||||
|
||||
// Verstecke Finder-Ergebnisse
|
||||
const finderResult = document.getElementById('result');
|
||||
if (finderResult) {
|
||||
finderResult.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// Globale Funktion für Finder-Tab-Wechsel
|
||||
// Globale Funktion für Finder-Tab-Wechsel (nicht mehr benötigt)
|
||||
function showFinderTabWithPersona() {
|
||||
// Lade Markdown-Inhalte für die aktuelle Persona
|
||||
if (currentPersona && Object.keys(personasData).length > 0) {
|
||||
loadPersonaMarkdownContent(currentPersona);
|
||||
}
|
||||
// Funktion nicht mehr benötigt
|
||||
}
|
||||
|
||||
// Versteckt den Empfehlungsbereich
|
||||
function hideRecommendation() {
|
||||
const recommendation = document.querySelector('.recommendation');
|
||||
if (recommendation) {
|
||||
recommendation.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// Zeigt den Empfehlungsbereich an
|
||||
function showRecommendation() {
|
||||
const recommendation = document.querySelector('.recommendation');
|
||||
if (recommendation) {
|
||||
recommendation.style.display = 'block';
|
||||
}
|
||||
}
|
||||
// Empfehlungsbereich-Funktionen entfernt, da Button nicht mehr existiert
|
||||
|
||||
// Lädt nur die Markdown-Inhalte ohne Dropdowns zu ändern
|
||||
async function loadPersonaMarkdownContentOnly(personaName) {
|
||||
|
|
@ -561,7 +577,16 @@ async function loadPersonaMarkdownContent(personaName) {
|
|||
|
||||
// Bestimmt die richtige Markdown-Datei basierend auf Persona-Daten
|
||||
function getMarkdownFileForPersona(persona) {
|
||||
// Bundesland-Mapping - korrigiert für die tatsächlichen Verzeichnisnamen
|
||||
// Verwende die mapping-files aus der personas.yml, falls vorhanden
|
||||
if (persona['mapping-files'] && persona['mapping-files'].length > 0) {
|
||||
// Für jetzt verwende die erste Mapping-Datei
|
||||
// TODO: Später können wir eine intelligentere Auswahl basierend auf Dropdown-Werten implementieren
|
||||
const mappingFile = persona['mapping-files'][0];
|
||||
console.log('[DEBUG] Verwende Mapping-Datei aus personas.yml:', mappingFile);
|
||||
return mappingFile;
|
||||
}
|
||||
|
||||
// Fallback: Alte Logik für Personas ohne mapping-files
|
||||
const bundeslandMapping = {
|
||||
'BW': '1_BW',
|
||||
'BY': '2_BY',
|
||||
|
|
@ -592,25 +617,17 @@ function getMarkdownFileForPersona(persona) {
|
|||
let fileName = '';
|
||||
|
||||
// Ausbildung-basiert (Code-System)
|
||||
if (persona['ausbildung-value'] === 'B') {
|
||||
if (persona['ausbildung-value'] === 'AUSBILDUNG') {
|
||||
// Berufserfahrung
|
||||
if (persona['informatik-value'] === 'J') {
|
||||
fileName = 'HS-BA-1F.md'; // Informatik-Berufserfahrung
|
||||
} else {
|
||||
fileName = 'HS-BA-2F.md'; // Andere Berufserfahrung
|
||||
}
|
||||
} else if (persona['ausbildung-value'] === 'H') {
|
||||
fileName = 'HS-BA-1F.md'; // Berufserfahrung
|
||||
} else if (persona['ausbildung-value'] === 'HS') {
|
||||
// Hochschule
|
||||
if (persona['abschluss-value'] === 'B') {
|
||||
fileName = 'HS-MA-0F.md'; // Bachelor
|
||||
} else if (persona['abschluss-value'] === 'M') {
|
||||
if (persona['informatik-value'] === 'J') {
|
||||
fileName = 'HS-MA-1F.md'; // Master mit Informatik
|
||||
} else {
|
||||
fileName = 'HS-MA-2F.md'; // Master ohne Informatik (wie Birgit)
|
||||
}
|
||||
fileName = 'HS-MA-1F.md'; // Master
|
||||
}
|
||||
} else if (persona['ausbildung-value'] === 'S') {
|
||||
} else if (persona['ausbildung-value'] === 'LA') {
|
||||
// Studium/Lehramt
|
||||
fileName = 'LA-BA.md';
|
||||
}
|
||||
|
|
@ -620,7 +637,7 @@ function getMarkdownFileForPersona(persona) {
|
|||
return null;
|
||||
}
|
||||
|
||||
console.log(`[DEBUG] Persona ${persona.name}: Bundesland ${persona.bundesland} (${bundeslandDir}), Ausbildung ${persona['ausbildung-value']}, Abschluss ${persona['abschluss-value']}, Informatik ${persona['informatik-value']} → ${fileName}`);
|
||||
console.log(`[DEBUG] Persona ${persona.name}: Bundesland ${persona.bundesland} (${bundeslandDir}), Ausbildung ${persona['ausbildung-value']}, Abschluss ${persona['abschluss-value']} → ${fileName}`);
|
||||
|
||||
return `Bundeslaender/${bundeslandDir}/${fileName}`;
|
||||
}
|
||||
|
|
@ -637,18 +654,18 @@ async function loadLinkedMarkdownContent(markdownPaths) {
|
|||
// Entferne führenden Slash falls vorhanden
|
||||
const cleanPath = path.trim().startsWith('/') ? path.trim().substring(1) : path.trim();
|
||||
|
||||
// Füge Bundeslaender-repo/ hinzu, falls nicht bereits vorhanden
|
||||
const fullPath = cleanPath.startsWith('Bundeslaender-repo/') ? cleanPath : `Bundeslaender-repo/${cleanPath}`;
|
||||
// Verwende den Pfad direkt, da er bereits den korrekten Präfix hat
|
||||
const fullPath = cleanPath;
|
||||
const response = await fetch(fullPath);
|
||||
const content = await response.text();
|
||||
|
||||
// Konvertiere Markdown zu HTML (vereinfacht)
|
||||
const htmlContent = convertMarkdownToHtml(content);
|
||||
contentHtml += `<div class="content-section">${htmlContent}</div>`;
|
||||
// Konvertiere Markdown zu HTML (gleiche Struktur wie Finder)
|
||||
const htmlContent = renderMarkdownArticle(content);
|
||||
contentHtml += htmlContent;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Fehler beim Laden von:', path, error);
|
||||
contentHtml += `<div class="content-section"><h2>Fehler</h2><p>Datei nicht gefunden: ${path}</p></div>`;
|
||||
contentHtml += `<article class="content-article"><div class='main-content'><h2>Fehler</h2><div class='text-content'>Datei nicht gefunden: ${path}</div></div></article>`;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -658,49 +675,99 @@ async function loadLinkedMarkdownContent(markdownPaths) {
|
|||
displayPersonaContent(contentHtml);
|
||||
}
|
||||
|
||||
// Einfache Markdown-zu-HTML Konvertierung
|
||||
function convertMarkdownToHtml(markdown) {
|
||||
return markdown
|
||||
.replace(/^# (.*$)/gim, '<h1>$1</h1>')
|
||||
.replace(/^## (.*$)/gim, '<h2>$1</h2>')
|
||||
.replace(/^### (.*$)/gim, '<h3>$1</h3>')
|
||||
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
|
||||
.replace(/\*(.*?)\*/g, '<em>$1</em>')
|
||||
.replace(/\n\n/g, '</p><p>')
|
||||
.replace(/^(?!<[h1-6])/gm, '<p>')
|
||||
.replace(/$/gm, '</p>')
|
||||
.replace(/<p><\/p>/g, '');
|
||||
// Verwendet die gleiche Markdown-Rendering-Funktion wie Finder
|
||||
function renderMarkdownArticle(mdText) {
|
||||
// Splitte in Abschnitte nach ##
|
||||
const sections = mdText.split(/\n(?=## )/);
|
||||
return sections.map(section => {
|
||||
let lines = section.trim().split('\n');
|
||||
if (!lines[0].startsWith('##')) return '';
|
||||
let headline = lines[0].replace(/^## /, '');
|
||||
let marginal = '';
|
||||
let textStart = 1;
|
||||
|
||||
// Prüfe zweite Zeile auf Link
|
||||
if (lines[1] && lines[1].startsWith('http')) {
|
||||
const linkLine = lines[1];
|
||||
|
||||
// Prüfe ob es ein Markdown-Link mit Text ist: [Text](URL)
|
||||
const markdownLinkMatch = linkLine.match(/^\[([^\]]+)\]\(([^)]+)\)$/);
|
||||
if (markdownLinkMatch) {
|
||||
// Markdown-Link gefunden: [Text](URL)
|
||||
const linkText = markdownLinkMatch[1];
|
||||
const linkUrl = markdownLinkMatch[2];
|
||||
marginal = `<blockquote class='marginal'><a href="${linkUrl}" target="_blank">${linkText}</a></blockquote>`;
|
||||
} else {
|
||||
// Einfacher Link
|
||||
marginal = `<blockquote class='marginal'><a href="${linkLine}" target="_blank">${linkLine}</a></blockquote>`;
|
||||
}
|
||||
textStart = 2;
|
||||
}
|
||||
|
||||
// Rest als Text verarbeiten
|
||||
let textContent = lines.slice(textStart).join('\n');
|
||||
|
||||
// Markdown-zu-HTML Konvertierung
|
||||
textContent = textContent
|
||||
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
|
||||
.replace(/\*(.*?)\*/g, '<em>$1</em>')
|
||||
// Markdown-Links verarbeiten: [Text](URL)
|
||||
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>')
|
||||
.replace(/\n\n/g, '</p><p>')
|
||||
.replace(/^(?!<[h1-6])/gm, '<p>')
|
||||
.replace(/$/gm, '</p>')
|
||||
.replace(/<p><\/p>/g, '');
|
||||
|
||||
return `<article class="content-article">
|
||||
<div class="layout">
|
||||
<div class="main-content">
|
||||
<h2>${headline}</h2>
|
||||
<div class="text-content">${textContent}</div>
|
||||
</div>
|
||||
<div class="sidebar">${marginal}</div>
|
||||
</div>
|
||||
</article>`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
// Zeigt Persona-Inhalt im Empfehlungsbereich an (gleiche Struktur wie Finder)
|
||||
function displayPersonaContent(contentHtml) {
|
||||
console.log('[DEBUG] Zeige Persona-Inhalt an:', contentHtml.substring(0, 100));
|
||||
|
||||
// Verwende die gleiche Struktur wie der Finder
|
||||
const resultDiv = document.getElementById('result');
|
||||
if (resultDiv) {
|
||||
// Headline setzen
|
||||
const headlineElement = document.getElementById('finder-headline');
|
||||
if (headlineElement) {
|
||||
headlineElement.textContent = 'Empfehlung für ' + (currentPersona ? personasData[currentPersona].name : 'Persona');
|
||||
}
|
||||
|
||||
// Content setzen
|
||||
const textContentElement = document.getElementById('finder-text-content');
|
||||
if (textContentElement) {
|
||||
textContentElement.innerHTML = contentHtml;
|
||||
}
|
||||
|
||||
// Tags und Marginal leeren (falls vorhanden)
|
||||
const tagsElement = document.getElementById('finder-tags');
|
||||
if (tagsElement) {
|
||||
tagsElement.innerHTML = '';
|
||||
}
|
||||
|
||||
const marginalElement = document.getElementById('finder-marginal');
|
||||
if (marginalElement) {
|
||||
marginalElement.innerHTML = '';
|
||||
}
|
||||
|
||||
// Ergebnis-Bereich anzeigen
|
||||
resultDiv.style.display = 'block';
|
||||
if (!resultDiv) {
|
||||
console.error('Result div nicht gefunden');
|
||||
return;
|
||||
}
|
||||
|
||||
// Headline setzen
|
||||
const headlineElement = document.getElementById('finder-headline');
|
||||
if (headlineElement) {
|
||||
const personaName = currentPersona ? personasData[currentPersona].name : 'Persona';
|
||||
headlineElement.textContent = 'Empfehlung für ' + personaName;
|
||||
console.log('[DEBUG] Headline gesetzt für:', personaName);
|
||||
}
|
||||
|
||||
// Content setzen
|
||||
const textContentElement = document.getElementById('finder-text-content');
|
||||
if (textContentElement) {
|
||||
textContentElement.innerHTML = contentHtml;
|
||||
console.log('[DEBUG] Content gesetzt, Länge:', contentHtml.length);
|
||||
}
|
||||
|
||||
// Tags und Marginal leeren
|
||||
const tagsElement = document.getElementById('finder-tags');
|
||||
if (tagsElement) {
|
||||
tagsElement.innerHTML = '';
|
||||
}
|
||||
|
||||
const marginalElement = document.getElementById('finder-marginal');
|
||||
if (marginalElement) {
|
||||
marginalElement.innerHTML = '';
|
||||
}
|
||||
|
||||
// Ergebnis-Bereich anzeigen
|
||||
resultDiv.style.display = 'block';
|
||||
console.log('[DEBUG] Result div angezeigt');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,12 +7,12 @@ birgit:
|
|||
Birgit aus {{BUNDESLAND_SELECT}} hat direkt nach ihrer Ausbildung zur Fachinformatikerin für Systemintegration angefangen zu arbeiten. Mittlerweile verfügt Birgit über langjährige {{AUSBILDUNG_SELECT}} im IT-Bereich. Schon länger spielt sie mit dem Gedanken, etwas Neues auszuprobieren - sie möchte unbedingt nochmal Erfahrungen in einem Job mit tieferem Sinn machen, etwas bewirken und ihren Wissensschatz an die junge Generation weitergeben. Sie fragt sich, ob dies noch möglich ist.
|
||||
bundesland: RP
|
||||
ausbildung: Berufserfahrung
|
||||
ausbildung-value: B
|
||||
ausbildung-value: AUSBILDUNG
|
||||
abschluss-value: B
|
||||
informatik: Informatik
|
||||
informatik-value: J
|
||||
lehramtsbezug-value: O
|
||||
faecher-value: 1
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "11_RP/HS-BA-1F.md"
|
||||
- "11_RP/HS-BA-2F.md"
|
||||
|
||||
swantje:
|
||||
name: Swantje
|
||||
|
|
@ -23,12 +23,11 @@ swantje:
|
|||
Nach ihrem {{AUSBILDUNG_SELECT}} zur Informatikerin (Dipl.-FH) hat Swantje in {{BUNDESLAND_SELECT}} einen Job in der freien Wirtschaft angenommen. Sie ist Anfang 30 und befindet sich gerade mit ihrem zweiten Kind in der Elternzeit. Für ihren beruflichen Wiedereinstieg wünscht sie sich familienfreundliche Arbeitszeiten und die Möglichkeit, in Teilzeit zu arbeiten. Swantje hat bereits gehört, dass MV eine gut ausgebaute schulische Informatikbildung anbietet und informiert sich nun über die notwendigen Zusatzqualifikation für allgemeinbildende Schulen.
|
||||
bundesland: MV
|
||||
ausbildung: abgeschlossenes Studium
|
||||
ausbildung-value: H
|
||||
ausbildung-value: HS
|
||||
abschluss-value: M
|
||||
informatik: Informatik
|
||||
informatik-value: J
|
||||
lehramtsbezug-value: A
|
||||
faecher-value: 2
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "8_MV/HS-MA-1F.md"
|
||||
|
||||
ecem:
|
||||
name: Ecem
|
||||
|
|
@ -39,12 +38,11 @@ ecem:
|
|||
Ecem aus {{BUNDESLAND_SELECT}} hat in der Türkei Mathematik auf {{AUSBILDUNG_SELECT}} studiert und promoviert. Dort hat sie einige Jahre Mathematik unterrichtet, bevor sie vor fünf Jahren nach Deutschland kam. Inzwischen hat sie ihr Deutsch C1-Zertifikat bestanden und will in Niedersachsen Informatik nachstudieren, da dies in Bremen nicht geht. Sie hat vom niedersächsischen Kultusministerium Mathematik anerkannt bekommen und mitgeteilt bekommen, dass sie in einer Ausgleichsmaßnahme 80 Creditpoints für das zweite Fach an einer Uni nachstudieren muss. Zur Ausgleichsmaßnahme gehört auch ein ca. 12-monatiger schulpraktischer Teil, in dessen Zeit ein Arbeitsverhältnis mit dem Land besteht und pädagogische und fachdidaktische Seminare am Studienseminar erfolgreich zu besuchen sind.
|
||||
bundesland: HB
|
||||
ausbildung: abgeschlossenes Lehramtstudium +
|
||||
ausbildung-value: S
|
||||
ausbildung-value: LA
|
||||
abschluss-value: M
|
||||
informatik: Mathematik
|
||||
informatik-value: N
|
||||
lehramtsbezug-value: A
|
||||
faecher-value: 2
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "5_HB/LA-BA.md"
|
||||
|
||||
aminata:
|
||||
name: Aminata
|
||||
|
|
@ -55,12 +53,11 @@ aminata:
|
|||
Aminata sucht eine neue Perspektive. Sie hat ein abgeschlossenes {{AUSBILDUNG_SELECT}} und eine Promotion als Bioinformatikerin, investierte in den nachfolgenden Jahren viel Zeit in eine wissenschaftliche Karriere und nahm verschiedene befristete Projektstellen an, die ihr viel Freude gemacht haben - doch nun sucht sie eine langfristige Perspektive. Sie ist nun 38 Jahre und möchte einen Neuanfang in {{BUNDESLAND_SELECT}} machen.
|
||||
bundesland: BE
|
||||
ausbildung: Masterstudium
|
||||
ausbildung-value: H
|
||||
ausbildung-value: HS
|
||||
abschluss-value: B
|
||||
informatik: Mathematik
|
||||
informatik-value: J
|
||||
lehramtsbezug-value: A
|
||||
faecher-value: 1
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "3_BE/HS-MA-1F.md"
|
||||
|
||||
sabrina:
|
||||
name: Sabrina
|
||||
|
|
@ -68,15 +65,14 @@ sabrina:
|
|||
titel: Lehrerin für ev. Religion und Geschichte
|
||||
bild: Steuerungsdateien/images/WIL-Vorbild_Sabrina.png
|
||||
text: >
|
||||
Sabrina wusste schon immer, dass sie Lehrerin werden möchte, um ihre Schüler:innen auf ein anspruchsvolles Leben vorzubereiten. Deswegen entschied sie sich mit Anfang 20 für ein {{AUSBILDUNG_SELECT}}} (Sek. II) in den Fächern ev. Religion und Geschichte. Nun, mit Mitte 40, hat sich der Alltag verändert - Sabrina weiß, dass im {{BUNDESLAND_SELECT}} Informatikunterricht eingeführt werden soll und sich mit dem neuen Lehramt sich ggf. auch neue Karrierechancen und Gestaltungsmöglichkeiten innerhalb der Schule uergeben können. Sie möchte sich informieren, was sie leisten muss, um Informatik als drittes Fach hinzuzunehmen.
|
||||
Sabrina wusste schon immer, dass sie Lehrerin werden möchte, um ihre Schüler:innen auf ein anspruchsvolles Leben vorzubereiten. Deswegen entschied sie sich mit Anfang 20 für ein {{AUSBILDUNG_SELECT}} (Sek. II) in den Fächern ev. Religion und Geschichte. Nun, mit Mitte 40, hat sich der Alltag verändert - Sabrina weiß, dass im {{BUNDESLAND_SELECT}} Informatikunterricht eingeführt werden soll und sich mit dem neuen Lehramt sich ggf. auch neue Karrierechancen und Gestaltungsmöglichkeiten innerhalb der Schule uergeben können. Sie möchte sich informieren, was sie leisten muss, um Informatik als drittes Fach hinzuzunehmen.
|
||||
bundesland: SL
|
||||
ausbildung: Lehramtstudium -
|
||||
ausbildung-value: S
|
||||
ausbildung-value: LA
|
||||
abschluss-value: M
|
||||
informatik: Mathematik
|
||||
informatik-value: J
|
||||
lehramtsbezug-value: A
|
||||
faecher-value: 2
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "12_SL/LA-BA.md"
|
||||
|
||||
mandy:
|
||||
name: Mandy
|
||||
|
|
@ -87,12 +83,11 @@ mandy:
|
|||
Mandy studiert nach ihrem {{AUSBILDUNG_SELECT}} in Wirtschaftsinformatik momentan noch den Master in Informatik als Fernstudium, da sie aus familären Gründen mit 24 Jahren wieder zurück auf den elterlichen Hof in {{BUNDESLAND_SELECT}} gezogen ist. Sie engagiert sich viel in Vereinen und gibt Programmierkurse für Mädchen am Wochenende. Das macht ihr sehr viel Spaß und sie beschließt, dies beruflich weiterzuverfolgen.
|
||||
bundesland: BY
|
||||
ausbildung: Bachelor Informatikstudium
|
||||
ausbildung-value: H
|
||||
ausbildung-value: HS
|
||||
abschluss-value: B
|
||||
informatik: Informatik
|
||||
informatik-value: J
|
||||
lehramtsbezug-value: O
|
||||
faecher-value: E
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "2_BY/HS-BA-1F.md"
|
||||
|
||||
zoe:
|
||||
name: Zoe
|
||||
|
|
@ -103,10 +98,9 @@ zoe:
|
|||
Zoé ist 24 und ist für ihre Fachinformatikerin-Ausbildung nach {{BUNDESLAND_SELECT}} gezogen. Nach einigen {{AUSBILDUNG_SELECT}} ist sie Abteilungsleiterin, aber sie wünscht sich mehr für ihre berufliche Karriere. Da sie noch jung ist und einem zweiten Karriereweg nichts im Weg steht, überdenkt sie die Möglichkeiten mit ihrem fachlich-fundierten Hintergrund.
|
||||
bundesland: NRW
|
||||
ausbildung: Berufserfahrung
|
||||
ausbildung-value: B
|
||||
ausbildung-value: AUSBILDUNG
|
||||
abschluss-value: B
|
||||
informatik:
|
||||
informatik-value: N
|
||||
lehramtsbezug-value: 1
|
||||
faecher-value: E
|
||||
# Direkte Zuordnung zu relevanten MD-Dateien
|
||||
mapping-files:
|
||||
- "10_NW/HS-BA-1F.md"
|
||||
|
||||
|
|
@ -9,8 +9,8 @@
|
|||
<link href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@300&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="Steuerungsdateien/fonts.css">
|
||||
<link rel="stylesheet" href="Steuerungsdateien/styles.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
|
|
@ -34,7 +34,6 @@
|
|||
</div>
|
||||
<div class="text">
|
||||
<p id="persona-text">Birgit aus {{BUNDESLAND_SELECT}} hat direkt nach ihrer Ausbildung zur Fachinformatikerin für Systemintegration angefangen zu arbeiten. Mittlerweile verfügt Birgit über langjährige {{AUSBILDUNG_SELECT}} im IT-Bereich. Schon länger spielt sie mit dem Gedanken, etwas Neues auszuprobieren - sie möchte unbedingt nochmal Erfahrungen in einem Job mit tieferem Sinn machen, etwas bewirken und ihren Wissensschatz an die junge Generation weitergeben. Sie fragt sich, ob dies noch möglich ist.</p>
|
||||
<button id="persona-empfehlung-button" class="button">Unsere Empfehlung für <span id="persona-button-name">Birgit</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -49,16 +48,6 @@
|
|||
<div class="persona" data-name="zoe"><img src="Steuerungsdateien/images/WIL-Vorbild_Zoe.png"><span>Zoe</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="recommendation">
|
||||
<span class="distinction">Unsere Empfehlung ist</span><br>
|
||||
<div id="persona-empfehlung" class="main-content">
|
||||
<h2 id="persona-headline"></h2>
|
||||
<p id="persona-text-content"></p>
|
||||
<p id="persona-tags" class="tags"></p>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Finder Tab -->
|
||||
|
|
@ -68,39 +57,66 @@
|
|||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Ergebnisse außerhalb des Tab-Containers -->
|
||||
<div id="result" style="display: none;">
|
||||
<div class="main-section">
|
||||
<h2 id="finder-headline">Empfehlung</h2>
|
||||
<div id="finder-text-content" class="text-content">...</div>
|
||||
<!-- Result-Bereich für beide Tabs (Finder + Personas) -->
|
||||
<div id="result" class="result-container" style="display: none;">
|
||||
<div class="result-header">
|
||||
<h2 id="finder-headline">Ihre Empfehlung</h2>
|
||||
</div>
|
||||
<div class="result-content">
|
||||
<div id="finder-text-content"></div>
|
||||
<div id="finder-tags" class="tags"></div>
|
||||
<div id="finder-marginal" class="marginal"></div>
|
||||
</div>
|
||||
<!-- Zusätzliche Abschnitte werden hier dynamisch eingefügt -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js"></script>
|
||||
<script src="Steuerungsdateien/personas.js"></script>
|
||||
<script src="Steuerungsdateien/finder.js"></script>
|
||||
|
||||
<script>
|
||||
// Tabs anzeigen
|
||||
function showTab(tabId) {
|
||||
// Alle Tabs deaktivieren
|
||||
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
||||
document.querySelector(`.${tabId}`).classList.add('active');
|
||||
document.querySelectorAll('.button-tab').forEach(btn => btn.classList.remove('active'));
|
||||
|
||||
// Aktiven Tab aktivieren
|
||||
document.querySelector(`.${tabId}`).classList.add('active');
|
||||
document.querySelector(`.button-tab[onclick*="${tabId}"]`).classList.add('active');
|
||||
|
||||
// Texte zurücksetzen
|
||||
resetAllContent();
|
||||
|
||||
// Tab-spezifische Initialisierung
|
||||
if (tabId === 'tab1') {
|
||||
showPersonasTab();
|
||||
} else if (tabId === 'tab2') {
|
||||
loadFinderStructure();
|
||||
showFinderTabWithPersona();
|
||||
}
|
||||
}
|
||||
|
||||
// Setzt alle Inhalte zurück
|
||||
function resetAllContent() {
|
||||
// Persona-Empfehlungen zurücksetzen (nicht mehr benötigt)
|
||||
|
||||
// Finder-Ergebnisse zurücksetzen
|
||||
const finderResult = document.getElementById('result');
|
||||
if (finderResult) {
|
||||
finderResult.style.display = 'none';
|
||||
}
|
||||
|
||||
// Alle Inhalte leeren
|
||||
const elementsToClear = [
|
||||
'persona-headline', 'persona-text-content', 'persona-tags',
|
||||
'finder-headline', 'finder-text-content', 'finder-tags', 'finder-marginal'
|
||||
];
|
||||
|
||||
elementsToClear.forEach(id => {
|
||||
const element = document.getElementById(id);
|
||||
if (element) {
|
||||
element.innerHTML = '';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Initialisiere die Anwendung
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Personas werden automatisch geladen durch personas.js
|
||||
|
|
|
|||
94
www/typosnippet.html
Normal file
94
www/typosnippet.html
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
<!-- CSS- und JavaScript-Imports für Typo3 -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@300&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="Steuerungsdateien/fonts.css">
|
||||
<link rel="stylesheet" href="Steuerungsdateien/styles.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
|
||||
<!-- Hauptinhalt der Anwendung -->
|
||||
<div class="container">
|
||||
<div class="tab-buttons">
|
||||
<button class="button-tab active" onclick="showTab('tab1')">Personas</button>
|
||||
<button class="button-tab" onclick="showTab('tab2')">Finder</button>
|
||||
</div>
|
||||
|
||||
<!-- Personas Tab -->
|
||||
<div class="tab tab1 active">
|
||||
<div class="personas-tableau">
|
||||
<div class="focus personas-portrait">
|
||||
<div class="portrait-left">
|
||||
<img id="persona-image" src="" alt="Portrait">
|
||||
</div>
|
||||
<div class="info-right">
|
||||
<div class="persona-head">
|
||||
<h2 id="persona-name"></h2>
|
||||
<span id="persona-title" class="subline"></span>
|
||||
</div>
|
||||
<div class="text">
|
||||
<p id="persona-text"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="persona-list" id="persona-list"></div>
|
||||
</div>
|
||||
<div class="recommendation">
|
||||
<div class="main-content">
|
||||
<h2 id="persona-headline"></h2>
|
||||
<p id="persona-text-content"></p>
|
||||
<p id="persona-tags" class="tags"></p>
|
||||
</div>
|
||||
<div class="sidebar">
|
||||
<blockquote id="persona-marginal"></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Finder Tab -->
|
||||
<div class="tab tab2">
|
||||
<form id="selectionForm">
|
||||
<div id="dynamic-steps"></div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Ergebnisse außerhalb des Tab-Containers -->
|
||||
<div id="result" style="display: none;">
|
||||
<div class="main-section">
|
||||
<h2 id="finder-headline">Empfehlung</h2>
|
||||
<div id="finder-text-content" class="text-content">...</div>
|
||||
<div id="finder-tags" class="tags"></div>
|
||||
<div id="finder-marginal" class="marginal"></div>
|
||||
</div>
|
||||
<!-- Zusätzliche Abschnitte werden hier dynamisch eingefügt -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- JavaScript-Imports für Typo3 -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js"></script>
|
||||
<script src="Steuerungsdateien/personas.js"></script>
|
||||
<script src="Steuerungsdateien/finder.js"></script>
|
||||
|
||||
<!-- JavaScript-Funktionen -->
|
||||
<script>
|
||||
// Tabs anzeigen
|
||||
function showTab(tabId) {
|
||||
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
||||
document.querySelector(`.${tabId}`).classList.add('active');
|
||||
document.querySelectorAll('.button-tab').forEach(btn => btn.classList.remove('active'));
|
||||
document.querySelector(`.button-tab[onclick*="${tabId}"]`).classList.add('active');
|
||||
|
||||
// Tab-spezifische Initialisierung
|
||||
if (tabId === 'tab1') {
|
||||
showPersonasTab();
|
||||
} else if (tabId === 'tab2') {
|
||||
loadFinderStructure();
|
||||
showFinderTabWithPersona();
|
||||
}
|
||||
}
|
||||
|
||||
// Initialisiere die Anwendung
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Personas werden automatisch geladen durch personas.js
|
||||
// Finder wird beim Tab-Wechsel geladen
|
||||
});
|
||||
</script>
|
||||
Loading…
Reference in New Issue
Block a user