Files
markitect-main/testdrive-jsui/static/js/controls/debug-control.js
tegwick 8ef356af57 feat: implement plugin infrastructure for rendering engines
Added comprehensive plugin system for independent JavaScript UI development:

**Plugin Infrastructure:**
- Extended existing MarkiTect plugin system with RenderingEnginePlugin base class
- Added RENDERING plugin type to PluginType enum
- Created RenderingConfig for asset management and deployment
- Implemented RenderingEngineManager for plugin discovery and lifecycle

**TestDrive JSUI Plugin:**
- Extracted JavaScript UI components to independent testdrive-jsui plugin
- Created standalone development environment (no Python required)
- Implemented compass-positioned control panels (NW, NE, E, SE)
- Added clean JSON configuration interface for Python↔JavaScript data transfer

**Asset Management:**
- Development mode: serve assets directly from plugin source directory
- Production mode: deploy to _markitect/plugins/[plugin-name]/ structure
- Configurable asset URLs and deployment strategies
- Support for external dependencies (CDN resources)

**Standalone Development:**
- testdrive-jsui/test.html for browser-based development
- Package.json with npm scripts for development server
- Complete separation of JavaScript development from Python environment
- Hot reload and standard web development workflow

**Integration Demo:**
- demo_plugin_integration.py showcasing all plugin capabilities
- Standalone, plugin discovery, production deployment examples
- Asset URL generation for different deployment modes

This enables JavaScript-first development while maintaining clean integration
with the MarkiTect Python ecosystem. Developers can now work on UI components
independently using standard web development tools and workflows.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 06:49:41 +01:00

63 lines
2.8 KiB
JavaScript

/**
* Debug Control - Displays debug information and system messages
* Implements the Robustness Principle with Fail Fast mode support
*/
class DebugControl {
constructor() {
this.control = Object.create(Control);
this.control.config = {
icon: '🪲',
title: 'Debug',
className: 'debug-control',
defaultContent: 'Click to view debug information',
ariaLabel: 'Debug Control',
position: 'w'
};
// Bind methods to control
this.control.buildContent = () => {
const content = this.control.element.querySelector('.control-content');
const messages = window.MarkitectDebugSystem ?
window.MarkitectDebugSystem.getMessages() : [];
content.innerHTML = `
<div style="padding: 1rem; font-size: 0.8rem;">
<h4 style="margin-top: 0;">Debug Messages</h4>
<div style="max-height: 200px; overflow-y: auto;">
${messages.length > 0 ?
messages.slice(-10).map(msg =>
`<div style="margin-bottom: 0.5rem; padding: 0.3rem; background: #f8f9fa; border-radius: 3px;">
<strong>[${msg.category}]</strong> ${msg.component}: ${msg.message}
<div style="font-size: 0.7rem; color: #666;">${msg.displayTime}</div>
</div>`
).join('') :
'<p>No debug messages yet</p>'
}
</div>
<button onclick="if(window.MarkitectDebugSystem) window.MarkitectDebugSystem.clearMessages(); this.closest('.control-panel').querySelector('.control-content').innerHTML = '<div style=&quot;padding: 1rem; font-size: 0.8rem;&quot;><h4 style=&quot;margin-top: 0;&quot;>Debug Messages</h4><p>Messages cleared</p></div>'"
style="margin-top: 0.5rem; padding: 0.3rem 0.6rem; font-size: 0.7rem; background: #dc3545; color: white; border: none; border-radius: 3px; cursor: pointer;">
Clear Messages
</button>
</div>
`;
this.control.isExpanded = true;
};
this.control.toggle = () => {
if (this.control.isExpanded) {
this.control.element.querySelector('.control-content').style.display = 'none';
this.control.isExpanded = false;
} else {
this.control.buildContent();
this.control.element.querySelector('.control-content').style.display = 'block';
}
};
}
createControl() {
return this.control.createControl();
}
}
window.DebugControl = DebugControl;