on-codemerge
Version:
A WYSIWYG editor for on-codemerge is a user-friendly interface that allows users to edit and view their code in real time, exactly as it will appear in the final product
6 lines (5 loc) • 3.02 kB
JavaScript
/*! on-codemerge v1.3.1 @author Pavel Kuzmin @license MIT @homepage https://s00d.github.io/on-codemerge/ @repository git+https://github.com/s00d/on-codemerge.git Copyright (c) 2026 Pavel Kuzmin - Built on 2026-07-02T13:39:17.947Z */
"use strict";var a=Object.defineProperty;var d=(n,t,e)=>t in n?a(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var o=(n,t,e)=>d(n,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */;/* empty css */const u=require("./services/FileUploader.cjs"),h=require("./components/FileUploadMenu.cjs"),c=require("../ToolbarPlugin/utils.cjs"),p=require("../../icons/file.svg.cjs"),f=require("../../icons/upload.svg.cjs"),g=require("../../utils/helpers.cjs");class k{constructor(t={}){o(this,"name","file-upload");o(this,"hotkeys",[{keys:"Ctrl+Alt+U",description:"Upload file",command:"file-upload",icon:"📎"}]);o(this,"editor",null);o(this,"uploader");o(this,"menu",null);o(this,"config",{});o(this,"toolbarButton",null);o(this,"handleFileLinkClick",async t=>{const e=t.target.closest(".file-link");if(e instanceof HTMLElement){const i=e.getAttribute("data-file-id");if(i)try{await this.uploader.downloadFile(i)}catch(l){console.error("Download failed:",l)}}});this.config=t,this.uploader=new u.FileUploader(t)}initialize(t){this.menu=new h.FileUploadMenu(t,this.uploader,this.config,e=>{this.insertFileLink(e)}),this.editor=t,this.addToolbarButton(),this.setupEventListeners(),this.editor.on("file-upload",()=>{var e;(e=this.editor)==null||e.ensureEditorFocus(),this.showUploadMenu()})}addToolbarButton(){var e,i;const t=(e=this.editor)==null?void 0:e.getToolbar();t&&(this.toolbarButton=c.createToolbarButton({icon:f.default,title:((i=this.editor)==null?void 0:i.t("Upload File"))??"",onClick:()=>this.showUploadMenu()}),t.appendChild(this.toolbarButton))}setupEventListeners(){if(!this.editor)return;this.editor.getContainer().addEventListener("click",this.handleFileLinkClick)}showUploadMenu(){var t;(t=this.menu)==null||t.show()}insertFileLink(t){var l,s;if(!this.editor)return;const e=g.createLink("");e.className="file-link",e.setAttribute("data-file-id",t.id),e.innerHTML=`
${p.default}
${t.name} (${this.uploader.formatFileSize(t.size)})
`,(l=this.editor)==null||l.ensureEditorFocus();const i=(s=this.editor.getTextFormatter())==null?void 0:s.getSelection();if(i&&i.rangeCount>0){const r=i.getRangeAt(0);r.deleteContents(),r.insertNode(e),r.collapse(!1)}else this.editor.getContainer().appendChild(e)}destroy(){var t,e;this.toolbarButton&&this.toolbarButton.parentElement&&this.toolbarButton.parentElement.removeChild(this.toolbarButton),this.editor&&this.editor.getContainer().removeEventListener("click",this.handleFileLinkClick),(t=this.editor)==null||t.off("file-upload",()=>{var i;(i=this.editor)==null||i.ensureEditorFocus(),this.showUploadMenu()}),(e=this.menu)==null||e.destroy(),this.editor=null,this.menu=null,this.toolbarButton=null}}exports.FileUploadPlugin=k;