Skip to content
Snippets Groups Projects
Commit 49fdcb83 authored by catch's avatar catch
Browse files

Issue #3292780 by nod_, Spokje: Move Quick Edit related Javascript from...

Issue #3292780 by nod_, Spokje: Move Quick Edit related Javascript from core/modules/ckeditor5/js/ckeditor5.es6.js::detach() to the Quick Edit module
parent 1af31612
No related branches found
No related tags found
30 merge requests!8394[warning] array_flip(): Can only flip STRING and INTEGER values, when saving a non-revisionable custom content entity,!7780issue 3443822: fix for 'No route found for the specified format html. Supported formats: json, xml.',!7416Simplify the HTML of field.html.twig,!5013Issue #3071143: Table Render Array Example Is Incorrect,!4848Issue #1566662: Update module should send notifications on Thursdays,!4792Issue #2230689: Remove redundant "Italic" style,!4782Issue #2662898: "Links" field not displaying on custom view modes,!4220Issue #3368223: Link field > Access to internal links is not checked on display.,!3884Issue #3356842,!3870Issue #3087868,!3812Draft: Issue #3339373 by alexpott, andypost, mondrake:...,!3686Issue #3219967 against 9.5.x,!3683Issue #2939397: Clearing AliasManager cache with root path raises warning,!3543Issue #3344259: Allow ajax dialog to have focus configurable,!3356Issue #3209129: Scrolling problems when adding a block via layout builder,!2982Issue #3301562: Translate the default settings for this plugin (TimestampAgoFormatter),!2921Issue #1383696: Allow a custom HTML element to be selected for a grouping field,!2920Issue #3260175: Saving media entity without an owner crashes,!2857Issue #3314541: Remove unnecessary fill from SVG icon for the "Media Library" CKEditor 5 button — enabling dark mode support in contrib,!2841Resolve #3296811 "Resourceresponsetrait needs a",!2803Issue #3041402: Add option absolute url in formatter URL to image,!2280Issue #3280415: Metapackage Generator Breaks Under Composer --no-dev,!2205Quote all names in the regions section.,!2050Issue #3272969: Remove UnqiueField constraint.,!1956Issue #3268872: hook_views_invalidate_cache not called when a view is deleted,!1893Issue #3217260: Add a way to make media captions not editable in CKEditor,!1459Issue #3087632: menu_name max length is too long,!878Issue #3221534: throw an exception when IDs passed to loadMultiple() are badly formed,!866Issue #2845319: The highlighting of the 'Home' menu-link does not respect query strings and fragment identifiers,!204Issue #3040556: It is not possible to react to an entity being duplicated
...@@ -497,38 +497,11 @@ ...@@ -497,38 +497,11 @@
editor.updateSourceElement(); editor.updateSourceElement();
} else { } else {
element.removeAttribute('contentEditable'); element.removeAttribute('contentEditable');
// Return the promise to allow external code to queue code to
// Prepare variables that will be used when discarding Quickedit changes. // execute after the destroy is complete.
let textElement = null; return editor
let originalValue = null;
const usingQuickEdit = (((Drupal || {}).quickedit || {}).editors || {})
.editor;
if (usingQuickEdit) {
// The revert() function in QuickEdit's text editor does not work with
// CKEditor 5, as it is triggered before CKEditor 5 is fully
// destroyed. This function is overridden so the functionality it
// provides can happen after the CKEditor destroy() promise is
// fulfilled.
// This pulls the necessary values from the QuickEdit Backbone Model
// before it is destroyed, so they can be used by
// `editor.destroy().then()` to perform the expected revert.
Drupal.quickedit.editors.editor.prototype.revert =
function revertQuickeditChanges() {
textElement = this.$textElement[0];
originalValue = this.model.get('originalValue');
};
}
editor
.destroy() .destroy()
.then(() => { .then(() => {
// If textElement and originalValue are not null, a QuickEdit
// revert has been requested. Perform the revert here as it
// can't happen until the CKEditor instance is destroyed.
if (textElement && originalValue) {
textElement.innerHTML = originalValue;
}
// Clean up stored references. // Clean up stored references.
Drupal.CKEditor5Instances.delete(id); Drupal.CKEditor5Instances.delete(id);
callbacks.delete(id); callbacks.delete(id);
......
...@@ -265,22 +265,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len ...@@ -265,22 +265,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
editor.updateSourceElement(); editor.updateSourceElement();
} else { } else {
element.removeAttribute('contentEditable'); element.removeAttribute('contentEditable');
var textElement = null; return editor.destroy().then(function () {
var originalValue = null;
var usingQuickEdit = (((Drupal || {}).quickedit || {}).editors || {}).editor;
if (usingQuickEdit) {
Drupal.quickedit.editors.editor.prototype.revert = function revertQuickeditChanges() {
textElement = this.$textElement[0];
originalValue = this.model.get('originalValue');
};
}
editor.destroy().then(function () {
if (textElement && originalValue) {
textElement.innerHTML = originalValue;
}
Drupal.CKEditor5Instances.delete(id); Drupal.CKEditor5Instances.delete(id);
callbacks.delete(id); callbacks.delete(id);
......
...@@ -70,6 +70,55 @@ ...@@ -70,6 +70,55 @@
this.$textElement = this.$el; this.$textElement = this.$el;
} }
this.model.set('originalValue', this.$textElement.html()); this.model.set('originalValue', this.$textElement.html());
if (
Drupal.editors &&
Drupal.editors.ckeditor5 &&
once('quickedit-ckeditor5-destroy', 'body').length
) {
/**
* CKEditor 5 destroy lifecycle is different because is uses Promises.
*/
const ckeditor5Detach = Drupal.editors.ckeditor5.detach;
Drupal.editors.ckeditor5.detach = function quickeditDetach(
element,
format,
trigger,
) {
const destroyPromise = ckeditor5Detach.call(
this,
element,
format,
trigger,
);
if (destroyPromise && destroyPromise.then) {
let textElement = null;
let originalValue = null;
// The revert() function in QuickEdit's text editor does not work with
// CKEditor 5, as it is triggered before CKEditor 5 is fully
// destroyed. This function is overridden so the functionality it
// provides can happen after the CKEditor destroy() promise is
// fulfilled.
// This pulls the necessary values from the QuickEdit Backbone Model
// before it is destroyed, so they can be used by
// `editor.destroy().then()` to perform the expected revert.
Drupal.quickedit.editors.editor.prototype.revert =
function revertQuickeditChanges() {
textElement = this.$textElement[0];
originalValue = this.model.get('originalValue');
};
destroyPromise.then(() => {
// If textElement and originalValue are not null, a QuickEdit
// revert has been requested. Perform the revert here as it
// can't happen until the CKEditor instance is destroyed.
if (textElement && originalValue) {
textElement.innerHTML = originalValue;
}
});
}
};
}
}, },
/** /**
......
...@@ -26,6 +26,30 @@ ...@@ -26,6 +26,30 @@
} }
this.model.set('originalValue', this.$textElement.html()); this.model.set('originalValue', this.$textElement.html());
if (Drupal.editors && Drupal.editors.ckeditor5 && once('quickedit-ckeditor5-destroy', 'body').length) {
var ckeditor5Detach = Drupal.editors.ckeditor5.detach;
Drupal.editors.ckeditor5.detach = function quickeditDetach(element, format, trigger) {
var destroyPromise = ckeditor5Detach.call(this, element, format, trigger);
if (destroyPromise && destroyPromise.then) {
var textElement = null;
var originalValue = null;
Drupal.quickedit.editors.editor.prototype.revert = function revertQuickeditChanges() {
textElement = this.$textElement[0];
originalValue = this.model.get('originalValue');
};
destroyPromise.then(function () {
if (textElement && originalValue) {
textElement.innerHTML = originalValue;
}
});
}
};
}
}, },
getEditedElement: function getEditedElement() { getEditedElement: function getEditedElement() {
return this.$textElement; return this.$textElement;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment