diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js b/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js index 1e6d1acc0e0..e177cdd53de 100644 --- a/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js +++ b/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js @@ -35,6 +35,7 @@ import { isHtmlContentSupported, rgbToHex, isFontAwesome, + ICON_SELECTOR, getInSelection, getDeepRange, getRowIndex, @@ -4294,8 +4295,7 @@ export class OdooEditor extends EventTarget { } // Remove Zero Width Spaces on Font awesome elements - const faSelector = 'i.fa,span.fa,i.fab,span.fab,i.fad,span.fad,i.far,span.far'; - for (const el of element.querySelectorAll(faSelector)) { + for (const el of element.querySelectorAll(ICON_SELECTOR)) { cleanZWS(el); } 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 dbf52cbef9f..bbfe6d81b52 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 @@ -1410,13 +1410,24 @@ export function containsUnbreakable(node) { } return isUnbreakable(node) || containsUnbreakable(node.firstChild); } +// TODO rename this function in master: it also handles Odoo icons, not only +// font awesome ones. Also maybe just use the ICON_SELECTOR and `matches`? +const iconTags = ['I', 'SPAN']; +const iconClasses = ['fa', 'fab', 'fad', 'far', 'oi']; export function isFontAwesome(node) { + // See ICON_SELECTOR return ( node && - (node.nodeName === 'I' || node.nodeName === 'SPAN') && - ['fa', 'fab', 'fad', 'far'].some(faClass => node.classList.contains(faClass)) + iconTags.includes(node.nodeName) && + iconClasses.some(cls => node.classList.contains(cls)) ); } +export const ICON_SELECTOR = iconTags.map(tag => { + return iconClasses.map(cls => { + return `${tag}.${cls}`; + }).join(', '); +}).join(', '); + export function isZWS(node) { return ( node && diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/fontAwesome.test.js b/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/fontAwesome.test.js index 35edda06e5e..6bcfdb9e955 100644 --- a/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/fontAwesome.test.js +++ b/addons/web_editor/static/src/js/editor/odoo-editor/test/spec/fontAwesome.test.js @@ -56,6 +56,12 @@ describe('FontAwesome', () => { '

\u200b

', contentAfter: '

', }); + await testEditor(BasicEditor, { + contentBefore: '

', + contentBeforeEdit: + '

\u200b

', + contentAfter: '

', + }); }); it('should parse a fontawesome in a ', async () => { await testEditor(BasicEditor, { @@ -64,6 +70,12 @@ describe('FontAwesome', () => { '

\u200b

', contentAfter: '

', }); + await testEditor(BasicEditor, { + contentBefore: '

', + contentBeforeEdit: + '

\u200b

', + contentAfter: '

', + }); }); it('should parse a fontawesome with more classes', async () => { await testEditor(BasicEditor, { @@ -305,6 +317,13 @@ describe('FontAwesome', () => { stepFunction: deleteBackward, contentAfter: '

ab[]cd

', }); + await testEditor(BasicEditor, { + contentBefore: '

ab[]cd

', + contentBeforeEdit: + '

ab\u200b[]cd

', + stepFunction: deleteBackward, + contentAfter: '

ab[]cd

', + }); }); it('should delete a fontawesome before a span', async () => { await testEditor(BasicEditor, {