@textbus/collaborate 2.0.0-beta.4 → 2.0.0-beta.40
Sign up to get free protection for your applications and to get access to all the features.
- package/bundles/{collab/collaborate-cursor.d.ts → collaborate-cursor.d.ts} +17 -6
- package/bundles/collaborate-cursor.js +327 -0
- package/bundles/collaborate.d.ts +11 -5
- package/bundles/collaborate.js +206 -51
- package/bundles/fixed-caret.plugin.d.ts +9 -0
- package/bundles/fixed-caret.plugin.js +41 -0
- package/bundles/public-api.d.ts +4 -1
- package/bundles/public-api.js +16 -2
- package/bundles/unknown.component.d.ts +1 -0
- package/bundles/unknown.component.js +22 -0
- package/package.json +7 -7
- package/src/collaborate-cursor.ts +293 -0
- package/src/collaborate.ts +194 -54
- package/src/fixed-caret.plugin.ts +35 -0
- package/src/public-api.ts +18 -1
- package/src/unknown.component.ts +22 -0
- package/bundles/collab/_api.d.ts +0 -1
- package/bundles/collab/_api.js +0 -2
- package/bundles/collab/collaborate-cursor.js +0 -245
- package/src/collab/_api.ts +0 -1
- package/src/collab/collaborate-cursor.ts +0 -225
@@ -1,33 +1,44 @@
|
|
1
1
|
import { SelectionBridge } from '@textbus/browser';
|
2
|
-
import { Selection, SelectionPaths } from '@textbus/core';
|
2
|
+
import { Selection, SelectionPaths, Range as TBRange } from '@textbus/core';
|
3
3
|
export interface RemoteSelection {
|
4
4
|
color: string;
|
5
5
|
username: string;
|
6
6
|
paths: SelectionPaths;
|
7
7
|
}
|
8
|
-
export interface
|
9
|
-
color: string;
|
10
|
-
username: string;
|
8
|
+
export interface Rect {
|
11
9
|
x: number;
|
12
10
|
y: number;
|
13
11
|
width: number;
|
14
12
|
height: number;
|
15
13
|
}
|
14
|
+
export interface SelectionRect extends Rect {
|
15
|
+
color: string;
|
16
|
+
username: string;
|
17
|
+
}
|
16
18
|
export interface RemoteSelectionCursor {
|
17
19
|
cursor: HTMLElement;
|
18
20
|
anchor: HTMLElement;
|
19
21
|
userTip: HTMLElement;
|
20
22
|
}
|
23
|
+
export declare abstract class CollaborateCursorAwarenessDelegate {
|
24
|
+
abstract getRects(range: TBRange, nativeRange: Range): false | Rect[];
|
25
|
+
}
|
21
26
|
export declare class CollaborateCursor {
|
22
27
|
private container;
|
23
|
-
private
|
28
|
+
private awarenessDelegate;
|
24
29
|
private nativeSelection;
|
25
30
|
private selection;
|
31
|
+
private host;
|
32
|
+
private canvasContainer;
|
26
33
|
private canvas;
|
27
34
|
private context;
|
28
35
|
private tooltips;
|
29
36
|
private onRectsChange;
|
30
|
-
|
37
|
+
private subscription;
|
38
|
+
private currentSelection;
|
39
|
+
constructor(container: HTMLElement, awarenessDelegate: CollaborateCursorAwarenessDelegate, nativeSelection: SelectionBridge, selection: Selection);
|
40
|
+
refresh(): void;
|
41
|
+
destroy(): void;
|
31
42
|
draw(paths: RemoteSelection[]): void;
|
32
43
|
private drawUserCursor;
|
33
44
|
private getUserCursor;
|
@@ -0,0 +1,327 @@
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
+
};
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
|
+
};
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
12
|
+
};
|
13
|
+
import { Inject, Injectable, Optional } from '@tanbo/di';
|
14
|
+
import { createElement, VIEW_CONTAINER, getLayoutRectByRange, SelectionBridge } from '@textbus/browser';
|
15
|
+
import { Selection } from '@textbus/core';
|
16
|
+
import { fromEvent, Subject, Subscription } from '@tanbo/stream';
|
17
|
+
export class CollaborateCursorAwarenessDelegate {
|
18
|
+
}
|
19
|
+
let CollaborateCursor = class CollaborateCursor {
|
20
|
+
constructor(container, awarenessDelegate, nativeSelection, selection) {
|
21
|
+
Object.defineProperty(this, "container", {
|
22
|
+
enumerable: true,
|
23
|
+
configurable: true,
|
24
|
+
writable: true,
|
25
|
+
value: container
|
26
|
+
});
|
27
|
+
Object.defineProperty(this, "awarenessDelegate", {
|
28
|
+
enumerable: true,
|
29
|
+
configurable: true,
|
30
|
+
writable: true,
|
31
|
+
value: awarenessDelegate
|
32
|
+
});
|
33
|
+
Object.defineProperty(this, "nativeSelection", {
|
34
|
+
enumerable: true,
|
35
|
+
configurable: true,
|
36
|
+
writable: true,
|
37
|
+
value: nativeSelection
|
38
|
+
});
|
39
|
+
Object.defineProperty(this, "selection", {
|
40
|
+
enumerable: true,
|
41
|
+
configurable: true,
|
42
|
+
writable: true,
|
43
|
+
value: selection
|
44
|
+
});
|
45
|
+
Object.defineProperty(this, "host", {
|
46
|
+
enumerable: true,
|
47
|
+
configurable: true,
|
48
|
+
writable: true,
|
49
|
+
value: createElement('div', {
|
50
|
+
styles: {
|
51
|
+
position: 'absolute',
|
52
|
+
left: 0,
|
53
|
+
top: 0,
|
54
|
+
width: '100%',
|
55
|
+
height: '100%',
|
56
|
+
pointerEvents: 'none',
|
57
|
+
zIndex: 1
|
58
|
+
}
|
59
|
+
})
|
60
|
+
});
|
61
|
+
Object.defineProperty(this, "canvasContainer", {
|
62
|
+
enumerable: true,
|
63
|
+
configurable: true,
|
64
|
+
writable: true,
|
65
|
+
value: createElement('div', {
|
66
|
+
styles: {
|
67
|
+
position: 'absolute',
|
68
|
+
left: 0,
|
69
|
+
top: 0,
|
70
|
+
width: '100%',
|
71
|
+
height: '100%',
|
72
|
+
overflow: 'hidden'
|
73
|
+
}
|
74
|
+
})
|
75
|
+
});
|
76
|
+
Object.defineProperty(this, "canvas", {
|
77
|
+
enumerable: true,
|
78
|
+
configurable: true,
|
79
|
+
writable: true,
|
80
|
+
value: createElement('canvas', {
|
81
|
+
styles: {
|
82
|
+
position: 'absolute',
|
83
|
+
opacity: 0.5,
|
84
|
+
left: 0,
|
85
|
+
top: 0,
|
86
|
+
width: '100%',
|
87
|
+
height: document.documentElement.clientHeight + 'px',
|
88
|
+
pointerEvents: 'none',
|
89
|
+
}
|
90
|
+
})
|
91
|
+
});
|
92
|
+
Object.defineProperty(this, "context", {
|
93
|
+
enumerable: true,
|
94
|
+
configurable: true,
|
95
|
+
writable: true,
|
96
|
+
value: this.canvas.getContext('2d')
|
97
|
+
});
|
98
|
+
Object.defineProperty(this, "tooltips", {
|
99
|
+
enumerable: true,
|
100
|
+
configurable: true,
|
101
|
+
writable: true,
|
102
|
+
value: createElement('div', {
|
103
|
+
styles: {
|
104
|
+
position: 'absolute',
|
105
|
+
left: 0,
|
106
|
+
top: 0,
|
107
|
+
width: '100%',
|
108
|
+
height: '100%',
|
109
|
+
pointerEvents: 'none',
|
110
|
+
fontSize: '12px',
|
111
|
+
zIndex: 10
|
112
|
+
}
|
113
|
+
})
|
114
|
+
});
|
115
|
+
Object.defineProperty(this, "onRectsChange", {
|
116
|
+
enumerable: true,
|
117
|
+
configurable: true,
|
118
|
+
writable: true,
|
119
|
+
value: new Subject()
|
120
|
+
});
|
121
|
+
Object.defineProperty(this, "subscription", {
|
122
|
+
enumerable: true,
|
123
|
+
configurable: true,
|
124
|
+
writable: true,
|
125
|
+
value: new Subscription()
|
126
|
+
});
|
127
|
+
Object.defineProperty(this, "currentSelection", {
|
128
|
+
enumerable: true,
|
129
|
+
configurable: true,
|
130
|
+
writable: true,
|
131
|
+
value: []
|
132
|
+
});
|
133
|
+
this.canvasContainer.append(this.canvas);
|
134
|
+
this.host.append(this.canvasContainer, this.tooltips);
|
135
|
+
container.prepend(this.host);
|
136
|
+
this.subscription.add(this.onRectsChange.subscribe(rects => {
|
137
|
+
for (const rect of rects) {
|
138
|
+
this.context.fillStyle = rect.color;
|
139
|
+
this.context.beginPath();
|
140
|
+
this.context.rect(rect.x, rect.y, rect.width, rect.height);
|
141
|
+
this.context.fill();
|
142
|
+
this.context.closePath();
|
143
|
+
}
|
144
|
+
}), fromEvent(window, 'resize').subscribe(() => {
|
145
|
+
this.canvas.style.height = document.documentElement.clientHeight + 'px';
|
146
|
+
this.refresh();
|
147
|
+
}));
|
148
|
+
}
|
149
|
+
refresh() {
|
150
|
+
this.draw(this.currentSelection);
|
151
|
+
}
|
152
|
+
destroy() {
|
153
|
+
this.subscription.unsubscribe();
|
154
|
+
}
|
155
|
+
draw(paths) {
|
156
|
+
this.currentSelection = paths;
|
157
|
+
const containerRect = this.container.getBoundingClientRect();
|
158
|
+
this.canvas.style.top = containerRect.y * -1 + 'px';
|
159
|
+
this.canvas.width = this.canvas.offsetWidth;
|
160
|
+
this.canvas.height = this.canvas.offsetHeight;
|
161
|
+
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
162
|
+
const users = [];
|
163
|
+
paths.filter(i => {
|
164
|
+
return i.paths.anchor.length && i.paths.focus.length;
|
165
|
+
}).forEach(item => {
|
166
|
+
const anchorPaths = [...item.paths.anchor];
|
167
|
+
const focusPaths = [...item.paths.focus];
|
168
|
+
const anchorOffset = anchorPaths.pop();
|
169
|
+
const anchorSlot = this.selection.findSlotByPaths(anchorPaths);
|
170
|
+
const focusOffset = focusPaths.pop();
|
171
|
+
const focusSlot = this.selection.findSlotByPaths(focusPaths);
|
172
|
+
if (!anchorSlot || !focusSlot) {
|
173
|
+
return;
|
174
|
+
}
|
175
|
+
const { focus, anchor } = this.nativeSelection.getPositionByRange({
|
176
|
+
focusOffset,
|
177
|
+
anchorOffset,
|
178
|
+
focusSlot,
|
179
|
+
anchorSlot
|
180
|
+
});
|
181
|
+
if (!focus || !anchor) {
|
182
|
+
return;
|
183
|
+
}
|
184
|
+
const nativeRange = document.createRange();
|
185
|
+
nativeRange.setStart(anchor.node, anchor.offset);
|
186
|
+
nativeRange.setEnd(focus.node, focus.offset);
|
187
|
+
if ((anchor.node !== focus.node || anchor.offset !== focus.offset) && nativeRange.collapsed) {
|
188
|
+
nativeRange.setStart(focus.node, focus.offset);
|
189
|
+
nativeRange.setEnd(anchor.node, anchor.offset);
|
190
|
+
}
|
191
|
+
let rects = false;
|
192
|
+
if (this.awarenessDelegate) {
|
193
|
+
rects = this.awarenessDelegate.getRects({
|
194
|
+
focusOffset,
|
195
|
+
anchorOffset,
|
196
|
+
focusSlot,
|
197
|
+
anchorSlot
|
198
|
+
}, nativeRange);
|
199
|
+
}
|
200
|
+
if (!rects) {
|
201
|
+
rects = nativeRange.getClientRects();
|
202
|
+
}
|
203
|
+
const selectionRects = [];
|
204
|
+
for (let i = rects.length - 1; i >= 0; i--) {
|
205
|
+
const rect = rects[i];
|
206
|
+
selectionRects.push({
|
207
|
+
color: item.color,
|
208
|
+
username: item.username,
|
209
|
+
x: rect.x - containerRect.x,
|
210
|
+
y: rect.y,
|
211
|
+
width: rect.width,
|
212
|
+
height: rect.height,
|
213
|
+
});
|
214
|
+
}
|
215
|
+
this.onRectsChange.next(selectionRects);
|
216
|
+
const cursorRange = nativeRange.cloneRange();
|
217
|
+
cursorRange.setStart(focus.node, focus.offset);
|
218
|
+
cursorRange.collapse(true);
|
219
|
+
const cursorRect = getLayoutRectByRange(cursorRange);
|
220
|
+
const rect = {
|
221
|
+
username: item.username,
|
222
|
+
color: item.color,
|
223
|
+
x: cursorRect.x - containerRect.x,
|
224
|
+
y: cursorRect.y - containerRect.y,
|
225
|
+
width: 2,
|
226
|
+
height: cursorRect.height
|
227
|
+
};
|
228
|
+
if (rect.x < 0 || rect.y < 0 || rect.x > containerRect.width) {
|
229
|
+
return;
|
230
|
+
}
|
231
|
+
users.push(rect);
|
232
|
+
});
|
233
|
+
this.drawUserCursor(users);
|
234
|
+
}
|
235
|
+
drawUserCursor(rects) {
|
236
|
+
for (let i = 0; i < rects.length; i++) {
|
237
|
+
const rect = rects[i];
|
238
|
+
const { cursor, userTip, anchor } = this.getUserCursor(i);
|
239
|
+
Object.assign(cursor.style, {
|
240
|
+
left: rect.x + 'px',
|
241
|
+
top: rect.y + 'px',
|
242
|
+
width: rect.width + 'px',
|
243
|
+
height: rect.height + 'px',
|
244
|
+
background: rect.color,
|
245
|
+
display: 'block'
|
246
|
+
});
|
247
|
+
anchor.style.background = rect.color;
|
248
|
+
userTip.innerText = rect.username;
|
249
|
+
userTip.style.background = rect.color;
|
250
|
+
}
|
251
|
+
for (let i = rects.length; i < this.tooltips.children.length; i++) {
|
252
|
+
this.tooltips.removeChild(this.tooltips.children[i]);
|
253
|
+
}
|
254
|
+
}
|
255
|
+
getUserCursor(index) {
|
256
|
+
let child = this.tooltips.children[index];
|
257
|
+
if (child) {
|
258
|
+
const anchor = child.children[0];
|
259
|
+
return {
|
260
|
+
cursor: child,
|
261
|
+
anchor,
|
262
|
+
userTip: anchor.children[0]
|
263
|
+
};
|
264
|
+
}
|
265
|
+
const userTip = createElement('span', {
|
266
|
+
styles: {
|
267
|
+
position: 'absolute',
|
268
|
+
display: 'none',
|
269
|
+
left: '50%',
|
270
|
+
transform: 'translateX(-50%)',
|
271
|
+
marginBottom: '2px',
|
272
|
+
bottom: '100%',
|
273
|
+
whiteSpace: 'nowrap',
|
274
|
+
color: '#fff',
|
275
|
+
boxShadow: '0 1px 2px rgba(0,0,0,.1)',
|
276
|
+
borderRadius: '3px',
|
277
|
+
padding: '3px 5px',
|
278
|
+
pointerEvents: 'none',
|
279
|
+
}
|
280
|
+
});
|
281
|
+
const anchor = createElement('span', {
|
282
|
+
styles: {
|
283
|
+
position: 'absolute',
|
284
|
+
top: '-2px',
|
285
|
+
left: '-2px',
|
286
|
+
width: '6px',
|
287
|
+
height: '6px',
|
288
|
+
pointerEvents: 'auto',
|
289
|
+
pointer: 'cursor',
|
290
|
+
},
|
291
|
+
children: [userTip],
|
292
|
+
on: {
|
293
|
+
mouseenter() {
|
294
|
+
userTip.style.display = 'block';
|
295
|
+
},
|
296
|
+
mouseleave() {
|
297
|
+
userTip.style.display = 'none';
|
298
|
+
}
|
299
|
+
}
|
300
|
+
});
|
301
|
+
child = createElement('span', {
|
302
|
+
styles: {
|
303
|
+
position: 'absolute',
|
304
|
+
},
|
305
|
+
children: [
|
306
|
+
anchor
|
307
|
+
]
|
308
|
+
});
|
309
|
+
this.tooltips.append(child);
|
310
|
+
return {
|
311
|
+
cursor: child,
|
312
|
+
anchor,
|
313
|
+
userTip
|
314
|
+
};
|
315
|
+
}
|
316
|
+
};
|
317
|
+
CollaborateCursor = __decorate([
|
318
|
+
Injectable(),
|
319
|
+
__param(0, Inject(VIEW_CONTAINER)),
|
320
|
+
__param(1, Optional()),
|
321
|
+
__metadata("design:paramtypes", [HTMLElement,
|
322
|
+
CollaborateCursorAwarenessDelegate,
|
323
|
+
SelectionBridge,
|
324
|
+
Selection])
|
325
|
+
], CollaborateCursor);
|
326
|
+
export { CollaborateCursor };
|
327
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEQsT0FBTyxFQUNMLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUEwQmhFLE1BQU0sT0FBZ0Isa0NBQWtDO0NBRXZEO0FBR0QsSUFBYSxpQkFBaUIsR0FBOUIsTUFBYSxpQkFBaUI7SUFvRDVCLFlBQTRDLFNBQXNCLEVBQ2xDLGlCQUFxRCxFQUNqRSxlQUFnQyxFQUNoQyxTQUFvQjs7Ozs7bUJBSEk7Ozs7OzttQkFDWjs7Ozs7O21CQUNaOzs7Ozs7bUJBQ0E7O1FBdERwQjs7OzttQkFBZSxhQUFhLENBQUMsS0FBSyxFQUFFO2dCQUNsQyxNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLElBQUksRUFBRSxDQUFDO29CQUNQLEdBQUcsRUFBRSxDQUFDO29CQUNOLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxNQUFNO29CQUNkLGFBQWEsRUFBRSxNQUFNO29CQUNyQixNQUFNLEVBQUUsQ0FBQztpQkFDVjthQUNGLENBQUM7V0FBQTtRQUNGOzs7O21CQUEwQixhQUFhLENBQUMsS0FBSyxFQUFFO2dCQUM3QyxNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLElBQUksRUFBRSxDQUFDO29CQUNQLEdBQUcsRUFBRSxDQUFDO29CQUNOLEtBQUssRUFBRSxN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QUFpQixDQTZQN0I7U0E3UFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7XG4gIGNyZWF0ZUVsZW1lbnQsXG4gIFZJRVdfQ09OVEFJTkVSLFxuICBnZXRMYXlvdXRSZWN0QnlSYW5nZSxcbiAgU2VsZWN0aW9uQnJpZGdlXG59IGZyb20gJ0B0ZXh0YnVzL2Jyb3dzZXInXG5pbXBvcnQgeyBTZWxlY3Rpb24sIFNlbGVjdGlvblBhdGhzLCBSYW5nZSBhcyBUQlJhbmdlIH0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHRhbmJvL3N0cmVhbSdcblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTZWxlY3Rpb24ge1xuICBjb2xvcjogc3RyaW5nXG4gIHVzZXJuYW1lOiBzdHJpbmdcbiAgcGF0aHM6IFNlbGVjdGlvblBhdGhzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbiAgd2lkdGg6IG51bWJlclxuICBoZWlnaHQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvblJlY3QgZXh0ZW5kcyBSZWN0IHtcbiAgY29sb3I6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2VsZWN0aW9uQ3Vyc29yIHtcbiAgY3Vyc29yOiBIVE1MRWxlbWVudFxuICBhbmNob3I6IEhUTUxFbGVtZW50XG4gIHVzZXJUaXA6IEhUTUxFbGVtZW50XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2xsYWJvcmF0ZUN1cnNvckF3YXJlbmVzc0RlbGVnYXRlIHtcbiAgYWJzdHJhY3QgZ2V0UmVjdHMocmFuZ2U6IFRCUmFuZ2UsIG5hdGl2ZVJhbmdlOiBSYW5nZSk6IGZhbHNlIHwgUmVjdFtdXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZUN1cnNvciB7XG4gIHByaXZhdGUgaG9zdCA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHpJbmRleDogMVxuICAgIH1cbiAgfSlcbiAgcHJpdmF0ZSBjYW52YXNDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgc3R5bGVzOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICB9XG4gIH0pXG4gIHByaXZhdGUgY2FudmFzID0gY3JlYXRlRWxlbWVudCgnY2FudmFzJywge1xuICAgIHN0eWxlczoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCArICdweCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgfVxuICB9KSBhcyBIVE1MQ2FudmFzRWxlbWVudFxuICBwcml2YXRlIGNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIVxuICBwcml2YXRlIHRvb2x0aXBzID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgIHN0eWxlczoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgZm9udFNpemU6ICcxMnB4JyxcbiAgICAgIHpJbmRleDogMTBcbiAgICB9XG4gIH0pXG5cbiAgcHJpdmF0ZSBvblJlY3RzQ2hhbmdlID0gbmV3IFN1YmplY3Q8U2VsZWN0aW9uUmVjdFtdPigpXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKClcbiAgcHJpdmF0ZSBjdXJyZW50U2VsZWN0aW9uOiBSZW1vdGVTZWxlY3Rpb25bXSA9IFtdXG5cbiAgY29uc3RydWN0b3IoQEluamVjdChWSUVXX0NPTlRBSU5FUikgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGF3YXJlbmVzc0RlbGVnYXRlOiBDb2xsYWJvcmF0ZUN1cnNvckF3YXJlbmVzc0RlbGVnYXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIG5hdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uQnJpZGdlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uKSB7XG4gICAgdGhpcy5jYW52YXNDb250YWluZXIuYXBwZW5kKHRoaXMuY2FudmFzKVxuICAgIHRoaXMuaG9zdC5hcHBlbmQodGhpcy5jYW52YXNDb250YWluZXIsIHRoaXMudG9vbHRpcHMpXG4gICAgY29udGFpbmVyLnByZXBlbmQodGhpcy5ob3N0KVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLm9uUmVjdHNDaGFuZ2Uuc3Vic2NyaWJlKHJlY3RzID0+IHtcbiAgICAgIGZvciAoY29uc3QgcmVjdCBvZiByZWN0cykge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gcmVjdC5jb2xvclxuICAgICAgICB0aGlzLmNvbnRleHQuYmVnaW5QYXRoKClcbiAgICAgICAgdGhpcy5jb250ZXh0LnJlY3QocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KVxuICAgICAgICB0aGlzLmNvbnRleHQuZmlsbCgpXG4gICAgICAgIHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKVxuICAgICAgfVxuICAgIH0pLCBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgKyAncHgnXG4gICAgICB0aGlzLnJlZnJlc2goKVxuICAgIH0pKVxuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLmRyYXcodGhpcy5jdXJyZW50U2VsZWN0aW9uKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gIH1cblxuICBkcmF3KHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHBhdGhzXG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgdGhpcy5jYW52YXMuc3R5bGUudG9wID0gY29udGFpbmVyUmVjdC55ICogLTEgKyAncHgnXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5vZmZzZXRXaWR0aFxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodClcblxuICAgIGNvbnN0IHVzZXJzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuXG4gICAgcGF0aHMuZmlsdGVyKGkgPT4ge1xuICAgICAgcmV0dXJuIGkucGF0aHMuYW5jaG9yLmxlbmd0aCAmJiBpLnBhdGhzLmZvY3VzLmxlbmd0aFxuICAgIH0pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBhbmNob3JQYXRocyA9IFsuLi5pdGVtLnBhdGhzLmFuY2hvcl1cbiAgICAgIGNvbnN0IGZvY3VzUGF0aHMgPSBbLi4uaXRlbS5wYXRocy5mb2N1c11cbiAgICAgIGNvbnN0IGFuY2hvck9mZnNldCA9IGFuY2hvclBhdGhzLnBvcCgpIVxuICAgICAgY29uc3QgYW5jaG9yU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhhbmNob3JQYXRocylcbiAgICAgIGNvbnN0IGZvY3VzT2Zmc2V0ID0gZm9jdXNQYXRocy5wb3AoKSFcbiAgICAgIGNvbnN0IGZvY3VzU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhmb2N1c1BhdGhzKVxuICAgICAgaWYgKCFhbmNob3JTbG90IHx8ICFmb2N1c1Nsb3QpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmb2N1cywgYW5jaG9yfSA9IHRoaXMubmF0aXZlU2VsZWN0aW9uLmdldFBvc2l0aW9uQnlSYW5nZSh7XG4gICAgICAgIGZvY3VzT2Zmc2V0LFxuICAgICAgICBhbmNob3JPZmZzZXQsXG4gICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgYW5jaG9yU2xvdFxuICAgICAgfSlcbiAgICAgIGlmICghZm9jdXMgfHwgIWFuY2hvcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hdGl2ZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgbmF0aXZlUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpXG4gICAgICBuYXRpdmVSYW5nZS5zZXRFbmQoZm9jdXMubm9kZSwgZm9jdXMub2Zmc2V0KVxuICAgICAgaWYgKChhbmNob3Iubm9kZSAhPT0gZm9jdXMubm9kZSB8fCBhbmNob3Iub2Zmc2V0ICE9PSBmb2N1cy5vZmZzZXQpICYmIG5hdGl2ZVJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgICBuYXRpdmVSYW5nZS5zZXRTdGFydChmb2N1cy5ub2RlLCBmb2N1cy5vZmZzZXQpXG4gICAgICAgIG5hdGl2ZVJhbmdlLnNldEVuZChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldClcbiAgICAgIH1cblxuICAgICAgbGV0IHJlY3RzOiBSZWN0W10gfCBET01SZWN0TGlzdCB8IGZhbHNlID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLmF3YXJlbmVzc0RlbGVnYXRlKSB7XG4gICAgICAgIHJlY3RzID0gdGhpcy5hd2FyZW5lc3NEZWxlZ2F0ZS5nZXRSZWN0cyh7XG4gICAgICAgICAgZm9jdXNPZmZzZXQsXG4gICAgICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgICBhbmNob3JTbG90XG4gICAgICAgIH0sIG5hdGl2ZVJhbmdlKVxuICAgICAgfVxuICAgICAgaWYgKCFyZWN0cykge1xuICAgICAgICByZWN0cyA9IG5hdGl2ZVJhbmdlLmdldENsaWVudFJlY3RzKClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvblJlY3RzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuICAgICAgZm9yIChsZXQgaSA9IHJlY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXVxuICAgICAgICBzZWxlY3Rpb25SZWN0cy5wdXNoKHtcbiAgICAgICAgICBjb2xvcjogaXRlbS5jb2xvcixcbiAgICAgICAgICB1c2VybmFtZTogaXRlbS51c2VybmFtZSxcbiAgICAgICAgICB4OiByZWN0LnggLSBjb250YWluZXJSZWN0LngsXG4gICAgICAgICAgeTogcmVjdC55LFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLm9uUmVjdHNDaGFuZ2UubmV4dChzZWxlY3Rpb25SZWN0cylcblxuICAgICAgY29uc3QgY3Vyc29yUmFuZ2UgPSBuYXRpdmVSYW5nZS5jbG9uZVJhbmdlKClcbiAgICAgIGN1cnNvclJhbmdlLnNldFN0YXJ0KGZvY3VzLm5vZGUsIGZvY3VzLm9mZnNldClcbiAgICAgIGN1cnNvclJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgIGNvbnN0IGN1cnNvclJlY3QgPSBnZXRMYXlvdXRSZWN0QnlSYW5nZShjdXJzb3JSYW5nZSlcblxuICAgICAgY29uc3QgcmVjdDogU2VsZWN0aW9uUmVjdCA9IHtcbiAgICAgICAgdXNlcm5hbWU6IGl0ZW0udXNlcm5hbWUsXG4gICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICB4OiBjdXJzb3JSZWN0LnggLSBjb250YWluZXJSZWN0LngsXG4gICAgICAgIHk6IGN1cnNvclJlY3QueSAtIGNvbnRhaW5lclJlY3QueSxcbiAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgIGhlaWdodDogY3Vyc29yUmVjdC5oZWlnaHRcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LnggPCAwIHx8IHJlY3QueSA8IDAgfHwgcmVjdC54ID4gY29udGFpbmVyUmVjdC53aWR0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHVzZXJzLnB1c2gocmVjdClcbiAgICB9KVxuICAgIHRoaXMuZHJhd1VzZXJDdXJzb3IodXNlcnMpXG4gIH1cblxuICBwcml2YXRlIGRyYXdVc2VyQ3Vyc29yKHJlY3RzOiBTZWxlY3Rpb25SZWN0W10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWN0ID0gcmVjdHNbaV1cbiAgICAgIGNvbnN0IHtjdXJzb3IsIHVzZXJUaXAsIGFuY2hvcn0gPSB0aGlzLmdldFVzZXJDdXJzb3IoaSlcbiAgICAgIE9iamVjdC5hc3NpZ24oY3Vyc29yLnN0eWxlLCB7XG4gICAgICAgIGxlZnQ6IHJlY3QueCArICdweCcsXG4gICAgICAgIHRvcDogcmVjdC55ICsgJ3B4JyxcbiAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICsgJ3B4JyxcbiAgICAgICAgYmFja2dyb3VuZDogcmVjdC5jb2xvcixcbiAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgfSlcbiAgICAgIGFuY2hvci5zdHlsZS5iYWNrZ3JvdW5kID0gcmVjdC5jb2xvclxuICAgICAgdXNlclRpcC5pbm5lclRleHQgPSByZWN0LnVzZXJuYW1lXG4gICAgICB1c2VyVGlwLnN0eWxlLmJhY2tncm91bmQgPSByZWN0LmNvbG9yXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHJlY3RzLmxlbmd0aDsgaSA8IHRoaXMudG9vbHRpcHMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudG9vbHRpcHMucmVtb3ZlQ2hpbGQodGhpcy50b29sdGlwcy5jaGlsZHJlbltpXSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJDdXJzb3IoaW5kZXg6IG51bWJlcik6IFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gICAgbGV0IGNoaWxkOiBIVE1MRWxlbWVudCA9IHRoaXMudG9vbHRpcHMuY2hpbGRyZW5baW5kZXhdIGFzIEhUTUxFbGVtZW50XG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICBjb25zdCBhbmNob3IgPSBjaGlsZC5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3Vyc29yOiBjaGlsZCxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB1c2VyVGlwOiBhbmNob3IuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdXNlclRpcCA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgbGVmdDogJzUwJScsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLFxuICAgICAgICBtYXJnaW5Cb3R0b206ICcycHgnLFxuICAgICAgICBib3R0b206ICcxMDAlJyxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgIGJveFNoYWRvdzogJzAgMXB4IDJweCByZ2JhKDAsMCwwLC4xKScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgIHBhZGRpbmc6ICczcHggNXB4JyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBhbmNob3IgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6ICctMnB4JyxcbiAgICAgICAgbGVmdDogJy0ycHgnLFxuICAgICAgICB3aWR0aDogJzZweCcsXG4gICAgICAgIGhlaWdodDogJzZweCcsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJyxcbiAgICAgICAgcG9pbnRlcjogJ2N1cnNvcicsXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFt1c2VyVGlwXSxcbiAgICAgIG9uOiB7XG4gICAgICAgIG1vdXNlZW50ZXIoKSB7XG4gICAgICAgICAgdXNlclRpcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgICAgICB9LFxuICAgICAgICBtb3VzZWxlYXZlKCkge1xuICAgICAgICAgIHVzZXJUaXAuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBjaGlsZCA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgYW5jaG9yXG4gICAgICBdXG4gICAgfSlcbiAgICB0aGlzLnRvb2x0aXBzLmFwcGVuZChjaGlsZClcbiAgICByZXR1cm4ge1xuICAgICAgY3Vyc29yOiBjaGlsZCxcbiAgICAgIGFuY2hvcixcbiAgICAgIHVzZXJUaXBcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/bundles/collaborate.d.ts
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
import { Observable } from '@tanbo/stream';
|
2
|
-
import {
|
2
|
+
import { Controller, History, Registry, RootComponentRef, Scheduler, Selection, SelectionPaths, Starter, Translator } from '@textbus/core';
|
3
3
|
import { Doc as YDoc } from 'yjs';
|
4
|
-
import { CollaborateCursor, RemoteSelection } from './
|
4
|
+
import { CollaborateCursor, RemoteSelection } from './collaborate-cursor';
|
5
5
|
export declare class Collaborate implements History {
|
6
|
+
private stackSize;
|
6
7
|
private rootComponentRef;
|
7
8
|
private collaborateCursor;
|
9
|
+
private controller;
|
10
|
+
private scheduler;
|
8
11
|
private translator;
|
9
|
-
private renderer;
|
10
12
|
private registry;
|
11
13
|
private selection;
|
12
14
|
private starter;
|
@@ -30,15 +32,19 @@ export declare class Collaborate implements History {
|
|
30
32
|
private slotsSyncCaches;
|
31
33
|
private componentStateSyncCaches;
|
32
34
|
private selectionChangeEvent;
|
35
|
+
private contentMap;
|
33
36
|
private updateRemoteActions;
|
34
|
-
constructor(rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor,
|
37
|
+
constructor(stackSize: number, rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, controller: Controller, scheduler: Scheduler, translator: Translator, registry: Registry, selection: Selection, starter: Starter);
|
35
38
|
setup(): void;
|
36
39
|
updateRemoteSelection(paths: RemoteSelection[]): void;
|
37
40
|
listen(): void;
|
38
41
|
back(): void;
|
39
42
|
forward(): void;
|
43
|
+
clear(): void;
|
40
44
|
destroy(): void;
|
41
|
-
private
|
45
|
+
private syncRootComponent;
|
46
|
+
private restoreCursorLocation;
|
47
|
+
private getRelativeCursorLocation;
|
42
48
|
private syncContent;
|
43
49
|
private syncSlot;
|
44
50
|
private syncSlots;
|