@textbus/collaborate 2.0.0-beta.21 → 2.0.0-beta.24
Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
|
|
1
|
+
import { Plugin } from '@textbus/core';
|
2
|
+
import { Injector } from '@tanbo/di';
|
3
|
+
export declare class FixedCaretPlugin implements Plugin {
|
4
|
+
scrollContainer: HTMLElement;
|
5
|
+
private subscriptions;
|
6
|
+
constructor(scrollContainer: HTMLElement);
|
7
|
+
setup(injector: Injector): void;
|
8
|
+
onDestroy(): void;
|
9
|
+
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { Renderer, Scheduler } from '@textbus/core';
|
2
|
+
import { Caret } from '@textbus/browser';
|
3
|
+
import { Subscription } from '@tanbo/stream';
|
4
|
+
export class FixedCaretPlugin {
|
5
|
+
constructor(scrollContainer) {
|
6
|
+
Object.defineProperty(this, "scrollContainer", {
|
7
|
+
enumerable: true,
|
8
|
+
configurable: true,
|
9
|
+
writable: true,
|
10
|
+
value: scrollContainer
|
11
|
+
});
|
12
|
+
Object.defineProperty(this, "subscriptions", {
|
13
|
+
enumerable: true,
|
14
|
+
configurable: true,
|
15
|
+
writable: true,
|
16
|
+
value: new Subscription()
|
17
|
+
});
|
18
|
+
}
|
19
|
+
setup(injector) {
|
20
|
+
const scheduler = injector.get(Scheduler);
|
21
|
+
const caret = injector.get(Caret);
|
22
|
+
const renderer = injector.get(Renderer);
|
23
|
+
let isChanged = false;
|
24
|
+
let caretPosition = null;
|
25
|
+
renderer.onViewChecked.subscribe(() => {
|
26
|
+
isChanged = true;
|
27
|
+
});
|
28
|
+
this.subscriptions.add(caret.onPositionChange.subscribe(position => {
|
29
|
+
if (isChanged && caretPosition && position && !scheduler.hasLocalUpdate) {
|
30
|
+
const offset = position.top - caretPosition.top;
|
31
|
+
this.scrollContainer.scrollTop += offset;
|
32
|
+
isChanged = false;
|
33
|
+
}
|
34
|
+
caretPosition = position;
|
35
|
+
}));
|
36
|
+
}
|
37
|
+
onDestroy() {
|
38
|
+
this.subscriptions.unsubscribe();
|
39
|
+
}
|
40
|
+
}
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWQtY2FyZXQucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpeGVkLWNhcmV0LnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUUzRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGtCQUFrQixDQUFBO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFNUMsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFtQixlQUE0Qjs7Ozs7bUJBQTVCOztRQUZuQjs7OzttQkFBd0IsSUFBSSxZQUFZLEVBQUU7V0FBQTtJQUcxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQWtCO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDekMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUNyQixJQUFJLGFBQWEsR0FBeUIsSUFBSSxDQUFBO1FBQzlDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNwQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNqRSxJQUFJLFNBQVMsSUFBSSxhQUFhLElBQUksUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRTtnQkFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFBO2dCQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUE7Z0JBQ3hDLFNBQVMsR0FBRyxLQUFLLENBQUE7YUFDbEI7WUFDRCxhQUFhLEdBQUcsUUFBUSxDQUFBO1FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGx1Z2luLCBSZW5kZXJlciwgU2NoZWR1bGVyIH0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQHRhbmJvL2RpJ1xuaW1wb3J0IHsgQ2FyZXQsIENhcmV0UG9zaXRpb24gfSBmcm9tICdAdGV4dGJ1cy9icm93c2VyJ1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHRhbmJvL3N0cmVhbSdcblxuZXhwb3J0IGNsYXNzIEZpeGVkQ2FyZXRQbHVnaW4gaW1wbGVtZW50cyBQbHVnaW4ge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKClcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICB9XG5cbiAgc2V0dXAoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgY29uc3Qgc2NoZWR1bGVyID0gaW5qZWN0b3IuZ2V0KFNjaGVkdWxlcilcbiAgICBjb25zdCBjYXJldCA9IGluamVjdG9yLmdldChDYXJldClcbiAgICBjb25zdCByZW5kZXJlciA9IGluamVjdG9yLmdldChSZW5kZXJlcilcblxuICAgIGxldCBpc0NoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBjYXJldFBvc2l0aW9uOiBDYXJldFBvc2l0aW9uIHwgbnVsbCA9IG51bGxcbiAgICByZW5kZXJlci5vblZpZXdDaGVja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpc0NoYW5nZWQgPSB0cnVlXG4gICAgfSlcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGNhcmV0Lm9uUG9zaXRpb25DaGFuZ2Uuc3Vic2NyaWJlKHBvc2l0aW9uID0+IHtcbiAgICAgIGlmIChpc0NoYW5nZWQgJiYgY2FyZXRQb3NpdGlvbiAmJiBwb3NpdGlvbiAmJiAhc2NoZWR1bGVyLmhhc0xvY2FsVXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHBvc2l0aW9uLnRvcCAtIGNhcmV0UG9zaXRpb24udG9wXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCArPSBvZmZzZXRcbiAgICAgICAgaXNDaGFuZ2VkID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIGNhcmV0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgIH0pKVxuICB9XG5cbiAgb25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpXG4gIH1cbn1cbiJdfQ==
|
package/bundles/public-api.d.ts
CHANGED
package/bundles/public-api.js
CHANGED
@@ -3,6 +3,7 @@ import { Collaborate } from './collaborate';
|
|
3
3
|
import { CollaborateCursor } from './collaborate-cursor';
|
4
4
|
export * from './collaborate';
|
5
5
|
export * from './collaborate-cursor';
|
6
|
+
export * from './fixed-caret.plugin';
|
6
7
|
export const collaborateModule = {
|
7
8
|
providers: [
|
8
9
|
Collaborate,
|
@@ -13,4 +14,4 @@ export const collaborateModule = {
|
|
13
14
|
}
|
14
15
|
]
|
15
16
|
};
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQVUsTUFBTSxlQUFlLENBQUE7QUFFL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUV4RCxjQUFjLGVBQWUsQ0FBQTtBQUM3QixjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUE7QUFFcEMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVc7SUFDdkMsU0FBUyxFQUFFO1FBQ1QsV0FBVztRQUNYLGlCQUFpQjtRQUNqQjtZQUNFLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1NBQ3RCO0tBQ0Y7Q0FDRixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSGlzdG9yeSwgTW9kdWxlIH0gZnJvbSAnQHRleHRidXMvY29yZSdcblxuaW1wb3J0IHsgQ29sbGFib3JhdGUgfSBmcm9tICcuL2NvbGxhYm9yYXRlJ1xuaW1wb3J0IHsgQ29sbGFib3JhdGVDdXJzb3IgfSBmcm9tICcuL2NvbGxhYm9yYXRlLWN1cnNvcidcblxuZXhwb3J0ICogZnJvbSAnLi9jb2xsYWJvcmF0ZSdcbmV4cG9ydCAqIGZyb20gJy4vY29sbGFib3JhdGUtY3Vyc29yJ1xuZXhwb3J0ICogZnJvbSAnLi9maXhlZC1jYXJldC5wbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBjb2xsYWJvcmF0ZU1vZHVsZTogTW9kdWxlID0ge1xuICBwcm92aWRlcnM6IFtcbiAgICBDb2xsYWJvcmF0ZSxcbiAgICBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICB7XG4gICAgICBwcm92aWRlOiBIaXN0b3J5LFxuICAgICAgdXNlQ2xhc3M6IENvbGxhYm9yYXRlXG4gICAgfVxuICBdXG59XG4iXX0=
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@textbus/collaborate",
|
3
|
-
"version": "2.0.0-beta.
|
3
|
+
"version": "2.0.0-beta.24",
|
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",
|
@@ -27,8 +27,8 @@
|
|
27
27
|
"dependencies": {
|
28
28
|
"@tanbo/di": "^1.1.1",
|
29
29
|
"@tanbo/stream": "^1.0.2",
|
30
|
-
"@textbus/browser": "^2.0.0-beta.
|
31
|
-
"@textbus/core": "^2.0.0-beta.
|
30
|
+
"@textbus/browser": "^2.0.0-beta.24",
|
31
|
+
"@textbus/core": "^2.0.0-beta.24",
|
32
32
|
"reflect-metadata": "^0.1.13",
|
33
33
|
"y-protocols": "^1.0.5",
|
34
34
|
"yjs": "^13.5.27"
|
@@ -44,5 +44,5 @@
|
|
44
44
|
"bugs": {
|
45
45
|
"url": "https://github.com/textbus/textbus.git/issues"
|
46
46
|
},
|
47
|
-
"gitHead": "
|
47
|
+
"gitHead": "6d1c26dd6de5d7bdf06eeaa355368ac8a2c5ded2"
|
48
48
|
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { Plugin, Renderer, Scheduler } from '@textbus/core'
|
2
|
+
import { Injector } from '@tanbo/di'
|
3
|
+
import { Caret, CaretPosition } from '@textbus/browser'
|
4
|
+
import { Subscription } from '@tanbo/stream'
|
5
|
+
|
6
|
+
export class FixedCaretPlugin implements Plugin {
|
7
|
+
private subscriptions = new Subscription()
|
8
|
+
|
9
|
+
constructor(public scrollContainer: HTMLElement) {
|
10
|
+
}
|
11
|
+
|
12
|
+
setup(injector: Injector) {
|
13
|
+
const scheduler = injector.get(Scheduler)
|
14
|
+
const caret = injector.get(Caret)
|
15
|
+
const renderer = injector.get(Renderer)
|
16
|
+
|
17
|
+
let isChanged = false
|
18
|
+
let caretPosition: CaretPosition | null = null
|
19
|
+
renderer.onViewChecked.subscribe(() => {
|
20
|
+
isChanged = true
|
21
|
+
})
|
22
|
+
this.subscriptions.add(caret.onPositionChange.subscribe(position => {
|
23
|
+
if (isChanged && caretPosition && position && !scheduler.hasLocalUpdate) {
|
24
|
+
const offset = position.top - caretPosition.top
|
25
|
+
this.scrollContainer.scrollTop += offset
|
26
|
+
isChanged = false
|
27
|
+
}
|
28
|
+
caretPosition = position
|
29
|
+
}))
|
30
|
+
}
|
31
|
+
|
32
|
+
onDestroy() {
|
33
|
+
this.subscriptions.unsubscribe()
|
34
|
+
}
|
35
|
+
}
|