Odoo18-Base/addons/html_editor/static/tests/table/adding_table.test.js
2025-01-06 10:57:38 +07:00

286 lines
9.5 KiB
JavaScript

import { expect, test } from "@odoo/hoot";
import { animationFrame } from "@odoo/hoot-mock";
import { setupEditor } from "../_helpers/editor";
import { getContent } from "../_helpers/selection";
import { insertText } from "../_helpers/user_actions";
import { unformat } from "../_helpers/format";
import { press, waitFor, queryOne } from "@odoo/hoot-dom";
function expectContentToBe(el, html) {
expect(getContent(el)).toBe(unformat(html));
}
test.tags("desktop");
test("can add a table using the powerbox and keyboard", async () => {
const { el, editor } = await setupEditor("<p>a[]</p>");
expect(".o-we-powerbox").toHaveCount(0);
expectContentToBe(el, `<p>a[]</p>`);
// open powerbox
await insertText(editor, "/");
await waitFor(".o-we-powerbox");
expect(".o-we-tablepicker").toHaveCount(0);
// filter to get table command in first position
await insertText(editor, "table");
await animationFrame();
// press enter to open tablepicker
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-powerbox").toHaveCount(0);
// press enter to validate current dimension (3x3)
await press("Enter");
await animationFrame();
expect(".o-we-powerbox").toHaveCount(0);
expect(".o-we-tablepicker").toHaveCount(0);
expectContentToBe(
el,
`<p>a</p>
<table class="table table-bordered o_table">
<tbody>
<tr>
<td><p placeholder='Type "/" for commands' class="o-we-hint">[]<br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
<tr>
<td><p><br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
<tr>
<td><p><br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
</tbody>
</table>
<p><br></p>`
);
});
test.tags("desktop");
test("can close table picker with escape", async () => {
const { el, editor } = await setupEditor("<p>a[]</p>");
await insertText(editor, "/");
await waitFor(".o-we-powerbox");
await insertText(editor, "table");
expectContentToBe(el, "<p>a/table[]</p>");
await animationFrame();
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-tablepicker").toHaveCount(1);
expectContentToBe(el, "<p>a[]</p>");
await press("escape");
await animationFrame();
expect(".o-we-tablepicker").toHaveCount(0);
});
test.tags("iframe", "desktop");
test("in iframe, can add a table using the powerbox and keyboard", async () => {
const { el, editor } = await setupEditor("<p>a[]</p>", {
props: { iframe: true },
});
expect(".o-we-powerbox").toHaveCount(0);
expect(getContent(el)).toBe(`<p>a[]</p>`);
expect(":iframe .o_table").toHaveCount(0);
// open powerbox
await insertText(editor, "/");
await waitFor(".o-we-powerbox");
expect(".o-we-tablepicker").toHaveCount(0);
// filter to get table command in first position
await insertText(editor, "table");
await animationFrame();
// press enter to open tablepicker
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-powerbox").toHaveCount(0);
// press enter to validate current dimension (3x3)
await press("Enter");
await animationFrame();
expect(".o-we-powerbox").toHaveCount(0);
expect(".o-we-tablepicker").toHaveCount(0);
expect(":iframe .o_table").toHaveCount(1);
});
test.tags("desktop");
test("Expand columns in the correct direction in 'rtl'", async () => {
const { editor } = await setupEditor("<p>a[]</p>", {
config: {
direction: "rtl",
},
});
await insertText(editor, "/table");
await press("Enter");
await waitFor(".o-we-tablepicker");
// Initially we have 3 columns
const tablePickerOverlay = queryOne(".overlay");
expect(tablePickerOverlay).toHaveStyle({ right: /px$/ });
const right = tablePickerOverlay.style.right;
const width3Columns = tablePickerOverlay.getBoundingClientRect().width;
expect(".o-we-cell.active").toHaveCount(9);
// Add one column -> we have 4 columns
await press("ArrowLeft");
await animationFrame();
expect(tablePickerOverlay.getBoundingClientRect().width).toBeGreaterThan(width3Columns);
expect(tablePickerOverlay).toHaveStyle({ right });
expect(".o-we-cell.active").toHaveCount(12);
// Remove one column -> we have 3 columns
await press("ArrowRight");
await animationFrame();
expect(".o-we-cell.active").toHaveCount(9);
expect(tablePickerOverlay).toHaveStyle({ right });
// Remove one column -> we have 2 columns
await press("ArrowRight");
await animationFrame();
expect(tablePickerOverlay.getBoundingClientRect().width).toBeLessThan(width3Columns);
expect(tablePickerOverlay).toHaveStyle({ right });
expect(".o-we-cell.active").toHaveCount(6);
});
test.tags("desktop");
test("add table inside empty list", async () => {
const { el, editor } = await setupEditor("<ul><li>[]<br></li></ul>");
// open powerbox
insertText(editor, "/");
await waitFor(".o-we-powerbox");
expect(".o-we-tablepicker").toHaveCount(0);
// filter to get table command in first position
insertText(editor, "table");
await animationFrame();
// press enter to open tablepicker
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-powerbox").toHaveCount(0);
// press enter to validate current dimension (3x3)
await press("Enter");
await animationFrame();
expect(".o-we-powerbox").toHaveCount(0);
expect(".o-we-tablepicker").toHaveCount(0);
expectContentToBe(
el,
`<ul>
<li>
<br>
<table class="table table-bordered o_table">
<tbody>
<tr>
<td><p placeholder='Type "/" for commands' class="o-we-hint">[]<br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
<tr>
<td><p><br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
<tr>
<td><p><br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
</tbody>
</table>
<br>
</li>
</ul>`
);
});
test.tags("desktop");
test("add table inside non-empty list", async () => {
const { el, editor } = await setupEditor("<ul><li>abc[]</li></ul>");
// open powerbox
insertText(editor, "/");
await waitFor(".o-we-powerbox");
expect(".o-we-tablepicker").toHaveCount(0);
// filter to get table command in first position
insertText(editor, "table");
await animationFrame();
// press enter to open tablepicker
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-powerbox").toHaveCount(0);
// press enter to validate current dimension (3x3)
await press("Enter");
await animationFrame();
expect(".o-we-powerbox").toHaveCount(0);
expect(".o-we-tablepicker").toHaveCount(0);
expectContentToBe(
el,
`<ul>
<li>
abc
<table class="table table-bordered o_table">
<tbody>
<tr>
<td><p placeholder='Type "/" for commands' class="o-we-hint">[]<br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
<tr>
<td><p><br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
<tr>
<td><p><br></p></td>
<td><p><br></p></td>
<td><p><br></p></td>
</tr>
</tbody>
</table>
<br>
</li>
</ul>`
);
});
test.tags("desktop");
test("should close the table picker when any key except arrow keys pressed", async () => {
const { el, editor } = await setupEditor("<p>a[]</p>");
await insertText(editor, "/");
await waitFor(".o-we-powerbox");
await insertText(editor, "table");
expectContentToBe(el, "<p>a/table[]</p>");
await animationFrame();
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-tablepicker").toHaveCount(1);
expectContentToBe(el, "<p>a[]</p>");
await insertText(editor, "b");
await animationFrame();
expect(".o-we-tablepicker").toHaveCount(0);
expectContentToBe(el, "<p>ab[]</p>");
await insertText(editor, "/");
await waitFor(".o-we-powerbox");
await insertText(editor, "table");
expectContentToBe(el, "<p>ab/table[]</p>");
await animationFrame();
await press("Enter");
await waitFor(".o-we-tablepicker");
expect(".o-we-tablepicker").toHaveCount(1);
expectContentToBe(el, "<p>ab[]</p>");
await insertText(editor, "/");
await animationFrame();
expect(".o-we-tablepicker").toHaveCount(0);
});