@plait/core 0.54.0 → 0.55.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.
Files changed (71) hide show
  1. package/board/board.component.d.ts +6 -3
  2. package/constants/index.d.ts +2 -0
  3. package/core/element/context.d.ts +6 -2
  4. package/core/element/plugin-element.d.ts +13 -4
  5. package/core/list-render.d.ts +16 -0
  6. package/esm2022/board/board.component.mjs +24 -21
  7. package/esm2022/constants/index.mjs +3 -1
  8. package/esm2022/core/element/context.mjs +1 -1
  9. package/esm2022/core/element/plugin-element.mjs +79 -12
  10. package/esm2022/core/list-render.mjs +209 -0
  11. package/esm2022/interfaces/board.mjs +3 -3
  12. package/esm2022/interfaces/element.mjs +28 -2
  13. package/esm2022/interfaces/node.mjs +18 -1
  14. package/esm2022/interfaces/path.mjs +56 -57
  15. package/esm2022/plugins/create-board.mjs +10 -10
  16. package/esm2022/plugins/with-hotkey.mjs +32 -3
  17. package/esm2022/plugins/with-moving.mjs +12 -12
  18. package/esm2022/plugins/with-related-fragment.mjs +5 -5
  19. package/esm2022/public-api.mjs +1 -3
  20. package/esm2022/transforms/group.mjs +23 -6
  21. package/esm2022/transforms/index.mjs +6 -3
  22. package/esm2022/transforms/z-index.mjs +20 -0
  23. package/esm2022/utils/angle.mjs +17 -3
  24. package/esm2022/utils/clipboard/clipboard.mjs +5 -5
  25. package/esm2022/utils/clipboard/common.mjs +5 -5
  26. package/esm2022/utils/clipboard/types.mjs +1 -1
  27. package/esm2022/utils/common.mjs +27 -1
  28. package/esm2022/utils/fragment.mjs +20 -1
  29. package/esm2022/utils/group.mjs +27 -1
  30. package/esm2022/utils/helper.mjs +37 -1
  31. package/esm2022/utils/index.mjs +4 -1
  32. package/esm2022/utils/math.mjs +37 -1
  33. package/esm2022/utils/position.mjs +3 -3
  34. package/esm2022/utils/snap/snap-moving.mjs +199 -0
  35. package/esm2022/utils/snap/snap.mjs +208 -0
  36. package/esm2022/utils/to-image.mjs +2 -2
  37. package/esm2022/utils/weak-maps.mjs +3 -1
  38. package/esm2022/utils/z-index.mjs +166 -0
  39. package/fesm2022/plait-core.mjs +1655 -1080
  40. package/fesm2022/plait-core.mjs.map +1 -1
  41. package/interfaces/board.d.ts +5 -5
  42. package/interfaces/element.d.ts +5 -0
  43. package/interfaces/node.d.ts +1 -0
  44. package/package.json +1 -1
  45. package/public-api.d.ts +0 -2
  46. package/styles/styles.scss +9 -0
  47. package/transforms/group.d.ts +4 -0
  48. package/transforms/index.d.ts +3 -2
  49. package/transforms/z-index.d.ts +13 -0
  50. package/utils/angle.d.ts +2 -0
  51. package/utils/clipboard/common.d.ts +1 -1
  52. package/utils/clipboard/types.d.ts +1 -1
  53. package/utils/common.d.ts +8 -0
  54. package/utils/fragment.d.ts +3 -1
  55. package/utils/group.d.ts +3 -1
  56. package/utils/helper.d.ts +4 -1
  57. package/utils/index.d.ts +3 -0
  58. package/utils/math.d.ts +1 -0
  59. package/utils/position.d.ts +1 -1
  60. package/utils/snap/snap-moving.d.ts +5 -0
  61. package/utils/snap/snap.d.ts +31 -0
  62. package/utils/weak-maps.d.ts +2 -0
  63. package/utils/z-index.d.ts +5 -0
  64. package/core/children/children.component.d.ts +0 -17
  65. package/core/children/effect.d.ts +0 -2
  66. package/core/element/element.component.d.ts +0 -30
  67. package/esm2022/core/children/children.component.mjs +0 -60
  68. package/esm2022/core/children/effect.mjs +0 -2
  69. package/esm2022/core/element/element.component.mjs +0 -105
  70. package/esm2022/utils/moving-snap.mjs +0 -372
  71. package/utils/moving-snap.d.ts +0 -41
