@plait/draw 0.57.0 → 0.59.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/constants/draw.d.ts +1 -0
- package/constants/geometry.d.ts +79 -2
- package/constants/index.d.ts +1 -0
- package/constants/pointer.d.ts +4 -2
- package/engines/index.d.ts +3 -3
- package/engines/table/table.d.ts +15 -1
- package/engines/uml/actor.d.ts +2 -0
- package/engines/uml/combined-fragment.d.ts +3 -0
- package/engines/uml/container.d.ts +2 -0
- package/engines/uml/package.d.ts +3 -0
- package/esm2022/constants/draw.mjs +2 -0
- package/esm2022/constants/geometry.mjs +70 -4
- package/esm2022/constants/index.mjs +2 -1
- package/esm2022/constants/pointer.mjs +9 -3
- package/esm2022/engines/basic-shapes/cloud.mjs +1 -1
- package/esm2022/engines/basic-shapes/comment.mjs +1 -1
- package/esm2022/engines/basic-shapes/diamond.mjs +2 -2
- package/esm2022/engines/basic-shapes/parallelogram.mjs +2 -2
- package/esm2022/engines/basic-shapes/pentagon.mjs +1 -1
- package/esm2022/engines/basic-shapes/round-comment.mjs +2 -2
- package/esm2022/engines/basic-shapes/star.mjs +1 -1
- package/esm2022/engines/basic-shapes/trapezoid.mjs +2 -2
- package/esm2022/engines/basic-shapes/triangle.mjs +2 -2
- package/esm2022/engines/flowchart/database.mjs +2 -2
- package/esm2022/engines/flowchart/display.mjs +1 -1
- package/esm2022/engines/flowchart/document.mjs +1 -1
- package/esm2022/engines/flowchart/hard-disk.mjs +2 -2
- package/esm2022/engines/flowchart/internal-storage.mjs +2 -2
- package/esm2022/engines/flowchart/manual-input.mjs +2 -2
- package/esm2022/engines/flowchart/manual-loop.mjs +2 -2
- package/esm2022/engines/flowchart/merge.mjs +1 -1
- package/esm2022/engines/flowchart/multi-document.mjs +1 -1
- package/esm2022/engines/flowchart/note-curly-left.mjs +2 -2
- package/esm2022/engines/flowchart/note-curly-right.mjs +2 -2
- package/esm2022/engines/flowchart/note-square.mjs +1 -1
- package/esm2022/engines/flowchart/off-page.mjs +2 -2
- package/esm2022/engines/flowchart/or.mjs +1 -8
- package/esm2022/engines/flowchart/predefined-process.mjs +1 -1
- package/esm2022/engines/flowchart/summing-junction.mjs +1 -8
- package/esm2022/engines/index.mjs +14 -5
- package/esm2022/engines/table/table.mjs +58 -10
- package/esm2022/engines/uml/actor.mjs +102 -0
- package/esm2022/engines/uml/combined-fragment.mjs +66 -0
- package/esm2022/engines/uml/container.mjs +44 -0
- package/esm2022/engines/uml/package.mjs +75 -0
- package/esm2022/generators/geometry-shape.generator.mjs +3 -3
- package/esm2022/generators/index.mjs +7 -0
- package/esm2022/generators/line-active.generator.mjs +3 -3
- package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
- package/esm2022/generators/single-text.generator.mjs +16 -0
- package/esm2022/generators/table.generator.mjs +20 -0
- package/esm2022/generators/text.generator.mjs +126 -0
- package/esm2022/geometry.component.mjs +63 -76
- package/esm2022/image.component.mjs +8 -25
- package/esm2022/interfaces/element.mjs +2 -1
- package/esm2022/interfaces/engine.mjs +2 -0
- package/esm2022/interfaces/geometry.mjs +14 -1
- package/esm2022/interfaces/image.mjs +1 -1
- package/esm2022/interfaces/index.mjs +27 -4
- package/esm2022/interfaces/line.mjs +1 -1
- package/esm2022/interfaces/table.mjs +9 -2
- package/esm2022/line.component.mjs +8 -25
- package/esm2022/plugins/with-draw-fragment.mjs +3 -1
- package/esm2022/plugins/with-draw-hotkey.mjs +12 -3
- package/esm2022/plugins/with-draw-resize.mjs +1 -1
- package/esm2022/plugins/with-draw.mjs +6 -2
- package/esm2022/plugins/with-geometry-create.mjs +2 -1
- package/esm2022/plugins/with-geometry-resize.mjs +3 -2
- package/esm2022/plugins/with-line-auto-complete-reaction.mjs +2 -2
- package/esm2022/plugins/with-line-bound-reaction.mjs +3 -4
- package/esm2022/plugins/with-line-create.mjs +3 -3
- package/esm2022/plugins/with-line-resize.mjs +3 -3
- package/esm2022/plugins/with-swimlane-create.mjs +132 -0
- package/esm2022/plugins/with-swimlane.mjs +21 -0
- package/esm2022/plugins/with-table-resize.mjs +130 -0
- package/esm2022/plugins/with-table.mjs +53 -7
- package/esm2022/public-api.mjs +2 -1
- package/esm2022/table.component.mjs +117 -24
- package/esm2022/transforms/geometry-text.mjs +6 -3
- package/esm2022/transforms/geometry.mjs +3 -2
- package/esm2022/transforms/index.mjs +11 -2
- package/esm2022/transforms/multi-text-geometry-text.mjs +15 -0
- package/esm2022/transforms/swimlane.mjs +97 -0
- package/esm2022/transforms/table-text.mjs +44 -0
- package/esm2022/utils/clipboard.mjs +15 -2
- package/esm2022/utils/common.mjs +159 -0
- package/esm2022/utils/geometry.mjs +55 -63
- package/esm2022/utils/hit.mjs +47 -18
- package/esm2022/utils/index.mjs +4 -1
- package/esm2022/utils/line/elbow.mjs +2 -2
- package/esm2022/utils/line/line-arrow.mjs +2 -2
- package/esm2022/utils/line/line-basic.mjs +4 -4
- package/esm2022/utils/line/line-common.mjs +2 -2
- package/esm2022/utils/memorize.mjs +7 -1
- package/esm2022/utils/multi-text-geometry.mjs +61 -0
- package/esm2022/utils/position/geometry.mjs +2 -40
- package/esm2022/utils/selected.mjs +14 -1
- package/esm2022/utils/shape.mjs +5 -2
- package/esm2022/utils/snap-resizing.mjs +7 -7
- package/esm2022/utils/style/stroke.mjs +4 -10
- package/esm2022/utils/swimlane.mjs +120 -0
- package/esm2022/utils/table.mjs +124 -0
- package/fesm2022/plait-draw.mjs +6376 -4834
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/index.d.ts +6 -0
- package/generators/line-auto-complete.generator.d.ts +2 -2
- package/generators/single-text.generator.d.ts +11 -0
- package/generators/table.generator.d.ts +9 -0
- package/generators/text.generator.d.ts +42 -0
- package/geometry.component.d.ts +11 -17
- package/image.component.d.ts +5 -11
- package/interfaces/element.d.ts +2 -1
- package/interfaces/engine.d.ts +16 -0
- package/interfaces/geometry.d.ts +23 -18
- package/interfaces/image.d.ts +4 -2
- package/interfaces/index.d.ts +12 -3
- package/interfaces/line.d.ts +4 -5
- package/interfaces/table.d.ts +14 -1
- package/line.component.d.ts +4 -10
- package/package.json +1 -1
- package/plugins/with-swimlane-create.d.ts +8 -0
- package/plugins/with-swimlane.d.ts +2 -0
- package/plugins/with-table-resize.d.ts +2 -0
- package/plugins/with-table.d.ts +5 -1
- package/public-api.d.ts +1 -0
- package/table.component.d.ts +17 -11
- package/transforms/geometry.d.ts +2 -2
- package/transforms/index.d.ts +8 -2
- package/transforms/multi-text-geometry-text.d.ts +4 -0
- package/transforms/swimlane.d.ts +6 -0
- package/transforms/table-text.d.ts +4 -0
- package/utils/clipboard.d.ts +2 -0
- package/utils/common.d.ts +32 -0
- package/utils/geometry.d.ts +36 -15
- package/utils/hit.d.ts +4 -2
- package/utils/index.d.ts +3 -0
- package/utils/line/line-common.d.ts +3 -3
- package/utils/memorize.d.ts +3 -1
- package/utils/multi-text-geometry.d.ts +14 -0
- package/utils/position/geometry.d.ts +8 -21
- package/utils/selected.d.ts +4 -0
- package/utils/shape.d.ts +2 -2
- package/utils/style/stroke.d.ts +4 -5
- package/utils/swimlane.d.ts +52 -0
- package/utils/table.d.ts +26 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { idCreator, RectangleClient } from '@plait/core';
|
|
2
|
+
import { DEFAULT_TEXT_HEIGHT, DefaultSwimlanePropertyMap } from '../constants';
|
|
3
|
+
import { PlaitDrawElement, SwimlaneSymbols } from '../interfaces';
|
|
4
|
+
export function buildSwimlaneTable(element) {
|
|
5
|
+
const swimlaneElement = { ...element };
|
|
6
|
+
if (PlaitDrawElement.isHorizontalSwimlane(element)) {
|
|
7
|
+
swimlaneElement.cells = element.cells.map((item, index) => {
|
|
8
|
+
if (index === 0) {
|
|
9
|
+
item = {
|
|
10
|
+
...element.cells[0],
|
|
11
|
+
rowspan: element.rows.length
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
if (item.text && item.textHeight && !item.text.direction) {
|
|
15
|
+
item.text.direction = 'vertical';
|
|
16
|
+
}
|
|
17
|
+
return item;
|
|
18
|
+
});
|
|
19
|
+
return swimlaneElement;
|
|
20
|
+
}
|
|
21
|
+
swimlaneElement.cells = [
|
|
22
|
+
{
|
|
23
|
+
...element.cells[0],
|
|
24
|
+
colspan: element.columns.length
|
|
25
|
+
},
|
|
26
|
+
...element.cells.slice(1, element.cells.length)
|
|
27
|
+
];
|
|
28
|
+
return swimlaneElement;
|
|
29
|
+
}
|
|
30
|
+
export const getDefaultSWimlanePoints = (pointer, centerPoint) => {
|
|
31
|
+
const property = DefaultSwimlanePropertyMap[pointer];
|
|
32
|
+
return RectangleClient.getPoints(RectangleClient.getRectangleByCenterPoint(centerPoint, property.width, property.height));
|
|
33
|
+
};
|
|
34
|
+
export const createDefaultSwimlane = (shape, points) => {
|
|
35
|
+
const rows = createDefaultRowsOrColumns(shape, 'row');
|
|
36
|
+
const columns = createDefaultRowsOrColumns(shape, 'column');
|
|
37
|
+
const swimlane = {
|
|
38
|
+
id: idCreator(),
|
|
39
|
+
type: 'table',
|
|
40
|
+
shape,
|
|
41
|
+
points,
|
|
42
|
+
rows,
|
|
43
|
+
columns,
|
|
44
|
+
cells: createDefaultCells(shape, rows, columns)
|
|
45
|
+
};
|
|
46
|
+
return buildSwimlaneTable(swimlane);
|
|
47
|
+
};
|
|
48
|
+
export const createDefaultRowsOrColumns = (shape, type) => {
|
|
49
|
+
let data = new Array(3).fill('').map(item => {
|
|
50
|
+
return { id: idCreator() };
|
|
51
|
+
});
|
|
52
|
+
if (type === 'row' && shape === SwimlaneSymbols.swimlaneVertical) {
|
|
53
|
+
data = data.map((item, index) => {
|
|
54
|
+
if (index === 0 || index === 1) {
|
|
55
|
+
return {
|
|
56
|
+
...item,
|
|
57
|
+
height: 30
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return item;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (type === 'column' && shape === SwimlaneSymbols.swimlaneHorizontal) {
|
|
64
|
+
data = data.map((item, index) => {
|
|
65
|
+
if (index === 0 || index === 1) {
|
|
66
|
+
return {
|
|
67
|
+
...item,
|
|
68
|
+
width: 30
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return item;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return data;
|
|
75
|
+
};
|
|
76
|
+
export const createDefaultCells = (shape, rows, columns) => {
|
|
77
|
+
return new Array(7).fill('').map((item, index) => {
|
|
78
|
+
if (index === 0) {
|
|
79
|
+
item = {
|
|
80
|
+
id: idCreator(),
|
|
81
|
+
rowId: rows[0].id,
|
|
82
|
+
columnId: columns[0].id,
|
|
83
|
+
textHeight: DEFAULT_TEXT_HEIGHT,
|
|
84
|
+
text: {
|
|
85
|
+
children: [
|
|
86
|
+
{
|
|
87
|
+
text: 'New Swimlane'
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
align: 'center'
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if ([1, 2, 3].includes(index)) {
|
|
95
|
+
item = {
|
|
96
|
+
id: idCreator(),
|
|
97
|
+
rowId: shape === SwimlaneSymbols.swimlaneVertical ? rows[1].id : rows[index - 1].id,
|
|
98
|
+
columnId: shape === SwimlaneSymbols.swimlaneVertical ? columns[index - 1].id : columns[1].id,
|
|
99
|
+
textHeight: DEFAULT_TEXT_HEIGHT,
|
|
100
|
+
text: {
|
|
101
|
+
children: [
|
|
102
|
+
{
|
|
103
|
+
text: 'Lane'
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
align: 'center'
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if ([4, 5, 6].includes(index)) {
|
|
111
|
+
item = {
|
|
112
|
+
id: idCreator(),
|
|
113
|
+
rowId: shape === SwimlaneSymbols.swimlaneVertical ? rows[2].id : rows[index - 4].id,
|
|
114
|
+
columnId: shape === SwimlaneSymbols.swimlaneVertical ? columns[index - 4].id : columns[2].id
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return item;
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpbWxhbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9zd2ltbGFuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLDBCQUEwQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBaUIsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpGLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFzQjtJQUNyRCxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDdkMsSUFBSSxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2pELGVBQWUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxHQUFHO29CQUNILEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU07aUJBQy9CLENBQUM7WUFDTixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUNELGVB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QjtnQkFDL0IsSUFBSSxFQUFFO29CQUNGLFFBQVEsRUFBRTt3QkFDTjs0QkFDSSxJQUFJLEVBQUUsTUFBTTt5QkFDZjtxQkFDSjtvQkFDRCxLQUFLLEVBQUUsUUFBUTtpQkFDbEI7YUFDSixDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksR0FBRztnQkFDSCxFQUFFLEVBQUUsU0FBUyxFQUFFO2dCQUNmLEtBQUssRUFBRSxLQUFLLEtBQUssZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25GLFFBQVEsRUFBRSxLQUFLLEtBQUssZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDL0YsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlkQ3JlYXRvciwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfVEVYVF9IRUlHSFQsIERyYXdQb2ludGVyVHlwZSwgRGVmYXVsdFN3aW1sYW5lUHJvcGVydHlNYXAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUGxhaXREcmF3RWxlbWVudCwgUGxhaXRTd2ltbGFuZSwgU3dpbWxhbmVTeW1ib2xzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN3aW1sYW5lVGFibGUoZWxlbWVudDogUGxhaXRTd2ltbGFuZSkge1xuICAgIGNvbnN0IHN3aW1sYW5lRWxlbWVudCA9IHsgLi4uZWxlbWVudCB9O1xuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzSG9yaXpvbnRhbFN3aW1sYW5lKGVsZW1lbnQpKSB7XG4gICAgICAgIHN3aW1sYW5lRWxlbWVudC5jZWxscyA9IGVsZW1lbnQuY2VsbHMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudC5jZWxsc1swXSxcbiAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogZWxlbWVudC5yb3dzLmxlbmd0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS50ZXh0ICYmIGl0ZW0udGV4dEhlaWdodCAmJiAhaXRlbS50ZXh0LmRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIGl0ZW0udGV4dC5kaXJlY3Rpb24gPSAndmVydGljYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3dpbWxhbmVFbGVtZW50O1xuICAgIH1cbiAgICBzd2ltbGFuZUVsZW1lbnQuY2VsbHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLmVsZW1lbnQuY2VsbHNbMF0sXG4gICAgICAgICAgICBjb2xzcGFuOiBlbGVtZW50LmNvbHVtbnMubGVuZ3RoXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVsZW1lbnQuY2VsbHMuc2xpY2UoMSwgZWxlbWVudC5jZWxscy5sZW5ndGgpXG4gICAgXTtcbiAgICByZXR1cm4gc3dpbWxhbmVFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFNXaW1sYW5lUG9pbnRzID0gKHBvaW50ZXI6IERyYXdQb2ludGVyVHlwZSwgY2VudGVyUG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBEZWZhdWx0U3dpbWxhbmVQcm9wZXJ0eU1hcFtwb2ludGVyXTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChjZW50ZXJQb2ludCwgcHJvcGVydHkud2lkdGgsIHByb3BlcnR5LmhlaWdodCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlZmF1bHRTd2ltbGFuZSA9IChzaGFwZTogU3dpbWxhbmVTeW1ib2xzLCBwb2ludHM6IFtQb2ludCwgUG9pbnRdKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IGNyZWF0ZURlZmF1bHRSb3dzT3JDb2x1bW5zKHNoYXBlLCAncm93Jyk7XG4gICAgY29uc3QgY29sdW1ucyA9IGNyZWF0ZURlZmF1bHRSb3dzT3JDb2x1bW5zKHNoYXBlLCAnY29sdW1uJyk7XG4gICAgY29uc3Qgc3dpbWxhbmUgPSB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgcm93cyxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgY2VsbHM6IGNyZWF0ZURlZmF1bHRDZWxscyhzaGFwZSwgcm93cywgY29sdW1ucylcbiAgICB9IGFzIFBsYWl0U3dpbWxhbmU7XG4gICAgcmV0dXJuIGJ1aWxkU3dpbWxhbmVUYWJsZShzd2ltbGFuZSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdFJvd3NPckNvbHVtbnMgPSAoc2hhcGU6IFN3aW1sYW5lU3ltYm9scywgdHlwZTogJ3JvdycgfCAnY29sdW1uJykgPT4ge1xuICAgIGxldCBkYXRhID0gbmV3IEFycmF5KDMpLmZpbGwoJycpLm1hcChpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIHsgaWQ6IGlkQ3JlYXRvcigpIH07XG4gICAgfSk7XG4gICAgaWYgKHR5cGUgPT09ICdyb3cnICYmIHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVWZXJ0aWNhbCkge1xuICAgICAgICBkYXRhID0gZGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgfHwgaW5kZXggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdjb2x1bW4nICYmIHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVIb3Jpem9udGFsKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCB8fCBpbmRleCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlZmF1bHRDZWxscyA9IChcbiAgICBzaGFwZTogU3dpbWxhbmVTeW1ib2xzLFxuICAgIHJvd3M6IHsgaWQ6IHN0cmluZzsgaGVpZ2h0PzogbnVtYmVyIH1bXSxcbiAgICBjb2x1bW5zOiB7IGlkOiBzdHJpbmc7IHdpZHRoPzogbnVtYmVyIH1bXVxuKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcnJheSg3KS5maWxsKCcnKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgICAgICAgICAgcm93SWQ6IHJvd3NbMF0uaWQsXG4gICAgICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbnNbMF0uaWQsXG4gICAgICAgICAgICAgICAgdGV4dEhlaWdodDogREVGQVVMVF9URVhUX0hFSUdIVCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ05ldyBTd2ltbGFuZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdjZW50ZXInXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoWzEsIDIsIDNdLmluY2x1ZGVzKGluZGV4KSkge1xuICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgICAgICAgICAgcm93SWQ6IHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVWZXJ0aWNhbCA/IHJvd3NbMV0uaWQgOiByb3dzW2luZGV4IC0gMV0uaWQsXG4gICAgICAgICAgICAgICAgY29sdW1uSWQ6IHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVWZXJ0aWNhbCA/IGNvbHVtbnNbaW5kZXggLSAxXS5pZCA6IGNvbHVtbnNbMV0uaWQsXG4gICAgICAgICAgICAgICAgdGV4dEhlaWdodDogREVGQVVMVF9URVhUX0hFSUdIVCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0xhbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFs0LCA1LCA2XS5pbmNsdWRlcyhpbmRleCkpIHtcbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkQ3JlYXRvcigpLFxuICAgICAgICAgICAgICAgIHJvd0lkOiBzaGFwZSA9PT0gU3dpbWxhbmVTeW1ib2xzLnN3aW1sYW5lVmVydGljYWwgPyByb3dzWzJdLmlkIDogcm93c1tpbmRleCAtIDRdLmlkLFxuICAgICAgICAgICAgICAgIGNvbHVtbklkOiBzaGFwZSA9PT0gU3dpbWxhbmVTeW1ib2xzLnN3aW1sYW5lVmVydGljYWwgPyBjb2x1bW5zW2luZGV4IC0gNF0uaWQgOiBjb2x1bW5zWzJdLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { idCreator, RectangleClient } from '@plait/core';
|
|
2
|
+
import { getTextManage } from '../generators/text.generator';
|
|
3
|
+
export function getCellsWithPoints(board, element) {
|
|
4
|
+
const table = board.buildTable(element);
|
|
5
|
+
const rectangle = RectangleClient.getRectangleByPoints(table.points);
|
|
6
|
+
const columnsCount = table.columns.length;
|
|
7
|
+
const rowsCount = table.rows.length;
|
|
8
|
+
const cellWidths = calculateCellsSize(table.columns, rectangle.width, columnsCount, true);
|
|
9
|
+
const cellHeights = calculateCellsSize(table.rows, rectangle.height, rowsCount, false);
|
|
10
|
+
const cells = table.cells.map(cell => {
|
|
11
|
+
const rowIdx = table.rows.findIndex(row => row.id === cell.rowId);
|
|
12
|
+
const columnIdx = table.columns.findIndex(column => column.id === cell.columnId);
|
|
13
|
+
let cellTopLeftX = rectangle.x;
|
|
14
|
+
for (let i = 0; i < columnIdx; i++) {
|
|
15
|
+
cellTopLeftX += cellWidths[i];
|
|
16
|
+
}
|
|
17
|
+
let cellTopLeftY = rectangle.y;
|
|
18
|
+
for (let i = 0; i < rowIdx; i++) {
|
|
19
|
+
cellTopLeftY += cellHeights[i];
|
|
20
|
+
}
|
|
21
|
+
const cellWidth = calculateCellSize(cell, cellWidths, columnIdx, true);
|
|
22
|
+
const cellBottomRightX = cellTopLeftX + cellWidth;
|
|
23
|
+
const cellHeight = calculateCellSize(cell, cellHeights, rowIdx, false);
|
|
24
|
+
const cellBottomRightY = cellTopLeftY + cellHeight;
|
|
25
|
+
return {
|
|
26
|
+
...cell,
|
|
27
|
+
points: [
|
|
28
|
+
[cellTopLeftX, cellTopLeftY],
|
|
29
|
+
[cellBottomRightX, cellBottomRightY]
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
return cells;
|
|
34
|
+
}
|
|
35
|
+
export function getCellWithPoints(board, table, cellId) {
|
|
36
|
+
const cells = getCellsWithPoints(board, table);
|
|
37
|
+
const cellIndex = table.cells.findIndex(item => item.id === cellId);
|
|
38
|
+
return cells[cellIndex];
|
|
39
|
+
}
|
|
40
|
+
function calculateCellsSize(items, tableSize, count, isWidth) {
|
|
41
|
+
const cellSizes = [];
|
|
42
|
+
const sizeType = isWidth ? 'width' : 'height';
|
|
43
|
+
// The remaining size of the table excluding cells with already set sizes.
|
|
44
|
+
let totalSizeRemaining = tableSize;
|
|
45
|
+
items.forEach((item, index) => {
|
|
46
|
+
if (item[sizeType]) {
|
|
47
|
+
cellSizes[index] = item[sizeType];
|
|
48
|
+
totalSizeRemaining -= item[sizeType];
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// Divide the remaining size equally.
|
|
52
|
+
const remainingItemCount = count - cellSizes.filter(item => !!item).length;
|
|
53
|
+
const remainingCellSize = remainingItemCount > 0 ? totalSizeRemaining / remainingItemCount : 0;
|
|
54
|
+
for (let i = 0; i < count; i++) {
|
|
55
|
+
if (!cellSizes[i]) {
|
|
56
|
+
cellSizes[i] = remainingCellSize;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return cellSizes;
|
|
60
|
+
}
|
|
61
|
+
function calculateCellSize(cell, sizes, index, isWidth) {
|
|
62
|
+
const span = isWidth ? cell.colspan || 1 : cell.rowspan || 1;
|
|
63
|
+
let size = 0;
|
|
64
|
+
for (let i = 0; i < span; i++) {
|
|
65
|
+
const cellIndex = index + i;
|
|
66
|
+
size += sizes[cellIndex];
|
|
67
|
+
}
|
|
68
|
+
return size;
|
|
69
|
+
}
|
|
70
|
+
export function getHitCell(board, element, point) {
|
|
71
|
+
const table = board.buildTable(element);
|
|
72
|
+
const cells = getCellsWithPoints(board, table);
|
|
73
|
+
const rectangle = RectangleClient.getRectangleByPoints([point, point]);
|
|
74
|
+
const cell = cells.find(item => {
|
|
75
|
+
const cellRectangle = RectangleClient.getRectangleByPoints(item.points);
|
|
76
|
+
return RectangleClient.isHit(rectangle, cellRectangle);
|
|
77
|
+
});
|
|
78
|
+
if (cell) {
|
|
79
|
+
return table.cells.find(item => item.id === cell.id);
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
export function editCell(cell) {
|
|
84
|
+
const textManage = getTextManageByCell(cell);
|
|
85
|
+
textManage && textManage.edit();
|
|
86
|
+
}
|
|
87
|
+
export function getTextManageByCell(cell) {
|
|
88
|
+
return getTextManage(cell.id);
|
|
89
|
+
}
|
|
90
|
+
export const updateColumns = (table, columnId, width, offset) => {
|
|
91
|
+
const columns = table.columns.map(item => (item.id === columnId ? { ...item, width } : item));
|
|
92
|
+
const points = [table.points[0], [table.points[1][0] + offset, table.points[1][1]]];
|
|
93
|
+
return { columns, points };
|
|
94
|
+
};
|
|
95
|
+
export const updateRows = (table, rowId, height, offset) => {
|
|
96
|
+
const rows = table.rows.map(item => (item.id === rowId ? { ...item, height } : item));
|
|
97
|
+
const points = [table.points[0], [table.points[1][0], table.points[1][1] + offset]];
|
|
98
|
+
return { rows, points };
|
|
99
|
+
};
|
|
100
|
+
export function updateCellIdsByRowOrColumn(cells, oldId, newId, type) {
|
|
101
|
+
const id = `${type}Id`;
|
|
102
|
+
cells.forEach(item => {
|
|
103
|
+
if (item[id] === oldId) {
|
|
104
|
+
item[id] = newId;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
export function updateRowOrColumnIds(element, type) {
|
|
109
|
+
element[`${type}s`].forEach(item => {
|
|
110
|
+
const newId = idCreator();
|
|
111
|
+
updateCellIdsByRowOrColumn(element.cells, item.id, newId, type);
|
|
112
|
+
item.id = newId;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export function updateCellIds(cells) {
|
|
116
|
+
cells.forEach(item => {
|
|
117
|
+
const newId = idCreator();
|
|
118
|
+
item.id = newId;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
export function isCellIncludeText(cell) {
|
|
122
|
+
return cell.text && cell.textHeight;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy90YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzdELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFpQixFQUFFLE9BQW1CO0lBQ3JFLE1BQU0sS0FBSyxHQUFJLEtBQXlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXZGLE1BQU0sS0FBSyxHQUErQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLEtBQUss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QUNQLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBbUIsRUFBRSxJQUFzQjtJQUM1RSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMvQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUMxQiwwQkFBMEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBdUI7SUFDakQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNqQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBb0I7SUFDbEQsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlkQ3JlYXRvciwgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0VGFibGUsIFBsYWl0VGFibGVDZWxsLCBQbGFpdFRhYmxlQ2VsbFdpdGhQb2ludHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3RhYmxlJztcbmltcG9ydCB7IGdldFRleHRNYW5hZ2UgfSBmcm9tICcuLi9nZW5lcmF0b3JzL3RleHQuZ2VuZXJhdG9yJztcbmltcG9ydCB7IFBsYWl0VGFibGVCb2FyZCB9IGZyb20gJy4uL3BsdWdpbnMvd2l0aC10YWJsZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsc1dpdGhQb2ludHMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0VGFibGUpOiBQbGFpdFRhYmxlQ2VsbFdpdGhQb2ludHNbXSB7XG4gICAgY29uc3QgdGFibGUgPSAoYm9hcmQgYXMgUGxhaXRUYWJsZUJvYXJkKS5idWlsZFRhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyh0YWJsZS5wb2ludHMpO1xuICAgIGNvbnN0IGNvbHVtbnNDb3VudCA9IHRhYmxlLmNvbHVtbnMubGVuZ3RoO1xuICAgIGNvbnN0IHJvd3NDb3VudCA9IHRhYmxlLnJvd3MubGVuZ3RoO1xuICAgIGNvbnN0IGNlbGxXaWR0aHMgPSBjYWxjdWxhdGVDZWxsc1NpemUodGFibGUuY29sdW1ucywgcmVjdGFuZ2xlLndpZHRoLCBjb2x1bW5zQ291bnQsIHRydWUpO1xuICAgIGNvbnN0IGNlbGxIZWlnaHRzID0gY2FsY3VsYXRlQ2VsbHNTaXplKHRhYmxlLnJvd3MsIHJlY3RhbmdsZS5oZWlnaHQsIHJvd3NDb3VudCwgZmFsc2UpO1xuXG4gICAgY29uc3QgY2VsbHM6IFBsYWl0VGFibGVDZWxsV2l0aFBvaW50c1tdID0gdGFibGUuY2VsbHMubWFwKGNlbGwgPT4ge1xuICAgICAgICBjb25zdCByb3dJZHggPSB0YWJsZS5yb3dzLmZpbmRJbmRleChyb3cgPT4gcm93LmlkID09PSBjZWxsLnJvd0lkKTtcbiAgICAgICAgY29uc3QgY29sdW1uSWR4ID0gdGFibGUuY29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY2VsbC5jb2x1bW5JZCk7XG5cbiAgICAgICAgbGV0IGNlbGxUb3BMZWZ0WCA9IHJlY3RhbmdsZS54O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbklkeDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxsVG9wTGVmdFggKz0gY2VsbFdpZHRoc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjZWxsVG9wTGVmdFkgPSByZWN0YW5nbGUueTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dJZHg7IGkrKykge1xuICAgICAgICAgICAgY2VsbFRvcExlZnRZICs9IGNlbGxIZWlnaHRzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gY2FsY3VsYXRlQ2VsbFNpemUoY2VsbCwgY2VsbFdpZHRocywgY29sdW1uSWR4LCB0cnVlKTtcbiAgICAgICAgY29uc3QgY2VsbEJvdHRvbVJpZ2h0WCA9IGNlbGxUb3BMZWZ0WCArIGNlbGxXaWR0aDtcblxuICAgICAgICBjb25zdCBjZWxsSGVpZ2h0ID0gY2FsY3VsYXRlQ2VsbFNpemUoY2VsbCwgY2VsbEhlaWdodHMsIHJvd0lkeCwgZmFsc2UpO1xuICAgICAgICBjb25zdCBjZWxsQm90dG9tUmlnaHRZID0gY2VsbFRvcExlZnRZICsgY2VsbEhlaWdodDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2VsbCxcbiAgICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgICAgIFtjZWxsVG9wTGVmdFgsIGNlbGxUb3BMZWZ0WV0sXG4gICAgICAgICAgICAgICAgW2NlbGxCb3R0b21SaWdodFgsIGNlbGxCb3R0b21SaWdodFldXG4gICAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2VsbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsV2l0aFBvaW50cyhib2FyZDogUGxhaXRCb2FyZCwgdGFibGU6IFBsYWl0VGFibGUsIGNlbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2VsbHMgPSBnZXRDZWxsc1dpdGhQb2ludHMoYm9hcmQgYXMgUGxhaXRUYWJsZUJvYXJkLCB0YWJsZSk7XG4gICAgY29uc3QgY2VsbEluZGV4ID0gdGFibGUuY2VsbHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PT0gY2VsbElkKTtcbiAgICByZXR1cm4gY2VsbHNbY2VsbEluZGV4XTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQ2VsbHNTaXplKGl0ZW1zOiB7IGlkOiBzdHJpbmc7IFtrZXk6IHN0cmluZ106IGFueSB9W10sIHRhYmxlU2l6ZTogbnVtYmVyLCBjb3VudDogbnVtYmVyLCBpc1dpZHRoOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2VsbFNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHNpemVUeXBlID0gaXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICAgIC8vIFRoZSByZW1haW5pbmcgc2l6ZSBvZiB0aGUgdGFibGUgZXhjbHVkaW5nIGNlbGxzIHdpdGggYWxyZWFkeSBzZXQgc2l6ZXMuXG4gICAgbGV0IHRvdGFsU2l6ZVJlbWFpbmluZyA9IHRhYmxlU2l6ZTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpdGVtW3NpemVUeXBlXSkge1xuICAgICAgICAgICAgY2VsbFNpemVzW2luZGV4XSA9IGl0ZW1bc2l6ZVR5cGVdO1xuICAgICAgICAgICAgdG90YWxTaXplUmVtYWluaW5nIC09IGl0ZW1bc2l6ZVR5cGVdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXZpZGUgdGhlIHJlbWFpbmluZyBzaXplIGVxdWFsbHkuXG4gICAgY29uc3QgcmVtYWluaW5nSXRlbUNvdW50ID0gY291bnQgLSBjZWxsU2l6ZXMuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKS5sZW5ndGg7XG4gICAgY29uc3QgcmVtYWluaW5nQ2VsbFNpemUgPSByZW1haW5pbmdJdGVtQ291bnQgPiAwID8gdG90YWxTaXplUmVtYWluaW5nIC8gcmVtYWluaW5nSXRlbUNvdW50IDogMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKCFjZWxsU2l6ZXNbaV0pIHtcbiAgICAgICAgICAgIGNlbGxTaXplc1tpXSA9IHJlbWFpbmluZ0NlbGxTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjZWxsU2l6ZXM7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUNlbGxTaXplKGNlbGw6IFBsYWl0VGFibGVDZWxsLCBzaXplczogbnVtYmVyW10sIGluZGV4OiBudW1iZXIsIGlzV2lkdGg6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzcGFuID0gaXNXaWR0aCA/IGNlbGwuY29sc3BhbiB8fCAxIDogY2VsbC5yb3dzcGFuIHx8IDE7XG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IGluZGV4ICsgaTtcbiAgICAgICAgc2l6ZSArPSBzaXplc1tjZWxsSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpdENlbGwoYm9hcmQ6IFBsYWl0VGFibGVCb2FyZCwgZWxlbWVudDogUGxhaXRUYWJsZSwgcG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgdGFibGUgPSBib2FyZC5idWlsZFRhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IGNlbGxzID0gZ2V0Q2VsbHNXaXRoUG9pbnRzKGJvYXJkLCB0YWJsZSk7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtwb2ludCwgcG9pbnRdKTtcbiAgICBjb25zdCBjZWxsID0gY2VsbHMuZmluZChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgY2VsbFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhpdGVtLnBvaW50cyk7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQocmVjdGFuZ2xlLCBjZWxsUmVjdGFuZ2xlKTtcbiAgICB9KTtcbiAgICBpZiAoY2VsbCkge1xuICAgICAgICByZXR1cm4gdGFibGUuY2VsbHMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGNlbGwuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVkaXRDZWxsKGNlbGw6IFBsYWl0VGFibGVDZWxsKSB7XG4gICAgY29uc3QgdGV4dE1hbmFnZSA9IGdldFRleHRNYW5hZ2VCeUNlbGwoY2VsbCk7XG4gICAgdGV4dE1hbmFnZSAmJiB0ZXh0TWFuYWdlLmVkaXQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRNYW5hZ2VCeUNlbGwoY2VsbDogUGxhaXRUYWJsZUNlbGwpIHtcbiAgICByZXR1cm4gZ2V0VGV4dE1hbmFnZShjZWxsLmlkKTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSAodGFibGU6IFBsYWl0VGFibGUsIGNvbHVtbklkOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRhYmxlLmNvbHVtbnMubWFwKGl0ZW0gPT4gKGl0ZW0uaWQgPT09IGNvbHVtbklkID8geyAuLi5pdGVtLCB3aWR0aCB9IDogaXRlbSkpO1xuICAgIGNvbnN0IHBvaW50cyA9IFt0YWJsZS5wb2ludHNbMF0sIFt0YWJsZS5wb2ludHNbMV1bMF0gKyBvZmZzZXQsIHRhYmxlLnBvaW50c1sxXVsxXV1dIGFzIFBvaW50W107XG4gICAgcmV0dXJuIHsgY29sdW1ucywgcG9pbnRzIH07XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlUm93cyA9ICh0YWJsZTogUGxhaXRUYWJsZSwgcm93SWQ6IHN0cmluZywgaGVpZ2h0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKGl0ZW0gPT4gKGl0ZW0uaWQgPT09IHJvd0lkID8geyAuLi5pdGVtLCBoZWlnaHQgfSA6IGl0ZW0pKTtcbiAgICBjb25zdCBwb2ludHMgPSBbdGFibGUucG9pbnRzWzBdLCBbdGFibGUucG9pbnRzWzFdWzBdLCB0YWJsZS5wb2ludHNbMV1bMV0gKyBvZmZzZXRdXSBhcyBQb2ludFtdO1xuICAgIHJldHVybiB7IHJvd3MsIHBvaW50cyB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNlbGxJZHNCeVJvd09yQ29sdW1uKGNlbGxzOiBQbGFpdFRhYmxlQ2VsbFtdLCBvbGRJZDogc3RyaW5nLCBuZXdJZDogc3RyaW5nLCB0eXBlOiAncm93JyB8ICdjb2x1bW4nKSB7XG4gICAgY29uc3QgaWQ6ICdyb3dJZCcgfCAnY29sdW1uSWQnID0gYCR7dHlwZX1JZGA7XG4gICAgY2VsbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW1baWRdID09PSBvbGRJZCkge1xuICAgICAgICAgICAgaXRlbVtpZF0gPSBuZXdJZDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUm93T3JDb2x1bW5JZHMoZWxlbWVudDogUGxhaXRUYWJsZSwgdHlwZTogJ3JvdycgfCAnY29sdW1uJykge1xuICAgIGVsZW1lbnRbYCR7dHlwZX1zYF0uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgbmV3SWQgPSBpZENyZWF0b3IoKTtcbiAgICAgICAgdXBkYXRlQ2VsbElkc0J5Um93T3JDb2x1bW4oZWxlbWVudC5jZWxscywgaXRlbS5pZCwgbmV3SWQsIHR5cGUpO1xuICAgICAgICBpdGVtLmlkID0gbmV3SWQ7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDZWxsSWRzKGNlbGxzOiBQbGFpdFRhYmxlQ2VsbFtdKSB7XG4gICAgY2VsbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgbmV3SWQgPSBpZENyZWF0b3IoKTtcbiAgICAgICAgaXRlbS5pZCA9IG5ld0lkO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDZWxsSW5jbHVkZVRleHQoY2VsbDogUGxhaXRUYWJsZUNlbGwpIHtcbiAgICByZXR1cm4gY2VsbC50ZXh0ICYmIGNlbGwudGV4dEhlaWdodDtcbn1cbiJdfQ==
|