[REF] component: small improvement

and run prettier
This commit is contained in:
Géry Debongnie
2019-10-31 21:28:35 +01:00
parent 05a678c039
commit 534152eff7
7 changed files with 53 additions and 58 deletions
+18 -19
View File
@@ -20,29 +20,28 @@ create a test environment with mock services.
For example: For example:
```js ```js
async function myEnv() { async function myEnv() {
const templates = await loadTemplates(); const templates = await loadTemplates();
const qweb = new QWeb({templates}); const qweb = new QWeb({ templates });
const session = getSession(); const session = getSession();
return { return {
_t: myTranslateFunction, _t: myTranslateFunction,
session: session, session: session,
qweb: qweb, qweb: qweb,
services: { services: {
localStorage: localStorage, localStorage: localStorage,
rpc: rpc, rpc: rpc
}, },
debug: false, debug: false,
inMobileMode: true, inMobileMode: true
}; };
} }
async function start() { async function start() {
owl.config.env = await myEnv(); owl.config.env = await myEnv();
const app = new App(); const app = new App();
await app.mount(document.body); await app.mount(document.body);
} }
``` ```
+2 -2
View File
@@ -1,6 +1,7 @@
# 🦉 OWL Documentation 🦉 # 🦉 OWL Documentation 🦉
## Reference ## Reference
- [Animations](reference/animations.md) - [Animations](reference/animations.md)
- [Component](reference/component.md) - [Component](reference/component.md)
- [Configuration](reference/config.md) - [Configuration](reference/config.md)
@@ -43,7 +44,7 @@ and `EventBus` is exported as `owl.core.EventBus`):
``` ```
Component misc Component misc
Context AsyncRoot Context AsyncRoot
QWeb router QWeb router
Store Link Store Link
useState RouteComponent useState RouteComponent
@@ -70,4 +71,3 @@ hooks loadJS
``` ```
Note that for convenience, the `useState` hook is also exported at the root of the `owl` object. Note that for convenience, the `useState` hook is also exported at the root of the `owl` object.
+2 -2
View File
@@ -1,7 +1,7 @@
# 🦉 Config 🦉 # 🦉 Config 🦉
The Owl framework is designed to work in many situations. However, it is The Owl framework is designed to work in many situations. However, it is
sometimes necessary to customize some behaviour. This is done by using the sometimes necessary to customize some behaviour. This is done by using the
global `config` object. It currently has two keys: global `config` object. It currently has two keys:
- [`mode`](#mode), - [`mode`](#mode),
-1
View File
@@ -15,4 +15,3 @@ Note: some additional information can be found here:
- [What should go into an environment?](../learning/environment.md) - [What should go into an environment?](../learning/environment.md)
- [Customizing an environment](config.md#env) - [Customizing an environment](config.md#env)
+16 -19
View File
@@ -115,15 +115,16 @@ export class Component<T extends Env, Props extends {}> {
Component.current = this; Component.current = this;
const id: number = nextId++; const id: number = nextId++;
let constr = this.constructor as any;
let depth; let depth;
if (parent) { if (parent) {
const defaultProps = (<any>this.constructor).defaultProps; const defaultProps = constr.defaultProps;
if (defaultProps) { if (defaultProps) {
props = this.__applyDefaultProps(props, defaultProps); props = this.__applyDefaultProps(props, defaultProps);
} }
this.props = <Props>props; this.props = <Props>props;
if (QWeb.dev) { if (QWeb.dev) {
QWeb.utils.validateProps(this.constructor, this.props); QWeb.utils.validateProps(constr, this.props);
} }
this.env = parent.env; this.env = parent.env;
const __powl__ = parent.__owl__; const __powl__ = parent.__owl__;
@@ -153,7 +154,7 @@ export class Component<T extends Env, Props extends {}> {
} }
const qweb = this.env.qweb; const qweb = this.env.qweb;
const template = constr.template || this.__getTemplate(qweb);
this.__owl__ = { this.__owl__ = {
id: id, id: id,
depth: depth, depth: depth,
@@ -173,7 +174,7 @@ export class Component<T extends Env, Props extends {}> {
willStartCB: null, willStartCB: null,
willUpdatePropsCB: null, willUpdatePropsCB: null,
observer: null, observer: null,
renderFn: qweb.render.bind(qweb, this.__getTemplate(qweb)), renderFn: qweb.render.bind(qweb, template),
classObj: null, classObj: null,
refs: null refs: null
}; };
@@ -543,22 +544,18 @@ export class Component<T extends Env, Props extends {}> {
__getTemplate(qweb: QWeb): string { __getTemplate(qweb: QWeb): string {
let p = (<any>this).constructor; let p = (<any>this).constructor;
if (!p.hasOwnProperty("_template")) { if (!p.hasOwnProperty("_template")) {
if (p.template) { // here, the component and none of its superclasses defines a static `template`
p._template = p.template; // key. So we fall back on looking for a template matching its name (or
} else { // one of its subclass).
// here, the component and none of its superclasses defines a static `template`
// key. So we fall back on looking for a template matching its name (or
// one of its subclass).
let template: string; let template: string;
while ((template = p.name) && !(template in qweb.templates) && p !== Component) { while ((template = p.name) && !(template in qweb.templates) && p !== Component) {
p = p.__proto__; p = p.__proto__;
} }
if (p === Component) { if (p === Component) {
throw new Error(`Could not find template for component "${this.constructor.name}"`); throw new Error(`Could not find template for component "${this.constructor.name}"`);
} else { } else {
p._template = template; p._template = template;
}
} }
} }
return p._template; return p._template;
+1 -1
View File
@@ -26,5 +26,5 @@ Object.defineProperty(config, "mode", {
} else { } else {
console.log(`Owl is now running in 'prod' mode.`); console.log(`Owl is now running in 'prod' mode.`);
} }
}, }
}); });
+14 -14
View File
@@ -121,7 +121,7 @@ describe("props validation", () => {
expect(error.message).toBe(`Missing props 'p' (component '_a')`); expect(error.message).toBe(`Missing props 'p' (component '_a')`);
error = undefined; error = undefined;
props = {p: test.ok}; props = { p: test.ok };
try { try {
const p = new Parent(); const p = new Parent();
await p.mount(fixture); await p.mount(fixture);
@@ -130,7 +130,7 @@ describe("props validation", () => {
} }
expect(error).toBeUndefined(); expect(error).toBeUndefined();
props = {p: test.ko}; props = { p: test.ko };
try { try {
const p = new Parent(); const p = new Parent();
await p.mount(fixture); await p.mount(fixture);
@@ -178,7 +178,7 @@ describe("props validation", () => {
expect(error.message).toBe(`Missing props 'p' (component '_a')`); expect(error.message).toBe(`Missing props 'p' (component '_a')`);
error = undefined; error = undefined;
props = {p: test.ok}; props = { p: test.ok };
try { try {
const p = new Parent(); const p = new Parent();
await p.mount(fixture); await p.mount(fixture);
@@ -187,7 +187,7 @@ describe("props validation", () => {
} }
expect(error).toBeUndefined(); expect(error).toBeUndefined();
props = {p: test.ko}; props = { p: test.ko };
try { try {
const p = new Parent(); const p = new Parent();
await p.mount(fixture); await p.mount(fixture);
@@ -203,14 +203,14 @@ describe("props validation", () => {
class TestWidget extends Component<any, any> { class TestWidget extends Component<any, any> {
static template = xml`<div>hey</div>`; static template = xml`<div>hey</div>`;
static props = { p: [String, Boolean] }; static props = { p: [String, Boolean] };
}; }
class Parent extends Component<any, any> { class Parent extends Component<any, any> {
static template = xml`<div><TestWidget p="p"/></div>`; static template = xml`<div><TestWidget p="p"/></div>`;
static components = { TestWidget }; static components = { TestWidget };
get p() { get p() {
return props.p; return props.p;
} }
}; }
let error; let error;
let props; let props;
@@ -247,14 +247,14 @@ describe("props validation", () => {
class TestWidget extends Component<any, any> { class TestWidget extends Component<any, any> {
static template = xml`<div>hey</div>`; static template = xml`<div>hey</div>`;
static props = { p: { type: String, optional: true } }; static props = { p: { type: String, optional: true } };
}; }
class Parent extends Component<any, any> { class Parent extends Component<any, any> {
static template = xml`<div><TestWidget p="p"/></div>`; static template = xml`<div><TestWidget p="p"/></div>`;
static components = { TestWidget }; static components = { TestWidget };
get p() { get p() {
return props.p; return props.p;
} }
}; }
let error; let error;
let props; let props;
@@ -291,14 +291,14 @@ describe("props validation", () => {
class TestWidget extends Component<any, any> { class TestWidget extends Component<any, any> {
static template = xml`<div>hey</div>`; static template = xml`<div>hey</div>`;
static props = { p: { type: Array, element: String } }; static props = { p: { type: Array, element: String } };
}; }
class Parent extends Component<any, any> { class Parent extends Component<any, any> {
static template = xml`<div><TestWidget p="p"/></div>`; static template = xml`<div><TestWidget p="p"/></div>`;
static components = { TestWidget }; static components = { TestWidget };
get p() { get p() {
return props.p; return props.p;
} }
}; }
let error; let error;
let props; let props;
@@ -343,7 +343,7 @@ describe("props validation", () => {
class TestWidget extends Component<any, any> { class TestWidget extends Component<any, any> {
static template = xml`<div>hey</div>`; static template = xml`<div>hey</div>`;
static props = { p: { type: Array, element: [String, Boolean] } }; static props = { p: { type: Array, element: [String, Boolean] } };
}; }
class Parent extends Component<any, any> { class Parent extends Component<any, any> {
static template = xml`<div><TestWidget p="p"/></div>`; static template = xml`<div><TestWidget p="p"/></div>`;
static components = { TestWidget }; static components = { TestWidget };
@@ -398,7 +398,7 @@ describe("props validation", () => {
static props = { static props = {
p: { type: Object, shape: { id: Number, url: String } } p: { type: Object, shape: { id: Number, url: String } }
}; };
}; }
class Parent extends Component<any, any> { class Parent extends Component<any, any> {
static template = xml`<div><TestWidget p="p"/></div>`; static template = xml`<div><TestWidget p="p"/></div>`;
static components = { TestWidget }; static components = { TestWidget };
@@ -461,7 +461,7 @@ describe("props validation", () => {
} }
} }
}; };
}; }
class Parent extends Component<any, any> { class Parent extends Component<any, any> {
static template = xml`<div><TestWidget p="p"/></div>`; static template = xml`<div><TestWidget p="p"/></div>`;
static components = { TestWidget }; static components = { TestWidget };
@@ -677,7 +677,7 @@ describe("default props", () => {
const w = new Parent(); const w = new Parent();
await w.mount(fixture); await w.mount(fixture);
expect(fixture.innerHTML).toBe('<div><div>4</div></div>'); expect(fixture.innerHTML).toBe("<div><div>4</div></div>");
}); });
test("default values are also set whenever component is updated", async () => { test("default values are also set whenever component is updated", async () => {