Skip to content

Commit

Permalink
[FIX] compiler: multiple modifiers on t-custom
Browse files Browse the repository at this point in the history
Since [1] it's possible to have a custom directive, this directive only
supported one modifier. This commit, add the support to have multiple
modifiers on a t-custom directive.

[1] : 7e68723
  • Loading branch information
jpp-odoo committed Nov 25, 2024
1 parent e676850 commit fa0bc17
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/common/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export type customDirectives = Record<
string,
(node: Element, value: string, modifier?: string) => void
(node: Element, value: string, modifier?: string[]) => void
>;
4 changes: 2 additions & 2 deletions src/compiler/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -299,10 +299,10 @@ function parseTCustom(node: Element, ctx: ParsingContext): AST | null {
throw new OwlError(`Custom directive "${directiveName}" is not defined`);
}
const value = node.getAttribute(attr)!;
const modifier = attr.split(".").length > 1 ? attr.split(".")[1] : undefined;
const modifiers = attr.split(".").length > 1 ? attr.split(".").slice(1) : undefined;
node.removeAttribute(attr);
try {
customDirective(node, value, modifier);
customDirective(node, value, modifiers);
} catch (error) {
throw new OwlError(
`Custom directive "${directiveName}" throw the following error: ${error}`
Expand Down
2 changes: 1 addition & 1 deletion tests/compiler/__snapshots__/t_custom.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ exports[`t-custom can use t-custom directive on a node 1`] = `
}"
`;
exports[`t-custom can use t-custom directive with modifier on a node 1`] = `
exports[`t-custom can use t-custom directive with modifiers on a node 1`] = `
"function anonymous(app, bdom, helpers
) {
let { text, createBlock, list, multi, html, toggler, comment } = bdom;
Expand Down
12 changes: 7 additions & 5 deletions tests/compiler/t_custom.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,27 @@ describe("t-custom", () => {
expect(steps).toEqual(["clicked"]);
});

test("can use t-custom directive with modifier on a node", async () => {
test("can use t-custom directive with modifiers on a node", async () => {
const steps: string[] = [];
class SomeComponent extends Component {
static template = xml`<div t-custom-plop.mouse="click" class="my-div"/>`;
static template = xml`<div t-custom-plop.mouse.stop="click" class="my-div"/>`;
click() {
steps.push("clicked");
}
}
const app = new App(SomeComponent, {
customDirectives: {
plop: (node, value, modifier) => {
plop: (node, value, modifiers) => {
node.setAttribute("t-on-click", value);
steps.push(modifier || "");
for(let mod of modifiers || []) {
steps.push(mod);
}
},
},
});
await app.mount(fixture);
expect(fixture.innerHTML).toBe(`<div class="my-div"></div>`);
fixture.querySelector("div")!.click();
expect(steps).toEqual(["mouse", "clicked"]);
expect(steps).toEqual(["mouse", "stop", "clicked"]);
});
});

0 comments on commit fa0bc17

Please sign in to comment.