ckeditor5-image-upload-base64
Version:
The development environment of CKEditor 5 – the best browser-based rich text editor.
150 lines (115 loc) • 4.51 kB
JavaScript
/**
* @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
/* global window */
/**
* @module ckfinder/ckfindercommand
*/
import Command from '@ckeditor/ckeditor5-core/src/command';
import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
/**
* The CKFinder command. It is used by the {@link module:ckfinder/ckfinderediting~CKFinderEditing CKFinder editing feature}
* to open the CKFinder file manager to insert an image or a link to a file into the editor content.
*
* editor.execute( 'ckfinder' );
*
* **Note:** This command uses other features to perform tasks:
* - To insert images the {@link module:image/image/imageinsertcommand~ImageInsertCommand 'imageInsert'} command
* from the {@link module:image/image~Image Image feature}.
* - To insert links to files the {@link module:link/linkcommand~LinkCommand 'link'} command
* from the {@link module:link/link~Link Link feature}.
*
* @extends module:core/command~Command
*/
export default class CKFinderCommand extends Command {
/**
* @inheritDoc
*/
constructor( editor ) {
super( editor );
// Remove default document listener to lower its priority.
this.stopListening( this.editor.model.document, 'change' );
// Lower this command listener priority to be sure that refresh() will be called after link & image refresh.
this.listenTo( this.editor.model.document, 'change', () => this.refresh(), { priority: 'low' } );
}
/**
* @inheritDoc
*/
refresh() {
const imageCommand = this.editor.commands.get( 'imageInsert' );
const linkCommand = this.editor.commands.get( 'link' );
// The CKFinder command is enabled when one of image or link command is enabled.
this.isEnabled = imageCommand.isEnabled || linkCommand.isEnabled;
}
/**
* @inheritDoc
*/
execute() {
const editor = this.editor;
const openerMethod = this.editor.config.get( 'ckfinder.openerMethod' ) || 'modal';
if ( openerMethod != 'popup' && openerMethod != 'modal' ) {
throw new CKEditorError( 'ckfinder-unknown-openerMethod: The openerMethod config option must by "popup" or "modal".', editor );
}
const options = this.editor.config.get( 'ckfinder.options' ) || {};
options.chooseFiles = true;
// Cache the user-defined onInit method
const originalOnInit = options.onInit;
// Pass the lang code to the CKFinder if not defined by user.
if ( !options.language ) {
options.language = editor.locale.uiLanguage;
}
// The onInit method allows to extend CKFinder's behavior. It is used to attach event listeners to file choosing related events.
options.onInit = finder => {
// Call original options.onInit if it was defined by user.
if ( originalOnInit ) {
originalOnInit( finder );
}
finder.on( 'files:choose', evt => {
const files = evt.data.files.toArray();
// Insert links
const links = files.filter( file => !file.isImage() );
const images = files.filter( file => file.isImage() );
for ( const linkFile of links ) {
editor.execute( 'link', linkFile.getUrl() );
}
const imagesUrls = [];
for ( const image of images ) {
const url = image.getUrl();
imagesUrls.push( url ? url : finder.request( 'file:getProxyUrl', { file: image } ) );
}
if ( imagesUrls.length ) {
insertImages( editor, imagesUrls );
}
} );
finder.on( 'file:choose:resizedImage', evt => {
const resizedUrl = evt.data.resizedUrl;
if ( !resizedUrl ) {
const notification = editor.plugins.get( 'Notification' );
const t = editor.locale.t;
notification.showWarning( t( 'Could not obtain resized image URL.' ), {
title: t( 'Selecting resized image failed' ),
namespace: 'ckfinder'
} );
return;
}
insertImages( editor, [ resizedUrl ] );
} );
};
window.CKFinder[ openerMethod ]( options );
}
}
function insertImages( editor, urls ) {
const imageCommand = editor.commands.get( 'imageInsert' );
// Check if inserting an image is actually possible - it might be possible to only insert a link.
if ( !imageCommand.isEnabled ) {
const notification = editor.plugins.get( 'Notification' );
const t = editor.locale.t;
notification.showWarning( t( 'Could not insert image at the current position.' ), {
title: t( 'Inserting image failed' ),
namespace: 'ckfinder'
} );
return;
}
editor.execute( 'imageInsert', { source: urls } );
}