/**
* Mindmap-Seite JavaScript
* Spezifische Funktionen für die Mindmap-Seite
*/
// Füge das Modul zum globalen MindMap-Objekt hinzu
if (!window.MindMap) {
window.MindMap = {};
}
// Registriere den Initialisierer im MindMap-Objekt
if (window.MindMap) {
window.MindMap.pageInitializers = window.MindMap.pageInitializers || {};
window.MindMap.pageInitializers.mindmap = initMindmapPage;
}
// Initialisiere die Mindmap-Seite nur, wenn alle Abhängigkeiten vorhanden sind
if (window.MindMap && typeof MindMapVisualization !== 'undefined') {
if (document.body && document.body.dataset && document.body.dataset.page === 'mindmap') {
window.MindMap.pageInitializers = window.MindMap.pageInitializers || {};
window.MindMap.pageInitializers.mindmap = initMindmapPage;
initMindmapPage();
}
}
document.addEventListener('DOMContentLoaded', function() {
// Prüfe, ob wir auf der Mindmap-Seite sind und initialisiere
if (document.body && document.body.dataset && document.body.dataset.page === 'mindmap') {
initMindmapPage();
}
});
/**
* Initialisiert die Mindmap-Seite
*/
function initMindmapPage() {
console.log('Mindmap-Seite Initialisierung startet...');
console.log('D3 Bibliothek verfügbar:', typeof d3 !== 'undefined');
console.log('MindMapVisualization verfügbar:', typeof MindMapVisualization !== 'undefined');
const mindmapContainer = document.getElementById('cy');
const thoughtsContainer = document.getElementById('thoughts-container');
const nodeDetailsContainer = document.getElementById('node-details');
if (!mindmapContainer) {
console.error('Mindmap-Container nicht gefunden!');
return;
}
console.log('Mindmap-Container gefunden:', mindmapContainer);
// Prüfe, ob D3.js geladen ist
if (typeof d3 === 'undefined') {
console.error('D3.js ist nicht geladen!');
if (mindmapContainer) {
mindmapContainer.innerHTML = `
D3.js konnte nicht geladen werden. Bitte laden Sie die Seite neu.
`;
}
return;
}
// Prüfe, ob MindMapVisualization definiert ist
if (typeof MindMapVisualization === 'undefined') {
console.error('MindMapVisualization-Klasse ist nicht definiert!');
if (mindmapContainer) {
mindmapContainer.innerHTML = `
MindMap-Visualisierung konnte nicht geladen werden. Bitte laden Sie die Seite neu.
`;
}
return;
}
// Erstelle die Mindmap-Visualisierung
let mindmap;
try {
console.log('Versuche, MindMapVisualization zu erstellen...');
mindmap = new MindMapVisualization('#cy', {
height: 600,
onNodeClick: handleNodeClick
});
// Globale Referenz für die Zoom-Buttons erstellen
window.mindmapInstance = mindmap;
// Lade die Mindmap-Daten
mindmap.loadData();
console.log('MindMapVisualization erfolgreich erstellt und geladen');
// Dark Mode Listener registrieren
registerDarkModeListener(mindmap);
} catch (error) {
console.error('Fehler beim Erstellen der MindMapVisualization:', error);
if (mindmapContainer) {
mindmapContainer.innerHTML = `
Fehler beim Erstellen der Mindmap-Visualisierung:
${error.message}
`;
}
return;
}
// Suchfunktion für die Mindmap
const searchInput = document.getElementById('search-mindmap');
if (searchInput) {
searchInput.addEventListener('input', function(e) {
mindmap.filterBySearchTerm(e.target.value);
});
}
// UI-Elemente initialisieren
initializeMindmapButtons(mindmap);
/**
* Behandelt Klicks auf Mindmap-Knoten
*/
async function handleNodeClick(node) {
// Details im Detailbereich anzeigen
if (nodeDetailsContainer) {
updateNodeDetails(node);
}
if (!thoughtsContainer) return;
// Zeige Lade-Animation
thoughtsContainer.innerHTML = `
`;
try {
// Lade Gedanken für den ausgewählten Knoten
const response = await fetch(`/api/nodes/${node.id}/thoughts`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const thoughts = await response.json();
// Gedanken anzeigen
renderThoughts(thoughts, node.name);
} catch (error) {
console.error('Fehler beim Laden der Gedanken:', error);
thoughtsContainer.innerHTML = `
Fehler beim Laden der Gedanken.
`;
}
}
/**
* Aktualisiert den Node-Details-Bereich mit Informationen zum ausgewählten Knoten
*/
function updateNodeDetails(node) {
if (!nodeDetailsContainer) return;
const isDarkMode = document.documentElement.classList.contains('dark');
const textClass = isDarkMode ? 'text-gray-300' : 'text-gray-600';
nodeDetailsContainer.innerHTML = `
Erstellt:${formatDate(node.created_at || new Date())}
Verbindungen:${node.connections || 0}
`;
}
/**
* Formatiert ein Datum in ein lesbares Format
*/
function formatDate(dateString) {
const date = new Date(dateString);
return date.toLocaleDateString('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
}
/**
* Liefert eine CSS-Klasse für die Kategorie-Badge basierend auf der Kategorie
*/
function getCategoryBadgeClass(category) {
if (!category) return 'bg-gray-500 text-white';
const categories = {
'Konzept': 'bg-blue-500 text-white',
'Theorie': 'bg-purple-500 text-white',
'Methode': 'bg-green-500 text-white',
'Person': 'bg-yellow-500 text-black',
'Ereignis': 'bg-red-500 text-white',
'Referenz': 'bg-indigo-500 text-white'
};
return categories[category] || 'bg-gray-500 text-white';
}
/**
* Rendert die Gedanken in den Container
*/
function renderThoughts(thoughts, nodeName) {
const isDarkMode = document.documentElement.classList.contains('dark');
// Wenn keine Gedanken vorhanden sind
if (thoughts.length === 0) {
thoughtsContainer.innerHTML = `
Keine Gedanken zu "${nodeName}" vorhanden.
`;
// Event-Listener für den Button
document.getElementById('add-thought-btn')?.addEventListener('click', () => {
openAddThoughtModal(nodeName);
});
return;
}
// Gedanken anzeigen
thoughtsContainer.innerHTML = `