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 @@
}
function maybeMoveToFirstNestedEditable(editor, range, shouldMove) {
// Check if a single element is selected by the given range.
if (shouldMove && !range.collapsed && range.startContainer === range.endContainer &&
range.startContainer.nodeType === Node.ELEMENT_NODE && range.endOffset - range.startOffset === 1) {
const selectedNode = range.startContainer.childNodes[range.startOffset];
if (selectedNode.nodeType === Node.ELEMENT_NODE) {
// Check if the selected element is a widget wrapper.
const widget = editor.widgets.getByElement(new CKEDITOR.dom.element(selectedNode), true);
const firstNestedEditable = Object.values(widget?.editables)[0];
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);
range.setStart(ckRange.startContainer.$, ckRange.startOffset);
range.collapse(true);
}
const selectedWidget = shouldMove && getSelectedWidget(editor, range);
const firstNestedEditable = Object.values(selectedWidget?.editables)[0];
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);
range.setStart(ckRange.startContainer.$, ckRange.startOffset);
range.collapse(true);
}
}
function getSelectedWidget(editor, range) {
// Check if the range start is followed by a widget wrapper.
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