|
|
@@ -9,6 +9,7 @@
|
|
|
|
|
|
import mix from '@ckeditor/ckeditor5-utils/src/mix';
|
|
|
import ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';
|
|
|
+import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
|
|
|
|
|
|
import Mapper from '../conversion/mapper';
|
|
|
|
|
|
@@ -100,6 +101,8 @@ export default class DataController {
|
|
|
this.upcastDispatcher.on( 'text', convertText(), { priority: 'lowest' } );
|
|
|
this.upcastDispatcher.on( 'element', convertToModelFragment(), { priority: 'lowest' } );
|
|
|
this.upcastDispatcher.on( 'documentFragment', convertToModelFragment(), { priority: 'lowest' } );
|
|
|
+
|
|
|
+ this.decorate( 'init' );
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -171,8 +174,41 @@ export default class DataController {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Sets initial input data parsed by the {@link #processor data processor} and
|
|
|
+ * converted by the {@link #upcastDispatcher view-to-model converters}.
|
|
|
+ * Initial data can be set only to document that {@link module:engine/model/document~Document#version} is equal 0.
|
|
|
+ *
|
|
|
+ * **Note** This method is {@link module:utils/observablemixin~ObservableMixin#decorate decorated} which is
|
|
|
+ * used by e.g. collaborative editing plugin that syncs remote data on init.
|
|
|
+ *
|
|
|
+ * @fires init
|
|
|
+ * @param {String} data Input data.
|
|
|
+ * @param {String} [rootName='main'] Root name.
|
|
|
+ */
|
|
|
+ init( data, rootName = 'main' ) {
|
|
|
+ if ( this.model.document.version ) {
|
|
|
+ /**
|
|
|
+ * Cannot set initial data to not empty {@link module:engine/model/document~Document}.
|
|
|
+ * Initial data should be set once, during {@link module:core/editor/editor~Editor} initialization,
|
|
|
+ * when the {@link module:engine/model/document~Document#version} is equal 0.
|
|
|
+ *
|
|
|
+ * @error datacontroller-init-document-not-empty
|
|
|
+ */
|
|
|
+ throw new CKEditorError( 'datacontroller-init-document-not-empty: Trying to set initial data to not empty document.' );
|
|
|
+ }
|
|
|
+
|
|
|
+ const modelRoot = this.model.document.getRoot( rootName );
|
|
|
+
|
|
|
+ this.model.enqueueChange( 'transparent', writer => {
|
|
|
+ writer.insert( this.parse( data, modelRoot ), modelRoot );
|
|
|
+ } );
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* Sets input data parsed by the {@link #processor data processor} and
|
|
|
* converted by the {@link #upcastDispatcher view-to-model converters}.
|
|
|
+ * This method can be used any time to replace existing editor data by the new one without clearing the
|
|
|
+ * {@link module:engine/model/document~Document#history document history}.
|
|
|
*
|
|
|
* This method also creates a batch with all the changes applied. If all you need is to parse data, use
|
|
|
* the {@link #parse} method.
|
|
|
@@ -185,8 +221,6 @@ export default class DataController {
|
|
|
const modelRoot = this.model.document.getRoot( rootName );
|
|
|
|
|
|
this.model.enqueueChange( 'transparent', writer => {
|
|
|
- // Clearing selection is a workaround for ticket #569 (LiveRange loses position after removing data from document).
|
|
|
- // After fixing it this code should be removed.
|
|
|
writer.setSelection( null );
|
|
|
writer.removeSelectionAttribute( this.model.document.selection.getAttributeKeys() );
|
|
|
|
|
|
@@ -237,6 +271,13 @@ export default class DataController {
|
|
|
* Removes all event listeners set by the DataController.
|
|
|
*/
|
|
|
destroy() {}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Event fired by decorated {@link #init} method.
|
|
|
+ * See {@link module:utils/observablemixin~ObservableMixin.decorate} for more information and samples.
|
|
|
+ *
|
|
|
+ * @event init
|
|
|
+ */
|
|
|
}
|
|
|
|
|
|
mix( DataController, ObservableMixin );
|