class EditorModule { constructor() { this.commands = {}; this.terminal = null; this._vfsPath = null; } requirements() { return { met: true, missing: [] }; } getHelpInfo() { return { 'edit': 'Open the code editor for a VFS file (usage: edit )', }; } registerCommands() { this.commands['edit'] = (args) => this.edit(args); } edit(args) { if (!args[0]) return this.terminal.print('Usage: edit ', 'warning'); const path = args.join(' '); const modal = document.getElementById('code-editor'); const title = document.getElementById('code-editor-title'); const textarea = document.getElementById('code-editor-textarea'); if (!modal || !textarea) return this.terminal.print('Editor modal not found', 'error'); // Read existing file content or use empty for new files const content = this.terminal.fs.readFile(path); const fileContent = (content !== null && content !== false) ? content : ''; // Set up modal this._vfsPath = path; title.textContent = '📝 Editing: ' + path; textarea.value = fileContent; modal.style.display = 'flex'; textarea.focus(); // Override save button to write back to VFS const saveBtn = modal.querySelector('.modal-footer .btn:last-child'); const cancelBtn = modal.querySelector('.modal-footer .btn-danger'); if (saveBtn) { saveBtn._origOnclick = saveBtn.onclick; saveBtn.onclick = async () => { const code = textarea.value; const ok = this.terminal.fs.writeFile(this._vfsPath, code); if (ok) { this.terminal.print('✅ Saved to ' + this._vfsPath, 'success'); // Notify tutorial module for quest 4 (edit + save) if (this.terminal.tutorialModule) { this.terminal.tutorialModule.onFileSaved(this._vfsPath); } } else { this.terminal.print('❌ Failed to save ' + this._vfsPath, 'error'); } modal.style.display = 'none'; this._vfsPath = null; // Restore original onclick handler if (saveBtn._origOnclick) saveBtn.onclick = saveBtn._origOnclick; delete saveBtn._origOnclick; }; } if (cancelBtn) { cancelBtn._origOnclick = cancelBtn.onclick; cancelBtn.onclick = () => { modal.style.display = 'none'; this._vfsPath = null; if (cancelBtn._origOnclick) cancelBtn.onclick = cancelBtn._origOnclick; delete cancelBtn._origOnclick; }; } } } if (typeof window.webx11 !== 'undefined' && window.webx11) { webx11.moduleManager.registerModule(new EditorModule(), 'https://webx11.duckdns.org/spaces/newos4/modules/ext/editor.js'); }