diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js b/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js
index 65d6a088739..51f3683df68 100644
--- a/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js
+++ b/addons/web_editor/static/src/js/editor/odoo-editor/src/utils/utils.js
@@ -1033,8 +1033,13 @@ export const formatSelection = (editor, formatName, {applyStyle, formatProps} =
getDeepRange(editor.editable, { splitText: true, select: true, correctTripleClick: true });
}
- const selectedTextNodes = getSelectedNodes(editor.editable)
+ // Get selected nodes within td to handle non-p elements like h1, h2...
+ // Targeting
to ensure span stays inside its corresponding block node.
+ const selectedNodesInTds = [...editor.editable.querySelectorAll('.o_selected_td')]
+ .map(node => closestElement(node).querySelector('br'));
+ const selectedNodes = getSelectedNodes(editor.editable)
.filter(n => n.nodeType === Node.TEXT_NODE && closestElement(n).isContentEditable && (isVisibleTextNode(n) || isZWS(n)));
+ const selectedTextNodes = selectedNodes.length ? selectedNodes : selectedNodesInTds;
const formatSpec = formatsSpecs[formatName];
for (const selectedTextNode of selectedTextNodes) {
@@ -1064,7 +1069,6 @@ export const formatSelection = (editor, formatName, {applyStyle, formatProps} =
}
const firstBlockOrClassHasFormat = formatSpec.isFormatted(parentNode, formatProps);
-
if (firstBlockOrClassHasFormat && !applyStyle) {
formatSpec.addNeutralStyle && formatSpec.addNeutralStyle(getOrCreateSpan(selectedTextNode, inlineAncestors));
} else if (!firstBlockOrClassHasFormat && applyStyle) {
@@ -1306,7 +1310,7 @@ export function isSelectionFormat(editable, format) {
const selectedNodes = getTraversedNodes(editable)
.filter(n => n.nodeType === Node.TEXT_NODE && n.nodeValue.trim().length);
const isFormatted = formatsSpecs[format].isFormatted;
- return selectedNodes.every(n => isFormatted(n, editable));
+ return selectedNodes && selectedNodes.every(n => isFormatted(n, editable));
}
export function isUnbreakable(node) {
diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/format.test.js b/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/format.test.js
index 32a30873f1c..cbae5753617 100644
--- a/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/format.test.js
+++ b/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/format.test.js
@@ -429,7 +429,7 @@ describe('Format', () => {
await setTestSelection(selection);
await strikeThrough(editor);
},
- contentAfter: `
ab${s(`c`)}[ ]${s(`d`)}ef
`, + contentAfter: `abc[ ]def
[ | |
[] | |
[ | |
|
[] | |
[ |
|
[] | |