mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[FIX] qweb: add better support for template with only strings
This commit is contained in:
+5
-2
@@ -329,13 +329,15 @@ export class QWeb {
|
|||||||
}
|
}
|
||||||
if (ctx.parentNode) {
|
if (ctx.parentNode) {
|
||||||
ctx.addLine(`c${ctx.parentNode}.push({text: \`${text}\`});`);
|
ctx.addLine(`c${ctx.parentNode}.push({text: \`${text}\`});`);
|
||||||
|
} else if (ctx.parentTextNode) {
|
||||||
|
ctx.addLine(`vn${ctx.parentTextNode}.text += \`${text}\`;`);
|
||||||
} else {
|
} else {
|
||||||
// this is an unusual situation: this text node is the result of the
|
// this is an unusual situation: this text node is the result of the
|
||||||
// template rendering.
|
// template rendering.
|
||||||
let nodeID = ctx.generateID();
|
let nodeID = ctx.generateID();
|
||||||
ctx.addLine(`var vn${nodeID} = {text: \`${text}\`};`);
|
ctx.addLine(`var vn${nodeID} = {text: \`${text}\`};`);
|
||||||
ctx.rootContext.rootNode = nodeID;
|
ctx.rootContext.rootNode = nodeID;
|
||||||
ctx.rootContext.parentNode = nodeID;
|
ctx.rootContext.parentTextNode = nodeID;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -620,6 +622,7 @@ export class Context {
|
|||||||
variables: { [key: string]: QWebVar } = {};
|
variables: { [key: string]: QWebVar } = {};
|
||||||
escaping: boolean = false;
|
escaping: boolean = false;
|
||||||
parentNode: number | null = null;
|
parentNode: number | null = null;
|
||||||
|
parentTextNode: number | null = null;
|
||||||
rootNode: number | null = null;
|
rootNode: number | null = null;
|
||||||
indentLevel: number = 0;
|
indentLevel: number = 0;
|
||||||
rootContext: Context;
|
rootContext: Context;
|
||||||
@@ -644,7 +647,7 @@ export class Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
withParent(node: number): Context {
|
withParent(node: number): Context {
|
||||||
if (this === this.rootContext && this.parentNode) {
|
if (this === this.rootContext && (this.parentNode || this.parentTextNode)) {
|
||||||
throw new Error("A template should not have more than one root node");
|
throw new Error("A template should not have more than one root node");
|
||||||
}
|
}
|
||||||
if (!this.rootContext.rootNode) {
|
if (!this.rootContext.rootNode) {
|
||||||
|
|||||||
+10
-4
@@ -44,11 +44,17 @@ function compileValueNode(value: any, node: Element, qweb: QWeb, ctx: Context) {
|
|||||||
exprID = value.id;
|
exprID = value.id;
|
||||||
}
|
}
|
||||||
ctx.addIf(`${exprID} || ${exprID} === 0`);
|
ctx.addIf(`${exprID} || ${exprID} === 0`);
|
||||||
if (!ctx.parentNode) {
|
|
||||||
throw new Error("Should not have a text node without a parent");
|
|
||||||
}
|
|
||||||
if (ctx.escaping) {
|
if (ctx.escaping) {
|
||||||
ctx.addLine(`c${ctx.parentNode}.push({text: ${exprID}});`);
|
if (ctx.parentTextNode) {
|
||||||
|
ctx.addLine(`vn${ctx.parentTextNode}.text += ${exprID};`);
|
||||||
|
} else if (ctx.parentNode) {
|
||||||
|
ctx.addLine(`c${ctx.parentNode}.push({text: ${exprID}});`);
|
||||||
|
} else {
|
||||||
|
let nodeID = ctx.generateID();
|
||||||
|
ctx.rootContext.rootNode = nodeID;
|
||||||
|
ctx.rootContext.parentTextNode = nodeID;
|
||||||
|
ctx.addLine(`var vn${nodeID} = {text: ${exprID}};`);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let fragID = ctx.generateID();
|
let fragID = ctx.generateID();
|
||||||
ctx.addLine(`var frag${fragID} = this.utils.getFragment(${exprID})`);
|
ctx.addLine(`var frag${fragID} = this.utils.getFragment(${exprID})`);
|
||||||
|
|||||||
@@ -726,6 +726,18 @@ exports[`static templates empty div 1`] = `
|
|||||||
}"
|
}"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`static templates simple dynamic value 1`] = `
|
||||||
|
"function anonymous(context,extra
|
||||||
|
) {
|
||||||
|
var h = this.utils.h;
|
||||||
|
var _1 = context['text'];
|
||||||
|
if (_1 || _1 === 0) {
|
||||||
|
var vn2 = {text: _1};
|
||||||
|
}
|
||||||
|
return vn2;
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`static templates simple string 1`] = `
|
exports[`static templates simple string 1`] = `
|
||||||
"function anonymous(context,extra
|
"function anonymous(context,extra
|
||||||
) {
|
) {
|
||||||
@@ -735,6 +747,19 @@ exports[`static templates simple string 1`] = `
|
|||||||
}"
|
}"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`static templates simple string, with some dynamic value 1`] = `
|
||||||
|
"function anonymous(context,extra
|
||||||
|
) {
|
||||||
|
var h = this.utils.h;
|
||||||
|
var vn1 = {text: \`hello \`};
|
||||||
|
var _2 = context['text'];
|
||||||
|
if (_2 || _2 === 0) {
|
||||||
|
vn1.text += _2;
|
||||||
|
}
|
||||||
|
return vn1;
|
||||||
|
}"
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`t-call (template calling basic caller 1`] = `
|
exports[`t-call (template calling basic caller 1`] = `
|
||||||
"function anonymous(context,extra
|
"function anonymous(context,extra
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -24,6 +24,16 @@ describe("static templates", () => {
|
|||||||
expect(renderToString(qweb, "test")).toBe("hello vdom");
|
expect(renderToString(qweb, "test")).toBe("hello vdom");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("simple dynamic value", () => {
|
||||||
|
qweb.addTemplate("test", "<t><t t-esc=\"text\"/></t>");
|
||||||
|
expect(renderToString(qweb, "test", {text: "hello vdom"})).toBe("hello vdom");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("simple string, with some dynamic value", () => {
|
||||||
|
qweb.addTemplate("test", "<t>hello <t t-esc=\"text\"/></t>");
|
||||||
|
expect(renderToString(qweb, "test", {text: "vdom"})).toBe("hello vdom");
|
||||||
|
});
|
||||||
|
|
||||||
test("empty div", () => {
|
test("empty div", () => {
|
||||||
qweb.addTemplate("test", "<div></div>");
|
qweb.addTemplate("test", "<div></div>");
|
||||||
expect(renderToString(qweb, "test")).toBe("<div></div>");
|
expect(renderToString(qweb, "test")).toBe("<div></div>");
|
||||||
|
|||||||
Reference in New Issue
Block a user