import { Command, FileRepository, Model, type ModelNodeAttributes, type ModelWriter } from "ckeditor5"; interface FileUploadOpts { file: File[]; } export default class FileUploadCommand extends Command { override refresh() { this.isEnabled = true; } /** * Executes the command. * * @fires execute * @param {Object} options Options for the executed command. * @param {File|Array.} options.file The file or an array of files to upload. */ override execute( options: FileUploadOpts ) { const editor = this.editor; const model = editor.model; const fileRepository = editor.plugins.get( FileRepository ); model.change( writer => { const filesToUpload = options.file; for ( const file of filesToUpload ) { uploadFile( writer, model, fileRepository, file ); } } ); } } /** * Handles uploading single file. */ function uploadFile( writer: ModelWriter, model: Model, fileRepository: FileRepository, file: File ) { const loader = fileRepository.createLoader( file ); // Do not throw when upload adapter is not set. FileRepository will log an error anyway. if ( !loader ) { return; } insertFileLink( writer, model, { href: '', uploadId: loader.id }, file ); } function insertFileLink( writer: ModelWriter, model: Model, attributes: ModelNodeAttributes = {}, file: File ) { const placeholder = writer.createElement( 'reference', attributes ); model.insertContent( placeholder, model.document.selection ); writer.insertText( ' ', placeholder, 'after' ); }