235 lines
7.4 KiB
JavaScript
235 lines
7.4 KiB
JavaScript
/**
|
|
* MindMap - Hauptdatei für globale JavaScript-Funktionen
|
|
*/
|
|
|
|
/**
|
|
* Hauptmodul für die MindMap-Anwendung
|
|
* Verwaltet die globale Anwendungslogik
|
|
*/
|
|
|
|
/**
|
|
* Hauptobjekt der MindMap-Anwendung
|
|
*/
|
|
const MindMap = {
|
|
// App-Status
|
|
initialized: false,
|
|
darkMode: document.documentElement.classList.contains('dark'),
|
|
pageInitializers: {},
|
|
currentPage: null,
|
|
|
|
/**
|
|
* Initialisiert die MindMap-Anwendung
|
|
*/
|
|
init() {
|
|
if (this.initialized) return;
|
|
|
|
// Setze currentPage erst jetzt, wenn DOM garantiert geladen ist
|
|
this.currentPage = document.body && document.body.dataset ? document.body.dataset.page : null;
|
|
|
|
console.log('MindMap-Anwendung wird initialisiert...');
|
|
|
|
// Initialisiere den ChatGPT-Assistenten
|
|
if (typeof ChatGPTAssistant !== 'undefined') {
|
|
const assistant = new ChatGPTAssistant();
|
|
assistant.init();
|
|
// Speichere als Teil von MindMap
|
|
this.assistant = assistant;
|
|
}
|
|
|
|
// Seiten-spezifische Initialisierer aufrufen
|
|
if (this.currentPage && this.pageInitializers[this.currentPage]) {
|
|
this.pageInitializers[this.currentPage]();
|
|
}
|
|
|
|
// Event-Listener einrichten
|
|
this.setupEventListeners();
|
|
|
|
// Dunkel-/Hellmodus aus LocalStorage wiederherstellen
|
|
if (localStorage.getItem('darkMode') === 'dark') {
|
|
document.documentElement.classList.add('dark');
|
|
this.darkMode = true;
|
|
}
|
|
|
|
// Mindmap initialisieren, falls auf der richtigen Seite
|
|
this.initializeMindmap();
|
|
|
|
this.initialized = true;
|
|
},
|
|
|
|
/**
|
|
* Initialisiert die D3.js Mindmap-Visualisierung
|
|
*/
|
|
initializeMindmap() {
|
|
// Prüfe, ob wir auf der Mindmap-Seite sind
|
|
const mindmapContainer = document.getElementById('mindmap-container');
|
|
if (!mindmapContainer) return;
|
|
|
|
try {
|
|
console.log('Initialisiere Mindmap...');
|
|
|
|
// Prüfe, ob MindMapVisualization geladen ist
|
|
if (typeof MindMapVisualization === 'undefined') {
|
|
console.error('MindMapVisualization-Klasse ist nicht definiert!');
|
|
return;
|
|
}
|
|
|
|
// Initialisiere die Mindmap
|
|
const mindmap = new MindMapVisualization('#mindmap-container', {
|
|
height: mindmapContainer.clientHeight || 600,
|
|
nodeRadius: 18,
|
|
selectedNodeRadius: 24,
|
|
linkDistance: 150,
|
|
onNodeClick: this.handleNodeClick.bind(this)
|
|
});
|
|
|
|
// Globale Referenz für andere Module
|
|
window.mindmapInstance = mindmap;
|
|
|
|
// Event-Listener für Zoom-Buttons
|
|
const zoomInBtn = document.getElementById('zoom-in-btn');
|
|
if (zoomInBtn) {
|
|
zoomInBtn.addEventListener('click', () => {
|
|
const svg = d3.select('#mindmap-container svg');
|
|
const currentZoom = d3.zoomTransform(svg.node());
|
|
const newScale = currentZoom.k * 1.3;
|
|
svg.transition().duration(300).call(
|
|
d3.zoom().transform,
|
|
d3.zoomIdentity.translate(currentZoom.x, currentZoom.y).scale(newScale)
|
|
);
|
|
});
|
|
}
|
|
|
|
const zoomOutBtn = document.getElementById('zoom-out-btn');
|
|
if (zoomOutBtn) {
|
|
zoomOutBtn.addEventListener('click', () => {
|
|
const svg = d3.select('#mindmap-container svg');
|
|
const currentZoom = d3.zoomTransform(svg.node());
|
|
const newScale = currentZoom.k / 1.3;
|
|
svg.transition().duration(300).call(
|
|
d3.zoom().transform,
|
|
d3.zoomIdentity.translate(currentZoom.x, currentZoom.y).scale(newScale)
|
|
);
|
|
});
|
|
}
|
|
|
|
const centerBtn = document.getElementById('center-btn');
|
|
if (centerBtn) {
|
|
centerBtn.addEventListener('click', () => {
|
|
const svg = d3.select('#mindmap-container svg');
|
|
svg.transition().duration(500).call(
|
|
d3.zoom().transform,
|
|
d3.zoomIdentity.scale(1)
|
|
);
|
|
});
|
|
}
|
|
|
|
// Event-Listener für Add-Thought-Button
|
|
const addThoughtBtn = document.getElementById('add-thought-btn');
|
|
if (addThoughtBtn) {
|
|
addThoughtBtn.addEventListener('click', () => {
|
|
this.showAddThoughtDialog();
|
|
});
|
|
}
|
|
|
|
// Event-Listener für Connect-Button
|
|
const connectBtn = document.getElementById('connect-btn');
|
|
if (connectBtn) {
|
|
connectBtn.addEventListener('click', () => {
|
|
this.showConnectDialog();
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Fehler bei der Initialisierung der Mindmap:', error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Handler für Klick auf einen Knoten in der Mindmap
|
|
* @param {Object} node - Der angeklickte Knoten
|
|
*/
|
|
handleNodeClick(node) {
|
|
console.log('Knoten wurde angeklickt:', node);
|
|
|
|
// Hier könnte man Logik hinzufügen, um Detailinformationen anzuzeigen
|
|
// oder den ausgewählten Knoten hervorzuheben
|
|
const detailsContainer = document.getElementById('node-details');
|
|
if (detailsContainer) {
|
|
detailsContainer.innerHTML = `
|
|
<div class="p-4">
|
|
<h3 class="text-xl font-bold mb-2">${node.name}</h3>
|
|
<p class="text-gray-300 mb-4">${node.description || 'Keine Beschreibung verfügbar.'}</p>
|
|
|
|
<div class="flex items-center justify-between">
|
|
<span class="text-sm">
|
|
<i class="fas fa-brain mr-1"></i> ${node.thought_count || 0} Gedanken
|
|
</span>
|
|
<button class="px-3 py-1 bg-purple-600 bg-opacity-30 rounded-lg text-sm">
|
|
<i class="fas fa-plus mr-1"></i> Gedanke hinzufügen
|
|
</button>
|
|
</div>
|
|
</div>
|
|
`;
|
|
|
|
// Button zum Hinzufügen eines Gedankens
|
|
const addThoughtBtn = detailsContainer.querySelector('button');
|
|
addThoughtBtn.addEventListener('click', () => {
|
|
this.showAddThoughtDialog(node);
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Dialog zum Hinzufügen eines neuen Knotens
|
|
*/
|
|
showAddNodeDialog() {
|
|
// Diese Funktionalität würde in einer vollständigen Implementierung eingebunden werden
|
|
alert('Diese Funktion steht bald zur Verfügung!');
|
|
},
|
|
|
|
/**
|
|
* Dialog zum Hinzufügen eines neuen Gedankens zu einem Knoten
|
|
*/
|
|
showAddThoughtDialog(node) {
|
|
// Diese Funktionalität würde in einer vollständigen Implementierung eingebunden werden
|
|
alert('Diese Funktion steht bald zur Verfügung!');
|
|
},
|
|
|
|
/**
|
|
* Dialog zum Verbinden von Knoten
|
|
*/
|
|
showConnectDialog() {
|
|
// Diese Funktionalität würde in einer vollständigen Implementierung eingebunden werden
|
|
alert('Diese Funktion steht bald zur Verfügung!');
|
|
},
|
|
|
|
/**
|
|
* Richtet Event-Listener für die Benutzeroberfläche ein
|
|
*/
|
|
setupEventListeners() {
|
|
// Event-Listener für Dark Mode-Wechsel
|
|
document.addEventListener('darkModeToggled', (event) => {
|
|
this.darkMode = event.detail.isDark;
|
|
});
|
|
|
|
// Responsive Anpassungen bei Fenstergröße
|
|
window.addEventListener('resize', () => {
|
|
if (window.mindmapInstance) {
|
|
const container = document.getElementById('mindmap-container');
|
|
if (container) {
|
|
window.mindmapInstance.width = container.clientWidth;
|
|
window.mindmapInstance.height = container.clientHeight;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|
|
window.MindMap = MindMap;
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Initialisiere die Anwendung
|
|
MindMap.init();
|
|
|
|
// Wende Dunkel-/Hellmodus an
|
|
const isDarkMode = localStorage.getItem('darkMode') === 'dark';
|
|
document.documentElement.classList.toggle('dark', isDarkMode);
|
|
});
|