Skip to content
Snippets Groups Projects
Commit f49a87df authored by Marius Dumitru Florea's avatar Marius Dumitru Florea
Browse files

XWIKI-22220: Quick Actions doesn't insert macros inline even if they support inline mode

* Move the caret at the start of the first nested editable when the selection is before a macro widget wrapper (after the content is refreshed).

(cherry picked from commit c23af57c)
parent b2218f5e
No related branches found
No related tags found
No related merge requests found
...@@ -158,21 +158,29 @@ ...@@ -158,21 +158,29 @@
} }
function maybeMoveToFirstNestedEditable(editor, range, shouldMove) { function maybeMoveToFirstNestedEditable(editor, range, shouldMove) {
// Check if a single element is selected by the given range. const selectedWidget = shouldMove && getSelectedWidget(editor, range);
if (shouldMove && !range.collapsed && range.startContainer === range.endContainer && const firstNestedEditable = Object.values(selectedWidget?.editables)[0];
range.startContainer.nodeType === Node.ELEMENT_NODE && range.endOffset - range.startOffset === 1) { if (firstNestedEditable) {
const selectedNode = range.startContainer.childNodes[range.startOffset]; // Move the selection to the first nested editable of the selected widget.
if (selectedNode.nodeType === Node.ELEMENT_NODE) { const ckRange = new CKEDITOR.dom.range(editor.editable());
// Check if the selected element is a widget wrapper. ckRange.moveToElementEditablePosition(firstNestedEditable);
const widget = editor.widgets.getByElement(new CKEDITOR.dom.element(selectedNode), true); range.setStart(ckRange.startContainer.$, ckRange.startOffset);
const firstNestedEditable = Object.values(widget?.editables)[0]; range.collapse(true);
if (firstNestedEditable) { }
// Move the selection to the first nested editable of the selected widget. }
const ckRange = new CKEDITOR.dom.range(editor.editable());
ckRange.moveToElementEditablePosition(firstNestedEditable); function getSelectedWidget(editor, range) {
range.setStart(ckRange.startContainer.$, ckRange.startOffset); // Check if the range start is followed by a widget wrapper.
range.collapse(true); const nodeAfterRangeStart = range.startContainer.childNodes?.[range.startOffset];
} if (nodeAfterRangeStart?.nodeType === Node.ELEMENT_NODE) {
const widget = editor.widgets.getByElement(new CKEDITOR.dom.element(nodeAfterRangeStart), true);
// Either the range is collapsed before the widget,
if (widget && (range.collapsed ||
// or the range ends after the widget (we already know it starts before the widget)
(range.startContainer === range.endContainer && range.endOffset - range.startOffset === 1) ||
// or inside the widget.
nodeAfterRangeStart.contains(range.endContainer))) {
return widget;
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment