/** * Mindmap Initialisierung und Event-Handling */ // Warte auf die Cytoscape-Instanz document.addEventListener('mindmap-loaded', function() { const cy = window.cy; if (!cy) return; // Event-Listener für Knoten-Klicks cy.on('tap', 'node', function(evt) { const node = evt.target; // Alle vorherigen Hervorhebungen zurücksetzen cy.nodes().forEach(n => { n.removeStyle(); n.connectedEdges().removeStyle(); }); // Speichere ausgewählten Knoten window.mindmapInstance.selectedNode = node; // Aktiviere leuchtenden Effekt statt Umkreisung node.style({ 'background-opacity': 1, 'background-color': node.data('color'), 'shadow-color': node.data('color'), 'shadow-opacity': 1, 'shadow-blur': 15, 'shadow-offset-x': 0, 'shadow-offset-y': 0 }); // Verbundene Kanten und Knoten hervorheben const connectedEdges = node.connectedEdges(); const connectedNodes = node.neighborhood('node'); connectedEdges.style({ 'line-color': '#a78bfa', 'target-arrow-color': '#a78bfa', 'source-arrow-color': '#a78bfa', 'line-opacity': 0.8, 'width': 2 }); connectedNodes.style({ 'shadow-opacity': 0.7, 'shadow-blur': 10, 'shadow-color': '#a78bfa' }); // Info-Panel aktualisieren updateInfoPanel(node); // Seitenleiste aktualisieren updateSidebar(node); }); // Klick auf Hintergrund - Auswahl zurücksetzen cy.on('tap', function(evt) { if (evt.target === cy) { resetSelection(cy); } }); // Zoom-Controls document.getElementById('zoomIn')?.addEventListener('click', () => { cy.zoom({ level: cy.zoom() * 1.2, renderedPosition: { x: cy.width() / 2, y: cy.height() / 2 } }); }); document.getElementById('zoomOut')?.addEventListener('click', () => { cy.zoom({ level: cy.zoom() / 1.2, renderedPosition: { x: cy.width() / 2, y: cy.height() / 2 } }); }); document.getElementById('resetView')?.addEventListener('click', () => { cy.fit(); resetSelection(cy); }); // Legend-Toggle document.getElementById('toggleLegend')?.addEventListener('click', () => { const legend = document.getElementById('categoryLegend'); if (legend) { isLegendVisible = !isLegendVisible; legend.style.display = isLegendVisible ? 'block' : 'none'; } }); // Keyboard-Controls document.addEventListener('keydown', (e) => { if (e.key === '+' || e.key === '=') { cy.zoom({ level: cy.zoom() * 1.2, renderedPosition: { x: cy.width() / 2, y: cy.height() / 2 } }); } else if (e.key === '-' || e.key === '_') { cy.zoom({ level: cy.zoom() / 1.2, renderedPosition: { x: cy.width() / 2, y: cy.height() / 2 } }); } else if (e.key === 'Escape') { resetSelection(cy); } }); }); /** * Aktualisiert das Info-Panel mit Knoteninformationen * @param {Object} node - Der ausgewählte Knoten */ function updateInfoPanel(node) { const infoPanel = document.getElementById('infoPanel'); if (!infoPanel) return; const data = node.data(); const connectedNodes = node.neighborhood('node'); let html = `

${data.label || data.name}

${data.category || 'Keine Kategorie'}

${data.description ? `

${data.description}

` : ''}

Verbindungen (${connectedNodes.length})

`; infoPanel.innerHTML = html; infoPanel.style.display = 'block'; } /** * Aktualisiert die Seitenleiste mit Knoteninformationen * @param {Object} node - Der ausgewählte Knoten */ function updateSidebar(node) { const sidebar = document.getElementById('sidebar'); if (!sidebar) return; const data = node.data(); const connectedNodes = node.neighborhood('node'); let html = `

${data.label || data.name}

${data.category || 'Keine Kategorie'}

${data.description ? `

${data.description}

` : ''}

Verbindungen (${connectedNodes.length})

`; sidebar.innerHTML = html; } /** * Setzt die Auswahl zurück * @param {Object} cy - Cytoscape-Instanz */ function resetSelection(cy) { window.mindmapInstance.selectedNode = null; // Alle Hervorhebungen zurücksetzen cy.nodes().forEach(node => { node.removeStyle(); node.connectedEdges().removeStyle(); }); // Info-Panel ausblenden const infoPanel = document.getElementById('infoPanel'); if (infoPanel) { infoPanel.style.display = 'none'; } // Seitenleiste leeren const sidebar = document.getElementById('sidebar'); if (sidebar) { sidebar.innerHTML = ''; } }