@plait/mind 0.77.3 → 0.78.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/fesm2022/plait-mind.mjs +2 -2
- package/fesm2022/plait-mind.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/constants/abstract-node.mjs +0 -5
- package/esm2022/constants/default.mjs +0 -17
- package/esm2022/constants/index.mjs +0 -5
- package/esm2022/constants/node-style.mjs +0 -19
- package/esm2022/constants/node-topic-style.mjs +0 -7
- package/esm2022/constants/theme.mjs +0 -73
- package/esm2022/emoji/emoji-base.component.mjs +0 -6
- package/esm2022/emoji/index.mjs +0 -3
- package/esm2022/emoji/with-emoji.mjs +0 -8
- package/esm2022/generators/node-active.generator.mjs +0 -46
- package/esm2022/generators/node-collapse.generator.mjs +0 -108
- package/esm2022/generators/node-emojis.generator.mjs +0 -63
- package/esm2022/generators/node-plus.generator.mjs +0 -100
- package/esm2022/generators/node-shape.generator.mjs +0 -22
- package/esm2022/interfaces/element-data.mjs +0 -2
- package/esm2022/interfaces/element.mjs +0 -103
- package/esm2022/interfaces/index.mjs +0 -8
- package/esm2022/interfaces/layout.mjs +0 -19
- package/esm2022/interfaces/node.mjs +0 -14
- package/esm2022/interfaces/options.mjs +0 -2
- package/esm2022/interfaces/pointer.mjs +0 -5
- package/esm2022/interfaces/theme-color.mjs +0 -57
- package/esm2022/interfaces/types.mjs +0 -13
- package/esm2022/mind-node.component.mjs +0 -193
- package/esm2022/mind.component.mjs +0 -34
- package/esm2022/plait-mind.mjs +0 -5
- package/esm2022/plugins/with-abstract-resize.board.mjs +0 -12
- package/esm2022/plugins/with-abstract-resize.mjs +0 -112
- package/esm2022/plugins/with-mind-create.mjs +0 -104
- package/esm2022/plugins/with-mind-extend.mjs +0 -7
- package/esm2022/plugins/with-mind-fragment.mjs +0 -101
- package/esm2022/plugins/with-mind-hotkey.mjs +0 -62
- package/esm2022/plugins/with-mind.board.mjs +0 -2
- package/esm2022/plugins/with-mind.mjs +0 -148
- package/esm2022/plugins/with-node-dnd.mjs +0 -176
- package/esm2022/plugins/with-node-hover-hit-test.mjs +0 -23
- package/esm2022/plugins/with-node-image-resize.mjs +0 -46
- package/esm2022/plugins/with-node-image.mjs +0 -113
- package/esm2022/plugins/with-node-resize.mjs +0 -69
- package/esm2022/public-api.mjs +0 -16
- package/esm2022/queries/get-available-sublayouts-by-element.mjs +0 -23
- package/esm2022/queries/get-branch-layouts.mjs +0 -18
- package/esm2022/queries/get-correct-layout-by-element.mjs +0 -48
- package/esm2022/queries/get-layout-by-element.mjs +0 -18
- package/esm2022/queries/index.mjs +0 -11
- package/esm2022/transforms/abstract-node.mjs +0 -73
- package/esm2022/transforms/emoji.mjs +0 -41
- package/esm2022/transforms/image.mjs +0 -31
- package/esm2022/transforms/index.mjs +0 -30
- package/esm2022/transforms/layout.mjs +0 -19
- package/esm2022/transforms/node.mjs +0 -99
- package/esm2022/transforms/property.mjs +0 -34
- package/esm2022/utils/abstract/common.mjs +0 -170
- package/esm2022/utils/abstract/resize.mjs +0 -194
- package/esm2022/utils/clipboard.mjs +0 -108
- package/esm2022/utils/common.mjs +0 -26
- package/esm2022/utils/dnd/common.mjs +0 -59
- package/esm2022/utils/dnd/detector.mjs +0 -176
- package/esm2022/utils/draw/abstract-outline.mjs +0 -118
- package/esm2022/utils/draw/node-dnd.mjs +0 -164
- package/esm2022/utils/draw/node-link/abstract-link.mjs +0 -60
- package/esm2022/utils/draw/node-link/draw-link.mjs +0 -9
- package/esm2022/utils/draw/node-link/indented-link.mjs +0 -46
- package/esm2022/utils/draw/node-link/logic-link.mjs +0 -76
- package/esm2022/utils/draw/node-shape.mjs +0 -26
- package/esm2022/utils/index.mjs +0 -17
- package/esm2022/utils/layout.mjs +0 -105
- package/esm2022/utils/mind.mjs +0 -98
- package/esm2022/utils/node/adjust-node.mjs +0 -36
- package/esm2022/utils/node/common.mjs +0 -15
- package/esm2022/utils/node/create-node.mjs +0 -46
- package/esm2022/utils/node/dynamic-width.mjs +0 -14
- package/esm2022/utils/node/image.mjs +0 -15
- package/esm2022/utils/node/index.mjs +0 -6
- package/esm2022/utils/node/right-node-count.mjs +0 -45
- package/esm2022/utils/node-hover/extend.mjs +0 -50
- package/esm2022/utils/node-style/branch.mjs +0 -63
- package/esm2022/utils/node-style/common.mjs +0 -4
- package/esm2022/utils/node-style/index.mjs +0 -4
- package/esm2022/utils/node-style/shape.mjs +0 -37
- package/esm2022/utils/normalize.mjs +0 -40
- package/esm2022/utils/path.mjs +0 -12
- package/esm2022/utils/point-placement.mjs +0 -119
- package/esm2022/utils/position/emoji.mjs +0 -31
- package/esm2022/utils/position/image.mjs +0 -36
- package/esm2022/utils/position/index.mjs +0 -5
- package/esm2022/utils/position/node.mjs +0 -36
- package/esm2022/utils/position/topic.mjs +0 -16
- package/esm2022/utils/space/emoji.mjs +0 -20
- package/esm2022/utils/space/index.mjs +0 -4
- package/esm2022/utils/space/layout-options.mjs +0 -69
- package/esm2022/utils/space/node-space.mjs +0 -134
- package/esm2022/utils/weak-maps.mjs +0 -2
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { PlaitNode, Transforms } from '@plait/core';
|
|
2
|
-
import { isHorizontalLogicLayout, isVerticalLogicLayout } from '@plait/layouts';
|
|
3
|
-
export const correctLogicLayoutNode = (board, layout, path) => {
|
|
4
|
-
const node = PlaitNode.get(board, path);
|
|
5
|
-
if (node && layout) {
|
|
6
|
-
node.children?.forEach((value, index) => {
|
|
7
|
-
if (value.layout) {
|
|
8
|
-
if ((isHorizontalLogicLayout(layout) && isVerticalLogicLayout(value.layout)) ||
|
|
9
|
-
(isVerticalLogicLayout(layout) && isHorizontalLogicLayout(value.layout))) {
|
|
10
|
-
Transforms.setNode(board, { layout: null }, [...path, index]);
|
|
11
|
-
}
|
|
12
|
-
if (value.children?.length) {
|
|
13
|
-
correctLogicLayoutNode(board, layout, [...path, index]);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvdHJhbnNmb3Jtcy9sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsTUFBc0IsRUFBRSxJQUFVLEVBQUUsRUFBRTtJQUM1RixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQWdCLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2YsSUFDSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDMUUsQ0FBQztvQkFDQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUN6QixzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQYXRoLCBQbGFpdE5vZGUsIFRyYW5zZm9ybXMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBpc0hvcml6b250YWxMb2dpY0xheW91dCwgaXNWZXJ0aWNhbExvZ2ljTGF5b3V0LCBNaW5kTGF5b3V0VHlwZSB9IGZyb20gJ0BwbGFpdC9sYXlvdXRzJztcblxuZXhwb3J0IGNvbnN0IGNvcnJlY3RMb2dpY0xheW91dE5vZGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGxheW91dDogTWluZExheW91dFR5cGUsIHBhdGg6IFBhdGgpID0+IHtcbiAgICBjb25zdCBub2RlID0gUGxhaXROb2RlLmdldChib2FyZCwgcGF0aCk7XG4gICAgaWYgKG5vZGUgJiYgbGF5b3V0KSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKHZhbHVlOiBQbGFpdE5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoaXNIb3Jpem9udGFsTG9naWNMYXlvdXQobGF5b3V0KSAmJiBpc1ZlcnRpY2FsTG9naWNMYXlvdXQodmFsdWUubGF5b3V0KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzVmVydGljYWxMb2dpY0xheW91dChsYXlvdXQpICYmIGlzSG9yaXpvbnRhbExvZ2ljTGF5b3V0KHZhbHVlLmxheW91dCkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyBsYXlvdXQ6IG51bGwgfSwgWy4uLnBhdGgsIGluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvcnJlY3RMb2dpY0xheW91dE5vZGUoYm9hcmQsIGxheW91dCwgWy4uLnBhdGgsIGluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuIl19
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { Path } from 'slate';
|
|
2
|
-
import { MindElement, PlaitMind } from '../interfaces/element';
|
|
3
|
-
import { PlaitBoard, PlaitHistoryBoard, PlaitNode, Transforms, removeSelectedElement } from '@plait/core';
|
|
4
|
-
import { getRelativeStartEndByAbstractRef, insertElementHandleAbstract } from '../utils/abstract/common';
|
|
5
|
-
import { insertElementHandleRightNodeCount, isInRightBranchOfStandardLayout } from '../utils/node/right-node-count';
|
|
6
|
-
import { NodeSpace } from '../utils/space/node-space';
|
|
7
|
-
import { findNewChildNodePath, findNewSiblingNodePath, insertMindElement } from '../utils';
|
|
8
|
-
import { setAbstractsByRefs } from './abstract-node';
|
|
9
|
-
import { AbstractNode } from '@plait/layouts';
|
|
10
|
-
const normalizeWidthAndHeight = (board, element, width, height) => {
|
|
11
|
-
const minWidth = NodeSpace.getNodeTopicMinWidth(board, element);
|
|
12
|
-
const newWidth = width < minWidth ? minWidth : width;
|
|
13
|
-
return { width: Math.ceil(newWidth), height };
|
|
14
|
-
};
|
|
15
|
-
export const setTopic = (board, element, topic, width, height) => {
|
|
16
|
-
const newElement = {
|
|
17
|
-
data: { ...element.data, topic },
|
|
18
|
-
...normalizeWidthAndHeight(board, element, width, height)
|
|
19
|
-
};
|
|
20
|
-
const path = PlaitBoard.findPath(board, element);
|
|
21
|
-
Transforms.setNode(board, newElement, path);
|
|
22
|
-
};
|
|
23
|
-
export const setNodeManualWidth = (board, element, width, height) => {
|
|
24
|
-
const path = PlaitBoard.findPath(board, element);
|
|
25
|
-
const { width: normalizedWidth, height: normalizedHeight } = normalizeWidthAndHeight(board, element, width, height);
|
|
26
|
-
const newElement = { manualWidth: normalizedWidth, height: normalizedHeight };
|
|
27
|
-
Transforms.setNode(board, newElement, path);
|
|
28
|
-
};
|
|
29
|
-
export const setTopicSize = (board, element, width, height) => {
|
|
30
|
-
const newElement = {
|
|
31
|
-
...normalizeWidthAndHeight(board, element, width, height)
|
|
32
|
-
};
|
|
33
|
-
let isEqualWidth = Math.ceil(element.width) === Math.ceil(newElement.width);
|
|
34
|
-
let isEqualHeight = Math.ceil(element.height) === Math.ceil(newElement.height);
|
|
35
|
-
if (element.manualWidth) {
|
|
36
|
-
isEqualWidth = true;
|
|
37
|
-
}
|
|
38
|
-
if (!isEqualWidth || !isEqualHeight) {
|
|
39
|
-
const path = PlaitBoard.findPath(board, element);
|
|
40
|
-
Transforms.setNode(board, newElement, path);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
export const insertNodes = (board, elements, path) => {
|
|
44
|
-
const pathRef = board.pathRef(path);
|
|
45
|
-
elements.forEach(element => {
|
|
46
|
-
if (pathRef.current) {
|
|
47
|
-
Transforms.insertNode(board, element, pathRef.current);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
pathRef.unref();
|
|
51
|
-
};
|
|
52
|
-
export const insertAbstractNodes = (board, validAbstractRefs, elements, path) => {
|
|
53
|
-
const parent = PlaitNode.get(board, Path.parent(path));
|
|
54
|
-
const abstractPath = [...Path.parent(path), parent.children?.length];
|
|
55
|
-
const abstracts = validAbstractRefs.map(refs => {
|
|
56
|
-
const { start, end } = getRelativeStartEndByAbstractRef(refs, elements);
|
|
57
|
-
return {
|
|
58
|
-
...refs.abstract,
|
|
59
|
-
start: start + path[path.length - 1],
|
|
60
|
-
end: end + path[path.length - 1]
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
insertNodes(board, abstracts, abstractPath);
|
|
64
|
-
};
|
|
65
|
-
export const setRightNodeCountByRefs = (board, refs) => {
|
|
66
|
-
refs.forEach(ref => {
|
|
67
|
-
Transforms.setNode(board, { rightNodeCount: ref.rightNodeCount }, ref.path);
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
export const insertChildNode = (board, element) => {
|
|
71
|
-
if (MindElement.isMindElement(board, element)) {
|
|
72
|
-
removeSelectedElement(board, element);
|
|
73
|
-
const targetElementPath = PlaitBoard.findPath(board, element);
|
|
74
|
-
if (element.isCollapsed) {
|
|
75
|
-
const newElement = { isCollapsed: false };
|
|
76
|
-
PlaitHistoryBoard.withoutSaving(board, () => {
|
|
77
|
-
Transforms.setNode(board, newElement, targetElementPath);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
insertMindElement(board, element, findNewChildNodePath(board, element));
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
export const insertSiblingNode = (board, element) => {
|
|
84
|
-
if (MindElement.isMindElement(board, element) && !PlaitMind.isMind(element) && !AbstractNode.isAbstract(element)) {
|
|
85
|
-
const path = PlaitBoard.findPath(board, element);
|
|
86
|
-
if (isInRightBranchOfStandardLayout(element)) {
|
|
87
|
-
const refs = insertElementHandleRightNodeCount(board, path.slice(0, 1), 1);
|
|
88
|
-
setRightNodeCountByRefs(board, refs);
|
|
89
|
-
}
|
|
90
|
-
const abstractRefs = insertElementHandleAbstract(board, Path.next(path));
|
|
91
|
-
setAbstractsByRefs(board, abstractRefs);
|
|
92
|
-
insertMindElement(board, element, findNewSiblingNodePath(board, element));
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
export const insertMind = (board, mind) => {
|
|
96
|
-
Transforms.insertNode(board, mind, [board.children.length]);
|
|
97
|
-
Transforms.addSelectionWithTemporaryElements(board, [mind]);
|
|
98
|
-
};
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3RyYW5zZm9ybXMvbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFHLE9BQU8sRUFBZSxnQ0FBZ0MsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RILE9BQU8sRUFBcUIsaUNBQWlDLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxNQUFNLHVCQUF1QixHQUFHLENBQUMsS0FBcUIsRUFBRSxPQUFvQixFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUMzRyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENB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QyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSwrQkFBK0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLGlDQUFpQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRSx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLDJCQUEyQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQXFCLEVBQUUsSUFBaUIsRUFBRSxFQUFFO0lBQ25FLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RCxVQUFVLENBQUMsaUNBQWlDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50LCBQYXRoIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEhpc3RvcnlCb2FyZCwgUGxhaXROb2RlLCBUcmFuc2Zvcm1zLCByZW1vdmVTZWxlY3RlZEVsZW1lbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFJlZiwgZ2V0UmVsYXRpdmVTdGFydEVuZEJ5QWJzdHJhY3RSZWYsIGluc2VydEVsZW1lbnRIYW5kbGVBYnN0cmFjdCB9IGZyb20gJy4uL3V0aWxzL2Fic3RyYWN0L2NvbW1vbic7XG5pbXBvcnQgeyBSaWdodE5vZGVDb3VudFJlZiwgaW5zZXJ0RWxlbWVudEhhbmRsZVJpZ2h0Tm9kZUNvdW50LCBpc0luUmlnaHRCcmFuY2hPZlN0YW5kYXJkTGF5b3V0IH0gZnJvbSAnLi4vdXRpbHMvbm9kZS9yaWdodC1ub2RlLWNvdW50JztcbmltcG9ydCB7IE5vZGVTcGFjZSB9IGZyb20gJy4uL3V0aWxzL3NwYWNlL25vZGUtc3BhY2UnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyBmaW5kTmV3Q2hpbGROb2RlUGF0aCwgZmluZE5ld1NpYmxpbmdOb2RlUGF0aCwgaW5zZXJ0TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBzZXRBYnN0cmFjdHNCeVJlZnMgfSBmcm9tICcuL2Fic3RyYWN0LW5vZGUnO1xuaW1wb3J0IHsgQWJzdHJhY3ROb2RlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuXG5jb25zdCBub3JtYWxpemVXaWR0aEFuZEhlaWdodCA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG1pbldpZHRoID0gTm9kZVNwYWNlLmdldE5vZGVUb3BpY01pbldpZHRoKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBuZXdXaWR0aCA9IHdpZHRoIDwgbWluV2lkdGggPyBtaW5XaWR0aCA6IHdpZHRoO1xuICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLmNlaWwobmV3V2lkdGgpLCBoZWlnaHQgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRUb3BpYyA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50LCB0b3BpYzogRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0ge1xuICAgICAgICBkYXRhOiB7IC4uLmVsZW1lbnQuZGF0YSwgdG9waWMgfSxcbiAgICAgICAgLi4ubm9ybWFsaXplV2lkdGhBbmRIZWlnaHQoYm9hcmQsIGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQpXG4gICAgfSBhcyBNaW5kRWxlbWVudDtcbiAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCBuZXdFbGVtZW50LCBwYXRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXROb2RlTWFudWFsV2lkdGggPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgeyB3aWR0aDogbm9ybWFsaXplZFdpZHRoLCBoZWlnaHQ6IG5vcm1hbGl6ZWRIZWlnaHQgfSA9IG5vcm1hbGl6ZVdpZHRoQW5kSGVpZ2h0KGJvYXJkLCBlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0geyBtYW51YWxXaWR0aDogbm9ybWFsaXplZFdpZHRoLCBoZWlnaHQ6IG5vcm1hbGl6ZWRIZWlnaHQgfSBhcyBNaW5kRWxlbWVudDtcbiAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIG5ld0VsZW1lbnQsIHBhdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFRvcGljU2l6ZSA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB7XG4gICAgICAgIC4uLm5vcm1hbGl6ZVdpZHRoQW5kSGVpZ2h0KGJvYXJkLCBlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KVxuICAgIH07XG4gICAgbGV0IGlzRXF1YWxXaWR0aCA9IE1hdGguY2VpbChlbGVtZW50LndpZHRoKSA9PT0gTWF0aC5jZWlsKG5ld0VsZW1lbnQud2lkdGgpO1xuICAgIGxldCBpc0VxdWFsSGVpZ2h0ID0gTWF0aC5jZWlsKGVsZW1lbnQuaGVpZ2h0KSA9PT0gTWF0aC5jZWlsKG5ld0VsZW1lbnQuaGVpZ2h0KTtcbiAgICBpZiAoZWxlbWVudC5tYW51YWxXaWR0aCkge1xuICAgICAgICBpc0VxdWFsV2lkdGggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzRXF1YWxXaWR0aCB8fCAhaXNFcXVhbEhlaWdodCkge1xuICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgbmV3RWxlbWVudCwgcGF0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydE5vZGVzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50czogTWluZEVsZW1lbnRbXSwgcGF0aDogUGF0aCkgPT4ge1xuICAgIGNvbnN0IHBhdGhSZWYgPSBib2FyZC5wYXRoUmVmKHBhdGgpO1xuICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChwYXRoUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZShib2FyZCwgZWxlbWVudCwgcGF0aFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHBhdGhSZWYudW5yZWYoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRBYnN0cmFjdE5vZGVzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCB2YWxpZEFic3RyYWN0UmVmczogQWJzdHJhY3RSZWZbXSwgZWxlbWVudHM6IE1pbmRFbGVtZW50W10sIHBhdGg6IFBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnBhcmVudChwYXRoKSk7XG4gICAgY29uc3QgYWJzdHJhY3RQYXRoID0gWy4uLlBhdGgucGFyZW50KHBhdGgpLCBwYXJlbnQuY2hpbGRyZW4/Lmxlbmd0aCFdO1xuICAgIGNvbnN0IGFic3RyYWN0cyA9IHZhbGlkQWJzdHJhY3RSZWZzLm1hcChyZWZzID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBnZXRSZWxhdGl2ZVN0YXJ0RW5kQnlBYnN0cmFjdFJlZihyZWZzLCBlbGVtZW50cyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZWZzLmFic3RyYWN0LFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0ICsgcGF0aFtwYXRoLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZW5kOiBlbmQgKyBwYXRoW3BhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGluc2VydE5vZGVzKGJvYXJkLCBhYnN0cmFjdHMsIGFic3RyYWN0UGF0aCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UmlnaHROb2RlQ291bnRCeVJlZnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlZnM6IFJpZ2h0Tm9kZUNvdW50UmVmW10pID0+IHtcbiAgICByZWZzLmZvckVhY2gocmVmID0+IHtcbiAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCB7IHJpZ2h0Tm9kZUNvdW50OiByZWYucmlnaHROb2RlQ291bnQgfSwgcmVmLnBhdGgpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydENoaWxkTm9kZSA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpKSB7XG4gICAgICAgIHJlbW92ZVNlbGVjdGVkRWxlbWVudChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRQYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50OiBQYXJ0aWFsPE1pbmRFbGVtZW50PiA9IHsgaXNDb2xsYXBzZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICBQbGFpdEhpc3RvcnlCb2FyZC53aXRob3V0U2F2aW5nKGJvYXJkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCBuZXdFbGVtZW50LCB0YXJnZXRFbGVtZW50UGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCwgZmluZE5ld0NoaWxkTm9kZVBhdGgoYm9hcmQsIGVsZW1lbnQpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaW5zZXJ0U2libGluZ05vZGUgPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGlmIChNaW5kRWxlbWVudC5pc01pbmRFbGVtZW50KGJvYXJkLCBlbGVtZW50KSAmJiAhUGxhaXRNaW5kLmlzTWluZChlbGVtZW50KSAmJiAhQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBpZiAoaXNJblJpZ2h0QnJhbmNoT2ZTdGFuZGFyZExheW91dChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IGluc2VydEVsZW1lbnRIYW5kbGVSaWdodE5vZGVDb3VudChib2FyZCwgcGF0aC5zbGljZSgwLCAxKSwgMSk7XG4gICAgICAgICAgICBzZXRSaWdodE5vZGVDb3VudEJ5UmVmcyhib2FyZCwgcmVmcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWJzdHJhY3RSZWZzID0gaW5zZXJ0RWxlbWVudEhhbmRsZUFic3RyYWN0KGJvYXJkLCBQYXRoLm5leHQocGF0aCkpO1xuICAgICAgICBzZXRBYnN0cmFjdHNCeVJlZnMoYm9hcmQsIGFic3RyYWN0UmVmcyk7XG4gICAgICAgIGluc2VydE1pbmRFbGVtZW50KGJvYXJkLCBlbGVtZW50LCBmaW5kTmV3U2libGluZ05vZGVQYXRoKGJvYXJkLCBlbGVtZW50KSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydE1pbmQgPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBtaW5kOiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZShib2FyZCwgbWluZCwgW2JvYXJkLmNoaWxkcmVuLmxlbmd0aF0pO1xuICAgIFRyYW5zZm9ybXMuYWRkU2VsZWN0aW9uV2l0aFRlbXBvcmFyeUVsZW1lbnRzKGJvYXJkLCBbbWluZF0pO1xufTtcbiJdfQ==
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { PlaitNode, Transforms } from '@plait/core';
|
|
2
|
-
import { isStandardLayout } from '@plait/layouts';
|
|
3
|
-
import { PropertyTransforms } from '@plait/common';
|
|
4
|
-
import { MindElement, PlaitMind } from '../interfaces';
|
|
5
|
-
import { correctLogicLayoutNode } from './layout';
|
|
6
|
-
import { setAbstractByStandardLayout } from './abstract-node';
|
|
7
|
-
export const setLayout = (board, type) => {
|
|
8
|
-
const callback = (element, path) => {
|
|
9
|
-
if (MindElement.isMindElement(board, element)) {
|
|
10
|
-
correctLogicLayoutNode(board, type, path);
|
|
11
|
-
const element = PlaitNode.get(board, path);
|
|
12
|
-
if (PlaitMind.isMind(element) && isStandardLayout(type)) {
|
|
13
|
-
let properties = { rightNodeCount: element.children.length / 2 };
|
|
14
|
-
Transforms.setNode(board, properties, path);
|
|
15
|
-
setAbstractByStandardLayout(board, element);
|
|
16
|
-
}
|
|
17
|
-
Transforms.setNode(board, { layout: type }, path);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
PropertyTransforms.setProperty(board, {}, { callback });
|
|
21
|
-
};
|
|
22
|
-
export const setShape = (board, shape) => {
|
|
23
|
-
PropertyTransforms.setProperty(board, { shape });
|
|
24
|
-
};
|
|
25
|
-
export const setBranchShape = (board, branchShape) => {
|
|
26
|
-
PropertyTransforms.setProperty(board, { branchShape });
|
|
27
|
-
};
|
|
28
|
-
export const setBranchWidth = (board, branchWidth) => {
|
|
29
|
-
PropertyTransforms.setProperty(board, { branchWidth });
|
|
30
|
-
};
|
|
31
|
-
export const setBranchColor = (board, branchColor) => {
|
|
32
|
-
PropertyTransforms.setProperty(board, { branchColor });
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy90cmFuc2Zvcm1zL3Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBaUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBaUIsRUFBRSxJQUFvQixFQUFFLEVBQUU7SUFDakUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFvQixFQUFFLElBQVUsRUFBRSxFQUFFO1FBQ2xELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBZ0IsQ0FBQztZQUMxRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxVQUFVLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0Ysa0JBQWtCLENBQUMsV0FBVyxDQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsS0FBdUIsRUFBRSxFQUFFO0lBQ25FLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBd0IsRUFBRSxFQUFFO0lBQzFFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQ3JFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQ3JFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGgsIFBsYWl0Qm9hcmQsIFBsYWl0Tm9kZSwgVHJhbnNmb3JtcyB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRMYXlvdXRUeXBlLCBpc1N0YW5kYXJkTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgUHJvcGVydHlUcmFuc2Zvcm1zIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBCcmFuY2hTaGFwZSwgTWluZEVsZW1lbnRTaGFwZSwgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY29ycmVjdExvZ2ljTGF5b3V0Tm9kZSB9IGZyb20gJy4vbGF5b3V0JztcbmltcG9ydCB7IHNldEFic3RyYWN0QnlTdGFuZGFyZExheW91dCB9IGZyb20gJy4vYWJzdHJhY3Qtbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBzZXRMYXlvdXQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHR5cGU6IE1pbmRMYXlvdXRUeXBlKSA9PiB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZWxlbWVudDogTWluZEVsZW1lbnQsIHBhdGg6IFBhdGgpID0+IHtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb3JyZWN0TG9naWNMYXlvdXROb2RlKGJvYXJkLCB0eXBlLCBwYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBwYXRoKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpICYmIGlzU3RhbmRhcmRMYXlvdXQodHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IHsgcmlnaHROb2RlQ291bnQ6IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoIC8gMiB9O1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgcHJvcGVydGllcywgcGF0aCk7XG4gICAgICAgICAgICAgICAgc2V0QWJzdHJhY3RCeVN0YW5kYXJkTGF5b3V0KGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyBsYXlvdXQ6IHR5cGUgfSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFByb3BlcnR5VHJhbnNmb3Jtcy5zZXRQcm9wZXJ0eTxNaW5kRWxlbWVudD4oYm9hcmQsIHt9LCB7IGNhbGxiYWNrIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFNoYXBlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBzaGFwZTogTWluZEVsZW1lbnRTaGFwZSkgPT4ge1xuICAgIFByb3BlcnR5VHJhbnNmb3Jtcy5zZXRQcm9wZXJ0eShib2FyZCwgeyBzaGFwZSB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRCcmFuY2hTaGFwZSA9IChib2FyZDogUGxhaXRCb2FyZCwgYnJhbmNoU2hhcGU6IEJyYW5jaFNoYXBlKSA9PiB7XG4gICAgUHJvcGVydHlUcmFuc2Zvcm1zLnNldFByb3BlcnR5KGJvYXJkLCB7IGJyYW5jaFNoYXBlIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEJyYW5jaFdpZHRoID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBicmFuY2hXaWR0aDogbnVtYmVyKSA9PiB7XG4gICAgUHJvcGVydHlUcmFuc2Zvcm1zLnNldFByb3BlcnR5KGJvYXJkLCB7IGJyYW5jaFdpZHRoIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEJyYW5jaENvbG9yID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBicmFuY2hDb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgUHJvcGVydHlUcmFuc2Zvcm1zLnNldFByb3BlcnR5KGJvYXJkLCB7IGJyYW5jaENvbG9yIH0pO1xufTtcbiJdfQ==
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { AbstractNode } from '@plait/layouts';
|
|
2
|
-
import { MindElement, PlaitMind } from '../../interfaces/element';
|
|
3
|
-
import { Path, PlaitElement, PlaitNode } from '@plait/core';
|
|
4
|
-
export const separateChildren = (parentElement) => {
|
|
5
|
-
const rightNodeCount = parentElement.rightNodeCount;
|
|
6
|
-
const children = parentElement.children;
|
|
7
|
-
let rightChildren = [], leftChildren = [];
|
|
8
|
-
for (let i = 0; i < children.length; i++) {
|
|
9
|
-
const child = children[i];
|
|
10
|
-
if (AbstractNode.isAbstract(child) && child.end < rightNodeCount) {
|
|
11
|
-
rightChildren.push(child);
|
|
12
|
-
continue;
|
|
13
|
-
}
|
|
14
|
-
if (AbstractNode.isAbstract(child) && child.start >= rightNodeCount) {
|
|
15
|
-
leftChildren.push(child);
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
if (i < rightNodeCount) {
|
|
19
|
-
rightChildren.push(child);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
leftChildren.push(child);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return { leftChildren, rightChildren };
|
|
26
|
-
};
|
|
27
|
-
export const isSetAbstract = (element) => {
|
|
28
|
-
return !!getCorrespondingAbstract(element);
|
|
29
|
-
};
|
|
30
|
-
export const canSetAbstract = (element) => {
|
|
31
|
-
return !PlaitElement.isRootElement(element) && !AbstractNode.isAbstract(element) && !isSetAbstract(element);
|
|
32
|
-
};
|
|
33
|
-
export const getCorrespondingAbstract = (element) => {
|
|
34
|
-
const parent = MindElement.findParent(element);
|
|
35
|
-
if (!parent)
|
|
36
|
-
return undefined;
|
|
37
|
-
const elementIndex = parent.children.indexOf(element);
|
|
38
|
-
return parent.children.find(child => {
|
|
39
|
-
return AbstractNode.isAbstract(child) && elementIndex >= child.start && elementIndex <= child.end;
|
|
40
|
-
});
|
|
41
|
-
};
|
|
42
|
-
export const getBehindAbstracts = (element) => {
|
|
43
|
-
const parent = MindElement.findParent(element);
|
|
44
|
-
if (!parent)
|
|
45
|
-
return [];
|
|
46
|
-
const index = parent.children.indexOf(element);
|
|
47
|
-
return parent.children.filter(child => AbstractNode.isAbstract(child) && child.start > index);
|
|
48
|
-
};
|
|
49
|
-
/**
|
|
50
|
-
* return corresponding abstract that is not child of elements
|
|
51
|
-
*/
|
|
52
|
-
export const getOverallAbstracts = (board, elements) => {
|
|
53
|
-
const overallAbstracts = [];
|
|
54
|
-
elements
|
|
55
|
-
.filter(value => !AbstractNode.isAbstract(value) && !PlaitMind.isMind(value))
|
|
56
|
-
.forEach(value => {
|
|
57
|
-
const abstract = getCorrespondingAbstract(value);
|
|
58
|
-
if (abstract && elements.indexOf(abstract) === -1 && overallAbstracts.indexOf(abstract) === -1) {
|
|
59
|
-
const { start, end } = abstract;
|
|
60
|
-
const parent = MindElement.getParent(value);
|
|
61
|
-
const isOverall = parent.children.slice(start, end + 1).every(includedElement => elements.indexOf(includedElement) > -1);
|
|
62
|
-
if (isOverall) {
|
|
63
|
-
overallAbstracts.push(abstract);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
return overallAbstracts;
|
|
68
|
-
};
|
|
69
|
-
/**
|
|
70
|
-
* abstract node is valid when elements contains at least one element it is referenced with
|
|
71
|
-
*/
|
|
72
|
-
export const getValidAbstractRefs = (board, elements) => {
|
|
73
|
-
const validAbstractRefs = [];
|
|
74
|
-
elements
|
|
75
|
-
.filter(value => !AbstractNode.isAbstract(value) && !PlaitMind.isMind(value))
|
|
76
|
-
.forEach(value => {
|
|
77
|
-
const abstract = getCorrespondingAbstract(value);
|
|
78
|
-
if (abstract && elements.indexOf(abstract) > 0) {
|
|
79
|
-
const index = validAbstractRefs.findIndex(value => value.abstract === abstract);
|
|
80
|
-
if (index === -1) {
|
|
81
|
-
validAbstractRefs.push({
|
|
82
|
-
abstract: abstract,
|
|
83
|
-
references: [value]
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
validAbstractRefs[index].references.push(value);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
return validAbstractRefs;
|
|
92
|
-
};
|
|
93
|
-
export function getRelativeStartEndByAbstractRef(abstractRef, elements) {
|
|
94
|
-
const start = elements.indexOf(abstractRef.references[0]);
|
|
95
|
-
const end = elements.indexOf(abstractRef.references[abstractRef.references.length - 1]);
|
|
96
|
-
return { start, end };
|
|
97
|
-
}
|
|
98
|
-
export const insertElementHandleAbstract = (board, path, step = 1,
|
|
99
|
-
// This distinguishes between dragging and adding to the last node summarized in the abstract node
|
|
100
|
-
isExtendPreviousNode = true, effectedAbstracts = new Map()) => {
|
|
101
|
-
const parent = PlaitNode.parent(board, path);
|
|
102
|
-
const hasPreviousNode = path[path.length - 1] !== 0;
|
|
103
|
-
let behindAbstracts;
|
|
104
|
-
if (!hasPreviousNode) {
|
|
105
|
-
behindAbstracts = parent.children.filter(child => AbstractNode.isAbstract(child));
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
const selectedElement = PlaitNode.get(board, Path.previous(path));
|
|
109
|
-
behindAbstracts = getBehindAbstracts(selectedElement);
|
|
110
|
-
}
|
|
111
|
-
if (behindAbstracts.length) {
|
|
112
|
-
behindAbstracts.forEach(abstract => {
|
|
113
|
-
let newProperties = effectedAbstracts.get(abstract);
|
|
114
|
-
if (!newProperties) {
|
|
115
|
-
newProperties = { start: 0, end: 0 };
|
|
116
|
-
effectedAbstracts.set(abstract, newProperties);
|
|
117
|
-
}
|
|
118
|
-
newProperties.start = newProperties.start + step;
|
|
119
|
-
newProperties.end = newProperties.end + step;
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
if (!hasPreviousNode) {
|
|
123
|
-
return effectedAbstracts;
|
|
124
|
-
}
|
|
125
|
-
const selectedElement = PlaitNode.get(board, Path.previous(path));
|
|
126
|
-
const correspondingAbstract = getCorrespondingAbstract(selectedElement);
|
|
127
|
-
const isDragToLast = !isExtendPreviousNode && correspondingAbstract && correspondingAbstract.end === path[path.length - 1] - 1;
|
|
128
|
-
if (correspondingAbstract && !isDragToLast) {
|
|
129
|
-
let newProperties = effectedAbstracts.get(correspondingAbstract);
|
|
130
|
-
if (!newProperties) {
|
|
131
|
-
newProperties = { start: 0, end: 0 };
|
|
132
|
-
effectedAbstracts.set(correspondingAbstract, newProperties);
|
|
133
|
-
}
|
|
134
|
-
newProperties.end = newProperties.end + step;
|
|
135
|
-
}
|
|
136
|
-
return effectedAbstracts;
|
|
137
|
-
};
|
|
138
|
-
export const deleteElementHandleAbstract = (board, deletableElements, effectedAbstracts = new Map()) => {
|
|
139
|
-
deletableElements.forEach(node => {
|
|
140
|
-
if (!PlaitMind.isMind(node)) {
|
|
141
|
-
const behindAbstracts = getBehindAbstracts(node).filter(abstract => !deletableElements.includes(abstract));
|
|
142
|
-
if (behindAbstracts.length) {
|
|
143
|
-
behindAbstracts.forEach(abstract => {
|
|
144
|
-
let newProperties = effectedAbstracts.get(abstract);
|
|
145
|
-
if (!newProperties) {
|
|
146
|
-
newProperties = { start: 0, end: 0 };
|
|
147
|
-
effectedAbstracts.set(abstract, newProperties);
|
|
148
|
-
}
|
|
149
|
-
newProperties.start = newProperties.start - 1;
|
|
150
|
-
newProperties.end = newProperties.end - 1;
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
const correspondingAbstract = getCorrespondingAbstract(node);
|
|
154
|
-
if (correspondingAbstract && !deletableElements.includes(correspondingAbstract)) {
|
|
155
|
-
let newProperties = effectedAbstracts.get(correspondingAbstract);
|
|
156
|
-
if (!newProperties) {
|
|
157
|
-
newProperties = { start: 0, end: 0 };
|
|
158
|
-
effectedAbstracts.set(correspondingAbstract, newProperties);
|
|
159
|
-
}
|
|
160
|
-
newProperties.end = newProperties.end - 1;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
return effectedAbstracts;
|
|
165
|
-
};
|
|
166
|
-
export const isChildOfAbstract = (board, element) => {
|
|
167
|
-
const ancestors = MindElement.getAncestors(board, element);
|
|
168
|
-
return !!ancestors.find(value => AbstractNode.isAbstract(value));
|
|
169
|
-
};
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvdXRpbHMvYWJzdHJhY3QvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQWMsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLGFBQTBCLEVBQUUsRUFBRTtJQUMzRCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsY0FBZSxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDeEMsSUFBSSxhQUFhLEdBQUcsRUFBRSxFQUNsQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQy9ELGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsU0FBUztRQUNiLENBQUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNsRSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLFNBQVM7UUFDYixD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QUFvQixFQUFFLEVBQUU7SUFDekUsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFrQixDQUFDO0lBQzVFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3ROb2RlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQYXRoLCBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFBsYWl0Tm9kZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGNvbnN0IHNlcGFyYXRlQ2hpbGRyZW4gPSAocGFyZW50RWxlbWVudDogTWluZEVsZW1lbnQpID0+IHtcbiAgICBjb25zdCByaWdodE5vZGVDb3VudCA9IHBhcmVudEVsZW1lbnQucmlnaHROb2RlQ291bnQhO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbjtcbiAgICBsZXQgcmlnaHRDaGlsZHJlbiA9IFtdLFxuICAgICAgICBsZWZ0Q2hpbGRyZW4gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKEFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGNoaWxkKSAmJiBjaGlsZC5lbmQgPCByaWdodE5vZGVDb3VudCkge1xuICAgICAgICAgICAgcmlnaHRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdChjaGlsZCkgJiYgY2hpbGQuc3RhcnQgPj0gcmlnaHROb2RlQ291bnQpIHtcbiAgICAgICAgICAgIGxlZnRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgPCByaWdodE5vZGVDb3VudCkge1xuICAgICAgICAgICAgcmlnaHRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxlZnRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGxlZnRDaGlsZHJlbiwgcmlnaHRDaGlsZHJlbiB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU2V0QWJzdHJhY3QgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgcmV0dXJuICEhZ2V0Q29ycmVzcG9uZGluZ0Fic3RyYWN0KGVsZW1lbnQgYXMgTWluZEVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhblNldEFic3RyYWN0ID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgIHJldHVybiAhUGxhaXRFbGVtZW50LmlzUm9vdEVsZW1lbnQoZWxlbWVudCkgJiYgIUFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGVsZW1lbnQpICYmICFpc1NldEFic3RyYWN0KGVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IChlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IE1pbmRFbGVtZW50LmZpbmRQYXJlbnQoZWxlbWVudCBhcyBNaW5kRWxlbWVudCk7XG4gICAgaWYgKCFwYXJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50KTtcbiAgICByZXR1cm4gcGFyZW50LmNoaWxkcmVuLmZpbmQoY2hpbGQgPT4ge1xuICAgICAgICByZXR1cm4gQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoY2hpbGQpICYmIGVsZW1lbnRJbmRleCA+PSBjaGlsZC5zdGFydCEgJiYgZWxlbWVudEluZGV4IDw9IGNoaWxkLmVuZCE7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmVoaW5kQWJzdHJhY3RzID0gKGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgcGFyZW50ID0gTWluZEVsZW1lbnQuZmluZFBhcmVudChlbGVtZW50IGFzIE1pbmRFbGVtZW50KTtcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZWxlbWVudCk7XG4gICAgcmV0dXJuIHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoY2hpbGQpICYmIGNoaWxkLnN0YXJ0ISA+IGluZGV4KTtcbn07XG5cbi8qKlxuICogcmV0dXJuIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3QgdGhhdCBpcyBub3QgY2hpbGQgb2YgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE92ZXJhbGxBYnN0cmFjdHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBNaW5kRWxlbWVudFtdKSA9PiB7XG4gICAgY29uc3Qgb3ZlcmFsbEFic3RyYWN0czogTWluZEVsZW1lbnRbXSA9IFtdO1xuICAgIGVsZW1lbnRzXG4gICAgICAgIC5maWx0ZXIodmFsdWUgPT4gIUFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KHZhbHVlKSAmJiAhUGxhaXRNaW5kLmlzTWluZCh2YWx1ZSkpXG4gICAgICAgIC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFic3RyYWN0ID0gZ2V0Q29ycmVzcG9uZGluZ0Fic3RyYWN0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChhYnN0cmFjdCAmJiBlbGVtZW50cy5pbmRleE9mKGFic3RyYWN0KSA9PT0gLTEgJiYgb3ZlcmFsbEFic3RyYWN0cy5pbmRleE9mKGFic3RyYWN0KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGFic3RyYWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IE1pbmRFbGVtZW50LmdldFBhcmVudCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdmVyYWxsID0gcGFyZW50LmNoaWxkcmVuLnNsaWNlKHN0YXJ0ISwgZW5kISArIDEpLmV2ZXJ5KGluY2x1ZGVkRWxlbWVudCA9PiBlbGVtZW50cy5pbmRleE9mKGluY2x1ZGVkRWxlbWVudCkgPiAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3ZlcmFsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdmVyYWxsQWJzdHJhY3RzLnB1c2goYWJzdHJhY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIG92ZXJhbGxBYnN0cmFjdHMgYXMgKE1pbmRFbGVtZW50ICYgQWJzdHJhY3ROb2RlKVtdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdFJlZiB7XG4gICAgYWJzdHJhY3Q6IE1pbmRFbGVtZW50ICYgQWJzdHJhY3ROb2RlO1xuICAgIHJlZmVyZW5jZXM6IE1pbmRFbGVtZW50W107XG59XG5cbi8qKlxuICogYWJzdHJhY3Qgbm9kZSBpcyB2YWxpZCB3aGVuIGVsZW1lbnRzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IGl0IGlzIHJlZmVyZW5jZWQgd2l0aFxuICovXG5leHBvcnQgY29uc3QgZ2V0VmFsaWRBYnN0cmFjdFJlZnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBNaW5kRWxlbWVudFtdKSA9PiB7XG4gICAgY29uc3QgdmFsaWRBYnN0cmFjdFJlZnM6IEFic3RyYWN0UmVmW10gPSBbXTtcbiAgICBlbGVtZW50c1xuICAgICAgICAuZmlsdGVyKHZhbHVlID0+ICFBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdCh2YWx1ZSkgJiYgIVBsYWl0TWluZC5pc01pbmQodmFsdWUpKVxuICAgICAgICAuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoYWJzdHJhY3QgJiYgZWxlbWVudHMuaW5kZXhPZihhYnN0cmFjdCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB2YWxpZEFic3RyYWN0UmVmcy5maW5kSW5kZXgodmFsdWUgPT4gdmFsdWUuYWJzdHJhY3QgPT09IGFic3RyYWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkQWJzdHJhY3RSZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3Q6IGFic3RyYWN0IGFzIE1pbmRFbGVtZW50ICYgQWJzdHJhY3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlczogW3ZhbHVlXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZEFic3RyYWN0UmVmc1tpbmRleF0ucmVmZXJlbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIHJldHVybiB2YWxpZEFic3RyYWN0UmVmcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWxhdGl2ZVN0YXJ0RW5kQnlBYnN0cmFjdFJlZihhYnN0cmFjdFJlZjogQWJzdHJhY3RSZWYsIGVsZW1lbnRzOiBNaW5kRWxlbWVudFtdKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBlbGVtZW50cy5pbmRleE9mKGFic3RyYWN0UmVmLnJlZmVyZW5jZXNbMF0pO1xuICAgIGNvbnN0IGVuZCA9IGVsZW1lbnRzLmluZGV4T2YoYWJzdHJhY3RSZWYucmVmZXJlbmNlc1thYnN0cmFjdFJlZi5yZWZlcmVuY2VzLmxlbmd0aCAtIDFdKTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG59XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRFbGVtZW50SGFuZGxlQWJzdHJhY3QgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgcGF0aDogUGF0aCxcbiAgICBzdGVwID0gMSxcbiAgICAvLyBUaGlzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBkcmFnZ2luZyBhbmQgYWRkaW5nIHRvIHRoZSBsYXN0IG5vZGUgc3VtbWFyaXplZCBpbiB0aGUgYWJzdHJhY3Qgbm9kZVxuICAgIGlzRXh0ZW5kUHJldmlvdXNOb2RlOiBib29sZWFuID0gdHJ1ZSxcbiAgICBlZmZlY3RlZEFic3RyYWN0cyA9IG5ldyBNYXA8TWluZEVsZW1lbnQsIFBpY2s8QWJzdHJhY3ROb2RlLCAnc3RhcnQnIHwgJ2VuZCc+PigpXG4pID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUucGFyZW50KGJvYXJkLCBwYXRoKSBhcyBNaW5kRWxlbWVudDtcbiAgICBjb25zdCBoYXNQcmV2aW91c05vZGUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gIT09IDA7XG4gICAgbGV0IGJlaGluZEFic3RyYWN0czogTWluZEVsZW1lbnRbXTtcblxuICAgIGlmICghaGFzUHJldmlvdXNOb2RlKSB7XG4gICAgICAgIGJlaGluZEFic3RyYWN0cyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoY2hpbGQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnByZXZpb3VzKHBhdGgpKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgYmVoaW5kQWJzdHJhY3RzID0gZ2V0QmVoaW5kQWJzdHJhY3RzKHNlbGVjdGVkRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKGJlaGluZEFic3RyYWN0cy5sZW5ndGgpIHtcbiAgICAgICAgYmVoaW5kQWJzdHJhY3RzLmZvckVhY2goYWJzdHJhY3QgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBlZmZlY3RlZEFic3RyYWN0cy5nZXQoYWJzdHJhY3QpO1xuICAgICAgICAgICAgaWYgKCFuZXdQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgICAgICAgICAgIGVmZmVjdGVkQWJzdHJhY3RzLnNldChhYnN0cmFjdCwgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLnN0YXJ0ID0gbmV3UHJvcGVydGllcy5zdGFydCArIHN0ZXA7XG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmVuZCA9IG5ld1Byb3BlcnRpZXMuZW5kICsgc3RlcDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNQcmV2aW91c05vZGUpIHtcbiAgICAgICAgcmV0dXJuIGVmZmVjdGVkQWJzdHJhY3RzO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IFBsYWl0Tm9kZS5nZXQoYm9hcmQsIFBhdGgucHJldmlvdXMocGF0aCkpIGFzIE1pbmRFbGVtZW50O1xuICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdChzZWxlY3RlZEVsZW1lbnQpO1xuICAgIGNvbnN0IGlzRHJhZ1RvTGFzdCA9ICFpc0V4dGVuZFByZXZpb3VzTm9kZSAmJiBjb3JyZXNwb25kaW5nQWJzdHJhY3QgJiYgY29ycmVzcG9uZGluZ0Fic3RyYWN0LmVuZCA9PT0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdIC0gMTtcblxuICAgIGlmIChjb3JyZXNwb25kaW5nQWJzdHJhY3QgJiYgIWlzRHJhZ1RvTGFzdCkge1xuICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGVmZmVjdGVkQWJzdHJhY3RzLmdldChjb3JyZXNwb25kaW5nQWJzdHJhY3QpO1xuICAgICAgICBpZiAoIW5ld1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgICAgICAgIGVmZmVjdGVkQWJzdHJhY3RzLnNldChjb3JyZXNwb25kaW5nQWJzdHJhY3QsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZW5kID0gbmV3UHJvcGVydGllcy5lbmQgKyBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiBlZmZlY3RlZEFic3RyYWN0cztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVFbGVtZW50SGFuZGxlQWJzdHJhY3QgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZGVsZXRhYmxlRWxlbWVudHM6IE1pbmRFbGVtZW50W10sXG4gICAgZWZmZWN0ZWRBYnN0cmFjdHMgPSBuZXcgTWFwPE1pbmRFbGVtZW50LCBQaWNrPEFic3RyYWN0Tm9kZSwgJ3N0YXJ0JyB8ICdlbmQnPj4oKVxuKSA9PiB7XG4gICAgZGVsZXRhYmxlRWxlbWVudHMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgaWYgKCFQbGFpdE1pbmQuaXNNaW5kKG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBiZWhpbmRBYnN0cmFjdHMgPSBnZXRCZWhpbmRBYnN0cmFjdHMobm9kZSkuZmlsdGVyKGFic3RyYWN0ID0+ICFkZWxldGFibGVFbGVtZW50cy5pbmNsdWRlcyhhYnN0cmFjdCkpO1xuICAgICAgICAgICAgaWYgKGJlaGluZEFic3RyYWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBiZWhpbmRBYnN0cmFjdHMuZm9yRWFjaChhYnN0cmFjdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0aWVzID0gZWZmZWN0ZWRBYnN0cmFjdHMuZ2V0KGFic3RyYWN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RlZEFic3RyYWN0cy5zZXQoYWJzdHJhY3QsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuc3RhcnQgPSBuZXdQcm9wZXJ0aWVzLnN0YXJ0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcy5lbmQgPSBuZXdQcm9wZXJ0aWVzLmVuZCAtIDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdChub2RlKTtcbiAgICAgICAgICAgIGlmIChjb3JyZXNwb25kaW5nQWJzdHJhY3QgJiYgIWRlbGV0YWJsZUVsZW1lbnRzLmluY2x1ZGVzKGNvcnJlc3BvbmRpbmdBYnN0cmFjdCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGVmZmVjdGVkQWJzdHJhY3RzLmdldChjb3JyZXNwb25kaW5nQWJzdHJhY3QpO1xuICAgICAgICAgICAgICAgIGlmICghbmV3UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0ZWRBYnN0cmFjdHMuc2V0KGNvcnJlc3BvbmRpbmdBYnN0cmFjdCwgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuZW5kID0gbmV3UHJvcGVydGllcy5lbmQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVmZmVjdGVkQWJzdHJhY3RzO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ2hpbGRPZkFic3RyYWN0ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IE1pbmRFbGVtZW50LmdldEFuY2VzdG9ycyhib2FyZCwgZWxlbWVudCkgYXMgTWluZEVsZW1lbnRbXTtcbiAgICByZXR1cm4gISFhbmNlc3RvcnMuZmluZCh2YWx1ZSA9PiBBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdCh2YWx1ZSkpO1xufTtcbiJdfQ==
|