aboutsummaryrefslogtreecommitdiff
path: root/modules/ext/editor.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-05-25 18:02:02 +0200
committerAgando <roduccomm@gmail.com>2026-05-25 18:02:02 +0200
commit4baa484b84c5184286cac2743575251454a5ee2b (patch)
treecb9002f93644f363d0f35831dc97e6492bbb0ed6 /modules/ext/editor.js
auto: 2026-05-25_18:02 changes
Diffstat (limited to 'modules/ext/editor.js')
-rw-r--r--modules/ext/editor.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/modules/ext/editor.js b/modules/ext/editor.js
new file mode 100644
index 0000000..571a535
--- /dev/null
+++ b/modules/ext/editor.js
@@ -0,0 +1,70 @@
+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 <path>)',
+ };
+ }
+
+ registerCommands() {
+ this.commands['edit'] = (args) => this.edit(args);
+ }
+ edit(args) {
+ if (!args[0]) return this.terminal.print('Usage: edit <path>', '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');
+ } 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/chatstudio/newos4/modules/editor.js');
+}