@plait/mind 0.9.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 +22 -15
- package/esm2020/plugins/with-mind.mjs +9 -8
- package/esm2020/plugins/with-node-dnd.mjs +2 -2
- 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 +547 -726
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +547 -714
- 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 +11 -10
- 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 -98
- package/esm2020/utils/draw/node-topic.mjs +0 -32
- package/utils/draw/node-topic.d.ts +0 -16
package/interfaces/element.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ export declare const MindElement: {
|
|
|
39
39
|
findParentNode(element: MindElement): import("@plait/mind").MindNode | undefined;
|
|
40
40
|
hasEmojis(element: MindElement): element is MindElement<EmojiData>;
|
|
41
41
|
getEmojis(element: MindElement<EmojiData>): import("./element-data").EmojiItem[];
|
|
42
|
+
getEditor(element: MindElement): import("slate").BaseEditor & import("slate-angular").AngularEditor & import("slate-history").HistoryEditor;
|
|
42
43
|
};
|
|
43
44
|
export declare enum MindElementShape {
|
|
44
45
|
roundRectangle = "round-rectangle",
|
package/mind.module.d.ts
CHANGED
|
@@ -2,10 +2,10 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import * as i1 from "./mind.component";
|
|
3
3
|
import * as i2 from "./node.component";
|
|
4
4
|
import * as i3 from "@angular/common";
|
|
5
|
-
import * as i4 from "@plait/
|
|
5
|
+
import * as i4 from "@plait/text";
|
|
6
6
|
import * as i5 from "@plait/core";
|
|
7
7
|
export declare class MindModule {
|
|
8
8
|
static ɵfac: i0.ɵɵFactoryDeclaration<MindModule, never>;
|
|
9
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<MindModule, [typeof i1.PlaitMindComponent, typeof i2.MindNodeComponent], [typeof i3.CommonModule, typeof i4.
|
|
9
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<MindModule, [typeof i1.PlaitMindComponent, typeof i2.MindNodeComponent], [typeof i3.CommonModule, typeof i4.TextModule, typeof i5.PlaitModule], [typeof i1.PlaitMindComponent, typeof i2.MindNodeComponent]>;
|
|
10
10
|
static ɵinj: i0.ɵɵInjectorDeclaration<MindModule>;
|
|
11
11
|
}
|
package/node.component.d.ts
CHANGED
|
@@ -1,61 +1,45 @@
|
|
|
1
|
-
import { ChangeDetectorRef,
|
|
1
|
+
import { ChangeDetectorRef, OnDestroy, OnInit, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import { PlaitPluginElementComponent, PlaitPluginElementContext, OnContextChanged } from '@plait/core';
|
|
3
|
-
import {
|
|
3
|
+
import { TextManage } from '@plait/text';
|
|
4
4
|
import { RoughSVG } from 'roughjs/bin/svg';
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import { MindElement } from './interfaces/element';
|
|
7
7
|
import { MindNode } from './interfaces/node';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { NodeEmojisDrawer } from './drawer/node-emojis.drawer';
|
|
9
|
+
import { NodeInsertDrawer } from './drawer/node-insert.drawer';
|
|
10
10
|
import { PlaitMindBoard } from './plugins/with-mind.board';
|
|
11
|
-
import {
|
|
11
|
+
import { NodeActiveDrawer } from './drawer/node-active.drawer';
|
|
12
|
+
import { CollapseDrawer } from './drawer/node-collapse.drawer';
|
|
12
13
|
import * as i0 from "@angular/core";
|
|
13
14
|
export declare class MindNodeComponent extends PlaitPluginElementComponent<MindElement, PlaitMindBoard> implements OnInit, OnDestroy, OnContextChanged<MindElement, PlaitMindBoard> {
|
|
14
15
|
private viewContainerRef;
|
|
15
16
|
protected cdr: ChangeDetectorRef;
|
|
16
|
-
private render2;
|
|
17
|
-
private ngZone;
|
|
18
|
-
isEditable: boolean;
|
|
19
17
|
roughSVG: RoughSVG;
|
|
20
18
|
node: MindNode;
|
|
21
19
|
index: number;
|
|
22
|
-
abstractIncludedOutlineG?: SVGGElement;
|
|
23
20
|
parentG: SVGGElement;
|
|
24
|
-
activeG: SVGGElement[];
|
|
25
21
|
shapeG: SVGGElement | null;
|
|
26
22
|
linkG?: SVGGElement;
|
|
27
|
-
richtextG?: SVGGElement;
|
|
28
|
-
foreignObject?: SVGForeignObjectElement;
|
|
29
23
|
extendG?: SVGGElement;
|
|
30
|
-
maskG: SVGGElement;
|
|
31
|
-
richtextComponentRef?: ComponentRef<PlaitRichtextComponent>;
|
|
32
24
|
destroy$: Subject<void>;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
nodeEmojisDrawer: NodeEmojisDrawer;
|
|
26
|
+
nodeInsertDrawer: NodeInsertDrawer;
|
|
27
|
+
textManage: TextManage;
|
|
28
|
+
activeDrawer: NodeActiveDrawer;
|
|
29
|
+
collapseDrawer: CollapseDrawer;
|
|
30
|
+
constructor(viewContainerRef: ViewContainerRef, cdr: ChangeDetectorRef);
|
|
31
|
+
initializeDrawer(): void;
|
|
37
32
|
ngOnInit(): void;
|
|
33
|
+
editTopic(): void;
|
|
38
34
|
onContextChanged(value: PlaitPluginElementContext<MindElement, PlaitMindBoard>, previous: PlaitPluginElementContext<MindElement, PlaitMindBoard>): void;
|
|
39
35
|
drawEmojis(): void;
|
|
40
|
-
drawQuickInsert(): void;
|
|
41
36
|
drawShape(): void;
|
|
42
37
|
destroyShape(): void;
|
|
43
38
|
drawLink(): void;
|
|
44
39
|
destroyLine(): void;
|
|
45
|
-
drawMaskG(): void;
|
|
46
|
-
destroyMaskG(): void;
|
|
47
|
-
enableMaskG(): void;
|
|
48
|
-
disabledMaskG(): void;
|
|
49
|
-
drawActiveG(): void;
|
|
50
|
-
destroyActiveG(): void;
|
|
51
|
-
updateActiveClass(): void;
|
|
52
|
-
drawRichtext(): void;
|
|
53
40
|
drawExtend(): void;
|
|
54
41
|
destroyExtend(): void;
|
|
55
|
-
|
|
56
|
-
updateAbstractIncludedOutline(activeHandlePosition?: AbstractHandlePosition, resizingLocation?: number): void;
|
|
57
|
-
updateRichtext(): void;
|
|
58
|
-
startEditText(isEnd: boolean, isClear: boolean): void;
|
|
42
|
+
drawText(): void;
|
|
59
43
|
trackBy: (index: number, node: MindNode) => string;
|
|
60
44
|
ngOnDestroy(): void;
|
|
61
45
|
static ɵfac: i0.ɵɵFactoryDeclaration<MindNodeComponent, never>;
|
package/package.json
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
2
|
import { PlaitMindBoard } from './with-mind.board';
|
|
3
|
-
import {
|
|
4
|
-
import { PlaitRichtextComponent } from '@plait/richtext';
|
|
3
|
+
import { TextManage } from '@plait/text';
|
|
5
4
|
export interface FakeCreateNodeRef {
|
|
5
|
+
g: SVGGElement;
|
|
6
6
|
nodeG: SVGGElement;
|
|
7
|
-
|
|
8
|
-
foreignObject: SVGForeignObjectElement;
|
|
9
|
-
topicG: SVGGElement;
|
|
7
|
+
textManage: TextManage;
|
|
10
8
|
}
|
|
11
9
|
export declare const withCreateMind: (board: PlaitBoard) => PlaitBoard & PlaitMindBoard;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const withNodeDnd: (board: PlaitBoard) => PlaitBoard;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PlaitBoard } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../interfaces/element';
|
|
3
|
+
export declare const withNodeHover: (board: PlaitBoard) => PlaitBoard;
|
|
4
|
+
export declare const addHovered: (element: MindElement) => void;
|
|
5
|
+
export declare const removeHovered: (element: MindElement) => void;
|
package/styles/mixins.scss
CHANGED
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
@mixin node-color{
|
|
1
|
+
@mixin node-color {
|
|
2
2
|
&.theme-default,
|
|
3
3
|
&.theme-soft {
|
|
4
|
-
.
|
|
5
|
-
color: #333333;
|
|
6
|
-
}
|
|
7
|
-
.child-node {
|
|
4
|
+
.plait-richtext-container {
|
|
8
5
|
color: #333333;
|
|
9
6
|
}
|
|
10
7
|
}
|
|
11
8
|
|
|
12
9
|
&.theme-colorful,
|
|
13
10
|
&.theme-retro {
|
|
14
|
-
.root
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
color: #333333;
|
|
11
|
+
.root {
|
|
12
|
+
.plait-richtext-container {
|
|
13
|
+
color: #ffffff;
|
|
14
|
+
}
|
|
19
15
|
}
|
|
20
16
|
}
|
|
21
17
|
|
|
22
18
|
&.theme-dark,
|
|
23
19
|
&.theme-starry {
|
|
24
|
-
.
|
|
25
|
-
color: #333333;
|
|
26
|
-
}
|
|
27
|
-
.child-node {
|
|
20
|
+
.plait-richtext-container {
|
|
28
21
|
color: #ffffff;
|
|
29
22
|
}
|
|
23
|
+
.root {
|
|
24
|
+
.plait-richtext-container {
|
|
25
|
+
color: #333333;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
30
28
|
}
|
|
31
|
-
}
|
|
29
|
+
}
|
package/styles/styles.scss
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
$primary: #4e8afa;
|
|
4
4
|
|
|
5
5
|
g[plait-mindmap='true'] {
|
|
6
|
-
.
|
|
6
|
+
.slate-editable-container {
|
|
7
7
|
cursor: default;
|
|
8
8
|
min-width: 5px;
|
|
9
|
-
&[
|
|
9
|
+
&[contenteditable='true'] {
|
|
10
10
|
cursor: text;
|
|
11
11
|
max-width: 34em;
|
|
12
12
|
}
|
|
@@ -29,7 +29,7 @@ g[plait-mindmap='true'] {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
.plait-board-container {
|
|
32
|
-
&.focused:not(.selection-moving):not(.element-moving):not(.abstract-resizing-horizontal):not(.abstract-resizing-vertical):not(.pointer-mind) {
|
|
32
|
+
&.focused:not(.selection-moving):not(.element-moving):not(.abstract-resizing-horizontal):not(.abstract-resizing-vertical):not(.pointer-mind):not(.mind-node-dragging) {
|
|
33
33
|
.extend {
|
|
34
34
|
cursor: pointer;
|
|
35
35
|
&:hover {
|
|
@@ -93,13 +93,6 @@ g[plait-mindmap='true'] {
|
|
|
93
93
|
position: initial;
|
|
94
94
|
align-items: center;
|
|
95
95
|
height: 100%;
|
|
96
|
-
::-moz-selection {
|
|
97
|
-
/* Code for Firefox */
|
|
98
|
-
background: none;
|
|
99
|
-
}
|
|
100
|
-
::selection {
|
|
101
|
-
background: none;
|
|
102
|
-
}
|
|
103
96
|
}
|
|
104
97
|
|
|
105
98
|
.fake-node {
|
|
@@ -112,5 +105,13 @@ g[plait-mindmap='true'] {
|
|
|
112
105
|
}
|
|
113
106
|
}
|
|
114
107
|
|
|
108
|
+
.root {
|
|
109
|
+
.plait-richtext-container {
|
|
110
|
+
font-size: 18px;
|
|
111
|
+
min-height: 25px;
|
|
112
|
+
line-height: 25px;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
115
116
|
@include mixins.node-color();
|
|
116
117
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PlaitBoard,
|
|
1
|
+
import { PlaitBoard, Point, RectangleClient } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../../interfaces';
|
|
3
3
|
import { LayoutNode } from '@plait/layouts';
|
|
4
4
|
import { AbstractHandlePosition } from '../../plugins/with-abstract-resize.board';
|
|
@@ -20,4 +20,4 @@ export declare const getAbstractHandleRectangle: (rectangle: RectangleClient, is
|
|
|
20
20
|
width: number;
|
|
21
21
|
};
|
|
22
22
|
export declare function findLocationLeftIndex(board: PlaitBoard, parentChildren: MindElement[], location: number, isHorizontal: boolean): number;
|
|
23
|
-
export declare function handleTouchedAbstract(board: PlaitBoard, touchedAbstract:
|
|
23
|
+
export declare function handleTouchedAbstract(board: PlaitBoard, touchedAbstract: MindElement | undefined, endPoint: Point): MindElement<import("../../interfaces").BaseData> | undefined;
|
package/utils/node/common.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { MindElement } from '../../interfaces/element';
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function editTopic(element: MindElement): void;
|
|
@@ -1,72 +0,0 @@
|
|
|
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 EmojisDrawer {
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamlzLmRyYXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9lbW9qaXMuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBd0IsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbkUsTUFBTSxXQUFXO0lBR2IsWUFBb0IsS0FBcUIsRUFBVSxnQkFBa0M7UUFBakUsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRnJGLGlCQUFZLEdBQWdELElBQUksQ0FBQztJQUV1QixDQUFDO0lBRXpGLElBQUksQ0FBQyxLQUFnQixFQUFFLE9BQStCO1FBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFB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bmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbW9qaURhdGEsIEVtb2ppSXRlbSwgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmRFbW9qaUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlL2Vtb2ppLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUZvcmVpZ25PYmplY3QsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRFbW9qaUZvbnRTaXplIH0gZnJvbSAnLi4vdXRpbHMvc3BhY2UvZW1vamknO1xuaW1wb3J0IHsgZ2V0RW1vamlGb3JlaWduUmVjdGFuZ2xlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vZW1vamknO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5cbmNsYXNzIEVtb2ppRHJhd2VyIHtcbiAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNaW5kRW1vamlCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kQm9hcmQsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIGRyYXcoZW1vamk6IEVtb2ppSXRlbSwgZWxlbWVudDogTWluZEVsZW1lbnQ8RW1vamlEYXRhPikge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuYm9hcmQuZHJhd0Vtb2ppKGVtb2ppLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbW9qaUl0ZW0gPSBlbW9qaTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYm9hcmQgPSB0aGlzLmJvYXJkO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZm9udFNpemUgPSBnZXRFbW9qaUZvbnRTaXplKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVtb2ppc0RyYXdlciB7XG4gICAgZW1vamlEcmF3ZXJzOiBFbW9qaURyYXdlcltdID0gW107XG5cbiAgICBnPzogU1ZHR0VsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJvYXJkOiBQbGFpdE1pbmRCb2FyZCwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7fVxuXG4gICAgZHJhd0Vtb2ppcyhlbGVtZW50OiBNaW5kRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50Lmhhc0Vtb2ppcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5nID0gY3JlYXRlRygpO1xuICAgICAgICAgICAgdGhpcy5nLmNsYXNzTGlzdC5hZGQoJ2Vtb2ppcycpO1xuICAgICAgICAgICAgY29uc3QgZm9yZWlnblJlY3RhbmdsZSA9IGdldEVtb2ppRm9yZWlnblJlY3RhbmdsZSh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjcmVhdGVGb3JlaWduT2JqZWN0KFxuICAgICAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUueCxcbiAgICAgICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLnksXG4gICAgICAgICAgICAgICAgZm9yZWlnblJlY3RhbmdsZS53aWR0aCxcbiAgICAgICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZy5hcHBlbmQoZm9yZWlnbk9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdub2RlLWVtb2ppcy1jb250YWluZXInKTtcbiAgICAgICAgICAgIGZvcmVpZ25PYmplY3QuYXBwZW5kKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLmVtb2ppRHJhd2VycyA9IGVsZW1lbnQuZGF0YS5lbW9qaXMubWFwKGVtb2ppSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhd2VyID0gbmV3IEVtb2ppRHJhd2VyKHRoaXMuYm9hcmQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICAgICAgICAgICAgZHJhd2VyLmRyYXcoZW1vamlJdGVtLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2VyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtb2ppRHJhd2Vycy5mb3JFYWNoKGRyYXdlciA9PiB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChkcmF3ZXIubmF0aXZlRWxlbWVudCEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZykge1xuICAgICAgICAgICAgdGhpcy5nLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1vamlEcmF3ZXJzLmZvckVhY2goZHJhd2VyID0+IGRyYXdlci5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLmVtb2ppRHJhd2VycyA9IFtdO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, createG } 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_RADIUS, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_INNER_CROSS_COLOR } from '../constants/default';
|
|
7
|
-
import { isHorizontalLayout, isIndentedLayout, isTopLayout } from '@plait/layouts';
|
|
8
|
-
import { MindQueries } from '../queries';
|
|
9
|
-
import { fromEvent } from 'rxjs';
|
|
10
|
-
import { insertMindElement } from '../utils/mind';
|
|
11
|
-
import { take } from 'rxjs/operators';
|
|
12
|
-
import { findNewChildNodePath } from '../utils/path';
|
|
13
|
-
import { getBranchColorByMindElement, getBranchWidthByMindElement, getNextBranchColor } from '../utils/node-style/branch';
|
|
14
|
-
import { getLayoutDirection, getPointByPlacement, moveXOfPoint, transformPlacement } from '../utils/point-placement';
|
|
15
|
-
import { HorizontalPlacement, VerticalPlacement } from '../interfaces/types';
|
|
16
|
-
export class QuickInsertDrawer extends BaseDrawer {
|
|
17
|
-
canDraw(element) {
|
|
18
|
-
if (PlaitBoard.isReadonly(this.board) || element?.isCollapsed) {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
draw(element) {
|
|
24
|
-
const quickInsertG = createG();
|
|
25
|
-
this.g = quickInsertG;
|
|
26
|
-
quickInsertG.classList.add('quick-insert');
|
|
27
|
-
const node = MindElement.getNode(element);
|
|
28
|
-
const layout = MindQueries.getLayoutByElement(element);
|
|
29
|
-
const isHorizontal = isHorizontalLayout(layout);
|
|
30
|
-
let linkDirection = getLayoutDirection(node, isHorizontal);
|
|
31
|
-
if (isIndentedLayout(layout)) {
|
|
32
|
-
linkDirection = isTopLayout(layout) ? LayoutDirection.top : LayoutDirection.bottom;
|
|
33
|
-
}
|
|
34
|
-
const isUnderlineShape = getShapeByElement(this.board, element) === MindElementShape.underline;
|
|
35
|
-
const nodeClient = getRectangleByNode(node);
|
|
36
|
-
const branchWidth = getBranchWidthByMindElement(this.board, element);
|
|
37
|
-
const branchColor = PlaitMind.isMind(element)
|
|
38
|
-
? getNextBranchColor(this.board, element)
|
|
39
|
-
: getBranchColorByMindElement(this.board, element);
|
|
40
|
-
let distance = 8;
|
|
41
|
-
let placement = [HorizontalPlacement.right, VerticalPlacement.middle];
|
|
42
|
-
transformPlacement(placement, linkDirection);
|
|
43
|
-
// underline shape and horizontal
|
|
44
|
-
if (isHorizontal && isUnderlineShape && !element.isRoot) {
|
|
45
|
-
placement[1] = VerticalPlacement.bottom;
|
|
46
|
-
}
|
|
47
|
-
let beginPoint = getPointByPlacement(nodeClient, placement);
|
|
48
|
-
if (element.children.length > 0 && !element.isRoot) {
|
|
49
|
-
beginPoint = moveXOfPoint(beginPoint, EXTEND_RADIUS + 8, linkDirection);
|
|
50
|
-
distance = 5;
|
|
51
|
-
}
|
|
52
|
-
const endPoint = moveXOfPoint(beginPoint, distance, linkDirection);
|
|
53
|
-
const circleCenter = moveXOfPoint(endPoint, 8, linkDirection);
|
|
54
|
-
const line = PlaitBoard.getRoughSVG(this.board).line(beginPoint[0], beginPoint[1], endPoint[0], endPoint[1], {
|
|
55
|
-
stroke: branchColor,
|
|
56
|
-
strokeWidth: branchWidth
|
|
57
|
-
});
|
|
58
|
-
const circle = PlaitBoard.getRoughSVG(this.board).circle(circleCenter[0], circleCenter[1], EXTEND_RADIUS, {
|
|
59
|
-
fill: QUICK_INSERT_CIRCLE_COLOR,
|
|
60
|
-
stroke: QUICK_INSERT_CIRCLE_COLOR,
|
|
61
|
-
fillStyle: 'solid'
|
|
62
|
-
});
|
|
63
|
-
const HLineBeginPoint = [circleCenter[0] - 5, circleCenter[1]];
|
|
64
|
-
const HLineEndPoint = [circleCenter[0] + 5, circleCenter[1]];
|
|
65
|
-
const VLineBeginPoint = [circleCenter[0], circleCenter[1] - 5];
|
|
66
|
-
const VLineEndPoint = [circleCenter[0], circleCenter[1] + 5];
|
|
67
|
-
const innerCrossHLine = PlaitBoard.getRoughSVG(this.board).line(HLineBeginPoint[0], HLineBeginPoint[1], HLineEndPoint[0], HLineEndPoint[1], {
|
|
68
|
-
stroke: QUICK_INSERT_INNER_CROSS_COLOR,
|
|
69
|
-
strokeWidth: 2
|
|
70
|
-
});
|
|
71
|
-
const innerCrossVLine = PlaitBoard.getRoughSVG(this.board).line(VLineBeginPoint[0], VLineBeginPoint[1], VLineEndPoint[0], VLineEndPoint[1], {
|
|
72
|
-
stroke: QUICK_INSERT_INNER_CROSS_COLOR,
|
|
73
|
-
strokeWidth: 2
|
|
74
|
-
});
|
|
75
|
-
quickInsertG.appendChild(line);
|
|
76
|
-
quickInsertG.appendChild(circle);
|
|
77
|
-
quickInsertG.appendChild(innerCrossHLine);
|
|
78
|
-
quickInsertG.appendChild(innerCrossVLine);
|
|
79
|
-
return quickInsertG;
|
|
80
|
-
}
|
|
81
|
-
afterDraw(element) {
|
|
82
|
-
if (!this.g) {
|
|
83
|
-
throw new Error(`can not find quick insert g`);
|
|
84
|
-
}
|
|
85
|
-
fromEvent(this.g, 'mousedown')
|
|
86
|
-
.pipe(take(1))
|
|
87
|
-
.subscribe(e => {
|
|
88
|
-
e.stopPropagation();
|
|
89
|
-
});
|
|
90
|
-
fromEvent(this.g, 'mouseup')
|
|
91
|
-
.pipe(take(1))
|
|
92
|
-
.subscribe(() => {
|
|
93
|
-
const path = findNewChildNodePath(this.board, element);
|
|
94
|
-
insertMindElement(this.board, element, path);
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2staW5zZXJ0LmRyYXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9xdWljay1pbnNlcnQuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQVksU0FBUyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSx5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hILE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFB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dkIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgY3JlYXRlRyB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50LCBCYXNlRGF0YSwgUGxhaXRNaW5kLCBNaW5kRWxlbWVudFNoYXBlLCBMYXlvdXREaXJlY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFmdGVyRHJhdywgQmFzZURyYXdlciB9IGZyb20gJy4uL2Jhc2UvYmFzZS5kcmF3ZXInO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vbm9kZSc7XG5pbXBvcnQgeyBnZXRTaGFwZUJ5RWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL25vZGUtc3R5bGUvc2hhcGUnO1xuaW1wb3J0IHsgRVhURU5EX1JBRElVUywgUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUiwgUVVJQ0tfSU5TRVJUX0lOTkVSX0NST1NTX0NPTE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgTWluZExheW91dFR5cGUsIGlzSG9yaXpvbnRhbExheW91dCwgaXNJbmRlbnRlZExheW91dCwgaXNUb3BMYXlvdXQgfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBNaW5kUXVlcmllcyB9IGZyb20gJy4uL3F1ZXJpZXMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbnNlcnRNaW5kRWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL21pbmQnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGZpbmROZXdDaGlsZE5vZGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvcGF0aCc7XG5pbXBvcnQgeyBnZXRCcmFuY2hDb2xvckJ5TWluZEVsZW1lbnQsIGdldEJyYW5jaFdpZHRoQnlNaW5kRWxlbWVudCwgZ2V0TmV4dEJyYW5jaENvbG9yIH0gZnJvbSAnLi4vdXRpbHMvbm9kZS1zdHlsZS9icmFuY2gnO1xuaW1wb3J0IHsgZ2V0TGF5b3V0RGlyZWN0aW9uLCBnZXRQb2ludEJ5UGxhY2VtZW50LCBtb3ZlWE9mUG9pbnQsIHRyYW5zZm9ybVBsYWNlbWVudCB9IGZyb20gJy4uL3V0aWxzL3BvaW50LXBsYWNlbWVudCc7XG5pbXBvcnQgeyBIb3Jpem9udGFsUGxhY2VtZW50LCBQb2ludFBsYWNlbWVudCwgVmVydGljYWxQbGFjZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFF1aWNrSW5zZXJ0RHJhd2VyIGV4dGVuZHMgQmFzZURyYXdlciBpbXBsZW1lbnRzIEFmdGVyRHJhdyB7XG4gICAgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudDxCYXNlRGF0YT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKFBsYWl0Qm9hcmQuaXNSZWFkb25seSh0aGlzLmJvYXJkKSB8fCBlbGVtZW50Py5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+KTogU1ZHR0VsZW1lbnQge1xuICAgICAgICBjb25zdCBxdWlja0luc2VydEcgPSBjcmVhdGVHKCk7XG4gICAgICAgIHRoaXMuZyA9IHF1aWNrSW5zZXJ0RztcbiAgICAgICAgcXVpY2tJbnNlcnRHLmNsYXNzTGlzdC5hZGQoJ3F1aWNrLWluc2VydCcpO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBNaW5kRWxlbWVudC5nZXROb2RlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBNaW5kUXVlcmllcy5nZXRMYXlvdXRCeUVsZW1lbnQoZWxlbWVudCkgYXMgTWluZExheW91dFR5cGU7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbExheW91dChsYXlvdXQpO1xuICAgICAgICBsZXQgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihub2RlLCBpc0hvcml6b250YWwpO1xuICAgICAgICBpZiAoaXNJbmRlbnRlZExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICBsaW5rRGlyZWN0aW9uID0gaXNUb3BMYXlvdXQobGF5b3V0KSA/IExheW91dERpcmVjdGlvbi50b3AgOiBMYXlvdXREaXJlY3Rpb24uYm90dG9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzVW5kZXJsaW5lU2hhcGUgPSBnZXRTaGFwZUJ5RWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50KSA9PT0gTWluZEVsZW1lbnRTaGFwZS51bmRlcmxpbmU7XG4gICAgICAgIGNvbnN0IG5vZGVDbGllbnQgPSBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSk7XG4gICAgICAgIGNvbnN0IGJyYW5jaFdpZHRoID0gZ2V0QnJhbmNoV2lkdGhCeU1pbmRFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBicmFuY2hDb2xvciA9IFBsYWl0TWluZC5pc01pbmQoZWxlbWVudClcbiAgICAgICAgICAgID8gZ2V0TmV4dEJyYW5jaENvbG9yKHRoaXMuYm9hcmQsIGVsZW1lbnQpXG4gICAgICAgICAgICA6IGdldEJyYW5jaENvbG9yQnlNaW5kRWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgbGV0IGRpc3RhbmNlID0gODtcblxuICAgICAgICBsZXQgcGxhY2VtZW50OiBQb2ludFBsYWNlbWVudCA9IFtIb3Jpem9udGFsUGxhY2VtZW50LnJpZ2h0LCBWZXJ0aWNhbFBsYWNlbWVudC5taWRkbGVdO1xuXG4gICAgICAgIHRyYW5zZm9ybVBsYWNlbWVudChwbGFjZW1lbnQsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIC8vIHVuZGVybGluZSBzaGFwZSBhbmQgaG9yaXpvbnRhbFxuICAgICAgICBpZiAoaXNIb3Jpem9udGFsICYmIGlzVW5kZXJsaW5lU2hhcGUgJiYgIWVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICBwbGFjZW1lbnRbMV0gPSBWZXJ0aWNhbFBsYWNlbWVudC5ib3R0b207XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmVnaW5Qb2ludCA9IGdldFBvaW50QnlQbGFjZW1lbnQobm9kZUNsaWVudCwgcGxhY2VtZW50KTtcblxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmICFlbGVtZW50LmlzUm9vdCkge1xuICAgICAgICAgICAgYmVnaW5Qb2ludCA9IG1vdmVYT2ZQb2ludChiZWdpblBvaW50LCBFWFRFTkRfUkFESVVTICsgOCwgbGlua0RpcmVjdGlvbik7XG4gICAgICAgICAgICBkaXN0YW5jZSA9IDU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmRQb2ludCA9IG1vdmVYT2ZQb2ludChiZWdpblBvaW50LCBkaXN0YW5jZSwgbGlua0RpcmVjdGlvbik7XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbnRlciA9IG1vdmVYT2ZQb2ludChlbmRQb2ludCwgOCwgbGlua0RpcmVjdGlvbik7XG5cbiAgICAgICAgY29uc3QgbGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShiZWdpblBvaW50WzBdLCBiZWdpblBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0sIHtcbiAgICAgICAgICAgIHN0cm9rZTogYnJhbmNoQ29sb3IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogYnJhbmNoV2lkdGhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2lyY2xlID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ2VudGVyWzBdLCBjaXJjbGVDZW50ZXJbMV0sIEVYVEVORF9SQURJVVMsIHtcbiAgICAgICAgICAgIGZpbGw6IFFVSUNLX0lOU0VSVF9DSVJDTEVfQ09MT1IsXG4gICAgICAgICAgICBzdHJva2U6IFFVSUNLX0lOU0VSVF9DSVJDTEVfQ09MT1IsXG4gICAgICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgSExpbmVCZWdpblBvaW50ID0gW2NpcmNsZUNlbnRlclswXSAtIDUsIGNpcmNsZUNlbnRlclsxXV07XG4gICAgICAgIGNvbnN0IEhMaW5lRW5kUG9pbnQgPSBbY2lyY2xlQ2VudGVyWzBdICsgNSwgY2lyY2xlQ2VudGVyWzFdXTtcbiAgICAgICAgY29uc3QgVkxpbmVCZWdpblBvaW50ID0gW2NpcmNsZUNlbnRlclswXSwgY2lyY2xlQ2VudGVyWzFdIC0gNV07XG4gICAgICAgIGNvbnN0IFZMaW5lRW5kUG9pbnQgPSBbY2lyY2xlQ2VudGVyWzBdLCBjaXJjbGVDZW50ZXJbMV0gKyA1XTtcblxuICAgICAgICBjb25zdCBpbm5lckNyb3NzSExpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmxpbmUoXG4gICAgICAgICAgICBITGluZUJlZ2luUG9pbnRbMF0sXG4gICAgICAgICAgICBITGluZUJlZ2luUG9pbnRbMV0sXG4gICAgICAgICAgICBITGluZUVuZFBvaW50WzBdLFxuICAgICAgICAgICAgSExpbmVFbmRQb2ludFsxXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdHJva2U6IFFVSUNLX0lOU0VSVF9JTk5FUl9DUk9TU19DT0xPUixcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGlubmVyQ3Jvc3NWTGluZSA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCkubGluZShcbiAgICAgICAgICAgIFZMaW5lQmVnaW5Qb2ludFswXSxcbiAgICAgICAgICAgIFZMaW5lQmVnaW5Qb2ludFsxXSxcbiAgICAgICAgICAgIFZMaW5lRW5kUG9pbnRbMF0sXG4gICAgICAgICAgICBWTGluZUVuZFBvaW50WzFdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0cm9rZTogUVVJQ0tfSU5TRVJUX0lOTkVSX0NST1NTX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKGxpbmUpO1xuICAgICAgICBxdWlja0luc2VydEcuYXBwZW5kQ2hpbGQoY2lyY2xlKTtcbiAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKGlubmVyQ3Jvc3NITGluZSk7XG4gICAgICAgIHF1aWNrSW5zZXJ0Ry5hcHBlbmRDaGlsZChpbm5lckNyb3NzVkxpbmUpO1xuXG4gICAgICAgIHJldHVybiBxdWlja0luc2VydEc7XG4gICAgfVxuXG4gICAgYWZ0ZXJEcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbiBub3QgZmluZCBxdWljayBpbnNlcnQgZ2ApO1xuICAgICAgICB9XG4gICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmcsICdtb3VzZWRvd24nKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy5nLCAnbW91c2V1cCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGZpbmROZXdDaGlsZE5vZGVQYXRoKHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGluc2VydE1pbmRFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQsIHBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { drawRichtext } from '@plait/richtext';
|
|
2
|
-
import { getTopicRectangleByNode } from '../position/topic';
|
|
3
|
-
import { PlaitBoard, updateForeignObject } from '@plait/core';
|
|
4
|
-
export function drawTopicByNode(board, node, viewContainerRef) {
|
|
5
|
-
const rectangle = getTopicRectangleByNode(board, node);
|
|
6
|
-
return drawTopicByElement(board, rectangle, node.origin, viewContainerRef);
|
|
7
|
-
}
|
|
8
|
-
export function drawTopicByElement(board, rectangle, element, viewContainerRef) {
|
|
9
|
-
const containerRef = viewContainerRef || PlaitBoard.getComponent(board).viewContainerRef;
|
|
10
|
-
const classList = [];
|
|
11
|
-
if (element.isRoot) {
|
|
12
|
-
classList.push('root-node');
|
|
13
|
-
classList.push('font-size-18');
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
classList.push('child-node');
|
|
17
|
-
}
|
|
18
|
-
// COMPAT: last character can not show in safari browser
|
|
19
|
-
return drawRichtext(rectangle.x, rectangle.y, rectangle.width, rectangle.height, element.data.topic, containerRef, classList);
|
|
20
|
-
}
|
|
21
|
-
export function updateMindNodeTopicSize(board, node, g, isEditable) {
|
|
22
|
-
const { x, y, width, height } = getTopicRectangleByNode(board, node);
|
|
23
|
-
if (isEditable) {
|
|
24
|
-
// add 999, avoid changing lines when paste more text
|
|
25
|
-
updateForeignObject(g, width + 999, height + 999, x, y);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
// COMPAT: last character can not show in safari browser
|
|
29
|
-
updateForeignObject(g, width, height, x, y);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS10b3BpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3V0aWxzL2RyYXcvbm9kZS10b3BpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHL0UsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFxQixFQUFFLElBQWMsRUFBRSxnQkFBbUM7SUFDdEcsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDOUIsS0FBcUIsRUFDckIsU0FBMEIsRUFDMUIsT0FBb0IsRUFDcEIsZ0JBQW1DO0lBRW5DLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7SUFDekYsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDbEM7U0FBTTtRQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDaEM7SUFDRCx3REFBd0Q7SUFDeEQsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbEksQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFxQixFQUFFLElBQWMsRUFBRSxDQUFjLEVBQUUsVUFBbUI7SUFDOUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxJQUFJLFVBQVUsRUFBRTtRQUNaLHFEQUFxRDtRQUNyRCxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUMzRDtTQUFNO1FBQ0gsd0RBQXdEO1FBQ3hELG1CQUFtQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUMvQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkcmF3UmljaHRleHQgfSBmcm9tICdAcGxhaXQvcmljaHRleHQnO1xuaW1wb3J0IHsgTWluZE5vZGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgZ2V0VG9waWNSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi9wb3NpdGlvbi90b3BpYyc7XG5pbXBvcnQgeyBQbGFpdE1pbmRCb2FyZCB9IGZyb20gJy4uLy4uL3BsdWdpbnMvd2l0aC1taW5kLmJvYXJkJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFJlY3RhbmdsZUNsaWVudCwgdXBkYXRlRm9yZWlnbk9iamVjdCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3VG9waWNCeU5vZGUoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBub2RlOiBNaW5kTm9kZSwgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBnZXRUb3BpY1JlY3RhbmdsZUJ5Tm9kZShib2FyZCwgbm9kZSk7XG4gICAgcmV0dXJuIGRyYXdUb3BpY0J5RWxlbWVudChib2FyZCwgcmVjdGFuZ2xlLCBub2RlLm9yaWdpbiwgdmlld0NvbnRhaW5lclJlZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3VG9waWNCeUVsZW1lbnQoXG4gICAgYm9hcmQ6IFBsYWl0TWluZEJvYXJkLFxuICAgIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGVsZW1lbnQ6IE1pbmRFbGVtZW50LFxuICAgIHZpZXdDb250YWluZXJSZWY/OiBWaWV3Q29udGFpbmVyUmVmXG4pIHtcbiAgICBjb25zdCBjb250YWluZXJSZWYgPSB2aWV3Q29udGFpbmVyUmVmIHx8IFBsYWl0Qm9hcmQuZ2V0Q29tcG9uZW50KGJvYXJkKS52aWV3Q29udGFpbmVyUmVmO1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IFtdO1xuICAgIGlmIChlbGVtZW50LmlzUm9vdCkge1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgncm9vdC1ub2RlJyk7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKCdmb250LXNpemUtMTgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnY2hpbGQtbm9kZScpO1xuICAgIH1cbiAgICAvLyBDT01QQVQ6IGxhc3QgY2hhcmFjdGVyIGNhbiBub3Qgc2hvdyBpbiBzYWZhcmkgYnJvd3NlclxuICAgIHJldHVybiBkcmF3UmljaHRleHQocmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55LCByZWN0YW5nbGUud2lkdGgsIHJlY3RhbmdsZS5oZWlnaHQsIGVsZW1lbnQuZGF0YS50b3BpYywgY29udGFpbmVyUmVmLCBjbGFzc0xpc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTWluZE5vZGVUb3BpY1NpemUoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBub2RlOiBNaW5kTm9kZSwgZzogU1ZHR0VsZW1lbnQsIGlzRWRpdGFibGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGdldFRvcGljUmVjdGFuZ2xlQnlOb2RlKGJvYXJkLCBub2RlKTtcbiAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICAvLyBhZGQgOTk577yMIGF2b2lkIGNoYW5naW5nIGxpbmVzIHdoZW4gcGFzdGUgbW9yZSB0ZXh0XG4gICAgICAgIHVwZGF0ZUZvcmVpZ25PYmplY3QoZywgd2lkdGggKyA5OTksIGhlaWdodCArIDk5OSwgeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ09NUEFUOiBsYXN0IGNoYXJhY3RlciBjYW4gbm90IHNob3cgaW4gc2FmYXJpIGJyb3dzZXJcbiAgICAgICAgdXBkYXRlRm9yZWlnbk9iamVjdChnLCB3aWR0aCwgaGVpZ2h0LCB4LCB5KTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ViewContainerRef } from '@angular/core';
|
|
2
|
-
import { MindNode } from '../../interfaces/node';
|
|
3
|
-
import { PlaitMindBoard } from '../../plugins/with-mind.board';
|
|
4
|
-
import { RectangleClient } from '@plait/core';
|
|
5
|
-
import { MindElement } from '../../interfaces';
|
|
6
|
-
export declare function drawTopicByNode(board: PlaitMindBoard, node: MindNode, viewContainerRef?: ViewContainerRef): {
|
|
7
|
-
richtextComponentRef: import("@angular/core").ComponentRef<import("@plait/richtext").PlaitRichtextComponent>;
|
|
8
|
-
richtextG: SVGGElement;
|
|
9
|
-
foreignObject: SVGForeignObjectElement;
|
|
10
|
-
};
|
|
11
|
-
export declare function drawTopicByElement(board: PlaitMindBoard, rectangle: RectangleClient, element: MindElement, viewContainerRef?: ViewContainerRef): {
|
|
12
|
-
richtextComponentRef: import("@angular/core").ComponentRef<import("@plait/richtext").PlaitRichtextComponent>;
|
|
13
|
-
richtextG: SVGGElement;
|
|
14
|
-
foreignObject: SVGForeignObjectElement;
|
|
15
|
-
};
|
|
16
|
-
export declare function updateMindNodeTopicSize(board: PlaitMindBoard, node: MindNode, g: SVGGElement, isEditable: boolean): void;
|