@plait/mind 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -13
- package/base/base.drawer.d.ts +4 -3
- package/constants/default.d.ts +1 -1
- package/constants/node-topic-style.d.ts +1 -0
- package/drawer/node-active.drawer.d.ts +13 -0
- package/drawer/node-collapse.drawer.d.ts +8 -0
- package/drawer/{emojis.drawer.d.ts → node-emojis.drawer.d.ts} +1 -1
- package/drawer/{quick-insert.drawer.d.ts → node-insert.drawer.d.ts} +2 -2
- package/esm2020/base/base.drawer.mjs +13 -1
- package/esm2020/constants/default.mjs +2 -2
- package/esm2020/constants/node-rule.mjs +1 -1
- package/esm2020/constants/node-topic-style.mjs +2 -1
- package/esm2020/drawer/node-active.drawer.mjs +43 -0
- package/esm2020/drawer/node-collapse.drawer.mjs +108 -0
- package/esm2020/drawer/node-emojis.drawer.mjs +72 -0
- package/esm2020/drawer/node-insert.drawer.mjs +98 -0
- package/esm2020/interfaces/element.mjs +5 -2
- package/esm2020/mind.component.mjs +2 -1
- package/esm2020/mind.module.mjs +5 -5
- package/esm2020/node.component.mjs +57 -424
- package/esm2020/plugins/with-abstract-resize.mjs +3 -3
- package/esm2020/plugins/with-mind-create.mjs +23 -15
- package/esm2020/plugins/with-mind.mjs +9 -8
- package/esm2020/plugins/with-node-dnd.mjs +7 -4
- package/esm2020/plugins/with-node-hover.mjs +65 -0
- package/esm2020/transforms/node.mjs +10 -7
- package/esm2020/utils/abstract/resize.mjs +4 -6
- package/esm2020/utils/dnd/common.mjs +8 -2
- package/esm2020/utils/draw/node-dnd.mjs +3 -3
- package/esm2020/utils/mind.mjs +4 -4
- package/esm2020/utils/node/adjust-node.mjs +4 -5
- package/esm2020/utils/node/common.mjs +3 -3
- package/esm2020/utils/node/create-node.mjs +4 -3
- package/fesm2015/plait-mind.mjs +567 -857
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +567 -845
- package/fesm2020/plait-mind.mjs.map +1 -1
- package/interfaces/element.d.ts +1 -0
- package/mind.module.d.ts +2 -2
- package/node.component.d.ts +15 -31
- package/package.json +1 -1
- package/plugins/with-mind-create.d.ts +3 -5
- package/plugins/with-node-dnd.d.ts +1 -1
- package/plugins/with-node-hover.d.ts +5 -0
- package/styles/mixins.scss +13 -15
- package/styles/styles.scss +12 -16
- package/utils/abstract/resize.d.ts +2 -2
- package/utils/node/common.d.ts +1 -1
- package/esm2020/drawer/emojis.drawer.mjs +0 -72
- package/esm2020/drawer/quick-insert.drawer.mjs +0 -211
- package/esm2020/utils/draw/node-topic.mjs +0 -32
- package/utils/draw/node-topic.d.ts +0 -16
package/README.md
CHANGED
|
@@ -1,24 +1,143 @@
|
|
|
1
|
-
# mindmap
|
|
2
1
|
|
|
3
|
-
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.3.0.
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
@plait/mind 库包含思维导图的核心逻辑的实现,基于 Plait 框架,是最早也是目前唯一一个落地的业务插件。
|
|
6
4
|
|
|
7
|
-
Run `ng generate component component-name --project mindmap` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project mindmap`.
|
|
8
|
-
> Note: Don't forget to add `--project mindmap` or else it will be added to the default project in your `angular.json` file.
|
|
9
5
|
|
|
10
|
-
## Build
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
**基础功能**
|
|
13
8
|
|
|
14
|
-
|
|
9
|
+
1. 支持逻辑布局、标准布局、缩进布局
|
|
10
|
+
1. 节点快捷新建(Tab、Enter)、删除(Delete、Backspace)
|
|
11
|
+
1. 节点主题文本编辑
|
|
12
|
+
1. 节点展开收起
|
|
13
|
+
1. 节点复制、粘贴
|
|
15
14
|
|
|
16
|
-
After building your library with `ng build mindmap`, go to the dist folder `cd dist/mind` and run `npm publish`.
|
|
17
15
|
|
|
18
|
-
## Running unit tests
|
|
19
16
|
|
|
20
|
-
Run `ng test mindmap` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
17
|
|
|
22
|
-
|
|
18
|
+
**高阶功能**
|
|
19
|
+
|
|
20
|
+
1. 节点支持拖拽调整位置
|
|
21
|
+
1. 节点支持概要/调整概要范围
|
|
22
|
+
1. 节点支持扩展设置 Emoji 表情
|
|
23
|
+
1. 交互式创建思维导图插件
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
**功能演示**
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@plait/mind 核心仅仅包含数据渲染及核心交互实现,不包含工具栏、属性设置等基于界面的交互实现,因为这部分功能依赖于特定的界面风格(插件层不希望引入组件库),我们在设计上倾向于把这部分功能交由使用方自定义实现,插件层只提供事件支持及个性化配置支持。
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
**自定义扩展**
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
1. 支持 MindOptions 配置
|
|
43
|
+
|
|
44
|
+
提供 Mind 插件特有的可重写函数,用于使用方自定义 Mind 插件配置(控制渲染样式、交互风格等):
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
export interface MindOptions {
|
|
48
|
+
emojiPadding: number;
|
|
49
|
+
spaceBetweenEmojis: number;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
目前仅支持 emoji 扩展相关的自定义配置,后续会把节点之间的间隙、文本与节点之间的间隙等等做成自定义配置,目前这些配置是按照我们自己的需求固定在代码中的。
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
2. 支持扩展 Emoji
|
|
58
|
+
|
|
59
|
+
Mind 插件支持 Emoji 功能的时候仅仅提供了一个调用入口,需要使用方提供具体的一个 Emoji 渲染组件,用于具体的实现 Emoji 的渲染及交互,插件层不关注 Emoji 的交互细节、也不管理 Emoji 资源,仅仅控制 emoji 的渲染位置及空间占位。
|
|
60
|
+
|
|
61
|
+
提供可重写函数签名:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
drawEmoji: (emoji: EmojiItem, element: MindElement) => ComponentType<MindEmojiBaseComponent>;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
提供 Emoji 渲染组件基类:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
@Directive({
|
|
71
|
+
host: {
|
|
72
|
+
class: 'mind-node-emoji'
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
export class MindEmojiBaseComponent implements OnInit {
|
|
76
|
+
@Input()
|
|
77
|
+
fontSize: number = 14;
|
|
78
|
+
|
|
79
|
+
@Input()
|
|
80
|
+
emojiItem!: EmojiItem;
|
|
81
|
+
|
|
82
|
+
@Input()
|
|
83
|
+
board!: PlaitBoard;
|
|
84
|
+
|
|
85
|
+
@Input()
|
|
86
|
+
element!: MindElement<EmojiData>;
|
|
87
|
+
|
|
88
|
+
get nativeElement() {
|
|
89
|
+
return this.elementRef.nativeElement;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
constructor(protected elementRef: ElementRef<HTMLElement>) {}
|
|
93
|
+
|
|
94
|
+
ngOnInit(): void {
|
|
95
|
+
this.elementRef.nativeElement.style.fontSize = `${this.fontSize}px`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
不同提供默认实现
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
newBoard.drawEmoji = (emoji: EmojiItem, element: MindElement) => {
|
|
104
|
+
throw new Error('Not implement drawEmoji method error.');
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
3. 概要调整
|
|
111
|
+
|
|
112
|
+
因为业务方需要在概要拖拽调整范围时做一定的业务处理,所以插件层增加了一个可重写方法用于抛出概要调整时的状态
|
|
113
|
+
|
|
114
|
+
提供可选的可重写函数签名 onAbstractResize:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
export interface PlaitAbstractBoard extends PlaitBoard {
|
|
118
|
+
onAbstractResize?: (state: AbstractResizeState) => void;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
AbstractResizeState 状态定义:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
export enum AbstractResizeState {
|
|
126
|
+
start = 'start',
|
|
127
|
+
resizing = 'resizing',
|
|
128
|
+
end = 'end'
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
**依赖**
|
|
135
|
+
|
|
136
|
+
@plait/core
|
|
137
|
+
|
|
138
|
+
@plait/layouts
|
|
139
|
+
|
|
140
|
+
@plait/richtext
|
|
141
|
+
|
|
142
|
+
|
|
23
143
|
|
|
24
|
-
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
package/base/base.drawer.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../interfaces';
|
|
3
|
-
export declare abstract class BaseDrawer {
|
|
3
|
+
export declare abstract class BaseDrawer<T = undefined> {
|
|
4
4
|
protected board: PlaitBoard;
|
|
5
5
|
g?: SVGGElement;
|
|
6
6
|
constructor(board: PlaitBoard);
|
|
7
|
-
|
|
8
|
-
abstract
|
|
7
|
+
draw(element: MindElement, parentG: SVGGElement, data?: T): void;
|
|
8
|
+
abstract canDraw(element: MindElement, data?: T): boolean;
|
|
9
|
+
abstract baseDraw(element: MindElement, data?: T): SVGGElement | undefined;
|
|
9
10
|
destroy(): void;
|
|
10
11
|
}
|
|
11
12
|
export interface AfterDraw {
|
package/constants/default.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare const GRAY_COLOR = "#AAAAAA";
|
|
|
5
5
|
export declare const STROKE_WIDTH = 3;
|
|
6
6
|
export declare const BRANCH_WIDTH = 3;
|
|
7
7
|
export declare const EXTEND_OFFSET = 8;
|
|
8
|
-
export declare const
|
|
8
|
+
export declare const EXTEND_DIAMETER = 16;
|
|
9
9
|
export declare const QUICK_INSERT_CIRCLE_OFFSET = 9;
|
|
10
10
|
export declare const QUICK_INSERT_CIRCLE_COLOR = "#6698FF";
|
|
11
11
|
export declare const QUICK_INSERT_INNER_CROSS_COLOR = "white";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
+
import { BaseDrawer } from '../base/base.drawer';
|
|
3
|
+
import { AbstractHandlePosition } from '../plugins/with-abstract-resize.board';
|
|
4
|
+
export interface ActiveData {
|
|
5
|
+
selected: boolean;
|
|
6
|
+
isEditing: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class NodeActiveDrawer extends BaseDrawer<ActiveData> {
|
|
9
|
+
abstractOutlineG?: SVGGElement;
|
|
10
|
+
canDraw(element: MindElement<BaseData>, data: ActiveData): boolean;
|
|
11
|
+
baseDraw(element: MindElement<BaseData>, data: ActiveData): SVGGElement;
|
|
12
|
+
updateAbstractOutline(element: MindElement, activeHandlePosition?: AbstractHandlePosition, resizingLocation?: number): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
+
import { AfterDraw, BaseDrawer } from '../base/base.drawer';
|
|
3
|
+
export declare class CollapseDrawer extends BaseDrawer implements AfterDraw {
|
|
4
|
+
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
+
baseDraw(element: MindElement<BaseData>): SVGGElement;
|
|
6
|
+
afterDraw(element: MindElement): void;
|
|
7
|
+
private getArrowPoints;
|
|
8
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MindElement, BaseData } from '../interfaces';
|
|
2
2
|
import { AfterDraw, BaseDrawer } from '../base/base.drawer';
|
|
3
|
-
export declare class
|
|
3
|
+
export declare class NodeInsertDrawer extends BaseDrawer implements AfterDraw {
|
|
4
4
|
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
-
|
|
5
|
+
baseDraw(element: MindElement<BaseData>): SVGGElement;
|
|
6
6
|
afterDraw(element: MindElement): void;
|
|
7
7
|
}
|
|
@@ -2,6 +2,18 @@ export class BaseDrawer {
|
|
|
2
2
|
constructor(board) {
|
|
3
3
|
this.board = board;
|
|
4
4
|
}
|
|
5
|
+
draw(element, parentG, data) {
|
|
6
|
+
this.destroy();
|
|
7
|
+
if (this.canDraw && this.canDraw(element, data)) {
|
|
8
|
+
const g = this.baseDraw(element, data);
|
|
9
|
+
if (g) {
|
|
10
|
+
parentG.append(g);
|
|
11
|
+
}
|
|
12
|
+
if (hasAfterDraw(this)) {
|
|
13
|
+
this.afterDraw(element);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
5
17
|
destroy() {
|
|
6
18
|
if (this.g) {
|
|
7
19
|
this.g.remove();
|
|
@@ -14,4 +26,4 @@ export function hasAfterDraw(value) {
|
|
|
14
26
|
}
|
|
15
27
|
return false;
|
|
16
28
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5kcmF3ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9iYXNlL2Jhc2UuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBZ0IsVUFBVTtJQUc1QixZQUFzQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO0lBQUcsQ0FBQztJQUUzQyxJQUFJLENBQUMsT0FBb0IsRUFBRSxPQUFvQixFQUFFLElBQVE7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxFQUFFO2dCQUNILE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckI7WUFDRCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMzQjtTQUNKO0lBQ0wsQ0FBQztJQU1ELE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztDQUNKO0FBTUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFVO0lBQ25DLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURyYXdlcjxUID0gdW5kZWZpbmVkPiB7XG4gICAgZz86IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJvYXJkOiBQbGFpdEJvYXJkKSB7fVxuXG4gICAgZHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCwgcGFyZW50RzogU1ZHR0VsZW1lbnQsIGRhdGE/OiBUKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5jYW5EcmF3ICYmIHRoaXMuY2FuRHJhdyhlbGVtZW50LCBkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZyA9IHRoaXMuYmFzZURyYXcoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgICAgICBpZiAoZykge1xuICAgICAgICAgICAgICAgIHBhcmVudEcuYXBwZW5kKGcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0FmdGVyRHJhdyh0aGlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJEcmF3KGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCwgZGF0YT86IFQpOiBib29sZWFuO1xuXG4gICAgYWJzdHJhY3QgYmFzZURyYXcoZWxlbWVudDogTWluZEVsZW1lbnQsIGRhdGE/OiBUKTogU1ZHR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5nKSB7XG4gICAgICAgICAgICB0aGlzLmcucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWZ0ZXJEcmF3IHtcbiAgICBhZnRlckRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQWZ0ZXJEcmF3KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBZnRlckRyYXcge1xuICAgIGlmICh2YWx1ZS5hZnRlckRyYXcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
@@ -5,8 +5,8 @@ export const GRAY_COLOR = '#AAAAAA';
|
|
|
5
5
|
export const STROKE_WIDTH = 3;
|
|
6
6
|
export const BRANCH_WIDTH = 3;
|
|
7
7
|
export const EXTEND_OFFSET = 8;
|
|
8
|
-
export const
|
|
8
|
+
export const EXTEND_DIAMETER = 16;
|
|
9
9
|
export const QUICK_INSERT_CIRCLE_OFFSET = 9;
|
|
10
10
|
export const QUICK_INSERT_CIRCLE_COLOR = '#6698FF';
|
|
11
11
|
export const QUICK_INSERT_INNER_CROSS_COLOR = 'white';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2NvbnN0YW50cy9kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUM7QUFDcEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsU0FBUyxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBCQVNFID0gNDtcbmV4cG9ydCBjb25zdCBQUklNQVJZX0NPTE9SID0gJyM2Njk4RkYnO1xuXG5leHBvcnQgY29uc3QgVFJBTlNQQVJFTlQgPSAndHJhbnNwYXJlbnQnO1xuZXhwb3J0IGNvbnN0IEdSQVlfQ09MT1IgPSAnI0FBQUFBQSc7XG5leHBvcnQgY29uc3QgU1RST0tFX1dJRFRIID0gMztcbmV4cG9ydCBjb25zdCBCUkFOQ0hfV0lEVEggPSAzO1xuXG5leHBvcnQgY29uc3QgRVhURU5EX09GRlNFVCA9IDg7XG5leHBvcnQgY29uc3QgRVhURU5EX0RJQU1FVEVSID0gMTY7XG5cbmV4cG9ydCBjb25zdCBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA9IDk7XG5leHBvcnQgY29uc3QgUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUiA9ICcjNjY5OEZGJztcbmV4cG9ydCBjb25zdCBRVUlDS19JTlNFUlRfSU5ORVJfQ1JPU1NfQ09MT1IgPSAnd2hpdGUnO1xuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const NODE_MIN_WIDTH = 18;
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1ydWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvY29uc3RhbnRzL25vZGUtcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE5PREVfTUlOX1dJRFRIID0gMTg7XG4iXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export const TOPIC_COLOR = '#333';
|
|
2
2
|
export const TOPIC_FONT_SIZE = 14;
|
|
3
3
|
export const ROOT_TOPIC_FONT_SIZE = 18;
|
|
4
|
+
export const ROOT_TOPIC_HEIGHT = 25;
|
|
4
5
|
export const TOPIC_DEFAULT_MAX_WORD_COUNT = 34;
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS10b3BpYy1zdHlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2NvbnN0YW50cy9ub2RlLXRvcGljLXN0eWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBUT1BJQ19DT0xPUiA9ICcjMzMzJztcbmV4cG9ydCBjb25zdCBUT1BJQ19GT05UX1NJWkUgPSAxNDtcblxuZXhwb3J0IGNvbnN0IFJPT1RfVE9QSUNfRk9OVF9TSVpFID0gMTg7XG5cbmV4cG9ydCBjb25zdCBST09UX1RPUElDX0hFSUdIVCA9IDI1O1xuXG5leHBvcnQgY29uc3QgVE9QSUNfREVGQVVMVF9NQVhfV09SRF9DT1VOVCA9IDM0OyJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PlaitBoard, createG, drawRoundRectangle } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../interfaces';
|
|
3
|
+
import { BaseDrawer } from '../base/base.drawer';
|
|
4
|
+
import { getRectangleByNode } from '../utils/position/node';
|
|
5
|
+
import { PRIMARY_COLOR } from '../constants/default';
|
|
6
|
+
import { AbstractNode } from '@plait/layouts';
|
|
7
|
+
import { drawAbstractIncludedOutline } from '../utils/draw/abstract-outline';
|
|
8
|
+
export class NodeActiveDrawer extends BaseDrawer {
|
|
9
|
+
canDraw(element, data) {
|
|
10
|
+
if (data.selected) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
baseDraw(element, data) {
|
|
18
|
+
const activeG = createG();
|
|
19
|
+
this.g = activeG;
|
|
20
|
+
if (AbstractNode.isAbstract(element)) {
|
|
21
|
+
this.abstractOutlineG = drawAbstractIncludedOutline(this.board, PlaitBoard.getRoughSVG(this.board), element);
|
|
22
|
+
activeG.append(this.abstractOutlineG);
|
|
23
|
+
}
|
|
24
|
+
const node = MindElement.getNode(element);
|
|
25
|
+
let { x, y, width, height } = getRectangleByNode(node);
|
|
26
|
+
const strokeG = drawRoundRectangle(PlaitBoard.getRoughSVG(this.board), x - 2, y - 2, x + width + 2, y + height + 2, { stroke: PRIMARY_COLOR, strokeWidth: 2, fill: '' }, true);
|
|
27
|
+
this.g.appendChild(strokeG);
|
|
28
|
+
if (!data.isEditing) {
|
|
29
|
+
const fillG = drawRoundRectangle(PlaitBoard.getRoughSVG(this.board), x - 2, y - 2, x + width + 2, y + height + 2, { stroke: PRIMARY_COLOR, fill: PRIMARY_COLOR, fillStyle: 'solid' }, true);
|
|
30
|
+
fillG.style.opacity = '0.15';
|
|
31
|
+
this.g.appendChild(fillG);
|
|
32
|
+
}
|
|
33
|
+
return activeG;
|
|
34
|
+
}
|
|
35
|
+
updateAbstractOutline(element, activeHandlePosition, resizingLocation) {
|
|
36
|
+
if (this.abstractOutlineG) {
|
|
37
|
+
this.abstractOutlineG.remove();
|
|
38
|
+
}
|
|
39
|
+
this.abstractOutlineG = drawAbstractIncludedOutline(this.board, PlaitBoard.getRoughSVG(this.board), element, activeHandlePosition, resizingLocation);
|
|
40
|
+
this.g.append(this.abstractOutlineG);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1hY3RpdmUuZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvZHJhd2VyL25vZGUtYWN0aXZlLmRyYXdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBUTdFLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxVQUFzQjtJQUd4RCxPQUFPLENBQUMsT0FBOEIsRUFBRSxJQUFnQjtRQUNwRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsT0FBOEIsRUFBRSxJQUFnQjtRQUNyRCxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUVqQixJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0csT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN6QztRQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUM5QixVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDbEMsQ0FBQyxHQUFHLENBQUMsRUFDTCxDQUFDLEdBQUcsQ0FBQyxFQUNMLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUNiLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUNkLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFDbkQsSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FDNUIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ2xDLENBQUMsR0FBRyxDQUFDLEVBQ0wsQ0FBQyxHQUFHLENBQUMsRUFDTCxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFDYixDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFDZCxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQ2xFLElBQUksQ0FDUCxDQUFDO1lBQ0YsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELHFCQUFxQixDQUFDLE9BQW9CLEVBQUUsb0JBQTZDLEVBQUUsZ0JBQXlCO1FBQ2hILElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRywyQkFBMkIsQ0FDL0MsSUFBSSxDQUFDLEtBQUssRUFDVixVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDbEMsT0FBTyxFQUNQLG9CQUFvQixFQUNwQixnQkFBZ0IsQ0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxDQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIGNyZWF0ZUcsIGRyYXdSb3VuZFJlY3RhbmdsZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50LCBCYXNlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQmFzZURyYXdlciB9IGZyb20gJy4uL2Jhc2UvYmFzZS5kcmF3ZXInO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vbm9kZSc7XG5pbXBvcnQgeyBQUklNQVJZX0NPTE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgQWJzdHJhY3ROb2RlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgZHJhd0Fic3RyYWN0SW5jbHVkZWRPdXRsaW5lIH0gZnJvbSAnLi4vdXRpbHMvZHJhdy9hYnN0cmFjdC1vdXRsaW5lJztcbmltcG9ydCB7IEFic3RyYWN0SGFuZGxlUG9zaXRpb24gfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtYWJzdHJhY3QtcmVzaXplLmJvYXJkJztcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVEYXRhIHtcbiAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBpc0VkaXRpbmc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlQWN0aXZlRHJhd2VyIGV4dGVuZHMgQmFzZURyYXdlcjxBY3RpdmVEYXRhPiB7XG4gICAgYWJzdHJhY3RPdXRsaW5lRz86IFNWR0dFbGVtZW50O1xuXG4gICAgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudDxCYXNlRGF0YT4sIGRhdGE6IEFjdGl2ZURhdGEpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRhdGEuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmFzZURyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+LCBkYXRhOiBBY3RpdmVEYXRhKTogU1ZHR0VsZW1lbnQge1xuICAgICAgICBjb25zdCBhY3RpdmVHID0gY3JlYXRlRygpO1xuICAgICAgICB0aGlzLmcgPSBhY3RpdmVHO1xuXG4gICAgICAgIGlmIChBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdChlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5hYnN0cmFjdE91dGxpbmVHID0gZHJhd0Fic3RyYWN0SW5jbHVkZWRPdXRsaW5lKHRoaXMuYm9hcmQsIFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCksIGVsZW1lbnQpO1xuICAgICAgICAgICAgYWN0aXZlRy5hcHBlbmQodGhpcy5hYnN0cmFjdE91dGxpbmVHKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KTtcbiAgICAgICAgbGV0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5vZGUpO1xuICAgICAgICBjb25zdCBzdHJva2VHID0gZHJhd1JvdW5kUmVjdGFuZ2xlKFxuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKSxcbiAgICAgICAgICAgIHggLSAyLFxuICAgICAgICAgICAgeSAtIDIsXG4gICAgICAgICAgICB4ICsgd2lkdGggKyAyLFxuICAgICAgICAgICAgeSArIGhlaWdodCArIDIsXG4gICAgICAgICAgICB7IHN0cm9rZTogUFJJTUFSWV9DT0xPUiwgc3Ryb2tlV2lkdGg6IDIsIGZpbGw6ICcnIH0sXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZy5hcHBlbmRDaGlsZChzdHJva2VHKTtcblxuICAgICAgICBpZiAoIWRhdGEuaXNFZGl0aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxsRyA9IGRyYXdSb3VuZFJlY3RhbmdsZShcbiAgICAgICAgICAgICAgICBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLFxuICAgICAgICAgICAgICAgIHggLSAyLFxuICAgICAgICAgICAgICAgIHkgLSAyLFxuICAgICAgICAgICAgICAgIHggKyB3aWR0aCArIDIsXG4gICAgICAgICAgICAgICAgeSArIGhlaWdodCArIDIsXG4gICAgICAgICAgICAgICAgeyBzdHJva2U6IFBSSU1BUllfQ09MT1IsIGZpbGw6IFBSSU1BUllfQ09MT1IsIGZpbGxTdHlsZTogJ3NvbGlkJyB9LFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWxsRy5zdHlsZS5vcGFjaXR5ID0gJzAuMTUnO1xuICAgICAgICAgICAgdGhpcy5nLmFwcGVuZENoaWxkKGZpbGxHKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY3RpdmVHO1xuICAgIH1cblxuICAgIHVwZGF0ZUFic3RyYWN0T3V0bGluZShlbGVtZW50OiBNaW5kRWxlbWVudCwgYWN0aXZlSGFuZGxlUG9zaXRpb24/OiBBYnN0cmFjdEhhbmRsZVBvc2l0aW9uLCByZXNpemluZ0xvY2F0aW9uPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmFic3RyYWN0T3V0bGluZUcpIHtcbiAgICAgICAgICAgIHRoaXMuYWJzdHJhY3RPdXRsaW5lRy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFic3RyYWN0T3V0bGluZUcgPSBkcmF3QWJzdHJhY3RJbmNsdWRlZE91dGxpbmUoXG4gICAgICAgICAgICB0aGlzLmJvYXJkLFxuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBhY3RpdmVIYW5kbGVQb3NpdGlvbixcbiAgICAgICAgICAgIHJlc2l6aW5nTG9jYXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5nIS5hcHBlbmQodGhpcy5hYnN0cmFjdE91dGxpbmVHKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { PlaitBoard, PlaitPointerType, Transforms, createG, createText, drawLinearPath } from '@plait/core';
|
|
2
|
+
import { MindElement, PlaitMind, MindElementShape, LayoutDirection } from '../interfaces';
|
|
3
|
+
import { BaseDrawer } from '../base/base.drawer';
|
|
4
|
+
import { getRectangleByNode } from '../utils/position/node';
|
|
5
|
+
import { getShapeByElement } from '../utils/node-style/shape';
|
|
6
|
+
import { EXTEND_OFFSET, EXTEND_DIAMETER } from '../constants/default';
|
|
7
|
+
import { isHorizontalLayout, isIndentedLayout, isTopLayout } from '@plait/layouts';
|
|
8
|
+
import { MindQueries } from '../queries';
|
|
9
|
+
import { fromEvent } from 'rxjs';
|
|
10
|
+
import { getChildrenCount } from '../utils/mind';
|
|
11
|
+
import { filter, take } from 'rxjs/operators';
|
|
12
|
+
import { getBranchColorByMindElement, getBranchWidthByMindElement } from '../utils/node-style/branch';
|
|
13
|
+
import { getLayoutDirection, getPointByPlacement, moveXOfPoint, moveYOfPoint, transformPlacement } from '../utils/point-placement';
|
|
14
|
+
import { HorizontalPlacement, VerticalPlacement } from '../interfaces/types';
|
|
15
|
+
export class CollapseDrawer extends BaseDrawer {
|
|
16
|
+
canDraw(element) {
|
|
17
|
+
if (element.children.length && !PlaitMind.isMind(element)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
baseDraw(element) {
|
|
23
|
+
const collapseG = createG();
|
|
24
|
+
this.g = collapseG;
|
|
25
|
+
collapseG.classList.add('collapse-container');
|
|
26
|
+
const node = MindElement.getNode(element);
|
|
27
|
+
const stroke = getBranchColorByMindElement(this.board, element);
|
|
28
|
+
const branchWidth = getBranchWidthByMindElement(this.board, element);
|
|
29
|
+
const layout = MindQueries.getLayoutByElement(element);
|
|
30
|
+
const isUnderlineShape = getShapeByElement(this.board, element) === MindElementShape.underline;
|
|
31
|
+
const isHorizontal = isHorizontalLayout(layout);
|
|
32
|
+
const nodeClient = getRectangleByNode(node);
|
|
33
|
+
let linkDirection = getLayoutDirection(node, isHorizontal);
|
|
34
|
+
if (isIndentedLayout(layout)) {
|
|
35
|
+
linkDirection = isTopLayout(layout) ? LayoutDirection.top : LayoutDirection.bottom;
|
|
36
|
+
}
|
|
37
|
+
let placement = [HorizontalPlacement.right, VerticalPlacement.middle];
|
|
38
|
+
transformPlacement(placement, linkDirection);
|
|
39
|
+
// underline shape and horizontal
|
|
40
|
+
if (isHorizontal && isUnderlineShape && !element.isRoot) {
|
|
41
|
+
placement[1] = VerticalPlacement.bottom;
|
|
42
|
+
}
|
|
43
|
+
let startPoint = getPointByPlacement(nodeClient, placement);
|
|
44
|
+
const endPoint = moveXOfPoint(startPoint, EXTEND_OFFSET, linkDirection);
|
|
45
|
+
const circleCenter = moveXOfPoint(endPoint, EXTEND_DIAMETER / 2, linkDirection);
|
|
46
|
+
const arrowPoints = this.getArrowPoints(circleCenter, linkDirection);
|
|
47
|
+
const arrowLine = drawLinearPath(arrowPoints, {
|
|
48
|
+
stroke,
|
|
49
|
+
strokeWidth: 2
|
|
50
|
+
});
|
|
51
|
+
const extendLine = PlaitBoard.getRoughSVG(this.board).line(startPoint[0], startPoint[1], endPoint[0], endPoint[1], {
|
|
52
|
+
strokeWidth: branchWidth,
|
|
53
|
+
stroke
|
|
54
|
+
});
|
|
55
|
+
const badge = PlaitBoard.getRoughSVG(this.board).circle(circleCenter[0], circleCenter[1], EXTEND_DIAMETER, {
|
|
56
|
+
fill: stroke,
|
|
57
|
+
stroke,
|
|
58
|
+
fillStyle: 'solid'
|
|
59
|
+
});
|
|
60
|
+
const hideCircleG = PlaitBoard.getRoughSVG(this.board).circle(circleCenter[0], circleCenter[1], EXTEND_DIAMETER, {
|
|
61
|
+
fill: '#fff',
|
|
62
|
+
stroke,
|
|
63
|
+
strokeWidth: branchWidth > 3 ? 3 : branchWidth,
|
|
64
|
+
fillStyle: 'solid'
|
|
65
|
+
});
|
|
66
|
+
if (element.isCollapsed) {
|
|
67
|
+
let numberOffset = 0;
|
|
68
|
+
if (getChildrenCount(element) >= 10)
|
|
69
|
+
numberOffset = -2;
|
|
70
|
+
if (getChildrenCount(element) === 1)
|
|
71
|
+
numberOffset = 1;
|
|
72
|
+
const badgeText = createText(circleCenter[0] - 4 + numberOffset, circleCenter[1] + 4, stroke, `${getChildrenCount(element)}`);
|
|
73
|
+
badge.setAttribute('style', 'opacity: 0.15');
|
|
74
|
+
badgeText.setAttribute('style', 'font-size: 12px');
|
|
75
|
+
collapseG.appendChild(badge);
|
|
76
|
+
collapseG.appendChild(badgeText);
|
|
77
|
+
collapseG.appendChild(extendLine);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
collapseG.appendChild(hideCircleG);
|
|
81
|
+
collapseG.appendChild(arrowLine);
|
|
82
|
+
}
|
|
83
|
+
collapseG.appendChild(extendLine);
|
|
84
|
+
return collapseG;
|
|
85
|
+
}
|
|
86
|
+
afterDraw(element) {
|
|
87
|
+
if (!this.g) {
|
|
88
|
+
throw new Error(`can not find quick insert g`);
|
|
89
|
+
}
|
|
90
|
+
fromEvent(this.g, 'mouseup')
|
|
91
|
+
.pipe(filter(() => !PlaitBoard.isPointer(this.board, PlaitPointerType.hand) || !!PlaitBoard.isReadonly(this.board)), take(1))
|
|
92
|
+
.subscribe(() => {
|
|
93
|
+
const isCollapsed = !element.isCollapsed;
|
|
94
|
+
const newElement = { isCollapsed };
|
|
95
|
+
const path = PlaitBoard.findPath(this.board, element);
|
|
96
|
+
Transforms.setNode(this.board, newElement, path);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
getArrowPoints(circleCenter, linkDirection) {
|
|
100
|
+
let arrowTopPoint = moveXOfPoint(circleCenter, 2, linkDirection);
|
|
101
|
+
arrowTopPoint = moveYOfPoint(arrowTopPoint, 4, linkDirection);
|
|
102
|
+
const arrowMiddlePoint = moveXOfPoint(circleCenter, -2, linkDirection);
|
|
103
|
+
let arrowBottomPoint = moveXOfPoint(circleCenter, 2, linkDirection);
|
|
104
|
+
arrowBottomPoint = moveYOfPoint(arrowBottomPoint, -4, linkDirection);
|
|
105
|
+
return [arrowTopPoint, arrowMiddlePoint, arrowBottomPoint];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1jb2xsYXBzZS5kcmF3ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9kcmF3ZXIvbm9kZS1jb2xsYXBzZS5kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBUyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkgsT0FBTyxFQUFFLFdBQVcsRUFBWSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENB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QUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxjQUFjLENBQUMsWUFBbUIsRUFBRSxhQUE4QjtRQUN0RSxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNqRSxhQUFhLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDcEUsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdFBvaW50ZXJUeXBlLCBQb2ludCwgVHJhbnNmb3JtcywgY3JlYXRlRywgY3JlYXRlVGV4dCwgZHJhd0xpbmVhclBhdGggfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgQmFzZURhdGEsIFBsYWl0TWluZCwgTWluZEVsZW1lbnRTaGFwZSwgTGF5b3V0RGlyZWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBZnRlckRyYXcsIEJhc2VEcmF3ZXIgfSBmcm9tICcuLi9iYXNlL2Jhc2UuZHJhd2VyJztcbmltcG9ydCB7IGdldFJlY3RhbmdsZUJ5Tm9kZSB9IGZyb20gJy4uL3V0aWxzL3Bvc2l0aW9uL25vZGUnO1xuaW1wb3J0IHsgZ2V0U2hhcGVCeUVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9ub2RlLXN0eWxlL3NoYXBlJztcbmltcG9ydCB7IEVYVEVORF9PRkZTRVQsIEVYVEVORF9ESUFNRVRFUiB9IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IE1pbmRMYXlvdXRUeXBlLCBpc0hvcml6b250YWxMYXlvdXQsIGlzSW5kZW50ZWRMYXlvdXQsIGlzVG9wTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgTWluZFF1ZXJpZXMgfSBmcm9tICcuLi9xdWVyaWVzJztcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Q2hpbGRyZW5Db3VudCB9IGZyb20gJy4uL3V0aWxzL21pbmQnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0QnJhbmNoQ29sb3JCeU1pbmRFbGVtZW50LCBnZXRCcmFuY2hXaWR0aEJ5TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9ub2RlLXN0eWxlL2JyYW5jaCc7XG5pbXBvcnQgeyBnZXRMYXlvdXREaXJlY3Rpb24sIGdldFBvaW50QnlQbGFjZW1lbnQsIG1vdmVYT2ZQb2ludCwgbW92ZVlPZlBvaW50LCB0cmFuc2Zvcm1QbGFjZW1lbnQgfSBmcm9tICcuLi91dGlscy9wb2ludC1wbGFjZW1lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbFBsYWNlbWVudCwgUG9pbnRQbGFjZW1lbnQsIFZlcnRpY2FsUGxhY2VtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsYXBzZURyYXdlciBleHRlbmRzIEJhc2VEcmF3ZXIgaW1wbGVtZW50cyBBZnRlckRyYXcge1xuICAgIGNhbkRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCAmJiAhUGxhaXRNaW5kLmlzTWluZChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGJhc2VEcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50PEJhc2VEYXRhPik6IFNWR0dFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY29sbGFwc2VHID0gY3JlYXRlRygpO1xuICAgICAgICB0aGlzLmcgPSBjb2xsYXBzZUc7XG5cbiAgICAgICAgY29sbGFwc2VHLmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBNaW5kRWxlbWVudC5nZXROb2RlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBzdHJva2UgPSBnZXRCcmFuY2hDb2xvckJ5TWluZEVsZW1lbnQodGhpcy5ib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGJyYW5jaFdpZHRoID0gZ2V0QnJhbmNoV2lkdGhCeU1pbmRFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBNaW5kUXVlcmllcy5nZXRMYXlvdXRCeUVsZW1lbnQoZWxlbWVudCkgYXMgTWluZExheW91dFR5cGU7XG4gICAgICAgIGNvbnN0IGlzVW5kZXJsaW5lU2hhcGUgPSBnZXRTaGFwZUJ5RWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50KSA9PT0gTWluZEVsZW1lbnRTaGFwZS51bmRlcmxpbmU7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbExheW91dChsYXlvdXQpO1xuICAgICAgICBjb25zdCBub2RlQ2xpZW50ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5vZGUpO1xuICAgICAgICBsZXQgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihub2RlLCBpc0hvcml6b250YWwpO1xuICAgICAgICBpZiAoaXNJbmRlbnRlZExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICBsaW5rRGlyZWN0aW9uID0gaXNUb3BMYXlvdXQobGF5b3V0KSA/IExheW91dERpcmVjdGlvbi50b3AgOiBMYXlvdXREaXJlY3Rpb24uYm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBsYWNlbWVudDogUG9pbnRQbGFjZW1lbnQgPSBbSG9yaXpvbnRhbFBsYWNlbWVudC5yaWdodCwgVmVydGljYWxQbGFjZW1lbnQubWlkZGxlXTtcblxuICAgICAgICB0cmFuc2Zvcm1QbGFjZW1lbnQocGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcblxuICAgICAgICAvLyB1bmRlcmxpbmUgc2hhcGUgYW5kIGhvcml6b250YWxcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCAmJiBpc1VuZGVybGluZVNoYXBlICYmICFlbGVtZW50LmlzUm9vdCkge1xuICAgICAgICAgICAgcGxhY2VtZW50WzFdID0gVmVydGljYWxQbGFjZW1lbnQuYm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0UG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KG5vZGVDbGllbnQsIHBsYWNlbWVudCk7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gbW92ZVhPZlBvaW50KHN0YXJ0UG9pbnQsIEVYVEVORF9PRkZTRVQsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBjaXJjbGVDZW50ZXIgPSBtb3ZlWE9mUG9pbnQoZW5kUG9pbnQsIEVYVEVORF9ESUFNRVRFUiAvIDIsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IGFycm93UG9pbnRzID0gdGhpcy5nZXRBcnJvd1BvaW50cyhjaXJjbGVDZW50ZXIsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IGFycm93TGluZSA9IGRyYXdMaW5lYXJQYXRoKGFycm93UG9pbnRzLCB7XG4gICAgICAgICAgICBzdHJva2UsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBleHRlbmRMaW5lID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5saW5lKHN0YXJ0UG9pbnRbMF0sIHN0YXJ0UG9pbnRbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSwge1xuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGJyYW5jaFdpZHRoLFxuICAgICAgICAgICAgc3Ryb2tlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJhZGdlID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ2VudGVyWzBdLCBjaXJjbGVDZW50ZXJbMV0sIEVYVEVORF9ESUFNRVRFUiwge1xuICAgICAgICAgICAgZmlsbDogc3Ryb2tlLFxuICAgICAgICAgICAgc3Ryb2tlLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhpZGVDaXJjbGVHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ2VudGVyWzBdLCBjaXJjbGVDZW50ZXJbMV0sIEVYVEVORF9ESUFNRVRFUiwge1xuICAgICAgICAgICAgZmlsbDogJyNmZmYnLFxuICAgICAgICAgICAgc3Ryb2tlLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGJyYW5jaFdpZHRoID4gMyA/IDMgOiBicmFuY2hXaWR0aCxcbiAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZWxlbWVudC5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgbGV0IG51bWJlck9mZnNldCA9IDA7XG4gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW5Db3VudChlbGVtZW50KSA+PSAxMCkgbnVtYmVyT2Zmc2V0ID0gLTI7XG4gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW5Db3VudChlbGVtZW50KSA9PT0gMSkgbnVtYmVyT2Zmc2V0ID0gMTtcblxuICAgICAgICAgICAgY29uc3QgYmFkZ2VUZXh0ID0gY3JlYXRlVGV4dChjaXJjbGVDZW50ZXJbMF0gLSA0ICsgbnVtYmVyT2Zmc2V0LCBjaXJjbGVDZW50ZXJbMV0gKyA0LCBzdHJva2UsIGAke2dldENoaWxkcmVuQ291bnQoZWxlbWVudCl9YCk7XG4gICAgICAgICAgICBiYWRnZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ29wYWNpdHk6IDAuMTUnKTtcbiAgICAgICAgICAgIGJhZGdlVGV4dC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogMTJweCcpO1xuICAgICAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGJhZGdlKTtcbiAgICAgICAgICAgIGNvbGxhcHNlRy5hcHBlbmRDaGlsZChiYWRnZVRleHQpO1xuICAgICAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGV4dGVuZExpbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGhpZGVDaXJjbGVHKTtcbiAgICAgICAgICAgIGNvbGxhcHNlRy5hcHBlbmRDaGlsZChhcnJvd0xpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGV4dGVuZExpbmUpO1xuICAgICAgICByZXR1cm4gY29sbGFwc2VHO1xuICAgIH1cblxuICAgIGFmdGVyRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4gbm90IGZpbmQgcXVpY2sgaW5zZXJ0IGdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmcsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhUGxhaXRCb2FyZC5pc1BvaW50ZXIodGhpcy5ib2FyZCwgUGxhaXRQb2ludGVyVHlwZS5oYW5kKSB8fCAhIVBsYWl0Qm9hcmQuaXNSZWFkb25seSh0aGlzLmJvYXJkKSksXG4gICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSAhZWxlbWVudC5pc0NvbGxhcHNlZDtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50OiBQYXJ0aWFsPE1pbmRFbGVtZW50PiA9IHsgaXNDb2xsYXBzZWQgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aCh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5ib2FyZCwgbmV3RWxlbWVudCwgcGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFycm93UG9pbnRzKGNpcmNsZUNlbnRlcjogUG9pbnQsIGxpbmtEaXJlY3Rpb246IExheW91dERpcmVjdGlvbikge1xuICAgICAgICBsZXQgYXJyb3dUb3BQb2ludCA9IG1vdmVYT2ZQb2ludChjaXJjbGVDZW50ZXIsIDIsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBhcnJvd1RvcFBvaW50ID0gbW92ZVlPZlBvaW50KGFycm93VG9wUG9pbnQsIDQsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBhcnJvd01pZGRsZVBvaW50ID0gbW92ZVhPZlBvaW50KGNpcmNsZUNlbnRlciwgLTIsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBsZXQgYXJyb3dCb3R0b21Qb2ludCA9IG1vdmVYT2ZQb2ludChjaXJjbGVDZW50ZXIsIDIsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBhcnJvd0JvdHRvbVBvaW50ID0gbW92ZVlPZlBvaW50KGFycm93Qm90dG9tUG9pbnQsIC00LCBsaW5rRGlyZWN0aW9uKTtcblxuICAgICAgICByZXR1cm4gW2Fycm93VG9wUG9pbnQsIGFycm93TWlkZGxlUG9pbnQsIGFycm93Qm90dG9tUG9pbnRdO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { MindElement } from '../interfaces';
|
|
2
|
+
import { createForeignObject, createG } from '@plait/core';
|
|
3
|
+
import { getEmojiFontSize } from '../utils/space/emoji';
|
|
4
|
+
import { getEmojiForeignRectangle } from '../utils/position/emoji';
|
|
5
|
+
class EmojiDrawer {
|
|
6
|
+
constructor(board, viewContainerRef) {
|
|
7
|
+
this.board = board;
|
|
8
|
+
this.viewContainerRef = viewContainerRef;
|
|
9
|
+
this.componentRef = null;
|
|
10
|
+
}
|
|
11
|
+
draw(emoji, element) {
|
|
12
|
+
this.destroy();
|
|
13
|
+
const componentType = this.board.drawEmoji(emoji, element);
|
|
14
|
+
this.componentRef = this.viewContainerRef.createComponent(componentType);
|
|
15
|
+
this.componentRef.instance.emojiItem = emoji;
|
|
16
|
+
this.componentRef.instance.board = this.board;
|
|
17
|
+
this.componentRef.instance.element = element;
|
|
18
|
+
this.componentRef.instance.fontSize = getEmojiFontSize(element);
|
|
19
|
+
}
|
|
20
|
+
get nativeElement() {
|
|
21
|
+
if (this.componentRef) {
|
|
22
|
+
return this.componentRef.instance.nativeElement;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
destroy() {
|
|
29
|
+
if (this.componentRef) {
|
|
30
|
+
this.componentRef.destroy();
|
|
31
|
+
this.componentRef = null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class NodeEmojisDrawer {
|
|
36
|
+
constructor(board, viewContainerRef) {
|
|
37
|
+
this.board = board;
|
|
38
|
+
this.viewContainerRef = viewContainerRef;
|
|
39
|
+
this.emojiDrawers = [];
|
|
40
|
+
}
|
|
41
|
+
drawEmojis(element) {
|
|
42
|
+
this.destroy();
|
|
43
|
+
if (MindElement.hasEmojis(element)) {
|
|
44
|
+
this.g = createG();
|
|
45
|
+
this.g.classList.add('emojis');
|
|
46
|
+
const foreignRectangle = getEmojiForeignRectangle(this.board, element);
|
|
47
|
+
const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
|
|
48
|
+
this.g.append(foreignObject);
|
|
49
|
+
const container = document.createElement('div');
|
|
50
|
+
container.classList.add('node-emojis-container');
|
|
51
|
+
foreignObject.append(container);
|
|
52
|
+
this.emojiDrawers = element.data.emojis.map(emojiItem => {
|
|
53
|
+
const drawer = new EmojiDrawer(this.board, this.viewContainerRef);
|
|
54
|
+
drawer.draw(emojiItem, element);
|
|
55
|
+
return drawer;
|
|
56
|
+
});
|
|
57
|
+
this.emojiDrawers.forEach(drawer => {
|
|
58
|
+
container.append(drawer.nativeElement);
|
|
59
|
+
});
|
|
60
|
+
return this.g;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
destroy() {
|
|
65
|
+
if (this.g) {
|
|
66
|
+
this.g.remove();
|
|
67
|
+
}
|
|
68
|
+
this.emojiDrawers.forEach(drawer => drawer.destroy());
|
|
69
|
+
this.emojiDrawers = [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbW9qaXMuZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvZHJhd2VyL25vZGUtZW1vamlzLmRyYXdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXdCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR25FLE1BQU0sV0FBVztJQUdiLFlBQW9CLEtBQXFCLEVBQVUsZ0JBQWtDO1FBQWpFLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUZyRixpQkFBWSxHQUFnRCxJQUFJLENBQUM7SUFFdUIsQ0FBQztJQUV6RixJQUFJLENBQUMsS0FBZ0IsRUFBRSxPQUErQjtRQUNsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbW9qaURhdGEsIEVtb2ppSXRlbSwgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmRFbW9qaUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlL2Vtb2ppLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUZvcmVpZ25PYmplY3QsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRFbW9qaUZvbnRTaXplIH0gZnJvbSAnLi4vdXRpbHMvc3BhY2UvZW1vamknO1xuaW1wb3J0IHsgZ2V0RW1vamlGb3JlaWduUmVjdGFuZ2xlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vZW1vamknO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5cbmNsYXNzIEVtb2ppRHJhd2VyIHtcbiAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNaW5kRW1vamlCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kQm9hcmQsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIGRyYXcoZW1vamk6IEVtb2ppSXRlbSwgZWxlbWVudDogTWluZEVsZW1lbnQ8RW1vamlEYXRhPikge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuYm9hcmQuZHJhd0Vtb2ppKGVtb2ppLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbW9qaUl0ZW0gPSBlbW9qaTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYm9hcmQgPSB0aGlzLmJvYXJkO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZm9udFNpemUgPSBnZXRFbW9qaUZvbnRTaXplKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vZGVFbW9qaXNEcmF3ZXIge1xuICAgIGVtb2ppRHJhd2VyczogRW1vamlEcmF3ZXJbXSA9IFtdO1xuXG4gICAgZz86IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kQm9hcmQsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIGRyYXdFbW9qaXMoZWxlbWVudDogTWluZEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmIChNaW5kRWxlbWVudC5oYXNFbW9qaXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuZyA9IGNyZWF0ZUcoKTtcbiAgICAgICAgICAgIHRoaXMuZy5jbGFzc0xpc3QuYWRkKCdlbW9qaXMnKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25SZWN0YW5nbGUgPSBnZXRFbW9qaUZvcmVpZ25SZWN0YW5nbGUodGhpcy5ib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY3JlYXRlRm9yZWlnbk9iamVjdChcbiAgICAgICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLngsXG4gICAgICAgICAgICAgICAgZm9yZWlnblJlY3RhbmdsZS55LFxuICAgICAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAgICAgZm9yZWlnblJlY3RhbmdsZS5oZWlnaHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmcuYXBwZW5kKGZvcmVpZ25PYmplY3QpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbm9kZS1lbW9qaXMtY29udGFpbmVyJyk7XG4gICAgICAgICAgICBmb3JlaWduT2JqZWN0LmFwcGVuZChjb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMgPSBlbGVtZW50LmRhdGEuZW1vamlzLm1hcChlbW9qaUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYXdlciA9IG5ldyBFbW9qaURyYXdlcih0aGlzLmJvYXJkLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICAgICAgICAgIGRyYXdlci5kcmF3KGVtb2ppSXRlbSwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMuZm9yRWFjaChkcmF3ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZHJhd2VyLm5hdGl2ZUVsZW1lbnQhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmcpIHtcbiAgICAgICAgICAgIHRoaXMuZy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtb2ppRHJhd2Vycy5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXIuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMgPSBbXTtcbiAgICB9XG59XG4iXX0=
|