replace stale web_editor with html_editor and html_builder for 19.0

web_editor was removed in Odoo 19.0 and replaced by html_editor
and html_builder. The old web_editor was incorrectly included in
the 19.0 vanilla import.

🤖 assisted by claude
This commit is contained in:
Ernad Husremovic 2026-03-09 15:31:13 +01:00
parent 4b94f0abc5
commit f866779561
1513 changed files with 396049 additions and 358525 deletions

View file

@ -0,0 +1,115 @@
import { leftPos, rightPos } from "@html_editor/utils/position";
import { expect, test } from "@odoo/hoot";
import { animationFrame, pointerDown, pointerUp, waitForNone } from "@odoo/hoot-dom";
import { tick } from "@odoo/hoot-mock";
import { setupEditor, testEditor } from "../_helpers/editor";
import { getContent, setSelection } from "../_helpers/selection";
/**
* Simulates placing the cursor at the editable root after a mouse click.
*
* @param {HTMLElement} node
* @param {boolean} [before=false] whether to place the cursor after the node
*/
async function simulateMouseClick(node, before = false) {
await pointerDown(node);
const pos = before ? leftPos(node) : rightPos(node);
setSelection({
anchorNode: pos[0],
anchorOffset: pos[1],
focusNode: pos[0],
focusOffset: pos[1],
});
await tick();
await pointerUp(node);
}
test("should insert a paragraph at end of editable and place cursor in it (hr)", async () => {
await testEditor({
contentBefore: '<hr contenteditable="false">',
stepFunction: async (editor) => {
const hr = editor.editable.querySelector("hr");
await simulateMouseClick(hr);
},
contentAfter: "<hr><p>[]<br></p>",
});
});
test("should insert a paragraph at end of editable and place cursor in it (table)", async () => {
await testEditor({
contentBefore: "<table></table>",
stepFunction: async (editor) => {
const table = editor.editable.querySelector("table");
await simulateMouseClick(table);
},
contentAfter: "<table></table><p>[]<br></p>",
});
});
test("should insert a paragraph at beginning of editable and place cursor in it (1)", async () => {
await testEditor({
contentBefore: '<hr contenteditable="false">',
stepFunction: async (editor) => {
const hr = editor.editable.querySelector("hr");
await simulateMouseClick(hr, true);
},
contentAfter: "<p>[]<br></p><hr>",
});
});
test("should insert a paragraph at beginning of editable and place cursor in it (2)", async () => {
await testEditor({
contentBefore: "<table></table>",
stepFunction: async (editor) => {
const table = editor.editable.querySelector("table");
await simulateMouseClick(table, true);
},
contentAfter: "<p>[]<br></p><table></table>",
});
});
test("should insert a paragraph between the two non-P blocks and place cursor in it (1)", async () => {
await testEditor({
contentBefore: '<hr contenteditable="false"><hr contenteditable="false">',
stepFunction: async (editor) => {
const firstHR = editor.editable.querySelector("hr");
await simulateMouseClick(firstHR);
},
contentAfter: "<hr><p>[]<br></p><hr>",
});
});
test("should insert a paragraph between the two non-P blocks and place cursor in it (2)", async () => {
await testEditor({
contentBefore: "<table></table><table></table>",
stepFunction: async (editor) => {
const firstTable = editor.editable.querySelector("table");
await simulateMouseClick(firstTable);
},
contentAfter: "<table></table><p>[]<br></p><table></table>",
});
});
test("should insert a paragraph before the table, then one after it", async () => {
const { el } = await setupEditor("<table></table>");
const table = el.querySelector("table");
await simulateMouseClick(table, true);
expect(getContent(el)).toBe(
`<p o-we-hint-text='Type "/" for commands' class="o-we-hint">[]<br></p><table></table>`
);
await simulateMouseClick(table);
expect(getContent(el)).toBe(
`<p><br></p><table></table><p o-we-hint-text='Type "/" for commands' class="o-we-hint">[]<br></p>`
);
});
test.tags("desktop");
test("should have collapsed selection when mouse down on a table cell", async () => {
const { el } = await setupEditor(
`<table class="table table-bordered o_table"><tbody><tr><td><p><br></p></td><td><p><br>[</p></td><td><p>]<br></p></td></tr></tbody></table>`
);
const lastCell = el.querySelector("td:last-child");
pointerDown(lastCell);
await waitForNone(".o-we-toolbar");
await animationFrame();
const selection = document.getSelection();
expect(selection.isCollapsed).toBe(true);
});