@@ -39,15 +39,13 @@ export interface PlaitBoard {
39
39
  keyDown: (event: KeyboardEvent) => void;
40
40
  globalKeyDown: (event: KeyboardEvent) => void;
41
41
  keyUp: (event: KeyboardEvent) => void;
42
- setFragment: (data: DataTransfer | null, clipboardContext: WritableClipboardContext | null, rectangle: RectangleClient | null, type: 'copy' | 'cut') => void;
43
- insertFragment: (data: DataTransfer | null, clipboardData: ClipboardData | null, targetPoint: Point) => void;
42
+ buildFragment: (clipboardContext: WritableClipboardContext | null, rectangle: RectangleClient | null, type: 'copy' | 'cut') => WritableClipboardContext | null;
43
+ insertFragment: (clipboardData: ClipboardData | null, targetPoint: Point) => void;
44
44
  deleteFragment: (data: PlaitElement[]) => void;
45
45
  getDeletedFragment: (data: PlaitElement[]) => PlaitElement[];
46
46
  getRelatedFragment: (data: PlaitElement[], originData?: PlaitElement[]) => PlaitElement[];
47
47
  dblClick: (event: MouseEvent) => void;
48
- drawElement: (context: PlaitPluginElementContext) => SVGGElement[] | ComponentType<PlaitPluginElementComponent>;
49
- redrawElement: (context: PlaitPluginElementContext, previousContext?: PlaitPluginElementContext) => SVGGElement[] | void;
50
- destroyElement: (context: PlaitPluginElementContext) => void;
48
+ drawElement: (context: PlaitPluginElementContext) => ComponentType<PlaitPluginElementComponent>;
51
49
  isRectangleHit: (element: PlaitElement, range: Selection) => boolean;
52
50
  isHit: (element: PlaitElement, point: Point) => boolean;
53
51
  isInsidePoint: (element: PlaitElement, point: Point) => boolean;
@@ -61,6 +59,8 @@ export interface PlaitBoard {
61
59
  isAlign: (element: PlaitElement) => boolean;
62
60
  isImageBindingAllowed: (element: PlaitElement) => boolean;
63
61
  canAddToGroup: (element: PlaitElement) => boolean;
62
+ canSetZIndex: (element: PlaitElement) => boolean;
63
+ isExpanded: (element: PlaitElement) => boolean;
64
64
  pointerDown: (pointer: PointerEvent) => void;
65
65
  pointerMove: (pointer: PointerEvent) => void;
66
66
  pointerUp: (pointer: PointerEvent) => void;
@@ -12,6 +12,11 @@ export interface PlaitElement {
12
12
  export declare const PlaitElement: {
13
13
  isRootElement(value: PlaitElement): boolean;
14
14
  getComponent(value: PlaitElement): PlaitPluginElementComponent<PlaitElement, PlaitBoard>;
15
+ getElementG(value: PlaitElement): SVGGElement;
16
+ hasMounted(element: PlaitElement): boolean;
17
+ getContainerG<T extends boolean>(value: PlaitElement, options: {
18
+ suppressThrow: T;
19
+ }): T extends true ? SVGGElement | null : SVGGElement;
15
20
  };
16
21
  export interface ComponentType<T> {
17
22
  new (...args: any[]): T;
@@ -17,4 +17,5 @@ export declare const PlaitNode: {
17
17
  parents(root: PlaitBoard, path: Path, options?: NodeParentsOptions): Generator<PlaitNode, void, undefined>;
18
18
  get<T extends PlaitElement = PlaitElement>(root: PlaitBoard, path: Path): T;
19
19
  last(board: PlaitBoard, path: Path): PlaitElement;
20
+ first(board: PlaitBoard, path: Path): PlaitElement;
20
21
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/core",
3
- "version": "0.54.0",
3
+ "version": "0.55.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.2.4",
6
6
  "@angular/core": "^17.2.4",
package/public-api.d.ts CHANGED
@@ -1,8 +1,6 @@
1
1
  export * from './board/board.component';
2
2
  export * from './constants';
3
3
  export * from './core/element/plugin-element';
4
- export * from './core/element/element.component';
5
- export * from './core/children/children.component';
6
4
  export * from './core/element/context-change';
7
5
  export * from './core/island/island-base.component';
8
6
  export * from './interfaces';
@@ -51,6 +51,15 @@
51
51
  }
52
52
  }
53
53
 
54
+ &.element-rotating {
55
+ .element-active-host {
56
+ g.resize-handle,
57
+ g[class^='line-auto-complete-'] {
58
+ display: none;
59
+ }
60
+ }
61
+ }
62
+
54
63
  &.pointer-selection {
55
64
  cursor: default;
56
65
  }
@@ -1,6 +1,10 @@
1
1
  import { PlaitBoard, PlaitElement } from '../interfaces';
2
2
  export declare const addGroup: (board: PlaitBoard, elements?: PlaitElement[]) => void;
3
3
  export declare const removeGroup: (board: PlaitBoard, elements?: PlaitElement[]) => void;
4
+ export interface GroupTransforms {
5
+ addGroup: (board: PlaitBoard, elements?: PlaitElement[]) => void;
6
+ removeGroup: (board: PlaitBoard, elements?: PlaitElement[]) => void;
7
+ }
4
8
  export declare const GroupTransforms: {
5
9
  addGroup: (board: PlaitBoard, elements?: PlaitElement[]) => void;
6
10
  removeGroup: (board: PlaitBoard, elements?: PlaitElement[]) => void;
@@ -1,8 +1,9 @@
1
1
  import { GeneralTransforms } from './general';
2
+ import { GroupTransforms } from './group';
2
3
  import { NodeTransforms } from './node';
3
4
  import { SelectionTransforms } from './selection';
4
5
  import { ViewportTransforms } from './viewport';
6
+ import { ZIndexTransforms } from './z-index';
5
7
  export { BoardTransforms } from './board';
6
8
  export { CoreTransforms } from './element';
7
- export { GroupTransforms } from './group';
8
- export declare const Transforms: GeneralTransforms & ViewportTransforms & SelectionTransforms & NodeTransforms;
9
+ export declare const Transforms: GeneralTransforms & ViewportTransforms & SelectionTransforms & NodeTransforms & GroupTransforms & ZIndexTransforms;
@@ -0,0 +1,13 @@
1
+ import { PlaitBoard } from '../interfaces';
2
+ export interface ZIndexTransforms {
3
+ moveUp: (board: PlaitBoard) => void;
4
+ moveDown: (board: PlaitBoard) => void;
5
+ moveToTop: (board: PlaitBoard) => void;
6
+ moveToBottom: (board: PlaitBoard) => void;
7
+ }
8
+ export declare const ZIndexTransforms: {
9
+ moveUp: (board: PlaitBoard) => void;
10
+ moveDown: (board: PlaitBoard) => void;
11
+ moveToTop: (board: PlaitBoard) => void;
12
+ moveToBottom: (board: PlaitBoard) => void;
13
+ };
package/utils/angle.d.ts CHANGED
@@ -16,3 +16,5 @@ export declare const isAxisChangedByAngle: (angle: number) => boolean;
16
16
  export declare function degreesToRadians(d: number): number;
17
17
  export declare function radiansToDegrees(r: number): number;
18
18
  export declare function rotateElements(board: PlaitBoard, elements: PlaitElement[], angle: number): void;
19
+ export declare const normalizeAngle: (angle: number) => number;
20
+ export declare const getAngleBetweenPoints: (startPoint: Point, endPoint: Point, centerPoint: Point) => number;
@@ -5,5 +5,5 @@ export declare const stripHtml: (html: string) => string;
5
5
  export declare const getProbablySupportsClipboardWrite: () => boolean;
6
6
  export declare const getProbablySupportsClipboardWriteText: () => boolean;
7
7
  export declare const getProbablySupportsClipboardRead: () => boolean;
8
- export declare const createClipboardContext: (type: WritableClipboardType, data: WritableClipboardData, text: string) => WritableClipboardContext;
8
+ export declare const createClipboardContext: (type: WritableClipboardType, elements: WritableClipboardData, text: string) => WritableClipboardContext;
9
9
  export declare const addClipboardContext: (clipboardContext: WritableClipboardContext, addition: WritableClipboardContext) => WritableClipboardContext;
@@ -7,7 +7,7 @@ export type WritableClipboardData = PlaitElement[] | any[];
7
7
  export interface WritableClipboardContext {
8
8
  text: string;
9
9
  type: WritableClipboardType;
10
- data: WritableClipboardData;
10
+ elements: WritableClipboardData;
11
11
  }
12
12
  export interface ClipboardData {
13
13
  files?: File[];
package/utils/common.d.ts CHANGED
@@ -1,5 +1,13 @@
1
+ import { Path, PlaitElement } from '../interfaces';
1
2
  import { PlaitBoard } from '../interfaces/board';
3
+ export interface MoveNodeOption {
4
+ element: PlaitElement;
5
+ newPath: Path;
6
+ }
2
7
  export declare const throttleRAF: (board: PlaitBoard, key: string, fn: () => void) => void;
3
8
  export declare const debounce: (func: () => void, wait: number, options?: {
4
9
  leading: boolean;
5
10
  }) => () => void;
11
+ export declare const getElementsIndices: (board: PlaitBoard, elements: PlaitElement[]) => number[];
12
+ export declare const getHighestIndexOfElement: (board: PlaitBoard, elements: PlaitElement[]) => number;
13
+ export declare const moveElementsToNewPath: (board: PlaitBoard, moveOptions: MoveNodeOption[]) => void;
@@ -1,2 +1,4 @@
1
- import { PlaitBoard } from "../interfaces";
1
+ import { PlaitBoard, PlaitElement } from '../interfaces';
2
2
  export declare const deleteFragment: (board: PlaitBoard) => void;
3
+ export declare const setFragment: (board: PlaitBoard, type: 'copy' | 'cut', clipboardData: DataTransfer | null) => void;
4
+ export declare const duplicateElements: (board: PlaitBoard, elements?: PlaitElement[]) => void;
package/utils/group.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PlaitBoard, PlaitElement, PlaitGroup, RectangleClient } from '../interfaces';
1
+ import { Path, PlaitBoard, PlaitElement, PlaitGroup, RectangleClient } from '../interfaces';
2
2
  export declare const getElementsInGroup: (board: PlaitBoard, group: PlaitGroup, recursion?: boolean, includeGroup?: boolean) => PlaitElement[];
3
3
  export declare const getAllElementsInGroup: (board: PlaitBoard, group: PlaitGroup, recursion?: boolean, includeGroup?: boolean) => PlaitElement[];
4
4
  export declare const getRectangleByGroup: (board: PlaitBoard, group: PlaitGroup, recursion?: boolean) => RectangleClient;
@@ -20,3 +20,5 @@ export declare const nonGroupInHighestSelectedElements: (elements: PlaitElement[
20
20
  export declare const hasSelectedElementsInSameGroup: (elements: PlaitElement[]) => boolean;
21
21
  export declare const canAddGroup: (board: PlaitBoard, elements?: PlaitElement[]) => boolean;
22
22
  export declare const canRemoveGroup: (board: PlaitBoard, elements?: PlaitElement[]) => boolean;
23
+ export declare const getEditingGroup: (board: PlaitBoard, element: PlaitElement) => PlaitGroup | null;
24
+ export declare const moveElementsToNewPathAfterAddGroup: (board: PlaitBoard, selectedElements: PlaitElement[], newPath: Path) => void;
package/utils/helper.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PlaitElement } from "../interfaces";
1
+ import { PlaitElement } from '../interfaces';
2
2
  export declare function isNullOrUndefined(value: any): boolean;
3
3
  /**
4
4
  * get {x,y} point
@@ -12,3 +12,6 @@ export declare function normalizePoint(point: number[]): {
12
12
  export declare const RgbaToHEX: (Rgb: string, opacity: number) => string;
13
13
  export declare function isContextmenu(event: MouseEvent): boolean;
14
14
  export declare function uniqueById(elements: PlaitElement[]): any[];
15
+ export declare const findLastIndex: <T>(array: readonly T[], cb: (element: T, index: number, array: readonly T[]) => boolean, fromIndex?: number) => number;
16
+ export declare const findIndex: <T>(array: readonly T[], cb: (element: T, index: number, array: readonly T[]) => boolean, fromIndex?: number) => number;
17
+ export declare const isIndicesContinuous: (indexes: number[]) => boolean;
package/utils/index.d.ts CHANGED
@@ -29,3 +29,6 @@ export * from './group';
29
29
  export * from './selection';
30
30
  export * from './angle';
31
31
  export * from './fragment';
32
+ export * from './snap/snap';
33
+ export * from './z-index';
34
+ export * from './position';
package/utils/math.d.ts CHANGED
@@ -35,3 +35,4 @@ export declare function toFixed(v: number): number;
35
35
  * @public
36
36
  */
37
37
  export declare function approximately(a: number, b: number, precision?: number): boolean;
38
+ export declare function getCrossingPointsBetweenEllipseAndSegment(startPoint: Point, endPoint: Point, cx: number, cy: number, rx: number, ry: number, segment_only?: boolean): number[][];
@@ -1,2 +1,2 @@
1
1
  import { PlaitBoard, PlaitElement } from '../interfaces';
2
- export declare const sortElements: (board: PlaitBoard, elements: PlaitElement[]) => PlaitElement[];
2
+ export declare const sortElements: (board: PlaitBoard, elements: PlaitElement[], ascendingOrder?: boolean) => PlaitElement[];
@@ -0,0 +1,5 @@
1
+ import { PlaitBoard } from '../../interfaces/board';
2
+ import { PlaitElement } from '../../interfaces/element';
3
+ import { RectangleClient } from '../../interfaces';
4
+ import { SnapRef } from './snap';
5
+ export declare function getSnapMovingRef(board: PlaitBoard, activeRectangle: RectangleClient, activeElements: PlaitElement[]): SnapRef;
@@ -0,0 +1,31 @@
1
+ import { PlaitBoard, PlaitElement, Point, RectangleClient } from '../../interfaces';
2
+ export interface SnapDelta {
3
+ deltaX: number;
4
+ deltaY: number;
5
+ }
6
+ export interface SnapRef extends SnapDelta {
7
+ snapG: SVGGElement;
8
+ }
9
+ export interface GapSnapRef {
10
+ before: {
11
+ distance: number;
12
+ index: number;
13
+ }[];
14
+ after: {
15
+ distance: number;
16
+ index: number;
17
+ }[];
18
+ }
19
+ type TripleSnapAxis = [number, number, number];
20
+ export declare const SNAP_TOLERANCE = 2;
21
+ export declare function getSnapRectangles(board: PlaitBoard, activeElements: PlaitElement[]): RectangleClient[];
22
+ export declare function getBarPoint(point: Point, isHorizontal: boolean): number[][];
23
+ export declare function getMinPointDelta(pointRectangles: RectangleClient[], axis: number, isHorizontal: boolean): number;
24
+ export declare const getNearestDelta: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => number;
25
+ export declare const getTripleAxis: (rectangle: RectangleClient, isHorizontal: boolean) => TripleSnapAxis;
26
+ export declare function getNearestPointRectangle(snapRectangles: RectangleClient[], activeRectangle: RectangleClient): RectangleClient;
27
+ export declare const isSnapPoint: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => boolean;
28
+ export declare function drawPointSnapLines(board: PlaitBoard, activeRectangle: RectangleClient, snapRectangles: RectangleClient[], drawHorizontal?: boolean, drawVertical?: boolean, snapMiddle?: boolean): SVGGElement;
29
+ export declare function drawDashedLines(board: PlaitBoard, lines: [Point, Point][]): SVGGElement;
30
+ export declare function drawSolidLines(board: PlaitBoard, lines: Point[][]): SVGGElement;
31
+ export {};
@@ -9,6 +9,8 @@ export declare const IS_BOARD_CACHE: WeakMap<Object, boolean>;
9
9
  export declare const FLUSHING: WeakMap<PlaitBoard, boolean>;
10
10
  export declare const NODE_TO_INDEX: WeakMap<PlaitElement, number>;
11
11
  export declare const NODE_TO_PARENT: WeakMap<PlaitElement, Ancestor>;
12
+ export declare const NODE_TO_G: WeakMap<PlaitElement, SVGGElement>;
13
+ export declare const NODE_TO_CONTAINER_G: WeakMap<PlaitElement, SVGGElement>;
12
14
  export declare const IS_TEXT_EDITABLE: WeakMap<PlaitBoard, boolean>;
13
15
  export declare const BOARD_TO_ON_CHANGE: WeakMap<PlaitBoard, () => void>;
14
16
  export declare const BOARD_TO_AFTER_CHANGE: WeakMap<PlaitBoard, () => void>;
@@ -0,0 +1,5 @@
1
+ import { PlaitBoard } from '../interfaces';
2
+ import { MoveNodeOption } from './common';
3
+ export declare const getOneMoveOptions: (board: PlaitBoard, direction: 'down' | 'up') => MoveNodeOption[];
4
+ export declare const getAllMoveOptions: (board: PlaitBoard, direction: 'down' | 'up') => MoveNodeOption[];
5
+ export declare const canSetZIndex: (board: PlaitBoard) => boolean;
@@ -1,17 +0,0 @@
1
- import { OnInit } from '@angular/core';
2
- import { PlaitBoard } from '../../interfaces/board';
3
- import { PlaitElement } from '../../interfaces/element';
4
- import { PlaitEffect } from './effect';
5
- import { Ancestor } from '../../interfaces/node';
6
- import * as i0 from "@angular/core";
7
- export declare class PlaitChildrenElementComponent implements OnInit {
8
- board: PlaitBoard;
9
- parent: Ancestor;
10
- effect?: PlaitEffect;
11
- parentG: SVGGElement;
12
- constructor();
13
- ngOnInit(): void;
14
- trackBy: (index: number, element: PlaitElement) => string;
15
- static ɵfac: i0.ɵɵFactoryDeclaration<PlaitChildrenElementComponent, never>;
16
- static ɵcmp: i0.ɵɵComponentDeclaration<PlaitChildrenElementComponent, "plait-children", never, { "board": { "alias": "board"; "required": false; }; "parent": { "alias": "parent"; "required": false; }; "effect": { "alias": "effect"; "required": false; }; "parentG": { "alias": "parentG"; "required": false; }; }, {}, never, never, true, never>;
17
- }
@@ -1,2 +0,0 @@
1
- export interface PlaitEffect {
2
- }
@@ -1,30 +0,0 @@
1
- import { OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges, ViewContainerRef } from '@angular/core';
2
- import { PlaitBoard } from '../../interfaces/board';
3
- import { PlaitElement } from '../../interfaces/element';
4
- import { PlaitPluginElementContext } from './context';
5
- import { PlaitPluginElementComponent } from './plugin-element';
6
- import { PlaitEffect } from '../children/effect';
7
- import { Ancestor } from '../../interfaces/node';
8
- import * as i0 from "@angular/core";
9
- export declare class PlaitElementComponent implements OnInit, OnChanges, OnDestroy {
10
- renderer2: Renderer2;
11
- viewContainerRef: ViewContainerRef;
12
- initialized: boolean;
13
- instance?: PlaitPluginElementComponent<PlaitElement>;
14
- index: number;
15
- element: PlaitElement;
16
- parent: Ancestor;
17
- board: PlaitBoard;
18
- effect?: PlaitEffect;
19
- parentG: SVGGElement;
20
- constructor(renderer2: Renderer2, viewContainerRef: ViewContainerRef);
21
- ngOnInit(): void;
22
- initialize(): void;
23
- drawElement(): void;
24
- insertG(g: SVGGElement): void;
25
- ngOnChanges(simpleChanges: SimpleChanges): void;
26
- getContext(): PlaitPluginElementContext;
27
- ngOnDestroy(): void;
28
- static ɵfac: i0.ɵɵFactoryDeclaration<PlaitElementComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<PlaitElementComponent, "plait-element", never, { "index": { "alias": "index"; "required": false; }; "element": { "alias": "element"; "required": false; }; "parent": { "alias": "parent"; "required": false; }; "board": { "alias": "board"; "required": false; }; "effect": { "alias": "effect"; "required": false; }; "parentG": { "alias": "parentG"; "required": false; }; }, {}, never, never, true, never>;
30
- }
@@ -1,60 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { PlaitBoard } from '../../interfaces/board';
3
- import { PlaitElementComponent } from '../element/element.component';
4
- import { NgFor } from '@angular/common';
5
- import * as i0 from "@angular/core";
6
- export class PlaitChildrenElementComponent {
7
- constructor() {
8
- this.trackBy = (index, element) => {
9
- return element.id;
10
- };
11
- }
12
- ngOnInit() {
13
- if (!this.parent) {
14
- this.parent = this.board;
15
- }
16
- if (!this.parentG) {
17
- this.parentG = PlaitBoard.getElementHost(this.board);
18
- }
19
- }
20
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitChildrenElementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: PlaitChildrenElementComponent, isStandalone: true, selector: "plait-children", inputs: { board: "board", parent: "parent", effect: "effect", parentG: "parentG" }, ngImport: i0, template: `
22
- <plait-element
23
- *ngFor="let item of parent.children; let index = index; trackBy: trackBy"
24
- [index]="index"
25
- [element]="item"
26
- [parent]="parent"
27
- [board]="board"
28
- [effect]="effect"
29
- [parentG]="parentG"
30
- ></plait-element>
31
- `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: PlaitElementComponent, selector: "plait-element", inputs: ["index", "element", "parent", "board", "effect", "parentG"] }] }); }
32
- }
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitChildrenElementComponent, decorators: [{
34
- type: Component,
35
- args: [{
36
- selector: 'plait-children',
37
- template: `
38
- <plait-element
39
- *ngFor="let item of parent.children; let index = index; trackBy: trackBy"
40
- [index]="index"
41
- [element]="item"
42
- [parent]="parent"
43
- [board]="board"
44
- [effect]="effect"
45
- [parentG]="parentG"
46
- ></plait-element>
47
- `,
48
- standalone: true,
49
- imports: [NgFor, PlaitElementComponent]
50
- }]
51
- }], ctorParameters: () => [], propDecorators: { board: [{
52
- type: Input
53
- }], parent: [{
54
- type: Input
55
- }], effect: [{
56
- type: Input
57
- }], parentG: [{
58
- type: Input
59
- }] } });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbGRyZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvY29yZS9jaGlsZHJlbi9jaGlsZHJlbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSXBELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFrQnhDLE1BQU0sT0FBTyw2QkFBNkI7SUFTdEM7UUFXQSxZQUFPLEdBQUcsQ0FBQyxLQUFhLEVBQUUsT0FBcUIsRUFBRSxFQUFFO1lBQy9DLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUM7SUFiYSxDQUFDO0lBRWhCLFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNMLENBQUM7OEdBbEJRLDZCQUE2QjtrR0FBN0IsNkJBQTZCLDhKQWQ1Qjs7Ozs7Ozs7OztLQVVULDREQUVTLEtBQUssbUhBQUUscUJBQXFCOzsyRkFFN0IsNkJBQTZCO2tCQWhCekMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7S0FVVDtvQkFDRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDO2lCQUMxQzt3REFFWSxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEVmZmVjdCB9IGZyb20gJy4vZWZmZWN0JztcbmltcG9ydCB7IEFuY2VzdG9yIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4uL2VsZW1lbnQvZWxlbWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3BsYWl0LWNoaWxkcmVuJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8cGxhaXQtZWxlbWVudFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFyZW50LmNoaWxkcmVuOyBsZXQgaW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVwiXG4gICAgICAgICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgW2VsZW1lbnRdPVwiaXRlbVwiXG4gICAgICAgICAgICBbcGFyZW50XT1cInBhcmVudFwiXG4gICAgICAgICAgICBbYm9hcmRdPVwiYm9hcmRcIlxuICAgICAgICAgICAgW2VmZmVjdF09XCJlZmZlY3RcIlxuICAgICAgICAgICAgW3BhcmVudEddPVwicGFyZW50R1wiXG4gICAgICAgID48L3BsYWl0LWVsZW1lbnQ+XG4gICAgYCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0ZvciwgUGxhaXRFbGVtZW50Q29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBQbGFpdENoaWxkcmVuRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgYm9hcmQhOiBQbGFpdEJvYXJkO1xuXG4gICAgQElucHV0KCkgcGFyZW50ITogQW5jZXN0b3I7XG5cbiAgICBASW5wdXQoKSBlZmZlY3Q/OiBQbGFpdEVmZmVjdDtcblxuICAgIEBJbnB1dCgpIHBhcmVudEchOiBTVkdHRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudEcpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RyA9IFBsYWl0Qm9hcmQuZ2V0RWxlbWVudEhvc3QodGhpcy5ib2FyZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5ID0gKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pZDtcbiAgICB9O1xufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvY29yZS9jaGlsZHJlbi9lZmZlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUGxhaXRFZmZlY3Qge31cbiJdfQ==
@@ -1,105 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
- import { PlaitBoard } from '../../interfaces/board';
3
- import { PlaitElement } from '../../interfaces/element';
4
- import { PlaitNode } from '../../interfaces/node';
5
- import { NODE_TO_INDEX, NODE_TO_PARENT } from '../../utils/weak-maps';
6
- import { addSelectedElement, isSelectedElement, removeSelectedElement } from '../../utils';
7
- import * as i0 from "@angular/core";
8
- export class PlaitElementComponent {
9
- constructor(renderer2, viewContainerRef) {
10
- this.renderer2 = renderer2;
11
- this.viewContainerRef = viewContainerRef;
12
- this.initialized = false;
13
- }
14
- ngOnInit() {
15
- this.initialize();
16
- this.drawElement();
17
- }
18
- initialize() {
19
- NODE_TO_INDEX.set(this.element, this.index);
20
- NODE_TO_PARENT.set(this.element, this.parent);
21
- this.initialized = true;
22
- }
23
- drawElement() {
24
- const context = this.getContext();
25
- const result = this.board.drawElement(context);
26
- if (Array.isArray(result)) {
27
- }
28
- else {
29
- const componentRef = this.viewContainerRef.createComponent(result);
30
- const instance = componentRef.instance;
31
- instance.context = context;
32
- this.insertG(instance.rootG ? instance.rootG : instance.g);
33
- this.instance = instance;
34
- }
35
- }
36
- insertG(g) {
37
- if (PlaitBoard.isBoard(this.parent)) {
38
- this.parentG.append(g);
39
- }
40
- else {
41
- let siblingG = PlaitElement.getComponent(this.parent).g;
42
- if (this.index > 0) {
43
- const brotherElement = this.parent.children[this.index - 1];
44
- const lastElement = PlaitNode.last(this.board, PlaitBoard.findPath(this.board, brotherElement));
45
- let component = PlaitElement.getComponent(lastElement) || PlaitElement.getComponent(brotherElement);
46
- siblingG = component.g;
47
- }
48
- this.parentG.insertBefore(g, siblingG);
49
- }
50
- }
51
- ngOnChanges(simpleChanges) {
52
- if (this.initialized) {
53
- NODE_TO_INDEX.set(this.element, this.index);
54
- NODE_TO_PARENT.set(this.element, this.parent);
55
- const elementChanged = simpleChanges['element'];
56
- const context = this.getContext();
57
- if (elementChanged && isSelectedElement(this.board, elementChanged.previousValue)) {
58
- context.selected = true;
59
- removeSelectedElement(this.board, elementChanged.previousValue);
60
- addSelectedElement(this.board, this.element);
61
- }
62
- if (this.instance) {
63
- this.instance.context = context;
64
- }
65
- }
66
- }
67
- getContext() {
68
- const isSelected = isSelectedElement(this.board, this.element);
69
- const context = {
70
- element: this.element,
71
- parent: this.parent,
72
- board: this.board,
73
- selected: isSelected,
74
- effect: this.effect
75
- };
76
- return context;
77
- }
78
- ngOnDestroy() {
79
- this.board.destroyElement(this.getContext());
80
- }
81
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitElementComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
82
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: PlaitElementComponent, isStandalone: true, selector: "plait-element", inputs: { index: "index", element: "element", parent: "parent", board: "board", effect: "effect", parentG: "parentG" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
83
- }
84
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitElementComponent, decorators: [{
85
- type: Component,
86
- args: [{
87
- selector: 'plait-element',
88
- template: '',
89
- changeDetection: ChangeDetectionStrategy.OnPush,
90
- standalone: true
91
- }]
92
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ViewContainerRef }], propDecorators: { index: [{
93
- type: Input
94
- }], element: [{
95
- type: Input
96
- }], parent: [{
97
- type: Input
98
- }], board: [{
99
- type: Input
100
- }], effect: [{
101
- type: Input
102
- }], parentG: [{
103
- type: Input
104
- }] } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9jb3JlL2VsZW1lbnQvZWxlbWVudC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQU9SLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJeEQsT0FBTyxFQUFZLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQVEzRixNQUFNLE9BQU8scUJBQXFCO0lBaUI5QixZQUFtQixTQUFvQixFQUFTLGdCQUFrQztRQUEvRCxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWhCbEYsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFnQmlFLENBQUM7SUFFdEYsUUFBUTtRQUNKLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFVBQVU7UUFDTixhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFD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QUM7Z0JBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNwQyxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ04sTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQThCO1lBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUN0QixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDOzhHQXpGUSxxQkFBcUI7a0dBQXJCLHFCQUFxQixzTkFKcEIsRUFBRTs7MkZBSUgscUJBQXFCO2tCQU5qQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxlQUFlO29CQUN6QixRQUFRLEVBQUUsRUFBRTtvQkFDWixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsVUFBVSxFQUFFLElBQUk7aUJBQ25COzZHQU1ZLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IFBsYWl0UGx1Z2luRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLWVsZW1lbnQnO1xuaW1wb3J0IHsgUGxhaXRFZmZlY3QgfSBmcm9tICcuLi9jaGlsZHJlbi9lZmZlY3QnO1xuaW1wb3J0IHsgQW5jZXN0b3IsIFBsYWl0Tm9kZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBOT0RFX1RPX0lOREVYLCBOT0RFX1RPX1BBUkVOVCB9IGZyb20gJy4uLy4uL3V0aWxzL3dlYWstbWFwcyc7XG5pbXBvcnQgeyBhZGRTZWxlY3RlZEVsZW1lbnQsIGlzU2VsZWN0ZWRFbGVtZW50LCByZW1vdmVTZWxlY3RlZEVsZW1lbnQgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGxhaXQtZWxlbWVudCcsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUGxhaXRFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIGluc3RhbmNlPzogUGxhaXRQbHVnaW5FbGVtZW50Q29tcG9uZW50PFBsYWl0RWxlbWVudD47XG5cbiAgICBASW5wdXQoKSBpbmRleCE6IG51bWJlcjtcblxuICAgIEBJbnB1dCgpIGVsZW1lbnQhOiBQbGFpdEVsZW1lbnQ7XG5cbiAgICBASW5wdXQoKSBwYXJlbnQhOiBBbmNlc3RvcjtcblxuICAgIEBJbnB1dCgpIGJvYXJkITogUGxhaXRCb2FyZDtcblxuICAgIEBJbnB1dCgpIGVmZmVjdD86IFBsYWl0RWZmZWN0O1xuXG4gICAgQElucHV0KCkgcGFyZW50RyE6IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlbmRlcmVyMjogUmVuZGVyZXIyLCBwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgdGhpcy5kcmF3RWxlbWVudCgpO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIE5PREVfVE9fSU5ERVguc2V0KHRoaXMuZWxlbWVudCwgdGhpcy5pbmRleCk7XG4gICAgICAgIE5PREVfVE9fUEFSRU5ULnNldCh0aGlzLmVsZW1lbnQsIHRoaXMucGFyZW50KTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZHJhd0VsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ib2FyZC5kcmF3RWxlbWVudChjb250ZXh0KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChyZXN1bHQpO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0RyhpbnN0YW5jZS5yb290RyA/IGluc3RhbmNlLnJvb3RHIDogaW5zdGFuY2UuZyk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnNlcnRHKGc6IFNWR0dFbGVtZW50KSB7XG4gICAgICAgIGlmIChQbGFpdEJvYXJkLmlzQm9hcmQodGhpcy5wYXJlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEcuYXBwZW5kKGcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHNpYmxpbmdHID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudCh0aGlzLnBhcmVudCkuZztcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyb3RoZXJFbGVtZW50ID0gKHRoaXMucGFyZW50LmNoaWxkcmVuIGFzIFBsYWl0RWxlbWVudFtdKVt0aGlzLmluZGV4IC0gMV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBQbGFpdE5vZGUubGFzdCh0aGlzLmJvYXJkLCBQbGFpdEJvYXJkLmZpbmRQYXRoKHRoaXMuYm9hcmQsIGJyb3RoZXJFbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9IFBsYWl0RWxlbWVudC5nZXRDb21wb25lbnQobGFzdEVsZW1lbnQpIHx8IFBsYWl0RWxlbWVudC5nZXRDb21wb25lbnQoYnJvdGhlckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHNpYmxpbmdHID0gY29tcG9uZW50Lmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhcmVudEcuaW5zZXJ0QmVmb3JlKGcsIHNpYmxpbmdHKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKHNpbXBsZUNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIE5PREVfVE9fSU5ERVguc2V0KHRoaXMuZWxlbWVudCwgdGhpcy5pbmRleCk7XG4gICAgICAgICAgICBOT0RFX1RPX1BBUkVOVC5zZXQodGhpcy5lbGVtZW50LCB0aGlzLnBhcmVudCk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50Q2hhbmdlZCA9IHNpbXBsZUNoYW5nZXNbJ2VsZW1lbnQnXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Q2hhbmdlZCAmJiBpc1NlbGVjdGVkRWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50Q2hhbmdlZC5wcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlbW92ZVNlbGVjdGVkRWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50Q2hhbmdlZC5wcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBhZGRTZWxlY3RlZEVsZW1lbnQodGhpcy5ib2FyZCwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENvbnRleHQoKTogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dCB7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBpc1NlbGVjdGVkRWxlbWVudCh0aGlzLmJvYXJkLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0ID0ge1xuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgICAgICAgIGJvYXJkOiB0aGlzLmJvYXJkLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQsXG4gICAgICAgICAgICBlZmZlY3Q6IHRoaXMuZWZmZWN0XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJvYXJkLmRlc3Ryb3lFbGVtZW50KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICB9XG59XG4iXX0=