@plait/core 0.54.0 → 0.55.1
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/board/board.component.d.ts +8 -3
- package/constants/index.d.ts +2 -0
- package/core/element/context.d.ts +6 -2
- package/core/element/plugin-element.d.ts +13 -4
- package/core/list-render.d.ts +16 -0
- package/esm2022/board/board.component.mjs +28 -23
- package/esm2022/constants/index.mjs +3 -1
- package/esm2022/core/element/context.mjs +1 -1
- package/esm2022/core/element/plugin-element.mjs +79 -12
- package/esm2022/core/list-render.mjs +210 -0
- package/esm2022/interfaces/board.mjs +3 -3
- package/esm2022/interfaces/element.mjs +28 -2
- package/esm2022/interfaces/node.mjs +18 -1
- package/esm2022/interfaces/path.mjs +56 -57
- package/esm2022/plugins/create-board.mjs +10 -10
- package/esm2022/plugins/with-hotkey.mjs +32 -3
- package/esm2022/plugins/with-moving.mjs +12 -12
- package/esm2022/plugins/with-related-fragment.mjs +5 -5
- package/esm2022/public-api.mjs +2 -4
- package/esm2022/services/context.service.mjs +30 -0
- package/esm2022/transforms/group.mjs +23 -6
- package/esm2022/transforms/index.mjs +6 -3
- package/esm2022/transforms/z-index.mjs +20 -0
- package/esm2022/utils/angle.mjs +17 -3
- package/esm2022/utils/clipboard/clipboard.mjs +5 -5
- package/esm2022/utils/clipboard/common.mjs +5 -5
- package/esm2022/utils/clipboard/types.mjs +1 -1
- package/esm2022/utils/common.mjs +29 -1
- package/esm2022/utils/fragment.mjs +22 -1
- package/esm2022/utils/group.mjs +33 -4
- package/esm2022/utils/helper.mjs +37 -1
- package/esm2022/utils/index.mjs +4 -1
- package/esm2022/utils/math.mjs +37 -1
- package/esm2022/utils/position.mjs +3 -3
- package/esm2022/utils/snap/snap-moving.mjs +199 -0
- package/esm2022/utils/snap/snap.mjs +208 -0
- package/esm2022/utils/to-image.mjs +2 -2
- package/esm2022/utils/weak-maps.mjs +3 -1
- package/esm2022/utils/z-index.mjs +166 -0
- package/fesm2022/plait-core.mjs +1667 -1075
- package/fesm2022/plait-core.mjs.map +1 -1
- package/interfaces/board.d.ts +5 -5
- package/interfaces/element.d.ts +5 -0
- package/interfaces/node.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -3
- package/services/{image-context.service.d.ts → context.service.d.ts} +3 -0
- package/styles/styles.scss +9 -0
- package/transforms/group.d.ts +4 -0
- package/transforms/index.d.ts +3 -2
- package/transforms/z-index.d.ts +13 -0
- package/utils/angle.d.ts +2 -0
- package/utils/clipboard/common.d.ts +1 -1
- package/utils/clipboard/types.d.ts +1 -1
- package/utils/common.d.ts +8 -0
- package/utils/fragment.d.ts +3 -1
- package/utils/group.d.ts +3 -1
- package/utils/helper.d.ts +4 -1
- package/utils/index.d.ts +3 -0
- package/utils/math.d.ts +1 -0
- package/utils/position.d.ts +1 -1
- package/utils/snap/snap-moving.d.ts +5 -0
- package/utils/snap/snap.d.ts +31 -0
- package/utils/weak-maps.d.ts +2 -0
- package/utils/z-index.d.ts +5 -0
- package/core/children/children.component.d.ts +0 -17
- package/core/children/effect.d.ts +0 -2
- package/core/element/element.component.d.ts +0 -30
- package/esm2022/core/children/children.component.mjs +0 -60
- package/esm2022/core/children/effect.mjs +0 -2
- package/esm2022/core/element/element.component.mjs +0 -105
- package/esm2022/services/image-context.service.mjs +0 -22
- package/esm2022/utils/moving-snap.mjs +0 -372
- package/utils/moving-snap.d.ts +0 -41
|
@@ -3,6 +3,8 @@ export const IS_BOARD_CACHE = new WeakMap();
|
|
|
3
3
|
export const FLUSHING = new WeakMap();
|
|
4
4
|
export const NODE_TO_INDEX = new WeakMap();
|
|
5
5
|
export const NODE_TO_PARENT = new WeakMap();
|
|
6
|
+
export const NODE_TO_G = new WeakMap();
|
|
7
|
+
export const NODE_TO_CONTAINER_G = new WeakMap();
|
|
6
8
|
export const IS_TEXT_EDITABLE = new WeakMap();
|
|
7
9
|
export const BOARD_TO_ON_CHANGE = new WeakMap();
|
|
8
10
|
export const BOARD_TO_AFTER_CHANGE = new WeakMap();
|
|
@@ -20,4 +22,4 @@ export const BOARD_TO_IS_SELECTION_MOVING = new WeakMap();
|
|
|
20
22
|
export const BOARD_TO_TEMPORARY_ELEMENTS = new WeakMap();
|
|
21
23
|
export const BOARD_TO_MOVING_ELEMENT = new WeakMap();
|
|
22
24
|
export const PATH_REFS = new WeakMap();
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vhay1tYXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvd2Vhay1tYXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLDhCQUE4QjtBQUM5QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXpFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUF1QyxDQUFDO0FBRXJGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUF3QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBUzdDLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBOEIsQ0FBQztBQUVuRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUvRSxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQTRELENBQUM7QUFFbkgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQThCLENBQUM7QUFFakYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFzQyxJQUFJLE9BQU8sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tICdyb3VnaGpzL2Jpbi9zdmcnO1xuaW1wb3J0IHsgQm9hcmRDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuLi9ib2FyZC9ib2FyZC5jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ib2FyZCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG9pbnQnO1xuaW1wb3J0IHsgQW5jZXN0b3IsIFBsYWl0Tm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBQYXRoUmVmIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wYXRoLXJlZic7XG5cbi8vIHJlY29yZCByaWNodGV4dCB0eXBlIHN0YXR1c1xuZXhwb3J0IGNvbnN0IElTX0JPQVJEX0NBQ0hFID0gbmV3IFdlYWtNYXA8T2JqZWN0LCBib29sZWFuPigpO1xuXG5leHBvcnQgY29uc3QgRkxVU0hJTkcgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19JTkRFWCA9IG5ldyBXZWFrTWFwPFBsYWl0Tm9kZSwgbnVtYmVyPigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19QQVJFTlQgPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIEFuY2VzdG9yPigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19HID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBTVkdHRWxlbWVudD4oKTtcblxuZXhwb3J0IGNvbnN0IE5PREVfVE9fQ09OVEFJTkVSX0cgPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIFNWR0dFbGVtZW50PigpO1xuXG5leHBvcnQgY29uc3QgSVNfVEVYVF9FRElUQUJMRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19PTl9DSEFOR0UgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCAoKSA9PiB2b2lkPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fQUZURVJfQ0hBTkdFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgKCkgPT4gdm9pZD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0NPTVBPTkVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIEJvYXJkQ29tcG9uZW50SW50ZXJmYWNlPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fUk9VR0hfU1ZHID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUm91Z2hTVkc+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19IT1NUID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgU1ZHU1ZHRWxlbWVudD4oKTtcblxuZXhwb3J0IGNvbnN0IElTX0JPQVJEX0FMSVZFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgYm9vbGVhbj4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0VMRU1FTlRfSE9TVCA9IG5ldyBXZWFrTWFwPFxuICAgIFBsYWl0Qm9hcmQsXG4gICAge1xuICAgICAgICBob3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgdXBwZXJIb3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgYWN0aXZlSG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHZpZXdwb3J0Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICB9XG4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19TRUxFQ1RFRF9FTEVNRU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50W10+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19NT1ZJTkdfUE9JTlRfSU5fQk9BUkQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQb2ludD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX01PVklOR19QT0lOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBvaW50PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fVklFV1BPUlRfT1JJR0lOQVRJT04gPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQb2ludD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0lTX1NFTEVDVElPTl9NT1ZJTkcgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG4vLyBzYXZlIG5vIHN0YW5kYXJkIHNlbGVjdGVkIGVsZW1lbnRzXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fVEVNUE9SQVJZX0VMRU1FTlRTID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgeyBlbGVtZW50czogUGxhaXRFbGVtZW50W107IHRpbWVvdXRJZDogYW55IH0+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19NT1ZJTkdfRUxFTUVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudFtdPigpO1xuXG5leHBvcnQgY29uc3QgUEFUSF9SRUZTOiBXZWFrTWFwPFBsYWl0Qm9hcmQsIFNldDxQYXRoUmVmPj4gPSBuZXcgV2Vha01hcCgpO1xuIl19
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { PlaitGroupElement } from '../interfaces';
|
|
2
|
+
import { getElementsIndices } from './common';
|
|
3
|
+
import { getEditingGroup, getElementsInGroup, getGroupByElement, getHighestGroup, isSelectedAllElementsInGroup } from './group';
|
|
4
|
+
import { findIndex, findLastIndex } from './helper';
|
|
5
|
+
import { sortElements } from './position';
|
|
6
|
+
import { getSelectedElements } from './selected-element';
|
|
7
|
+
export const getOneMoveOptions = (board, direction) => {
|
|
8
|
+
const indicesToMove = getElementsIndices(board, getSelectedElements(board));
|
|
9
|
+
let groupedIndices = toContiguousGroups(board, indicesToMove);
|
|
10
|
+
if (direction === 'up') {
|
|
11
|
+
groupedIndices = groupedIndices.reverse();
|
|
12
|
+
}
|
|
13
|
+
let moveContents = [];
|
|
14
|
+
groupedIndices.forEach((indices, i) => {
|
|
15
|
+
const leadingIndex = indices[0];
|
|
16
|
+
const trailingIndex = indices[indices.length - 1];
|
|
17
|
+
const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
|
|
18
|
+
const targetIndex = getTargetIndex(board, boundaryIndex, direction);
|
|
19
|
+
if (targetIndex === -1 || boundaryIndex === targetIndex) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (direction === 'down') {
|
|
23
|
+
indices = indices.reverse();
|
|
24
|
+
}
|
|
25
|
+
moveContents.push(...indices.map(path => {
|
|
26
|
+
return {
|
|
27
|
+
element: board.children[path],
|
|
28
|
+
newPath: [targetIndex]
|
|
29
|
+
};
|
|
30
|
+
}));
|
|
31
|
+
});
|
|
32
|
+
return moveContents;
|
|
33
|
+
};
|
|
34
|
+
export const getAllMoveOptions = (board, direction) => {
|
|
35
|
+
const indicesToMove = getElementsIndices(board, getSelectedElements(board));
|
|
36
|
+
let groupedIndices = toContiguousGroups(board, indicesToMove);
|
|
37
|
+
let moveContents = [];
|
|
38
|
+
if (direction === 'down') {
|
|
39
|
+
groupedIndices = groupedIndices.reverse();
|
|
40
|
+
}
|
|
41
|
+
groupedIndices.forEach(indices => {
|
|
42
|
+
const leadingIndex = indices[0];
|
|
43
|
+
const trailingIndex = indices[indices.length - 1];
|
|
44
|
+
const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
|
|
45
|
+
const sourceElement = board.children[boundaryIndex];
|
|
46
|
+
const editingGroup = getEditingGroup(board, sourceElement);
|
|
47
|
+
let targetIndex = direction === 'down' ? 0 : board.children.length - 1;
|
|
48
|
+
if (editingGroup) {
|
|
49
|
+
const elementsInGroup = sortElements(board, getElementsInGroup(board, editingGroup, true, true));
|
|
50
|
+
targetIndex =
|
|
51
|
+
direction === 'down'
|
|
52
|
+
? board.children.indexOf(elementsInGroup[0])
|
|
53
|
+
: board.children.indexOf(elementsInGroup[elementsInGroup.length - 1]);
|
|
54
|
+
}
|
|
55
|
+
if (direction === 'down') {
|
|
56
|
+
indices = indices.reverse();
|
|
57
|
+
}
|
|
58
|
+
moveContents.push(...indices.map(path => {
|
|
59
|
+
return {
|
|
60
|
+
element: board.children[path],
|
|
61
|
+
newPath: [targetIndex]
|
|
62
|
+
};
|
|
63
|
+
}));
|
|
64
|
+
});
|
|
65
|
+
return moveContents;
|
|
66
|
+
};
|
|
67
|
+
export const canSetZIndex = (board) => {
|
|
68
|
+
const selectedElements = getSelectedElements(board).filter(item => board.canSetZIndex(item));
|
|
69
|
+
return selectedElements.length > 0;
|
|
70
|
+
};
|
|
71
|
+
const toContiguousGroups = (board, array) => {
|
|
72
|
+
let cursor = 0;
|
|
73
|
+
return array.reduce((acc, value, index) => {
|
|
74
|
+
if (index > 0) {
|
|
75
|
+
const currentElement = board.children[value];
|
|
76
|
+
const previousElement = board.children[array[index - 1]];
|
|
77
|
+
const isContiguous = value - 1 === array[index - 1]
|
|
78
|
+
? true
|
|
79
|
+
: board.children.every((item, childIndex) => {
|
|
80
|
+
if (childIndex > array[index - 1] && childIndex <= value - 1) {
|
|
81
|
+
return PlaitGroupElement.isGroup(item);
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
});
|
|
85
|
+
let isPartialSelectGroupElement = false;
|
|
86
|
+
if (previousElement?.groupId || (currentElement?.groupId && previousElement?.groupId !== currentElement?.groupId)) {
|
|
87
|
+
let isPartialSelectPreviousGroup = false;
|
|
88
|
+
let isPartialSelectCurrentElement = false;
|
|
89
|
+
if (previousElement.groupId) {
|
|
90
|
+
const highestGroup = getHighestGroup(board, previousElement);
|
|
91
|
+
isPartialSelectPreviousGroup = !isSelectedAllElementsInGroup(board, highestGroup);
|
|
92
|
+
}
|
|
93
|
+
if (currentElement.groupId) {
|
|
94
|
+
const highestGroup = getHighestGroup(board, currentElement);
|
|
95
|
+
isPartialSelectCurrentElement = !isSelectedAllElementsInGroup(board, highestGroup);
|
|
96
|
+
}
|
|
97
|
+
isPartialSelectGroupElement = isPartialSelectPreviousGroup || isPartialSelectCurrentElement;
|
|
98
|
+
}
|
|
99
|
+
if (!isContiguous || isPartialSelectGroupElement) {
|
|
100
|
+
cursor = ++cursor;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
(acc[cursor] || (acc[cursor] = [])).push(value);
|
|
104
|
+
return acc;
|
|
105
|
+
}, []);
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Returns next candidate index that's available to be moved to. Currently that
|
|
109
|
+
* is a non-deleted element, and not inside a group (unless we're editing it).
|
|
110
|
+
*/
|
|
111
|
+
const getTargetIndex = (board, boundaryIndex, direction) => {
|
|
112
|
+
if ((boundaryIndex === 0 && direction === 'down') || (boundaryIndex === board.children.length - 1 && direction === 'up')) {
|
|
113
|
+
return -1;
|
|
114
|
+
}
|
|
115
|
+
const indexFilter = (element) => {
|
|
116
|
+
if (element.isDeleted || PlaitGroupElement.isGroup(element)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
};
|
|
121
|
+
const candidateIndex = direction === 'down'
|
|
122
|
+
? findLastIndex(board.children, el => indexFilter(el), Math.max(0, boundaryIndex - 1))
|
|
123
|
+
: findIndex(board.children, el => indexFilter(el), boundaryIndex + 1);
|
|
124
|
+
const nextElement = board.children[candidateIndex];
|
|
125
|
+
if (!nextElement) {
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
const elements = [...board.children];
|
|
129
|
+
const sourceElement = elements[boundaryIndex];
|
|
130
|
+
const editingGroup = getEditingGroup(board, sourceElement);
|
|
131
|
+
const nextElementGroups = (getGroupByElement(board, nextElement, true) || []);
|
|
132
|
+
// candidate element is a sibling in current editing group → return
|
|
133
|
+
if (editingGroup && sourceElement?.groupId !== nextElement?.groupId) {
|
|
134
|
+
// candidate element is outside current editing group → prevent
|
|
135
|
+
if (!nextElementGroups.find(item => item.id === editingGroup.id)) {
|
|
136
|
+
return -1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!nextElement.groupId) {
|
|
140
|
+
return candidateIndex;
|
|
141
|
+
}
|
|
142
|
+
let siblingGroup;
|
|
143
|
+
if (editingGroup) {
|
|
144
|
+
siblingGroup = nextElementGroups[nextElementGroups.indexOf(editingGroup) - 1];
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
siblingGroup = nextElementGroups[nextElementGroups.length - 1];
|
|
148
|
+
}
|
|
149
|
+
if (siblingGroup) {
|
|
150
|
+
let elementsInSiblingGroup = getElementsInGroup(board, siblingGroup, true, false);
|
|
151
|
+
if (elementsInSiblingGroup.length) {
|
|
152
|
+
elementsInSiblingGroup.sort((a, b) => {
|
|
153
|
+
const indexA = board.children.findIndex(child => child.id === a.id);
|
|
154
|
+
const indexB = board.children.findIndex(child => child.id === b.id);
|
|
155
|
+
return indexA - indexB;
|
|
156
|
+
});
|
|
157
|
+
// assumes getElementsInGroup() returned elements are sorted
|
|
158
|
+
// by zIndex (ascending)
|
|
159
|
+
return direction === 'down'
|
|
160
|
+
? elements.indexOf(elementsInSiblingGroup[0])
|
|
161
|
+
: elements.indexOf(elementsInSiblingGroup[elementsInSiblingGroup.length - 1]);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return candidateIndex;
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiei1pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3otaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixpQkFBaUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQWtCLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQXdCLEVBQW9CLEVBQUU7SUFDL0YsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksWUFBWSxHQUFxQixFQUFFLENBQUM7SUFDeEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8s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SixZQUFZLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2YsSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRixJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsNERBQTREO1lBQzVELHdCQUF3QjtZQUN4QixPQUFPLFNBQVMsS0FBSyxNQUFNO2dCQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFBsYWl0R3JvdXBFbGVtZW50LCBQbGFpdEdyb3VwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb3ZlTm9kZU9wdGlvbiwgZ2V0RWxlbWVudHNJbmRpY2VzIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgZ2V0RWRpdGluZ0dyb3VwLCBnZXRFbGVtZW50c0luR3JvdXAsIGdldEdyb3VwQnlFbGVtZW50LCBnZXRIaWdoZXN0R3JvdXAsIGlzU2VsZWN0ZWRBbGxFbGVtZW50c0luR3JvdXAgfSBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IGZpbmRJbmRleCwgZmluZExhc3RJbmRleCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IHNvcnRFbGVtZW50cyB9IGZyb20gJy4vcG9zaXRpb24nO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJy4vc2VsZWN0ZWQtZWxlbWVudCc7XG5cbmV4cG9ydCBjb25zdCBnZXRPbmVNb3ZlT3B0aW9ucyA9IChib2FyZDogUGxhaXRCb2FyZCwgZGlyZWN0aW9uOiAnZG93bicgfCAndXAnKTogTW92ZU5vZGVPcHRpb25bXSA9PiB7XG4gICAgY29uc3QgaW5kaWNlc1RvTW92ZSA9IGdldEVsZW1lbnRzSW5kaWNlcyhib2FyZCwgZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkpO1xuICAgIGxldCBncm91cGVkSW5kaWNlcyA9IHRvQ29udGlndW91c0dyb3Vwcyhib2FyZCwgaW5kaWNlc1RvTW92ZSk7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBncm91cGVkSW5kaWNlcyA9IGdyb3VwZWRJbmRpY2VzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgbGV0IG1vdmVDb250ZW50czogTW92ZU5vZGVPcHRpb25bXSA9IFtdO1xuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goKGluZGljZXMsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGVhZGluZ0luZGV4ID0gaW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgYm91bmRhcnlJbmRleCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gbGVhZGluZ0luZGV4IDogdHJhaWxpbmdJbmRleDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBnZXRUYXJnZXRJbmRleChib2FyZCwgYm91bmRhcnlJbmRleCwgZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSB8fCBib3VuZGFyeUluZGV4ID09PSB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICAgICAgaW5kaWNlcyA9IGluZGljZXMucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIG1vdmVDb250ZW50cy5wdXNoKFxuICAgICAgICAgICAgLi4uaW5kaWNlcy5tYXAocGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogYm9hcmQuY2hpbGRyZW5bcGF0aF0sXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhdGg6IFt0YXJnZXRJbmRleF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtb3ZlQ29udGVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxsTW92ZU9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJyk6IE1vdmVOb2RlT3B0aW9uW10gPT4ge1xuICAgIGNvbnN0IGluZGljZXNUb01vdmUgPSBnZXRFbGVtZW50c0luZGljZXMoYm9hcmQsIGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpKTtcbiAgICBsZXQgZ3JvdXBlZEluZGljZXMgPSB0b0NvbnRpZ3VvdXNHcm91cHMoYm9hcmQsIGluZGljZXNUb01vdmUpO1xuICAgIGxldCBtb3ZlQ29udGVudHM6IE1vdmVOb2RlT3B0aW9uW10gPSBbXTtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgZ3JvdXBlZEluZGljZXMgPSBncm91cGVkSW5kaWNlcy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goaW5kaWNlcyA9PiB7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdJbmRleCA9IGluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGJvdW5kYXJ5SW5kZXggPSBkaXJlY3Rpb24gPT09ICdkb3duJyA/IGxlYWRpbmdJbmRleCA6IHRyYWlsaW5nSW5kZXg7XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnQgPSBib2FyZC5jaGlsZHJlbltib3VuZGFyeUluZGV4XTtcbiAgICAgICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICAgICAgbGV0IHRhcmdldEluZGV4ID0gZGlyZWN0aW9uID09PSAnZG93bicgPyAwIDogYm9hcmQuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNJbkdyb3VwID0gc29ydEVsZW1lbnRzKGJvYXJkLCBnZXRFbGVtZW50c0luR3JvdXAoYm9hcmQsIGVkaXRpbmdHcm91cCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPVxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ2Rvd24nXG4gICAgICAgICAgICAgICAgICAgID8gYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbMF0pXG4gICAgICAgICAgICAgICAgICAgIDogYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbZWxlbWVudHNJbkdyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBpbmRpY2VzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlQ29udGVudHMucHVzaChcbiAgICAgICAgICAgIC4uLmluZGljZXMubWFwKHBhdGggPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGJvYXJkLmNoaWxkcmVuW3BhdGhdLFxuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoOiBbdGFyZ2V0SW5kZXhdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW92ZUNvbnRlbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhblNldFpJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKS5maWx0ZXIoaXRlbSA9PiBib2FyZC5jYW5TZXRaSW5kZXgoaXRlbSkpO1xuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDA7XG59O1xuXG5jb25zdCB0b0NvbnRpZ3VvdXNHcm91cHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGFycmF5OiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjYywgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bdmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bYXJyYXlbaW5kZXggLSAxXV07XG4gICAgICAgICAgICBjb25zdCBpc0NvbnRpZ3VvdXMgPVxuICAgICAgICAgICAgICAgIHZhbHVlIC0gMSA9PT0gYXJyYXlbaW5kZXggLSAxXVxuICAgICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgICAgOiBib2FyZC5jaGlsZHJlbi5ldmVyeSgoaXRlbSwgY2hpbGRJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IGFycmF5W2luZGV4IC0gMV0gJiYgY2hpbGRJbmRleCA8PSB2YWx1ZSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudD8uZ3JvdXBJZCB8fCAoY3VycmVudEVsZW1lbnQ/Lmdyb3VwSWQgJiYgcHJldmlvdXNFbGVtZW50Py5ncm91cElkICE9PSBjdXJyZW50RWxlbWVudD8uZ3JvdXBJZCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXN0R3JvdXAgPSBnZXRIaWdoZXN0R3JvdXAoYm9hcmQsIHByZXZpb3VzRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFNlbGVjdFByZXZpb3VzR3JvdXAgPSAhaXNTZWxlY3RlZEFsbEVsZW1lbnRzSW5Hcm91cChib2FyZCwgaGlnaGVzdEdyb3VwISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RHcm91cCA9IGdldEhpZ2hlc3RHcm91cChib2FyZCwgY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudCA9ICFpc1NlbGVjdGVkQWxsRWxlbWVudHNJbkdyb3VwKGJvYXJkLCBoaWdoZXN0R3JvdXAhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQYXJ0aWFsU2VsZWN0R3JvdXBFbGVtZW50ID0gaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCB8fCBpc1BhcnRpYWxTZWxlY3RDdXJyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb250aWd1b3VzIHx8IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGN1cnNvciA9ICsrY3Vyc29yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChhY2NbY3Vyc29yXSB8fCAoYWNjW2N1cnNvcl0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdIGFzIG51bWJlcltdW10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIG5leHQgY2FuZGlkYXRlIGluZGV4IHRoYXQncyBhdmFpbGFibGUgdG8gYmUgbW92ZWQgdG8uIEN1cnJlbnRseSB0aGF0XG4gKiAgaXMgYSBub24tZGVsZXRlZCBlbGVtZW50LCBhbmQgbm90IGluc2lkZSBhIGdyb3VwICh1bmxlc3Mgd2UncmUgZWRpdGluZyBpdCkuXG4gKi9cbmNvbnN0IGdldFRhcmdldEluZGV4ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBib3VuZGFyeUluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJykgPT4ge1xuICAgIGlmICgoYm91bmRhcnlJbmRleCA9PT0gMCAmJiBkaXJlY3Rpb24gPT09ICdkb3duJykgfHwgKGJvdW5kYXJ5SW5kZXggPT09IGJvYXJkLmNoaWxkcmVuLmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID09PSAndXAnKSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4RmlsdGVyID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5pc0RlbGV0ZWQgfHwgUGxhaXRHcm91cEVsZW1lbnQuaXNHcm91cChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgY29uc3QgY2FuZGlkYXRlSW5kZXggPVxuICAgICAgICBkaXJlY3Rpb24gPT09ICdkb3duJ1xuICAgICAgICAgICAgPyBmaW5kTGFzdEluZGV4KGJvYXJkLmNoaWxkcmVuLCBlbCA9PiBpbmRleEZpbHRlcihlbCksIE1hdGgubWF4KDAsIGJvdW5kYXJ5SW5kZXggLSAxKSlcbiAgICAgICAgICAgIDogZmluZEluZGV4KGJvYXJkLmNoaWxkcmVuLCBlbCA9PiBpbmRleEZpbHRlcihlbCksIGJvdW5kYXJ5SW5kZXggKyAxKTtcblxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bY2FuZGlkYXRlSW5kZXhdO1xuICAgIGlmICghbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmJvYXJkLmNoaWxkcmVuXTtcbiAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gZWxlbWVudHNbYm91bmRhcnlJbmRleF07XG4gICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0RWxlbWVudEdyb3VwcyA9IChnZXRHcm91cEJ5RWxlbWVudChib2FyZCwgbmV4dEVsZW1lbnQsIHRydWUpIHx8IFtdKSBhcyBQbGFpdEdyb3VwW107XG4gICAgLy8gY2FuZGlkYXRlIGVsZW1lbnQgaXMgYSBzaWJsaW5nIGluIGN1cnJlbnQgZWRpdGluZyBncm91cCDihpIgcmV0dXJuXG4gICAgaWYgKGVkaXRpbmdHcm91cCAmJiBzb3VyY2VFbGVtZW50Py5ncm91cElkICE9PSBuZXh0RWxlbWVudD8uZ3JvdXBJZCkge1xuICAgICAgICAvLyBjYW5kaWRhdGUgZWxlbWVudCBpcyBvdXRzaWRlIGN1cnJlbnQgZWRpdGluZyBncm91cCDihpIgcHJldmVudFxuICAgICAgICBpZiAoIShuZXh0RWxlbWVudEdyb3VwcyBhcyBQbGFpdEdyb3VwW10pLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBlZGl0aW5nR3JvdXAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5leHRFbGVtZW50Lmdyb3VwSWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZUluZGV4O1xuICAgIH1cblxuICAgIGxldCBzaWJsaW5nR3JvdXA6IFBsYWl0R3JvdXA7XG4gICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICBzaWJsaW5nR3JvdXAgPSBuZXh0RWxlbWVudEdyb3Vwc1tuZXh0RWxlbWVudEdyb3Vwcy5pbmRleE9mKGVkaXRpbmdHcm91cCkgLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzaWJsaW5nR3JvdXAgPSBuZXh0RWxlbWVudEdyb3Vwc1tuZXh0RWxlbWVudEdyb3Vwcy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgaWYgKHNpYmxpbmdHcm91cCkge1xuICAgICAgICBsZXQgZWxlbWVudHNJblNpYmxpbmdHcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChib2FyZCwgc2libGluZ0dyb3VwLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGlmIChlbGVtZW50c0luU2libGluZ0dyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHNJblNpYmxpbmdHcm91cC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhBID0gYm9hcmQuY2hpbGRyZW4uZmluZEluZGV4KGNoaWxkID0+IGNoaWxkLmlkID09PSBhLmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleEIgPSBib2FyZC5jaGlsZHJlbi5maW5kSW5kZXgoY2hpbGQgPT4gY2hpbGQuaWQgPT09IGIuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGFzc3VtZXMgZ2V0RWxlbWVudHNJbkdyb3VwKCkgcmV0dXJuZWQgZWxlbWVudHMgYXJlIHNvcnRlZFxuICAgICAgICAgICAgLy8gYnkgekluZGV4IChhc2NlbmRpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnZG93bidcbiAgICAgICAgICAgICAgICA/IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudHNJblNpYmxpbmdHcm91cFswXSlcbiAgICAgICAgICAgICAgICA6IGVsZW1lbnRzLmluZGV4T2YoZWxlbWVudHNJblNpYmxpbmdHcm91cFtlbGVtZW50c0luU2libGluZ0dyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVJbmRleDtcbn07XG4iXX0=
|