Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit f52f0f8

Browse files
committed
memory plugins integration
1 parent 6dccd21 commit f52f0f8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+445
-309
lines changed

packages/bundle-odoo-website-editor/OdooWebsiteEditor.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@ export class OdooWebsiteEditor extends JWEditor {
9191
constructor(options: OdooWebsiteEditorOptions) {
9292
super();
9393
class CustomPlugin extends JWPlugin {
94-
commands = options.customCommands;
94+
commands = Object.assign(
95+
{ commit: { handler: options.afterRender } },
96+
options.customCommands,
97+
);
9598
}
9699

97100
this.configure({
@@ -210,7 +213,6 @@ export class OdooWebsiteEditor extends JWEditor {
210213
['editable', ['main']],
211214
],
212215
location: options.location,
213-
afterRender: options.afterRender,
214216
});
215217
this.configure(DomEditable, {
216218
autoFocus: true,
@@ -237,7 +239,10 @@ export class OdooWebsiteEditor extends JWEditor {
237239
}
238240

239241
async render(): Promise<void> {
242+
// TODO: remove this method, don't need to call a redraw or other. After @commit the
243+
// the rendring is ready.
244+
return;
240245
const domLayout = this.plugins.get(DomLayout);
241-
return domLayout.redraw();
246+
return domLayout._redrawAfterCommand();
242247
}
243248
}

packages/core/src/Core.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class Core<T extends JWPluginConfig = JWPluginConfig> extends JWPlugin<T>
8686
this.mode.is(range.startContainer, RuleProperty.EDITABLE)
8787
) {
8888
// Otherwise set range start at previous valid leaf.
89-
let ancestor = range.start.parent;
89+
let ancestor: VNode = range.start.parent;
9090
while (
9191
ancestor &&
9292
this.mode.is(ancestor, RuleProperty.BREAKABLE) &&
@@ -126,7 +126,7 @@ export class Core<T extends JWPluginConfig = JWPluginConfig> extends JWPlugin<T>
126126
this.mode.is(range.endContainer, RuleProperty.EDITABLE)
127127
) {
128128
// Otherwise set range end at next valid leaf.
129-
let ancestor = range.end.parent;
129+
let ancestor: VNode = range.end.parent;
130130
while (
131131
ancestor &&
132132
this.mode.is(ancestor, RuleProperty.BREAKABLE) &&

packages/core/src/Dispatcher.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,13 @@ export class Dispatcher {
111111
await hookCallback(args, signal);
112112
}
113113
}
114+
115+
/**
116+
* Dispatch the commit signal.
117+
*/
118+
async commit(): Promise<void> {
119+
for (const hookCallback of this.commandHooks.commit) {
120+
await hookCallback({}, 'commit');
121+
}
122+
}
114123
}

packages/core/src/Modifier.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Constructor } from '../../utils/src/utils';
22
import { VNode } from './VNodes/VNode';
3+
import { VersionableObject } from './Memory/VersionableObject';
34

45
export type ModifierTypeguard<T extends Modifier> = (modifier: Modifier) => modifier is T;
56
export type ModifierPredicate<T = Modifier | boolean> = T extends Modifier
@@ -12,7 +13,7 @@ interface ModifierConstructor {
1213
export interface Modifier {
1314
constructor: ModifierConstructor & this;
1415
}
15-
export class Modifier {
16+
export class Modifier extends VersionableObject {
1617
preserve = true;
1718
get name(): string {
1819
return '';

packages/core/src/Modifiers.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { Modifier } from './Modifier';
22
import { Constructor, isConstructor } from '../../utils/src/utils';
3+
import { VersionableObject } from './Memory/VersionableObject';
4+
import { VersionableArray } from './Memory/VersionableArray';
35

4-
export class Modifiers {
6+
export class Modifiers extends VersionableObject {
57
private _contents: Modifier[];
68
constructor(...modifiers: Array<Modifier | Constructor<Modifier>>) {
9+
super();
710
const clonedModifiers = modifiers.map(mod => {
811
return mod instanceof Modifier ? mod.clone() : mod;
912
});
@@ -49,7 +52,7 @@ export class Modifiers {
4952
*/
5053
append(...modifiers: Array<Modifier | Constructor<Modifier>>): void {
5154
if (modifiers.length && !this._contents) {
52-
this._contents = [];
55+
this._contents = new VersionableArray();
5356
}
5457
for (const modifier of modifiers) {
5558
if (modifier instanceof Modifier) {
@@ -67,7 +70,7 @@ export class Modifiers {
6770
*/
6871
prepend(...modifiers: Array<Modifier | Constructor<Modifier>>): void {
6972
if (modifiers.length && !this._contents) {
70-
this._contents = [];
73+
this._contents = new VersionableArray();
7174
}
7275
for (const modifier of [...modifiers].reverse()) {
7376
if (modifier instanceof Modifier) {

packages/core/src/VNodes/AbstractNode.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { AtomicNode } from './AtomicNode';
1010
import { Modifiers } from '../Modifiers';
1111
import { EventMixin } from '../../../utils/src/EventMixin';
1212
import { Modifier } from '../Modifier';
13+
import { markAsDiffRoot } from '../Memory/Memory';
1314

1415
export interface AbstractNodeParams {
1516
modifiers?: Modifiers | Array<Modifier | Constructor<Modifier>>;
@@ -71,6 +72,7 @@ export abstract class AbstractNode extends EventMixin {
7172
this.modifiers.append(...params.modifiers);
7273
}
7374
}
75+
markAsDiffRoot(this);
7476
}
7577

7678
get name(): string {
@@ -728,6 +730,7 @@ export abstract class AbstractNode extends EventMixin {
728730
return __repr;
729731
}
730732
}
733+
731734
export interface AbstractNode {
732735
constructor: new <T extends Constructor<VNode>>(...args: ConstructorParameters<T>) => this;
733736
}

packages/core/src/VNodes/ContainerNode.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { AbstractNode } from './AbstractNode';
22
import { VNode, Predicate, isLeaf } from './VNode';
33
import { ChildError } from '../../../utils/src/errors';
4+
import { VersionableArray } from '../Memory/VersionableArray';
45

56
export class ContainerNode extends AbstractNode {
67
parent: ContainerNode;
7-
readonly childVNodes: VNode[] = [];
8+
readonly childVNodes: VNode[] = new VersionableArray<VNode>();
89

910
//--------------------------------------------------------------------------
1011
// Browsing children.

packages/plugin-char/src/CharDomObjectRenderer.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,29 @@ import {
66
} from '../../plugin-renderer-dom-object/src/DomObjectRenderingEngine';
77
import { NodeRenderer } from '../../plugin-renderer/src/NodeRenderer';
88
import { Predicate } from '../../core/src/VNodes/VNode';
9+
import { RenderingEngineWorker } from '../../plugin-renderer/src/RenderingEngine';
910

1011
export class CharDomObjectRenderer extends NodeRenderer<DomObject> {
1112
static id = DomObjectRenderingEngine.id;
1213
engine: DomObjectRenderingEngine;
1314
predicate: Predicate = CharNode;
1415

15-
async render(charNode: CharNode): Promise<DomObject> {
16-
return this._renderText([charNode]);
16+
async render(charNode: CharNode, worker: RenderingEngineWorker<DomObject>): Promise<DomObject> {
17+
return this._renderText([charNode], worker);
1718
}
18-
async renderBatch(charNodes: CharNode[]): Promise<DomObject[]> {
19+
async renderBatch(
20+
charNodes: CharNode[],
21+
worker: RenderingEngineWorker<DomObject>,
22+
): Promise<DomObject[]> {
1923
const domObjects: DomObject[] = [];
20-
const domObject = this._renderText(charNodes);
24+
const domObject = this._renderText(charNodes, worker);
2125
for (let i = 0; i < charNodes.length; i++) domObjects.push(domObject);
2226
return domObjects;
2327
}
24-
private _renderText(charNodes: CharNode[]): DomObject {
28+
private _renderText(
29+
charNodes: CharNode[],
30+
worker: RenderingEngineWorker<DomObject>,
31+
): DomObject {
2532
// Create textObject.
2633
const texts = [];
2734
for (const charNode of charNodes) {
@@ -44,7 +51,7 @@ export class CharDomObjectRenderer extends NodeRenderer<DomObject> {
4451
texts[texts.length - 1] = texts[texts.length - 1].replace(/^ /g, '\u00A0');
4552
}
4653
const textObject = { text: texts.join('') };
47-
this.engine.locate(charNodes, textObject);
54+
worker.locate(charNodes, textObject);
4855
return textObject;
4956
}
5057
}

packages/plugin-devtools/src/components/DevToolsComponent.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ export class DevToolsComponent<T = {}> extends OwlComponent<T> {
3535
_heightOnLastMousedown: number;
3636

3737
async willStart(): Promise<void> {
38-
this.env.editor.dispatcher.registerCommandHook('*', this.refresh.bind(this));
38+
this.env.editor.dispatcher.registerCommandHook('*', this.addCommand.bind(this));
39+
this.env.editor.dispatcher.registerCommandHook('@commit', this.render.bind(this));
3940
return super.willStart();
4041
}
4142
willUnmount(): void {
@@ -65,12 +66,10 @@ export class DevToolsComponent<T = {}> extends OwlComponent<T> {
6566
(this.inspectorRef.comp as InspectorComponent)?.inspectDom();
6667
}
6768
/**
68-
* Refresh this component with respect to the recent dispatching of the
69-
* given command with the given arguments.
69+
* Add the recent dispatching of the given command with the given arguments.
7070
*/
71-
refresh(params: CommandParams, id: CommandIdentifier): void {
71+
addCommand(params: CommandParams, id: CommandIdentifier): void {
7272
this.state.commands.push([id, params]);
73-
this.render();
7473
}
7574
/**
7675
* Drag the DevTools to resize them

packages/plugin-dialog/src/DialogZoneDomObjectRenderer.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { MetadataNode } from '../../plugin-metadata/src/MetadataNode';
1111

1212
import template from '../assets/Dialog.xml';
1313
import '../assets/Dialog.css';
14+
import { RenderingEngineWorker } from '../../plugin-renderer/src/RenderingEngine';
1415

1516
const container = document.createElement('jw-container');
1617
container.innerHTML = template;
@@ -21,11 +22,17 @@ export class DialogZoneDomObjectRenderer extends NodeRenderer<DomObject> {
2122
engine: DomObjectRenderingEngine;
2223
predicate = DialogZoneNode;
2324

24-
async render(node: DialogZoneNode): Promise<DomObject> {
25+
async render(
26+
node: DialogZoneNode,
27+
worker: RenderingEngineWorker<DomObject>,
28+
): Promise<DomObject> {
2529
const float = document.createElement('jw-dialog-container');
2630
for (const child of node.childVNodes) {
27-
if (!node.hidden.get(child) && (child.tangible || child.is(MetadataNode))) {
28-
float.appendChild(await this._renderDialog(child));
31+
if (child.tangible || child instanceof MetadataNode) {
32+
if (!node.hidden?.[child.id]) {
33+
float.appendChild(await this._renderDialog(child));
34+
}
35+
worker.addNodeDependent(node, child);
2936
}
3037
}
3138
return {

0 commit comments

Comments
 (0)