// src/js/auditTrailRenderer.js import { auditService } from '../../src/utils/auditService.js'; export class AuditTrailRenderer { constructor(containerId, options = {}) { this.containerId = containerId; this.options = { title: options.title || 'KI-Entscheidungspfad', collapsible: options.collapsible !== false, defaultExpanded: options.defaultExpanded || false, ...options }; this.componentId = `audit-trail-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`; } /** * Render audit trail from raw audit data * FIXED: Proper Promise handling */ render(rawAuditTrail) { const container = document.getElementById(this.containerId); if (!container) { console.error(`[AUDIT RENDERER] Container ${this.containerId} not found`); return; } if (!rawAuditTrail || !Array.isArray(rawAuditTrail) || rawAuditTrail.length === 0) { this.renderEmpty(); return; } try { console.log('[AUDIT RENDERER] Processing audit trail...', rawAuditTrail.length, 'entries'); // Process audit trail using the centralized service (synchronous) const processedAudit = auditService.processAuditTrail(rawAuditTrail); console.log('[AUDIT RENDERER] Processed audit:', processedAudit); if (processedAudit && processedAudit.phases && processedAudit.phases.length > 0) { this.renderProcessed(processedAudit); // Attach event handlers after DOM is updated setTimeout(() => this.attachEventHandlers(), 0); } else { console.warn('[AUDIT RENDERER] No processed audit data'); this.renderEmpty(); } } catch (error) { console.error('[AUDIT RENDERER] Failed to render audit trail:', error); this.renderError(error); } } /** * Render processed audit trail */ renderProcessed(processedAudit) { const container = document.getElementById(this.containerId); if (!container) return; const detailsId = `${this.componentId}-details`; console.log('[AUDIT RENDERER] Rendering processed audit with', processedAudit.phases.length, 'phases'); container.innerHTML = `
Keine Phasen verfügbar
Fehler beim Laden der Audit-Informationen: ${this.escapeHtml(error.message)}