@textbus/collaborate 2.0.0-alpha.37 → 2.0.0-alpha.40
Sign up to get free protection for your applications and to get access to all the features.
- package/bundles/collab/_api.d.ts +1 -1
- package/bundles/collab/_api.js +1 -1
- package/bundles/collab/_api.js.map +1 -1
- package/bundles/collab/collaborate-cursor.d.ts +37 -0
- package/bundles/collab/collaborate-cursor.js +254 -0
- package/bundles/collab/collaborate-cursor.js.map +1 -0
- package/bundles/collab/local-to-remote.d.ts +10 -2
- package/bundles/collab/local-to-remote.js +139 -157
- package/bundles/collab/local-to-remote.js.map +1 -1
- package/bundles/collab/remote-to-local.d.ts +10 -1
- package/bundles/collab/remote-to-local.js +136 -112
- package/bundles/collab/remote-to-local.js.map +1 -1
- package/bundles/collaborate.d.ts +29 -8
- package/bundles/collaborate.js +191 -33
- package/bundles/collaborate.js.map +1 -1
- package/bundles/public-api.js.map +1 -1
- package/package.json +5 -4
- package/src/collab/_api.ts +1 -1
- package/src/collab/collaborate-cursor.ts +233 -0
- package/src/collab/local-to-remote.ts +136 -159
- package/src/collab/remote-to-local.ts +127 -108
- package/src/collaborate.ts +78 -28
- package/tsconfig-build.json +2 -0
- package/bundles/collab/collaborate-history.d.ts +0 -22
- package/bundles/collab/collaborate-history.js +0 -53
- package/bundles/collab/collaborate-history.js.map +0 -1
- package/src/collab/collaborate-history.ts +0 -55
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"remote-to-local.js","sourceRoot":"","sources":["../../src/collab/remote-to-local.ts"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"remote-to-local.js","sourceRoot":"","sources":["../../src/collab/remote-to-local.ts"],"names":[],"mappings":"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","sourcesContent":["import { Map as YMap, YArrayEvent, YEvent, YMapEvent, Text as YText, YTextEvent, Array as YArray } from 'yjs'\nimport { ComponentInstance, ComponentLiteral, makeError, Registry, Slot, Translator } from '@textbus/core'\n\ntype YPath = [number, string][]\nconst collaborateErrorFn = makeError('Collaborate')\n\nexport class RemoteToLocal {\n constructor(private translator: Translator,\n private registry: Registry) {\n }\n\n transform(events: YEvent[], slot: Slot) {\n events.forEach(ev => {\n const path: YPath = []\n\n for (let i = 0; i < ev.path.length; i += 2) {\n path.push(ev.path.slice(i, i + 2) as [number, string])\n }\n\n if (path.length) {\n const componentIndex = path.shift()![0] as number\n const component = slot.getContentAtIndex(componentIndex) as ComponentInstance\n this.applySharedComponentToComponent(ev, path, component)\n return\n }\n\n this.applySharedSlotToSlot(ev, path, slot)\n })\n }\n\n private applySharedComponentToComponent(ev: YEvent, path: YPath, component: ComponentInstance) {\n if (path.length) {\n const childPath = path.shift()!\n const slot = component.slots.get(childPath[0])!\n this.applySharedSlotToSlot(ev, path, slot)\n return\n }\n if (ev instanceof YMapEvent) {\n ev.keysChanged.forEach(key => {\n if (key === 'state') {\n const state = (ev.target as YMap<any>).get('state')\n component.updateState(draft => {\n Object.assign(draft, state)\n })\n }\n })\n } else if (ev instanceof YArrayEvent) {\n const slots = component.slots\n ev.delta.forEach(action => {\n if (Reflect.has(action, 'retain')) {\n slots.retain(action.retain!)\n } else if (action.insert) {\n (action.insert as Array<YMap<any>>).forEach(item => {\n slots.insert(this.createSlotBySharedSlot(item))\n })\n } else if (action.delete) {\n slots.retain(slots.index)\n slots.delete(action.delete)\n }\n })\n }\n }\n\n private applySharedSlotToSlot(ev: YEvent, path: YPath, slot: Slot) {\n if (path.length) {\n path.shift()\n const delta = (ev.target.parent as YText).toDelta()\n let componentIndex = 0\n for (let i = 0; i < delta.length; i++) {\n const action = delta[i]\n if (action.insert === ev.target) {\n break\n }\n componentIndex += typeof action.insert === 'string' ? action.insert.length : 1\n }\n const component = slot.getContentAtIndex(componentIndex) as ComponentInstance\n this.applySharedComponentToComponent(ev, path, component)\n return\n }\n\n if (ev instanceof YTextEvent) {\n slot.retain(0)\n ev.delta.forEach(action => {\n if (Reflect.has(action, 'retain')) {\n if (action.attributes) {\n slot.retain(action.retain!, Object.keys(action.attributes).map(key => {\n return [this.registry.getFormatter(key)!, action.attributes![key]]\n }))\n }\n slot.retain(action.retain!)\n } else if (action.insert) {\n if (typeof action.insert === 'string') {\n slot.insert(action.insert, action.attributes ? Object.keys(action.attributes).map(key => {\n return [this.registry.getFormatter(key)!, action.attributes![key]]\n }) : [])\n } else {\n const component = this.createComponentBySharedComponent(action.insert as YMap<any>)\n slot.insert(component)\n }\n } else if (action.delete) {\n slot.retain(slot.index)\n slot.delete(action.delete)\n } else if (action.attributes) {\n slot.updateState(draft => {\n Object.assign(draft, action.attributes)\n })\n }\n })\n } else if (ev instanceof YMapEvent) {\n ev.keysChanged.forEach(key => {\n if (key === 'state') {\n const state = (ev.target as YMap<any>).get('state')\n slot.updateState(draft => {\n Object.assign(draft, state)\n })\n }\n })\n }\n }\n\n private createComponentBySharedComponent(yMap: YMap<any>): ComponentInstance {\n const slots = yMap.get('slots') as YArray<YMap<any>>\n const componentLiteral: ComponentLiteral = {\n state: yMap.get('state'),\n name: yMap.get('name'),\n slots: slots.map(sharedSlot => {\n return this.createSlotBySharedSlot(sharedSlot).toJSON()\n })\n }\n return this.translator.createComponent(componentLiteral)!\n }\n\n private createSlotBySharedSlot(sharedSlot: YMap<any>): Slot {\n const content = sharedSlot.get('content') as YText\n const delta = content.toDelta()\n\n const slot = this.translator.createSlot({\n schema: sharedSlot.get('schema'),\n state: sharedSlot.get('state'),\n formats: {},\n content: []\n })\n\n for (const action of delta) {\n if (action.insert) {\n if (typeof action.insert === 'string') {\n slot.insert(action.insert, action.attributes ? Object.keys(action.attributes).map(key => {\n return [this.registry.getFormatter(key)!, action.attributes![key]]\n }) : [])\n } else {\n slot.insert(this.createComponentBySharedComponent(action.insert))\n }\n } else {\n throw collaborateErrorFn('Unexpected delta action.')\n }\n }\n return slot\n }\n}\n"]}
|
package/bundles/collaborate.d.ts
CHANGED
@@ -1,18 +1,39 @@
|
|
1
|
-
import {
|
1
|
+
import { Observable } from '@tanbo/stream';
|
2
|
+
import { RootComponentRef, Starter, Translator, Registry, Selection, SelectionPaths, History, Renderer } from '@textbus/core';
|
2
3
|
import { Doc as YDoc } from 'yjs';
|
3
|
-
import {
|
4
|
-
|
5
|
-
export declare class Collaborate {
|
4
|
+
import { CollaborateCursor, RemoteSelection } from './collab/_api';
|
5
|
+
export declare class Collaborate implements History {
|
6
6
|
private rootComponentRef;
|
7
|
+
private collaborateCursor;
|
7
8
|
private translator;
|
9
|
+
private renderer;
|
8
10
|
private registry;
|
9
|
-
private
|
11
|
+
private selection;
|
10
12
|
private starter;
|
13
|
+
onSelectionChange: Observable<SelectionPaths>;
|
11
14
|
yDoc: YDoc;
|
15
|
+
onBack: Observable<void>;
|
16
|
+
onForward: Observable<void>;
|
17
|
+
onChange: Observable<any>;
|
18
|
+
onPush: Observable<void>;
|
19
|
+
get canBack(): boolean;
|
20
|
+
get canForward(): boolean;
|
21
|
+
private localToRemote;
|
22
|
+
private remoteToLocal;
|
23
|
+
private backEvent;
|
24
|
+
private forwardEvent;
|
25
|
+
private changeEvent;
|
26
|
+
private pushEvent;
|
27
|
+
private manager;
|
12
28
|
private subscriptions;
|
13
29
|
private updateFromSelf;
|
14
|
-
|
15
|
-
|
30
|
+
private selectionChangeEvent;
|
31
|
+
constructor(rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, translator: Translator, renderer: Renderer, registry: Registry, selection: Selection, starter: Starter);
|
32
|
+
setup(): void;
|
33
|
+
updateRemoteSelection(paths: RemoteSelection[]): void;
|
34
|
+
listen(): void;
|
35
|
+
back(): void;
|
36
|
+
forward(): void;
|
16
37
|
destroy(): void;
|
17
|
-
private
|
38
|
+
private listen2;
|
18
39
|
}
|
package/bundles/collaborate.js
CHANGED
@@ -8,51 +8,205 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
9
|
};
|
10
10
|
import { Injectable } from '@tanbo/di';
|
11
|
-
import { debounceTime, filter, tap } from '@tanbo/stream';
|
12
|
-
import { RootComponentRef, Starter, Translator, Registry } from '@textbus/core';
|
13
|
-
import { Doc as YDoc } from 'yjs';
|
14
|
-
import {
|
15
|
-
import {
|
16
|
-
import {
|
17
|
-
// const collaborateErrorFn = makeError('Collaborate')
|
11
|
+
import { debounceTime, filter, Subject, tap } from '@tanbo/stream';
|
12
|
+
import { RootComponentRef, Starter, Translator, Registry, Selection, Renderer } from '@textbus/core';
|
13
|
+
import { Doc as YDoc, UndoManager } from 'yjs';
|
14
|
+
import { LocalToRemote } from './collab/local-to-remote';
|
15
|
+
import { RemoteToLocal } from './collab/remote-to-local';
|
16
|
+
import { CollaborateCursor } from './collab/_api';
|
18
17
|
let Collaborate = class Collaborate {
|
19
|
-
constructor(rootComponentRef, translator, registry,
|
20
|
-
this
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
this
|
27
|
-
|
18
|
+
constructor(rootComponentRef, collaborateCursor, translator, renderer, registry, selection, starter) {
|
19
|
+
Object.defineProperty(this, "rootComponentRef", {
|
20
|
+
enumerable: true,
|
21
|
+
configurable: true,
|
22
|
+
writable: true,
|
23
|
+
value: rootComponentRef
|
24
|
+
});
|
25
|
+
Object.defineProperty(this, "collaborateCursor", {
|
26
|
+
enumerable: true,
|
27
|
+
configurable: true,
|
28
|
+
writable: true,
|
29
|
+
value: collaborateCursor
|
30
|
+
});
|
31
|
+
Object.defineProperty(this, "translator", {
|
32
|
+
enumerable: true,
|
33
|
+
configurable: true,
|
34
|
+
writable: true,
|
35
|
+
value: translator
|
36
|
+
});
|
37
|
+
Object.defineProperty(this, "renderer", {
|
38
|
+
enumerable: true,
|
39
|
+
configurable: true,
|
40
|
+
writable: true,
|
41
|
+
value: renderer
|
42
|
+
});
|
43
|
+
Object.defineProperty(this, "registry", {
|
44
|
+
enumerable: true,
|
45
|
+
configurable: true,
|
46
|
+
writable: true,
|
47
|
+
value: registry
|
48
|
+
});
|
49
|
+
Object.defineProperty(this, "selection", {
|
50
|
+
enumerable: true,
|
51
|
+
configurable: true,
|
52
|
+
writable: true,
|
53
|
+
value: selection
|
54
|
+
});
|
55
|
+
Object.defineProperty(this, "starter", {
|
56
|
+
enumerable: true,
|
57
|
+
configurable: true,
|
58
|
+
writable: true,
|
59
|
+
value: starter
|
60
|
+
});
|
61
|
+
Object.defineProperty(this, "onSelectionChange", {
|
62
|
+
enumerable: true,
|
63
|
+
configurable: true,
|
64
|
+
writable: true,
|
65
|
+
value: void 0
|
66
|
+
});
|
67
|
+
Object.defineProperty(this, "yDoc", {
|
68
|
+
enumerable: true,
|
69
|
+
configurable: true,
|
70
|
+
writable: true,
|
71
|
+
value: new YDoc()
|
72
|
+
});
|
73
|
+
Object.defineProperty(this, "onBack", {
|
74
|
+
enumerable: true,
|
75
|
+
configurable: true,
|
76
|
+
writable: true,
|
77
|
+
value: void 0
|
78
|
+
});
|
79
|
+
Object.defineProperty(this, "onForward", {
|
80
|
+
enumerable: true,
|
81
|
+
configurable: true,
|
82
|
+
writable: true,
|
83
|
+
value: void 0
|
84
|
+
});
|
85
|
+
Object.defineProperty(this, "onChange", {
|
86
|
+
enumerable: true,
|
87
|
+
configurable: true,
|
88
|
+
writable: true,
|
89
|
+
value: void 0
|
90
|
+
});
|
91
|
+
Object.defineProperty(this, "onPush", {
|
92
|
+
enumerable: true,
|
93
|
+
configurable: true,
|
94
|
+
writable: true,
|
95
|
+
value: void 0
|
96
|
+
});
|
97
|
+
Object.defineProperty(this, "localToRemote", {
|
98
|
+
enumerable: true,
|
99
|
+
configurable: true,
|
100
|
+
writable: true,
|
101
|
+
value: new LocalToRemote()
|
102
|
+
});
|
103
|
+
Object.defineProperty(this, "remoteToLocal", {
|
104
|
+
enumerable: true,
|
105
|
+
configurable: true,
|
106
|
+
writable: true,
|
107
|
+
value: new RemoteToLocal(this.translator, this.registry)
|
108
|
+
});
|
109
|
+
Object.defineProperty(this, "backEvent", {
|
110
|
+
enumerable: true,
|
111
|
+
configurable: true,
|
112
|
+
writable: true,
|
113
|
+
value: new Subject()
|
114
|
+
});
|
115
|
+
Object.defineProperty(this, "forwardEvent", {
|
116
|
+
enumerable: true,
|
117
|
+
configurable: true,
|
118
|
+
writable: true,
|
119
|
+
value: new Subject()
|
120
|
+
});
|
121
|
+
Object.defineProperty(this, "changeEvent", {
|
122
|
+
enumerable: true,
|
123
|
+
configurable: true,
|
124
|
+
writable: true,
|
125
|
+
value: new Subject()
|
126
|
+
});
|
127
|
+
Object.defineProperty(this, "pushEvent", {
|
128
|
+
enumerable: true,
|
129
|
+
configurable: true,
|
130
|
+
writable: true,
|
131
|
+
value: new Subject()
|
132
|
+
});
|
133
|
+
Object.defineProperty(this, "manager", {
|
134
|
+
enumerable: true,
|
135
|
+
configurable: true,
|
136
|
+
writable: true,
|
137
|
+
value: void 0
|
138
|
+
});
|
139
|
+
Object.defineProperty(this, "subscriptions", {
|
140
|
+
enumerable: true,
|
141
|
+
configurable: true,
|
142
|
+
writable: true,
|
143
|
+
value: []
|
144
|
+
});
|
145
|
+
Object.defineProperty(this, "updateFromSelf", {
|
146
|
+
enumerable: true,
|
147
|
+
configurable: true,
|
148
|
+
writable: true,
|
149
|
+
value: true
|
150
|
+
});
|
151
|
+
Object.defineProperty(this, "selectionChangeEvent", {
|
152
|
+
enumerable: true,
|
153
|
+
configurable: true,
|
154
|
+
writable: true,
|
155
|
+
value: new Subject()
|
156
|
+
});
|
157
|
+
this.onSelectionChange = this.selectionChangeEvent.asObservable();
|
158
|
+
this.onBack = this.backEvent.asObservable();
|
159
|
+
this.onForward = this.forwardEvent.asObservable();
|
160
|
+
this.onChange = this.changeEvent.asObservable();
|
161
|
+
this.onPush = this.pushEvent.asObservable();
|
162
|
+
}
|
163
|
+
get canBack() {
|
164
|
+
var _a;
|
165
|
+
return (_a = this.manager) === null || _a === void 0 ? void 0 : _a.canUndo();
|
28
166
|
}
|
29
|
-
|
167
|
+
get canForward() {
|
168
|
+
var _a;
|
169
|
+
return (_a = this.manager) === null || _a === void 0 ? void 0 : _a.canRedo();
|
170
|
+
}
|
171
|
+
setup() {
|
30
172
|
this.subscriptions.push(this.starter.onReady.subscribe(() => {
|
31
|
-
this.
|
173
|
+
this.listen2();
|
174
|
+
}), this.selection.onChange.subscribe(() => {
|
175
|
+
const paths = this.selection.getPaths();
|
176
|
+
this.selectionChangeEvent.next(paths);
|
32
177
|
}));
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
178
|
+
}
|
179
|
+
updateRemoteSelection(paths) {
|
180
|
+
this.collaborateCursor.draw(paths);
|
181
|
+
}
|
182
|
+
listen() {
|
183
|
+
//
|
184
|
+
}
|
185
|
+
back() {
|
186
|
+
if (this.canBack) {
|
187
|
+
this.manager.undo();
|
188
|
+
}
|
189
|
+
}
|
190
|
+
forward() {
|
191
|
+
if (this.canForward) {
|
192
|
+
this.manager.redo();
|
193
|
+
}
|
42
194
|
}
|
43
195
|
destroy() {
|
44
196
|
this.subscriptions.forEach(i => i.unsubscribe());
|
45
197
|
}
|
46
|
-
|
47
|
-
const root = this.yDoc.
|
198
|
+
listen2() {
|
199
|
+
const root = this.yDoc.getText('content');
|
48
200
|
const slot = this.rootComponentRef.component.slots.get(0);
|
49
|
-
this.
|
201
|
+
this.manager = new UndoManager(root);
|
50
202
|
root.observeDeep((events, transaction) => {
|
51
203
|
if (transaction.origin === this.yDoc) {
|
52
204
|
return;
|
53
205
|
}
|
54
206
|
this.updateFromSelf = false;
|
55
|
-
remoteToLocal(events, slot
|
207
|
+
this.remoteToLocal.transform(events, slot);
|
208
|
+
this.renderer.render();
|
209
|
+
this.selection.restore();
|
56
210
|
this.updateFromSelf = true;
|
57
211
|
});
|
58
212
|
const operations = [];
|
@@ -63,19 +217,23 @@ let Collaborate = class Collaborate {
|
|
63
217
|
}), debounceTime(1)).subscribe(() => {
|
64
218
|
this.yDoc.transact(() => {
|
65
219
|
operations.forEach(operation => {
|
66
|
-
localToRemote(operation, root);
|
220
|
+
this.localToRemote.transform(operation, root);
|
67
221
|
});
|
68
222
|
operations.length = 0;
|
69
223
|
}, this.yDoc);
|
224
|
+
this.renderer.render();
|
225
|
+
this.selection.restore();
|
70
226
|
}));
|
71
227
|
}
|
72
228
|
};
|
73
229
|
Collaborate = __decorate([
|
74
230
|
Injectable(),
|
75
231
|
__metadata("design:paramtypes", [RootComponentRef,
|
232
|
+
CollaborateCursor,
|
76
233
|
Translator,
|
234
|
+
Renderer,
|
77
235
|
Registry,
|
78
|
-
|
236
|
+
Selection,
|
79
237
|
Starter])
|
80
238
|
], Collaborate);
|
81
239
|
export { Collaborate };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"collaborate.js","sourceRoot":"","sources":["../src/collaborate.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAgB,GAAG,EAAE,MAAM,eAAe,CAAA;
|
1
|
+
{"version":3,"file":"collaborate.js","sourceRoot":"","sources":["../src/collaborate.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@tanbo/di'\nimport { debounceTime, filter, Observable, Subject, Subscription, tap } from '@tanbo/stream'\nimport {\n RootComponentRef,\n Starter,\n Operation,\n Translator,\n Registry,\n Selection,\n SelectionPaths,\n History, Renderer\n} from '@textbus/core'\nimport { Doc as YDoc, UndoManager } from 'yjs'\nimport { LocalToRemote } from './collab/local-to-remote'\nimport { RemoteToLocal } from './collab/remote-to-local'\nimport { CollaborateCursor, RemoteSelection } from './collab/_api'\n\n@Injectable()\nexport class Collaborate implements History {\n onSelectionChange: Observable<SelectionPaths>\n yDoc = new YDoc()\n onBack: Observable<void>\n onForward: Observable<void>\n onChange: Observable<any>\n onPush: Observable<void>\n\n get canBack() {\n return this.manager?.canUndo()\n }\n\n get canForward() {\n return this.manager?.canRedo()\n }\n\n private localToRemote = new LocalToRemote()\n private remoteToLocal = new RemoteToLocal(this.translator, this.registry)\n\n private backEvent = new Subject<void>()\n private forwardEvent = new Subject<void>()\n private changeEvent = new Subject<void>()\n private pushEvent = new Subject<void>()\n\n private manager!: UndoManager\n\n private subscriptions: Subscription[] = []\n private updateFromSelf = true\n\n private selectionChangeEvent = new Subject<SelectionPaths>()\n\n constructor(private rootComponentRef: RootComponentRef,\n private collaborateCursor: CollaborateCursor,\n private translator: Translator,\n private renderer: Renderer,\n private registry: Registry,\n private selection: Selection,\n private starter: Starter) {\n this.onSelectionChange = this.selectionChangeEvent.asObservable()\n this.onBack = this.backEvent.asObservable()\n this.onForward = this.forwardEvent.asObservable()\n this.onChange = this.changeEvent.asObservable()\n this.onPush = this.pushEvent.asObservable()\n }\n\n setup() {\n this.subscriptions.push(\n this.starter.onReady.subscribe(() => {\n this.listen2()\n }),\n this.selection.onChange.subscribe(() => {\n const paths = this.selection.getPaths()\n this.selectionChangeEvent.next(paths)\n })\n )\n }\n\n updateRemoteSelection(paths: RemoteSelection[]) {\n this.collaborateCursor.draw(paths)\n }\n\n listen() {\n //\n }\n\n back() {\n if (this.canBack) {\n this.manager.undo()\n }\n }\n\n forward() {\n if (this.canForward) {\n this.manager.redo()\n }\n }\n\n destroy() {\n this.subscriptions.forEach(i => i.unsubscribe())\n }\n\n private listen2() {\n const root = this.yDoc.getText('content')\n const slot = this.rootComponentRef.component.slots.get(0)!\n this.manager = new UndoManager(root)\n root.observeDeep((events, transaction) => {\n if (transaction.origin === this.yDoc) {\n return\n }\n this.updateFromSelf = false\n\n this.remoteToLocal.transform(events, slot)\n this.renderer.render()\n this.selection.restore()\n this.updateFromSelf = true\n })\n const operations: Operation[] = []\n this.subscriptions.push(\n this.rootComponentRef.component.changeMarker.onChange.pipe(\n filter(() => {\n return this.updateFromSelf\n }),\n tap(op => {\n operations.push(op)\n }),\n debounceTime(1)\n ).subscribe(() => {\n this.yDoc.transact(() => {\n operations.forEach(operation => {\n this.localToRemote.transform(operation, root)\n })\n operations.length = 0\n }, this.yDoc)\n this.renderer.render()\n this.selection.restore()\n })\n )\n }\n}\n"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA"}
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA","sourcesContent":["export * from './collab/_api'\nexport * from './collaborate'\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@textbus/collaborate",
|
3
|
-
"version": "2.0.0-alpha.
|
3
|
+
"version": "2.0.0-alpha.40",
|
4
4
|
"description": "TextBus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
|
5
5
|
"main": "./bundles/public-api.js",
|
6
6
|
"module": "./bundles/public-api.js",
|
@@ -26,8 +26,9 @@
|
|
26
26
|
],
|
27
27
|
"dependencies": {
|
28
28
|
"@tanbo/di": "^1.0.5",
|
29
|
-
"@tanbo/stream": "^0.0.
|
30
|
-
"@textbus/
|
29
|
+
"@tanbo/stream": "^0.0.12",
|
30
|
+
"@textbus/browser": "^2.0.0-alpha.40",
|
31
|
+
"@textbus/core": "^2.0.0-alpha.40",
|
31
32
|
"reflect-metadata": "^0.1.13",
|
32
33
|
"y-protocols": "^1.0.5",
|
33
34
|
"yjs": "^13.5.27"
|
@@ -43,5 +44,5 @@
|
|
43
44
|
"bugs": {
|
44
45
|
"url": "https://github.com/textbus/textbus.git/issues"
|
45
46
|
},
|
46
|
-
"gitHead": "
|
47
|
+
"gitHead": "8b4da87f5f142fea6243a956e03d39bb42eccc4b"
|
47
48
|
}
|
package/src/collab/_api.ts
CHANGED
@@ -0,0 +1,233 @@
|
|
1
|
+
import { Inject, Injectable } from '@tanbo/di'
|
2
|
+
import { createElement, EDITABLE_DOCUMENT, EDITOR_CONTAINER, SelectionBridge } from '@textbus/browser'
|
3
|
+
import { Selection, SelectionPaths } from '@textbus/core'
|
4
|
+
import { Subject } from '@tanbo/stream'
|
5
|
+
|
6
|
+
export interface RemoteSelection {
|
7
|
+
color: string
|
8
|
+
username: string
|
9
|
+
paths: SelectionPaths
|
10
|
+
}
|
11
|
+
|
12
|
+
export interface SelectionRect {
|
13
|
+
x: number
|
14
|
+
y: number
|
15
|
+
width: number
|
16
|
+
height: number
|
17
|
+
}
|
18
|
+
|
19
|
+
export interface SelectionInfo {
|
20
|
+
color: string
|
21
|
+
username: string
|
22
|
+
rects: SelectionRect[]
|
23
|
+
}
|
24
|
+
|
25
|
+
export interface RemoteSelectionCursor {
|
26
|
+
cursor: HTMLElement
|
27
|
+
anchor: HTMLElement
|
28
|
+
userTip: HTMLElement
|
29
|
+
}
|
30
|
+
|
31
|
+
@Injectable()
|
32
|
+
export class CollaborateCursor {
|
33
|
+
private canvas = createElement('canvas', {
|
34
|
+
styles: {
|
35
|
+
position: 'absolute',
|
36
|
+
opacity: 0.5,
|
37
|
+
left: 0,
|
38
|
+
top: 0,
|
39
|
+
width: '100%',
|
40
|
+
height: '100%',
|
41
|
+
pointerEvents: 'none'
|
42
|
+
}
|
43
|
+
}) as HTMLCanvasElement
|
44
|
+
private context = this.canvas.getContext('2d')!
|
45
|
+
private tooltips = createElement('div', {
|
46
|
+
styles: {
|
47
|
+
position: 'absolute',
|
48
|
+
left: 0,
|
49
|
+
top: 0,
|
50
|
+
width: '100%',
|
51
|
+
height: '100%',
|
52
|
+
pointerEvents: 'none',
|
53
|
+
fontSize: '12px'
|
54
|
+
}
|
55
|
+
})
|
56
|
+
|
57
|
+
private onRectsChange = new Subject<SelectionInfo>()
|
58
|
+
|
59
|
+
constructor(@Inject(EDITOR_CONTAINER) private container: HTMLElement,
|
60
|
+
@Inject(EDITABLE_DOCUMENT) private document: Document,
|
61
|
+
private nativeSelection: SelectionBridge,
|
62
|
+
private selection: Selection) {
|
63
|
+
container.appendChild(this.canvas)
|
64
|
+
container.appendChild(this.tooltips)
|
65
|
+
this.onRectsChange.subscribe(info => {
|
66
|
+
const color = info.color
|
67
|
+
const rects = info.rects
|
68
|
+
for (const rect of rects) {
|
69
|
+
this.context.fillStyle = color
|
70
|
+
this.context.beginPath()
|
71
|
+
this.context.rect(rect.x, rect.y, rect.width, rect.height)
|
72
|
+
this.context.fill()
|
73
|
+
this.context.closePath()
|
74
|
+
}
|
75
|
+
})
|
76
|
+
}
|
77
|
+
|
78
|
+
draw(paths: RemoteSelection[]) {
|
79
|
+
this.canvas.width = this.container.offsetWidth
|
80
|
+
this.canvas.height = this.container.offsetHeight
|
81
|
+
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height)
|
82
|
+
|
83
|
+
const users: SelectionInfo[] = []
|
84
|
+
|
85
|
+
paths.filter(i => {
|
86
|
+
return i.paths.start.length && i.paths.end.length
|
87
|
+
}).forEach(item => {
|
88
|
+
const startOffset = item.paths.start.pop()!
|
89
|
+
const startSlot = this.selection.findSlotByPaths(item.paths.start)
|
90
|
+
const endOffset = item.paths.end.pop()!
|
91
|
+
const endSlot = this.selection.findSlotByPaths(item.paths.end)
|
92
|
+
|
93
|
+
if (startSlot && endSlot) {
|
94
|
+
const position = this.nativeSelection.getPositionByRange({
|
95
|
+
startOffset,
|
96
|
+
endOffset,
|
97
|
+
startSlot,
|
98
|
+
endSlot
|
99
|
+
})
|
100
|
+
if (position.start && position.end) {
|
101
|
+
const nativeRange = this.document.createRange()
|
102
|
+
nativeRange.setStart(position.start.node, position.start.offset)
|
103
|
+
nativeRange.setEnd(position.end.node, position.end.offset)
|
104
|
+
|
105
|
+
const rects = nativeRange.getClientRects()
|
106
|
+
const selectionRects: SelectionRect[] = []
|
107
|
+
for (let i = rects.length - 1; i >= 0; i--) {
|
108
|
+
const rect = rects[i]
|
109
|
+
selectionRects.push({
|
110
|
+
x: rect.x,
|
111
|
+
y: rect.y,
|
112
|
+
width: rect.width,
|
113
|
+
height: rect.height,
|
114
|
+
})
|
115
|
+
}
|
116
|
+
|
117
|
+
if (rects.length === 0) {
|
118
|
+
const rect = nativeRange.getBoundingClientRect()
|
119
|
+
if (rect.x !== 0 || rect.y !== 0 || rect.width !== 0 || rect.height !== 0) {
|
120
|
+
selectionRects.push({
|
121
|
+
x: rect.x,
|
122
|
+
y: rect.y,
|
123
|
+
width: 1,
|
124
|
+
height: rect.height,
|
125
|
+
})
|
126
|
+
}
|
127
|
+
}
|
128
|
+
const info: SelectionInfo = {
|
129
|
+
...item,
|
130
|
+
rects: selectionRects
|
131
|
+
}
|
132
|
+
this.onRectsChange.next(info)
|
133
|
+
|
134
|
+
users.push(info)
|
135
|
+
}
|
136
|
+
}
|
137
|
+
})
|
138
|
+
this.drawUserCursor(users)
|
139
|
+
}
|
140
|
+
|
141
|
+
private drawUserCursor(users: SelectionInfo[]) {
|
142
|
+
for (let i = 0; i < users.length; i++) {
|
143
|
+
const user = users[i]
|
144
|
+
const last = user.rects[user.rects.length - 1]
|
145
|
+
|
146
|
+
const {cursor, userTip, anchor} = this.getUserCursor(i)
|
147
|
+
if (!last) {
|
148
|
+
cursor.style.display = 'none'
|
149
|
+
} else {
|
150
|
+
Object.assign(cursor.style, {
|
151
|
+
left: last.x + last.width + 'px',
|
152
|
+
top: last.y + 'px',
|
153
|
+
width: '2px',
|
154
|
+
height: last.height + 'px',
|
155
|
+
background: user.color,
|
156
|
+
display: 'block'
|
157
|
+
})
|
158
|
+
anchor.style.background = user.color
|
159
|
+
userTip.innerText = user.username
|
160
|
+
userTip.style.background = user.color
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
for (let i = users.length; i < this.tooltips.children.length; i++) {
|
165
|
+
this.tooltips.removeChild(this.tooltips.children[i])
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
private getUserCursor(index: number): RemoteSelectionCursor {
|
170
|
+
let child: HTMLElement = this.tooltips.children[index] as HTMLElement
|
171
|
+
if (child) {
|
172
|
+
const anchor = child.children[0] as HTMLElement
|
173
|
+
return {
|
174
|
+
cursor: child,
|
175
|
+
anchor,
|
176
|
+
userTip: anchor.children[0] as HTMLElement
|
177
|
+
}
|
178
|
+
}
|
179
|
+
const userTip = createElement('span', {
|
180
|
+
styles: {
|
181
|
+
position: 'absolute',
|
182
|
+
display: 'none',
|
183
|
+
left: '50%',
|
184
|
+
transform: 'translateX(-50%)',
|
185
|
+
marginBottom: '2px',
|
186
|
+
bottom: '100%',
|
187
|
+
whiteSpace: 'nowrap',
|
188
|
+
color: '#fff',
|
189
|
+
boxShadow: '0 1px 2px rgba(0,0,0,.1)',
|
190
|
+
borderRadius: '3px',
|
191
|
+
padding: '3px 5px',
|
192
|
+
pointerEvents: 'none',
|
193
|
+
}
|
194
|
+
})
|
195
|
+
|
196
|
+
const anchor = createElement('span', {
|
197
|
+
styles: {
|
198
|
+
position: 'absolute',
|
199
|
+
top: '-2px',
|
200
|
+
left: '-2px',
|
201
|
+
width: '6px',
|
202
|
+
height: '6px',
|
203
|
+
pointerEvents: 'auto',
|
204
|
+
pointer: 'cursor',
|
205
|
+
},
|
206
|
+
children: [userTip],
|
207
|
+
on: {
|
208
|
+
mouseenter() {
|
209
|
+
anchor.style.transform = 'scale(1.2)'
|
210
|
+
userTip.style.display = 'block'
|
211
|
+
},
|
212
|
+
mouseleave() {
|
213
|
+
userTip.style.display = 'none'
|
214
|
+
anchor.style.transform = ''
|
215
|
+
}
|
216
|
+
}
|
217
|
+
})
|
218
|
+
child = createElement('span', {
|
219
|
+
styles: {
|
220
|
+
position: 'absolute',
|
221
|
+
},
|
222
|
+
children: [
|
223
|
+
anchor
|
224
|
+
]
|
225
|
+
})
|
226
|
+
this.tooltips.append(child)
|
227
|
+
return {
|
228
|
+
cursor: child,
|
229
|
+
anchor,
|
230
|
+
userTip
|
231
|
+
}
|
232
|
+
}
|
233
|
+
}
|