Skip to content

Commit 0e3084a

Browse files
committed
Merge branch 't/10936' into major
2 parents b2f28d1 + dde8a70 commit 0e3084a

File tree

1 file changed

+53
-21
lines changed

1 file changed

+53
-21
lines changed

plugins/widget/plugin.js

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,54 @@
335335
}
336336
},
337337

338+
/**
339+
* Finalizes a process of widget creation. This includes:
340+
*
341+
* * inserting widget element into editor,
342+
* * marking widget instance as ready (see {@link CKEDITOR.plugins.widget#event-ready}),
343+
* * focusing widget instance.
344+
*
345+
* This method is used by the default widget's command and is called
346+
* after widget's dialog (if set) is closed. It may also be used in a
347+
* customized process of widget creation and insertion.
348+
*
349+
* widget.once( 'edit', function() {
350+
* // Finalize creation only of not ready widgets.
351+
* if ( widget.isReady() )
352+
* return;
353+
*
354+
* // Cancel edit event to prevent automatic widget insertion.
355+
* evt.cancel();
356+
*
357+
* CustomDialog.open( widget.data, function saveCallback( savedData ) {
358+
* // Cache the container, because widget may be destroyed while saving data,
359+
* // if this process will require some deep transformations.
360+
* var container = widget.wrapper.getParent();
361+
*
362+
* widget.setData( savedData );
363+
*
364+
* // Widget will be retrieved from container and inserted into editor.
365+
* editor.widgets.finalizeCreation( container );
366+
* } );
367+
* } );
368+
*
369+
* @param {CKEDITOR.dom.element/CKEDITOR.dom.documentFragment} container The element
370+
* or document fragment which contains widget wrapper. The container is used, so before
371+
* finalizing creation the widget can be freely transformed (even destroyed and reinitialized).
372+
*/
373+
finalizeCreation: function( container ) {
374+
var wrapper = container.getFirst();
375+
if ( wrapper && isWidgetWrapper2( wrapper ) ) {
376+
this.editor.insertElement( wrapper );
377+
378+
var widget = this.getByElement( wrapper );
379+
// Fire postponed #ready event.
380+
widget.ready = true;
381+
widget.fire( 'ready' );
382+
widget.focus();
383+
}
384+
},
385+
338386
/**
339387
* Finds a widget instance which contains a given element. The element will be the {@link CKEDITOR.plugins.widget#wrapper wrapper}
340388
* of the returned widget or a descendant of this {@link CKEDITOR.plugins.widget#wrapper wrapper}.
@@ -1103,8 +1151,9 @@
11031151
*/
11041152

11051153
/**
1106-
* An event fired by the {@link #method-edit} method. It can be cancelled
1107-
* in order to stop the default action (opening a dialog window).
1154+
* An event fired by the {@link #method-edit} method. It can be canceled
1155+
* in order to stop the default action (opening a dialog window and/or
1156+
* {@link CKEDITOR.plugins.widget.repository#finalizeCreation finalizing widget creation}).
11081157
*
11091158
* @event edit
11101159
* @param data
@@ -1291,8 +1340,7 @@
12911340
element = CKEDITOR.dom.element.createFromHtml( widgetDef.template.output( defaults ) ),
12921341
instance,
12931342
wrapper = editor.widgets.wrapElement( element, widgetDef.name ),
1294-
temp = new CKEDITOR.dom.documentFragment( wrapper.getDocument() ),
1295-
editWasCanceled = true;
1343+
temp = new CKEDITOR.dom.documentFragment( wrapper.getDocument() );
12961344

12971345
// Append wrapper to a temporary document. This will unify the environment
12981346
// in which #data listeners work when creating and editing widget.
@@ -1313,8 +1361,6 @@
13131361
// temporary instance.
13141362
// * If dialog wasn't set and edit wasn't canceled, insert widget.
13151363
var editListener = instance.once( 'edit', function( evt ) {
1316-
editWasCanceled = false;
1317-
13181364
if ( evt.data.dialog ) {
13191365
instance.once( 'dialog', function( evt ) {
13201366
var dialog = evt.data,
@@ -1344,24 +1390,10 @@
13441390
// Remove listener in case someone canceled it before this
13451391
// listener was executed.
13461392
editListener.removeListener();
1347-
1348-
// In case edit was canceled - finalize creation here which should happen anyway (just without
1349-
// initial edit).
1350-
if ( editWasCanceled )
1351-
finalizeCreation();
13521393
}
13531394

13541395
function finalizeCreation() {
1355-
var wrapper = temp.getFirst();
1356-
if ( wrapper && isWidgetWrapper2( wrapper ) ) {
1357-
editor.insertElement( wrapper );
1358-
1359-
var widget = editor.widgets.getByElement( wrapper );
1360-
// Fire postponed #ready event.
1361-
widget.ready = true;
1362-
widget.fire( 'ready' );
1363-
widget.focus();
1364-
}
1396+
editor.widgets.finalizeCreation( temp );
13651397
}
13661398
},
13671399

0 commit comments

Comments
 (0)