slate-angular 17.0.0 → 17.1.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/components/children/children-outlet.component.d.ts +9 -0
- package/components/children/children.component.d.ts +1 -6
- package/components/editable/editable.component.d.ts +15 -5
- package/components/leaf/token.d.ts +4 -0
- package/components/leaves/leaves.component.d.ts +1 -14
- package/components/string/default-string.component.d.ts +1 -1
- package/components/string/string.component.d.ts +8 -0
- package/components/text/token.d.ts +5 -0
- package/components/text/void-text.component.d.ts +0 -1
- package/esm2022/components/block-card/block-card.component.mjs +2 -2
- package/esm2022/components/children/children-outlet.component.mjs +22 -0
- package/esm2022/components/children/children.component.mjs +5 -33
- package/esm2022/components/editable/editable.component.mjs +141 -48
- package/esm2022/components/element/default-element.component.mjs +3 -3
- package/esm2022/components/element/element.component.mjs +3 -3
- package/esm2022/components/leaf/token.mjs +3 -0
- package/esm2022/components/leaves/leaves.component.mjs +5 -50
- package/esm2022/components/string/default-string.component.mjs +1 -1
- package/esm2022/components/string/string.component.mjs +16 -6
- package/esm2022/components/text/default-text.component.mjs +3 -3
- package/esm2022/components/text/token.mjs +4 -0
- package/esm2022/components/text/void-text.component.mjs +3 -7
- package/esm2022/module.mjs +7 -22
- package/esm2022/plugins/angular-editor.mjs +65 -20
- package/esm2022/plugins/with-angular.mjs +5 -4
- package/esm2022/public-api.mjs +3 -2
- package/esm2022/utils/constants.mjs +2 -0
- package/esm2022/utils/index.mjs +2 -1
- package/esm2022/utils/throttle.mjs +18 -0
- package/esm2022/view/base.mjs +71 -17
- package/esm2022/view/container.mjs +2 -82
- package/esm2022/view/context-change.mjs +13 -0
- package/esm2022/view/context.mjs +1 -1
- package/esm2022/view/render/leaves-render.mjs +107 -0
- package/esm2022/view/render/list-render.mjs +292 -0
- package/esm2022/view/render/utils.mjs +115 -0
- package/fesm2022/slate-angular.mjs +1159 -786
- package/fesm2022/slate-angular.mjs.map +1 -1
- package/module.d.ts +7 -8
- package/package.json +7 -7
- package/plugins/angular-editor.d.ts +16 -5
- package/public-api.d.ts +2 -1
- package/utils/constants.d.ts +1 -0
- package/utils/index.d.ts +1 -0
- package/utils/throttle.d.ts +2 -0
- package/view/base.d.ts +17 -4
- package/view/container.d.ts +3 -7
- package/view/{before-context-change.d.ts → context-change.d.ts} +4 -0
- package/view/context.d.ts +7 -2
- package/view/render/leaves-render.d.ts +21 -0
- package/view/render/list-render.d.ts +35 -0
- package/view/render/utils.d.ts +11 -0
- package/components/descendant/descendant.component.d.ts +0 -35
- package/components/leaf/leaf.component.d.ts +0 -16
- package/esm2022/components/descendant/descendant.component.mjs +0 -186
- package/esm2022/components/leaf/leaf.component.mjs +0 -38
- package/esm2022/view/before-context-change.mjs +0 -7
package/module.d.ts
CHANGED
|
@@ -7,15 +7,14 @@ import * as i5 from "./components/text/void-text.component";
|
|
|
7
7
|
import * as i6 from "./components/text/default-text.component";
|
|
8
8
|
import * as i7 from "./components/string/string.component";
|
|
9
9
|
import * as i8 from "./components/string/template.component";
|
|
10
|
-
import * as i9 from "./components/
|
|
11
|
-
import * as i10 from "./components/
|
|
12
|
-
import * as i11 from "./components/
|
|
13
|
-
import * as i12 from "./components/leaf/leaf.component";
|
|
14
|
-
import * as i13 from "./components/
|
|
15
|
-
import * as i14 from "./components/
|
|
16
|
-
import * as i15 from "./components/string/default-string.component";
|
|
10
|
+
import * as i9 from "./components/children/children.component";
|
|
11
|
+
import * as i10 from "./components/block-card/block-card.component";
|
|
12
|
+
import * as i11 from "./components/leaves/leaves.component";
|
|
13
|
+
import * as i12 from "./components/leaf/default-leaf.component";
|
|
14
|
+
import * as i13 from "./components/string/default-string.component";
|
|
15
|
+
import * as i14 from "./components/children/children-outlet.component";
|
|
17
16
|
export declare class SlateModule {
|
|
18
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<SlateModule, never>;
|
|
19
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<SlateModule, never, [typeof i1.CommonModule, typeof i2.SlateEditable, typeof i3.SlateDefaultElement, typeof i4.SlateElement, typeof i5.SlateVoidText, typeof i6.SlateDefaultText, typeof i7.SlateString, typeof i8.SlateStringTemplate, typeof i9.
|
|
18
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<SlateModule, never, [typeof i1.CommonModule, typeof i2.SlateEditable, typeof i3.SlateDefaultElement, typeof i4.SlateElement, typeof i5.SlateVoidText, typeof i6.SlateDefaultText, typeof i7.SlateString, typeof i8.SlateStringTemplate, typeof i9.SlateChildren, typeof i10.SlateBlockCard, typeof i11.SlateLeaves, typeof i12.SlateDefaultLeaf, typeof i13.SlateDefaultString, typeof i14.SlateChildrenOutlet], [typeof i2.SlateEditable, typeof i9.SlateChildren, typeof i14.SlateChildrenOutlet, typeof i4.SlateElement, typeof i11.SlateLeaves, typeof i7.SlateString, typeof i13.SlateDefaultString]>;
|
|
20
19
|
static ɵinj: i0.ɵɵInjectorDeclaration<SlateModule>;
|
|
21
20
|
}
|
package/package.json
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slate-angular",
|
|
3
|
-
"version": "17.
|
|
3
|
+
"version": "17.1.0",
|
|
4
4
|
"description": "Angular view layer for Slate",
|
|
5
5
|
"author": "pubuzhixing <pubuzhixing@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/worktile/slate-angular#readme",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"peerDependencies": {
|
|
9
|
-
"slate": ">= 0.
|
|
10
|
-
"slate-history": "^0.
|
|
9
|
+
"slate": ">= 0.101.5",
|
|
10
|
+
"slate-history": "^0.100.0",
|
|
11
11
|
"debug": "^4.1.1",
|
|
12
12
|
"direction": "^2.0.1",
|
|
13
13
|
"is-hotkey": "^0.2.0",
|
|
14
14
|
"scroll-into-view-if-needed": "^2.2.20"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"slate": "^0.
|
|
18
|
-
"slate-history": "^0.
|
|
17
|
+
"slate": "^0.101.5",
|
|
18
|
+
"slate-history": "^0.100.0",
|
|
19
19
|
"direction": "^2.0.1",
|
|
20
20
|
"is-hotkey": "^0.2.0",
|
|
21
|
-
"scroll-into-view-if-needed": "^
|
|
22
|
-
"tslib": "^2.
|
|
21
|
+
"scroll-into-view-if-needed": "^3.1.0",
|
|
22
|
+
"tslib": "^2.6.2"
|
|
23
23
|
},
|
|
24
24
|
"exports": {
|
|
25
25
|
".": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Node, Path, Point, Range, BaseEditor } from 'slate';
|
|
1
|
+
import { Node, Path, Point, Range, Element, BaseEditor } from 'slate';
|
|
2
2
|
import { DOMElement, DOMNode, DOMPoint, DOMRange, DOMSelection, DOMStaticRange } from '../utils/dom';
|
|
3
3
|
import { Injector } from '@angular/core';
|
|
4
4
|
import { NodeEntry } from 'slate';
|
|
@@ -17,6 +17,7 @@ export interface AngularEditor extends BaseEditor {
|
|
|
17
17
|
onClick: (event: MouseEvent) => void;
|
|
18
18
|
injector: Injector;
|
|
19
19
|
isBlockCard: (node: Node) => boolean;
|
|
20
|
+
isExpanded: (node: Element) => boolean;
|
|
20
21
|
onError: (errorData: SlateError) => void;
|
|
21
22
|
hasRange: (editor: AngularEditor, range: Range) => boolean;
|
|
22
23
|
}
|
|
@@ -112,20 +113,30 @@ export declare const AngularEditor: {
|
|
|
112
113
|
/**
|
|
113
114
|
* Find a Slate node from a native DOM `element`.
|
|
114
115
|
*/
|
|
115
|
-
toSlateNode(editor: AngularEditor, domNode: DOMNode
|
|
116
|
+
toSlateNode<T extends boolean>(editor: AngularEditor, domNode: DOMNode, options?: {
|
|
117
|
+
suppressThrow: T;
|
|
118
|
+
}): T extends true ? Node : Node;
|
|
116
119
|
/**
|
|
117
120
|
* Get the target range from a DOM `event`.
|
|
118
121
|
*/
|
|
119
122
|
findEventRange(editor: AngularEditor, event: any): Range;
|
|
120
|
-
isLeafInEditor(editor: AngularEditor, leafNode: DOMElement
|
|
123
|
+
isLeafInEditor(editor: AngularEditor, leafNode: DOMElement, options: {
|
|
124
|
+
suppressThrow: boolean;
|
|
125
|
+
}): boolean;
|
|
121
126
|
/**
|
|
122
127
|
* Find a Slate point from a DOM selection's `domNode` and `domOffset`.
|
|
123
128
|
*/
|
|
124
|
-
toSlatePoint(editor: AngularEditor, domPoint: DOMPoint
|
|
129
|
+
toSlatePoint<T_1 extends boolean>(editor: AngularEditor, domPoint: DOMPoint, options: {
|
|
130
|
+
exactMatch?: boolean;
|
|
131
|
+
suppressThrow: T_1;
|
|
132
|
+
}): T_1 extends true ? import("slate").BasePoint : import("slate").BasePoint;
|
|
125
133
|
/**
|
|
126
134
|
* Find a Slate range from a DOM range or selection.
|
|
127
135
|
*/
|
|
128
|
-
toSlateRange(editor: AngularEditor, domRange: DOMRange | DOMStaticRange | DOMSelection
|
|
136
|
+
toSlateRange<T_2 extends boolean>(editor: AngularEditor, domRange: DOMRange | DOMStaticRange | DOMSelection, options?: {
|
|
137
|
+
exactMatch?: boolean;
|
|
138
|
+
suppressThrow: T_2;
|
|
139
|
+
}): T_2 extends true ? import("slate").BaseRange : import("slate").BaseRange;
|
|
129
140
|
isLeafBlock(editor: AngularEditor, node: Node): boolean;
|
|
130
141
|
isBlockCardLeftCursor(editor: AngularEditor): boolean;
|
|
131
142
|
isBlockCardRightCursor(editor: AngularEditor): boolean;
|
package/public-api.d.ts
CHANGED
|
@@ -5,11 +5,12 @@ export * from './components/element/element.component';
|
|
|
5
5
|
export * from './components/string/string.component';
|
|
6
6
|
export * from './components/string/default-string.component';
|
|
7
7
|
export * from './components/children/children.component';
|
|
8
|
+
export * from './components/children/children-outlet.component';
|
|
8
9
|
export * from './components/leaves/leaves.component';
|
|
9
10
|
export * from './module';
|
|
10
11
|
export * from './types/error';
|
|
11
12
|
export * from './view/base';
|
|
12
13
|
export * from './view/context';
|
|
13
|
-
export * from './view/
|
|
14
|
+
export * from './view/context-change';
|
|
14
15
|
export * from './utils';
|
|
15
16
|
export * from './types';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TRIPLE_CLICK = 3;
|
package/utils/index.d.ts
CHANGED
package/view/base.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit } from '@angular/core';
|
|
1
|
+
import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import { AngularEditor } from '../plugins/angular-editor';
|
|
3
3
|
import { SlateViewContext, SlateElementContext, SlateTextContext, SlateLeafContext } from './context';
|
|
4
4
|
import { Descendant, Element, Range, Text } from 'slate';
|
|
5
5
|
import { SlateChildrenContext } from './context';
|
|
6
|
+
import { ListRender } from './render/list-render';
|
|
7
|
+
import { LeavesRender } from './render/leaves-render';
|
|
8
|
+
import { SlateChildrenOutlet } from '../components/children/children-outlet.component';
|
|
6
9
|
import * as i0 from "@angular/core";
|
|
7
10
|
/**
|
|
8
11
|
* base class for template
|
|
@@ -17,6 +20,7 @@ export interface BaseEmbeddedView<T, K extends AngularEditor = AngularEditor> {
|
|
|
17
20
|
export declare abstract class BaseComponent<T = SlateTextContext | SlateLeafContext | SlateElementContext, K extends AngularEditor = AngularEditor> {
|
|
18
21
|
elementRef: ElementRef;
|
|
19
22
|
cdr: ChangeDetectorRef;
|
|
23
|
+
initialized: boolean;
|
|
20
24
|
protected _context: T;
|
|
21
25
|
set context(value: T);
|
|
22
26
|
get context(): T;
|
|
@@ -32,7 +36,6 @@ export declare abstract class BaseComponent<T = SlateTextContext | SlateLeafCont
|
|
|
32
36
|
* base class for custom leaf component
|
|
33
37
|
*/
|
|
34
38
|
export declare class BaseLeafComponent extends BaseComponent<SlateLeafContext> implements OnInit {
|
|
35
|
-
initialized: boolean;
|
|
36
39
|
placeholderElement: HTMLSpanElement;
|
|
37
40
|
isSlateLeaf: boolean;
|
|
38
41
|
get text(): Text;
|
|
@@ -50,8 +53,9 @@ export declare class BaseLeafComponent extends BaseComponent<SlateLeafContext> i
|
|
|
50
53
|
* base class for custom element component
|
|
51
54
|
*/
|
|
52
55
|
export declare class BaseElementComponent<T extends Element = Element, K extends AngularEditor = AngularEditor> extends BaseComponent<SlateElementContext<T>, K> implements OnInit, OnDestroy {
|
|
53
|
-
|
|
56
|
+
viewContainerRef: ViewContainerRef;
|
|
54
57
|
childrenContext: SlateChildrenContext;
|
|
58
|
+
childrenOutletInstance?: SlateChildrenOutlet;
|
|
55
59
|
get element(): T;
|
|
56
60
|
get selection(): Range;
|
|
57
61
|
get decorations(): Range[];
|
|
@@ -59,10 +63,15 @@ export declare class BaseElementComponent<T extends Element = Element, K extends
|
|
|
59
63
|
get isCollapsed(): boolean;
|
|
60
64
|
get isCollapsedAndNonReadonly(): boolean;
|
|
61
65
|
get readonly(): boolean;
|
|
66
|
+
getOutletParent: () => any;
|
|
67
|
+
getOutletElement: () => HTMLElement;
|
|
68
|
+
listRender: ListRender;
|
|
62
69
|
ngOnInit(): void;
|
|
70
|
+
afterViewInit(): void;
|
|
63
71
|
updateWeakMap(): void;
|
|
64
72
|
ngOnDestroy(): void;
|
|
65
73
|
onContextChange(): void;
|
|
74
|
+
updateChildrenView(): void;
|
|
66
75
|
getChildrenContext(): SlateChildrenContext;
|
|
67
76
|
static ɵfac: i0.ɵɵFactoryDeclaration<BaseElementComponent<any, any>, never>;
|
|
68
77
|
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseElementComponent<any, any>, never, never, {}, {}, never, never, false, never>;
|
|
@@ -71,8 +80,12 @@ export declare class BaseElementComponent<T extends Element = Element, K extends
|
|
|
71
80
|
* base class for custom text component
|
|
72
81
|
*/
|
|
73
82
|
export declare class BaseTextComponent<T extends Text = Text> extends BaseComponent<SlateTextContext<T>> implements OnInit, OnDestroy {
|
|
74
|
-
|
|
83
|
+
viewContainerRef: ViewContainerRef;
|
|
75
84
|
get text(): T;
|
|
85
|
+
leavesRender: LeavesRender;
|
|
86
|
+
childrenOutletInstance?: SlateChildrenOutlet;
|
|
87
|
+
getOutletParent: () => any;
|
|
88
|
+
getOutletElement: () => HTMLElement;
|
|
76
89
|
ngOnInit(): void;
|
|
77
90
|
updateWeakMap(): void;
|
|
78
91
|
ngOnDestroy(): void;
|
package/view/container.d.ts
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ElementRef, IterableDiffers } from '@angular/core';
|
|
2
2
|
import { SlateViewContext } from './context';
|
|
3
3
|
import { ViewContainerItem } from './container-item';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
/**
|
|
6
|
+
* @deprecated
|
|
6
7
|
* the special container for angular template
|
|
7
8
|
* Add the rootNodes of each child component to the parentElement
|
|
8
9
|
* Remove useless DOM elements, eg: comment...
|
|
9
10
|
*/
|
|
10
|
-
export declare abstract class ViewContainer<T extends ViewContainerItem>
|
|
11
|
+
export declare abstract class ViewContainer<T extends ViewContainerItem> {
|
|
11
12
|
protected elementRef: ElementRef<any>;
|
|
12
13
|
protected differs: IterableDiffers;
|
|
13
|
-
abstract childrenComponent: QueryList<T>;
|
|
14
14
|
viewContext: SlateViewContext;
|
|
15
15
|
constructor(elementRef: ElementRef<any>, differs: IterableDiffers);
|
|
16
|
-
ngAfterViewInit(): void;
|
|
17
|
-
getPreviousRootNode(currentIndex: any): any;
|
|
18
|
-
createFragment(): DocumentFragment;
|
|
19
|
-
handleContainerItemChange(record: IterableChangeRecord<T>, parentElement: HTMLElement): void;
|
|
20
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<ViewContainer<any>, never>;
|
|
21
17
|
static ɵdir: i0.ɵɵDirectiveDeclaration<ViewContainer<any>, never, never, { "viewContext": { "alias": "viewContext"; "required": false; }; }, {}, never, never, false, never>;
|
|
22
18
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export interface BeforeContextChange<T> {
|
|
2
2
|
beforeContextChange: (value: T) => void;
|
|
3
3
|
}
|
|
4
|
+
export interface AfterContextChange {
|
|
5
|
+
afterContextChange: () => void;
|
|
6
|
+
}
|
|
4
7
|
export declare function hasBeforeContextChange<T>(value: any): value is BeforeContextChange<T>;
|
|
8
|
+
export declare function hasAfterContextChange<T>(value: any): value is AfterContextChange;
|
package/view/context.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { NodeEntry, Range, Element, Ancestor, Text } from 'slate';
|
|
2
2
|
import { SlateStringTemplate } from '../components/string/template.component';
|
|
3
3
|
import { AngularEditor } from '../plugins/angular-editor';
|
|
4
|
-
import { ViewType } from '../types/view';
|
|
4
|
+
import { ComponentType, ViewType } from '../types/view';
|
|
5
|
+
import { BaseElementComponent, BaseLeafComponent, BaseTextComponent } from './base';
|
|
5
6
|
export interface SlateViewContext<T extends AngularEditor = AngularEditor> {
|
|
6
7
|
editor: T;
|
|
7
8
|
templateComponent: SlateStringTemplate;
|
|
9
|
+
defaultElement: ComponentType<BaseElementComponent>;
|
|
10
|
+
defaultText: ComponentType<BaseTextComponent>;
|
|
11
|
+
defaultVoidText: ComponentType<BaseTextComponent>;
|
|
12
|
+
defaultLeaf: ComponentType<BaseLeafComponent>;
|
|
8
13
|
trackBy: (element: Element) => any;
|
|
9
14
|
renderElement?: (element: Element) => ViewType;
|
|
10
15
|
renderLeaf?: (text: Text) => ViewType;
|
|
@@ -23,6 +28,7 @@ export interface SlateElementContext<T extends Element = Element> {
|
|
|
23
28
|
selection: Range | null;
|
|
24
29
|
decorations: Range[];
|
|
25
30
|
attributes: SlateElementAttributes;
|
|
31
|
+
contentEditable?: boolean;
|
|
26
32
|
decorate: (entry: NodeEntry) => Range[];
|
|
27
33
|
readonly: boolean;
|
|
28
34
|
}
|
|
@@ -43,7 +49,6 @@ export interface SlateElementAttributes {
|
|
|
43
49
|
'data-slate-node': 'element';
|
|
44
50
|
'data-slate-void'?: boolean;
|
|
45
51
|
'data-slate-inline'?: boolean;
|
|
46
|
-
contenteditable?: boolean;
|
|
47
52
|
'data-slate-key'?: string;
|
|
48
53
|
dir?: 'rtl';
|
|
49
54
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { ViewType } from '../../types/view';
|
|
3
|
+
import { SlateLeafContext, SlateTextContext, SlateViewContext } from '../context';
|
|
4
|
+
export declare class LeavesRender {
|
|
5
|
+
private viewContext;
|
|
6
|
+
private viewContainerRef;
|
|
7
|
+
private getOutletParent;
|
|
8
|
+
private getOutletElement;
|
|
9
|
+
private leaves;
|
|
10
|
+
private views;
|
|
11
|
+
private contexts;
|
|
12
|
+
private viewTypes;
|
|
13
|
+
private differ;
|
|
14
|
+
constructor(viewContext: SlateViewContext, viewContainerRef: ViewContainerRef, getOutletParent: () => HTMLElement, getOutletElement: () => HTMLElement);
|
|
15
|
+
initialize(context: SlateTextContext): void;
|
|
16
|
+
update(context: SlateTextContext): void;
|
|
17
|
+
private getLeaves;
|
|
18
|
+
}
|
|
19
|
+
export declare function getContext(index: number, leafContexts: SlateLeafContext[]): SlateLeafContext;
|
|
20
|
+
export declare function getViewType(leafContext: SlateLeafContext, viewContext: SlateViewContext): ViewType;
|
|
21
|
+
export declare function trackBy(viewContext: SlateViewContext): (index: any, node: any) => any;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Ancestor, Descendant, Range, Path } from 'slate';
|
|
2
|
+
import { ComponentRef, EmbeddedViewRef, ViewContainerRef } from '@angular/core';
|
|
3
|
+
import { ViewType } from '../../types/view';
|
|
4
|
+
import { SlateChildrenContext, SlateElementContext, SlateTextContext, SlateViewContext } from '../context';
|
|
5
|
+
import { SlateBlockCard } from '../../components/block-card/block-card.component';
|
|
6
|
+
export declare class ListRender {
|
|
7
|
+
private viewContext;
|
|
8
|
+
private viewContainerRef;
|
|
9
|
+
private getOutletParent;
|
|
10
|
+
private getOutletElement;
|
|
11
|
+
private children;
|
|
12
|
+
private views;
|
|
13
|
+
private addedViews;
|
|
14
|
+
private blockCards;
|
|
15
|
+
private contexts;
|
|
16
|
+
private viewTypes;
|
|
17
|
+
private differ;
|
|
18
|
+
initialized: boolean;
|
|
19
|
+
constructor(viewContext: SlateViewContext, viewContainerRef: ViewContainerRef, getOutletParent: () => HTMLElement, getOutletElement: () => HTMLElement | null);
|
|
20
|
+
initialize(children: Descendant[], parent: Ancestor, childrenContext: SlateChildrenContext): void;
|
|
21
|
+
update(children: Descendant[], parent: Ancestor, childrenContext: SlateChildrenContext): void;
|
|
22
|
+
afterViewInit(): void;
|
|
23
|
+
destroy(): void;
|
|
24
|
+
}
|
|
25
|
+
export declare function getContext(index: number, item: Descendant, parentPath: Path, childrenContext: SlateChildrenContext, viewContext: SlateViewContext): SlateElementContext | SlateTextContext;
|
|
26
|
+
export declare function getCommonContext(index: number, item: Descendant, parentPath: Path, viewContext: SlateViewContext, childrenContext: SlateChildrenContext): {
|
|
27
|
+
selection: Range;
|
|
28
|
+
decorations: Range[];
|
|
29
|
+
};
|
|
30
|
+
export declare function getViewType(item: Descendant, parent: Ancestor, viewContext: SlateViewContext): ViewType;
|
|
31
|
+
export declare function createBlockCard(item: Descendant, view: EmbeddedViewRef<any> | ComponentRef<any>, viewContainerRef: ViewContainerRef, viewContext: SlateViewContext): ComponentRef<SlateBlockCard>;
|
|
32
|
+
export declare function trackBy(viewContext: SlateViewContext): (index: any, node: any) => any;
|
|
33
|
+
export declare function memoizedContext(viewContext: SlateViewContext, descendant: Descendant, prev: SlateElementContext | SlateTextContext, next: SlateElementContext | SlateTextContext): boolean;
|
|
34
|
+
export declare function memoizedElementContext(viewContext: SlateViewContext, prev: SlateElementContext, next: SlateElementContext): boolean;
|
|
35
|
+
export declare function memoizedTextContext(prev: SlateTextContext, next: SlateTextContext): boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Descendant } from 'slate';
|
|
2
|
+
import { ComponentRef, EmbeddedViewRef, ViewContainerRef } from '@angular/core';
|
|
3
|
+
import { ViewType } from '../../types/view';
|
|
4
|
+
import { SlateElementContext, SlateLeafContext, SlateTextContext, SlateViewContext } from '../context';
|
|
5
|
+
import { SlateBlockCard } from '../../components/block-card/block-card.component';
|
|
6
|
+
export declare function createEmbeddedViewOrComponent(viewType: ViewType, context: any, viewContext: SlateViewContext, viewContainerRef: ViewContainerRef): ComponentRef<any> | EmbeddedViewRef<any>;
|
|
7
|
+
export declare function executeAfterViewInit(view: EmbeddedViewRef<any> | ComponentRef<any>): void;
|
|
8
|
+
export declare function updateContext(view: EmbeddedViewRef<any> | ComponentRef<any>, newContext: SlateElementContext | SlateTextContext | SlateLeafContext, viewContext: SlateViewContext): void;
|
|
9
|
+
export declare function mount(views: (EmbeddedViewRef<any> | ComponentRef<any>)[], blockCards: (ComponentRef<SlateBlockCard> | null)[] | null, outletParent: HTMLElement, outletElement: HTMLElement | null): void;
|
|
10
|
+
export declare function getRootNodes(ref: EmbeddedViewRef<any> | ComponentRef<any>, blockCard?: ComponentRef<SlateBlockCard>): HTMLElement[];
|
|
11
|
+
export declare function mountOnItemChange(index: number, item: Descendant, views: (EmbeddedViewRef<any> | ComponentRef<any>)[], blockCards: (ComponentRef<SlateBlockCard> | null)[] | null, outletParent: HTMLElement, firstRootNode: HTMLElement | null, viewContext: SlateViewContext): void;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { OnChanges, OnInit, ViewContainerRef } from '@angular/core';
|
|
2
|
-
import { ViewContainerItem } from '../../view/container-item';
|
|
3
|
-
import { Descendant, Range } from 'slate';
|
|
4
|
-
import { SlateChildrenContext, SlateElementContext, SlateTextContext, SlateViewContext } from '../../view/context';
|
|
5
|
-
import { BaseElementComponent, BaseTextComponent } from '../../view/base';
|
|
6
|
-
import { ComponentType, ViewType } from '../../types/view';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export declare class SlateDescendant extends ViewContainerItem<SlateElementContext | SlateTextContext, BaseElementComponent | BaseTextComponent> implements OnInit, OnChanges {
|
|
9
|
-
protected viewContainerRef: ViewContainerRef;
|
|
10
|
-
defaultElementComponentType: ComponentType<BaseElementComponent>;
|
|
11
|
-
descendant: Descendant;
|
|
12
|
-
context: SlateChildrenContext;
|
|
13
|
-
viewContext: SlateViewContext;
|
|
14
|
-
index: number;
|
|
15
|
-
get rootNodes(): HTMLElement[];
|
|
16
|
-
get isBlockCard(): boolean;
|
|
17
|
-
constructor(viewContainerRef: ViewContainerRef, defaultElementComponentType: ComponentType<BaseElementComponent>);
|
|
18
|
-
ngOnInit(): void;
|
|
19
|
-
destroyView(): void;
|
|
20
|
-
ngOnChanges(): void;
|
|
21
|
-
destroyBlockCard(): void;
|
|
22
|
-
createBlockCard(): void;
|
|
23
|
-
updateBlockCard(): void;
|
|
24
|
-
getCommonContext(): {
|
|
25
|
-
selection: Range;
|
|
26
|
-
decorations: Range[];
|
|
27
|
-
};
|
|
28
|
-
getContext(): SlateElementContext | SlateTextContext;
|
|
29
|
-
getViewType(): ViewType;
|
|
30
|
-
memoizedElementContext(prev: SlateElementContext, next: SlateElementContext): boolean;
|
|
31
|
-
memoizedTextContext(prev: SlateTextContext, next: SlateTextContext): boolean;
|
|
32
|
-
memoizedContext(prev: SlateElementContext | SlateTextContext, next: SlateElementContext | SlateTextContext): boolean;
|
|
33
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SlateDescendant, never>;
|
|
34
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SlateDescendant, "slate-descendant", never, { "descendant": { "alias": "descendant"; "required": false; }; "context": { "alias": "context"; "required": false; }; "viewContext": { "alias": "viewContext"; "required": false; }; "index": { "alias": "index"; "required": false; }; }, {}, never, never, true, never>;
|
|
35
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
|
2
|
-
import { ViewContainerItem } from '../../view/container-item';
|
|
3
|
-
import { SlateLeafContext } from '../../view/context';
|
|
4
|
-
import { BaseLeafComponent } from '../../view/base';
|
|
5
|
-
import { ViewType } from '../../types/view';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export declare class SlateLeaf extends ViewContainerItem<SlateLeafContext, BaseLeafComponent> implements OnInit, OnChanges {
|
|
8
|
-
context: SlateLeafContext;
|
|
9
|
-
ngOnInit(): void;
|
|
10
|
-
getContext(): SlateLeafContext;
|
|
11
|
-
getViewType(): ViewType;
|
|
12
|
-
memoizedContext(prev: SlateLeafContext, next: SlateLeafContext): boolean;
|
|
13
|
-
ngOnChanges(simpleChanges: SimpleChanges): void;
|
|
14
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SlateLeaf, never>;
|
|
15
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SlateLeaf, "slate-leaf", never, { "context": { "alias": "context"; "required": false; }; }, {}, never, never, true, never>;
|
|
16
|
-
}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
|
|
2
|
-
import { SlateBlockCard } from '../block-card/block-card.component';
|
|
3
|
-
import { ViewContainerItem } from '../../view/container-item';
|
|
4
|
-
import { Editor, Range, Element } from 'slate';
|
|
5
|
-
import { AngularEditor } from '../../plugins/angular-editor';
|
|
6
|
-
import { NODE_TO_INDEX, NODE_TO_PARENT } from '../../utils/weak-maps';
|
|
7
|
-
import { SlateDefaultText } from '../text/default-text.component';
|
|
8
|
-
import { SlateVoidText } from '../text/void-text.component';
|
|
9
|
-
import { isDecoratorRangeListEqual } from '../../utils';
|
|
10
|
-
import { SlateErrorCode } from '../../types';
|
|
11
|
-
import { SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN } from '../element/default-element.component.token';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
export class SlateDescendant extends ViewContainerItem {
|
|
14
|
-
get rootNodes() {
|
|
15
|
-
if (this.blockCardComponentRef) {
|
|
16
|
-
return [this.blockCardComponentRef.instance.nativeElement];
|
|
17
|
-
}
|
|
18
|
-
return super.getRootNodes();
|
|
19
|
-
}
|
|
20
|
-
get isBlockCard() {
|
|
21
|
-
return this.viewContext.editor.isBlockCard(this.descendant);
|
|
22
|
-
}
|
|
23
|
-
constructor(viewContainerRef, defaultElementComponentType) {
|
|
24
|
-
super(viewContainerRef);
|
|
25
|
-
this.viewContainerRef = viewContainerRef;
|
|
26
|
-
this.defaultElementComponentType = defaultElementComponentType;
|
|
27
|
-
}
|
|
28
|
-
ngOnInit() {
|
|
29
|
-
NODE_TO_INDEX.set(this.descendant, this.index);
|
|
30
|
-
NODE_TO_PARENT.set(this.descendant, this.context.parent);
|
|
31
|
-
this.createView();
|
|
32
|
-
if (this.isBlockCard) {
|
|
33
|
-
this.createBlockCard();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
destroyView() {
|
|
37
|
-
super.destroyView();
|
|
38
|
-
this.destroyBlockCard();
|
|
39
|
-
}
|
|
40
|
-
ngOnChanges() {
|
|
41
|
-
if (!this.initialized) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
NODE_TO_INDEX.set(this.descendant, this.index);
|
|
45
|
-
NODE_TO_PARENT.set(this.descendant, this.context.parent);
|
|
46
|
-
this.updateView();
|
|
47
|
-
if (this.isBlockCard) {
|
|
48
|
-
this.updateBlockCard();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
destroyBlockCard() {
|
|
52
|
-
if (this.blockCardComponentRef) {
|
|
53
|
-
this.blockCardComponentRef.destroy();
|
|
54
|
-
this.blockCardComponentRef = null;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
createBlockCard() {
|
|
58
|
-
const rootNodes = this.rootNodes;
|
|
59
|
-
this.blockCardComponentRef = this.viewContainerRef.createComponent(SlateBlockCard);
|
|
60
|
-
this.blockCardComponentRef.instance.initializeCenter(rootNodes);
|
|
61
|
-
}
|
|
62
|
-
updateBlockCard() {
|
|
63
|
-
if (this.blockCardComponentRef) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const rootNodes = this.rootNodes;
|
|
67
|
-
this.createBlockCard();
|
|
68
|
-
const firstRootNode = rootNodes[0];
|
|
69
|
-
firstRootNode.replaceWith(this.blockCardComponentRef.instance.nativeElement);
|
|
70
|
-
}
|
|
71
|
-
getCommonContext() {
|
|
72
|
-
const path = AngularEditor.findPath(this.viewContext.editor, this.context.parent);
|
|
73
|
-
const p = path.concat(this.index);
|
|
74
|
-
try {
|
|
75
|
-
const range = Editor.range(this.viewContext.editor, p);
|
|
76
|
-
const sel = this.context.selection && Range.intersection(range, this.context.selection);
|
|
77
|
-
const ds = this.context.decorate([this.descendant, p]);
|
|
78
|
-
for (const dec of this.context.decorations) {
|
|
79
|
-
const d = Range.intersection(dec, range);
|
|
80
|
-
if (d) {
|
|
81
|
-
ds.push(d);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return { selection: sel, decorations: ds };
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
this.viewContext.editor.onError({
|
|
88
|
-
code: SlateErrorCode.GetStartPointError,
|
|
89
|
-
nativeError: error
|
|
90
|
-
});
|
|
91
|
-
return { selection: null, decorations: [] };
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
getContext() {
|
|
95
|
-
if (Element.isElement(this.descendant)) {
|
|
96
|
-
const computedContext = this.getCommonContext();
|
|
97
|
-
const key = AngularEditor.findKey(this.viewContext.editor, this.descendant);
|
|
98
|
-
const isInline = this.viewContext.editor.isInline(this.descendant);
|
|
99
|
-
const isVoid = this.viewContext.editor.isVoid(this.descendant);
|
|
100
|
-
const elementContext = {
|
|
101
|
-
element: this.descendant,
|
|
102
|
-
...computedContext,
|
|
103
|
-
attributes: {
|
|
104
|
-
'data-slate-node': 'element',
|
|
105
|
-
'data-slate-key': key.id
|
|
106
|
-
},
|
|
107
|
-
decorate: this.context.decorate,
|
|
108
|
-
readonly: this.context.readonly
|
|
109
|
-
};
|
|
110
|
-
if (isInline) {
|
|
111
|
-
elementContext.attributes['data-slate-inline'] = true;
|
|
112
|
-
}
|
|
113
|
-
if (isVoid) {
|
|
114
|
-
elementContext.attributes['data-slate-void'] = true;
|
|
115
|
-
elementContext.attributes.contenteditable = false;
|
|
116
|
-
}
|
|
117
|
-
return elementContext;
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
const computedContext = this.getCommonContext();
|
|
121
|
-
const isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
|
|
122
|
-
const textContext = {
|
|
123
|
-
decorations: computedContext.decorations,
|
|
124
|
-
isLast: isLeafBlock && this.index === this.context.parent.children.length - 1,
|
|
125
|
-
parent: this.context.parent,
|
|
126
|
-
text: this.descendant
|
|
127
|
-
};
|
|
128
|
-
return textContext;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
getViewType() {
|
|
132
|
-
if (Element.isElement(this.descendant)) {
|
|
133
|
-
return (this.viewContext.renderElement && this.viewContext.renderElement(this.descendant)) || this.defaultElementComponentType;
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
const isVoid = this.viewContext.editor.isVoid(this.context.parent);
|
|
137
|
-
return isVoid
|
|
138
|
-
? SlateVoidText
|
|
139
|
-
: (this.viewContext.renderText && this.viewContext.renderText(this.descendant)) || SlateDefaultText;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
memoizedElementContext(prev, next) {
|
|
143
|
-
return (prev.element === next.element &&
|
|
144
|
-
(!this.viewContext.isStrictDecorate || prev.decorate === next.decorate) &&
|
|
145
|
-
prev.readonly === next.readonly &&
|
|
146
|
-
isDecoratorRangeListEqual(prev.decorations, next.decorations) &&
|
|
147
|
-
(prev.selection === next.selection || (!!prev.selection && !!next.selection && Range.equals(prev.selection, next.selection))));
|
|
148
|
-
}
|
|
149
|
-
memoizedTextContext(prev, next) {
|
|
150
|
-
return (next.parent === prev.parent &&
|
|
151
|
-
next.isLast === prev.isLast &&
|
|
152
|
-
next.text === prev.text &&
|
|
153
|
-
isDecoratorRangeListEqual(next.decorations, prev.decorations));
|
|
154
|
-
}
|
|
155
|
-
memoizedContext(prev, next) {
|
|
156
|
-
if (Element.isElement(this.descendant)) {
|
|
157
|
-
return this.memoizedElementContext(prev, next);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
return this.memoizedTextContext(prev, next);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: SlateDescendant, deps: [{ token: i0.ViewContainerRef }, { token: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
164
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: SlateDescendant, isStandalone: true, selector: "slate-descendant", inputs: { descendant: "descendant", context: "context", viewContext: "viewContext", index: "index" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
165
|
-
}
|
|
166
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: SlateDescendant, decorators: [{
|
|
167
|
-
type: Component,
|
|
168
|
-
args: [{
|
|
169
|
-
selector: 'slate-descendant',
|
|
170
|
-
template: '',
|
|
171
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
172
|
-
standalone: true
|
|
173
|
-
}]
|
|
174
|
-
}], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{
|
|
175
|
-
type: Inject,
|
|
176
|
-
args: [SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN]
|
|
177
|
-
}] }], propDecorators: { descendant: [{
|
|
178
|
-
type: Input
|
|
179
|
-
}], context: [{
|
|
180
|
-
type: Input
|
|
181
|
-
}], viewContext: [{
|
|
182
|
-
type: Input
|
|
183
|
-
}], index: [{
|
|
184
|
-
type: Input
|
|
185
|
-
}] } });
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY2VuZGFudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvY29tcG9uZW50cy9kZXNjZW5kYW50L2Rlc2NlbmRhbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUUzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBUW5HLE1BQU0sT0FBTyxlQUNULFNBQVEsaUJBQW1HO0lBVzNHLElBQUksU0FBUztRQUNULElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFD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ZUFBZSxrREF5QloscUNBQXFDO2tHQXpCeEMsZUFBZSw4TkFKZCxFQUFFOzsyRkFJSCxlQUFlO2tCQU4zQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxVQUFVLEVBQUUsSUFBSTtpQkFDbkI7OzBCQTBCUSxNQUFNOzJCQUFDLHFDQUFxQzt5Q0FyQnhDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNsYXRlQmxvY2tDYXJkIH0gZnJvbSAnLi4vYmxvY2stY2FyZC9ibG9jay1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3Q29udGFpbmVySXRlbSB9IGZyb20gJy4uLy4uL3ZpZXcvY29udGFpbmVyLWl0ZW0nO1xuaW1wb3J0IHsgRGVzY2VuZGFudCwgRWRpdG9yLCBSYW5nZSwgRWxlbWVudCB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IFNsYXRlQ2hpbGRyZW5Db250ZXh0LCBTbGF0ZUVsZW1lbnRDb250ZXh0LCBTbGF0ZVRleHRDb250ZXh0LCBTbGF0ZVZpZXdDb250ZXh0IH0gZnJvbSAnLi4vLi4vdmlldy9jb250ZXh0JztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICcuLi8uLi9wbHVnaW5zL2FuZ3VsYXItZWRpdG9yJztcbmltcG9ydCB7IE5PREVfVE9fSU5ERVgsIE5PREVfVE9fUEFSRU5UIH0gZnJvbSAnLi4vLi4vdXRpbHMvd2Vhay1tYXBzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50Q29tcG9uZW50LCBCYXNlVGV4dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ZpZXcvYmFzZSc7XG5pbXBvcnQgeyBTbGF0ZURlZmF1bHRUZXh0IH0gZnJvbSAnLi4vdGV4dC9kZWZhdWx0LXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFNsYXRlVm9pZFRleHQgfSBmcm9tICcuLi90ZXh0L3ZvaWQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNEZWNvcmF0b3JSYW5nZUxpc3RFcXVhbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIFZpZXdUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQgeyBTbGF0ZUVycm9yQ29kZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFNMQVRFX0RFRkFVTFRfRUxFTUVOVF9DT01QT05FTlRfVE9LRU4gfSBmcm9tICcuLi9lbGVtZW50L2RlZmF1bHQtZWxlbWVudC5jb21wb25lbnQudG9rZW4nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NsYXRlLWRlc2NlbmRhbnQnLFxuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFNsYXRlRGVzY2VuZGFudFxuICAgIGV4dGVuZHMgVmlld0NvbnRhaW5lckl0ZW08U2xhdGVFbGVtZW50Q29udGV4dCB8IFNsYXRlVGV4dENvbnRleHQsIEJhc2VFbGVtZW50Q29tcG9uZW50IHwgQmFzZVRleHRDb21wb25lbnQ+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAgIEBJbnB1dCgpIGRlc2NlbmRhbnQ6IERlc2NlbmRhbnQ7XG5cbiAgICBASW5wdXQoKSBjb250ZXh0OiBTbGF0ZUNoaWxkcmVuQ29udGV4dDtcblxuICAgIEBJbnB1dCgpIHZpZXdDb250ZXh0OiBTbGF0ZVZpZXdDb250ZXh0O1xuXG4gICAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcblxuICAgIGdldCByb290Tm9kZXMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Um9vdE5vZGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzQmxvY2tDYXJkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dC5lZGl0b3IuaXNCbG9ja0NhcmQodGhpcy5kZXNjZW5kYW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIEBJbmplY3QoU0xBVEVfREVGQVVMVF9FTEVNRU5UX0NPTVBPTkVOVF9UT0tFTilcbiAgICAgICAgcHVibGljIGRlZmF1bHRFbGVtZW50Q29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZTxCYXNlRWxlbWVudENvbXBvbmVudD5cbiAgICApIHtcbiAgICAgICAgc3VwZXIodmlld0NvbnRhaW5lclJlZik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIE5PREVfVE9fSU5ERVguc2V0KHRoaXMuZGVzY2VuZGFudCwgdGhpcy5pbmRleCk7XG4gICAgICAgIE5PREVfVE9fUEFSRU5ULnNldCh0aGlzLmRlc2NlbmRhbnQsIHRoaXMuY29udGV4dC5wYXJlbnQpO1xuICAgICAgICB0aGlzLmNyZWF0ZVZpZXcoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNCbG9ja0NhcmQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQmxvY2tDYXJkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95VmlldygpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveVZpZXcoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95QmxvY2tDYXJkKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE5PREVfVE9fSU5ERVguc2V0KHRoaXMuZGVzY2VuZGFudCwgdGhpcy5pbmRleCk7XG4gICAgICAgIE5PREVfVE9fUEFSRU5ULnNldCh0aGlzLmRlc2NlbmRhbnQsIHRoaXMuY29udGV4dC5wYXJlbnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNCbG9ja0NhcmQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmxvY2tDYXJkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95QmxvY2tDYXJkKCkge1xuICAgICAgICBpZiAodGhpcy5ibG9ja0NhcmRDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tDYXJkQ29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tDYXJkQ29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUJsb2NrQ2FyZCgpIHtcbiAgICAgICAgY29uc3Qgcm9vdE5vZGVzID0gdGhpcy5yb290Tm9kZXM7XG4gICAgICAgIHRoaXMuYmxvY2tDYXJkQ29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxTbGF0ZUJsb2NrQ2FyZD4oU2xhdGVCbG9ja0NhcmQpO1xuICAgICAgICB0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5pbml0aWFsaXplQ2VudGVyKHJvb3ROb2Rlcyk7XG4gICAgfVxuXG4gICAgdXBkYXRlQmxvY2tDYXJkKCkge1xuICAgICAgICBpZiAodGhpcy5ibG9ja0NhcmRDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb290Tm9kZXMgPSB0aGlzLnJvb3ROb2RlcztcbiAgICAgICAgdGhpcy5jcmVhdGVCbG9ja0NhcmQoKTtcbiAgICAgICAgY29uc3QgZmlyc3RSb290Tm9kZSA9IHJvb3ROb2Rlc1swXTtcbiAgICAgICAgZmlyc3RSb290Tm9kZS5yZXBsYWNlV2l0aCh0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBnZXRDb21tb25Db250ZXh0KCk6IHsgc2VsZWN0aW9uOiBSYW5nZTsgZGVjb3JhdGlvbnM6IFJhbmdlW10gfSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKHRoaXMudmlld0NvbnRleHQuZWRpdG9yLCB0aGlzLmNvbnRleHQucGFyZW50KTtcbiAgICAgICAgY29uc3QgcCA9IHBhdGguY29uY2F0KHRoaXMuaW5kZXgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBFZGl0b3IucmFuZ2UodGhpcy52aWV3Q29udGV4dC5lZGl0b3IsIHApO1xuICAgICAgICAgICAgY29uc3Qgc2VsID0gdGhpcy5jb250ZXh0LnNlbGVjdGlvbiAmJiBSYW5nZS5pbnRlcnNlY3Rpb24ocmFuZ2UsIHRoaXMuY29udGV4dC5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgZHMgPSB0aGlzLmNvbnRleHQuZGVjb3JhdGUoW3RoaXMuZGVzY2VuZGFudCwgcF0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgdGhpcy5jb250ZXh0LmRlY29yYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IFJhbmdlLmludGVyc2VjdGlvbihkZWMsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICBpZiAoZCkge1xuICAgICAgICAgICAgICAgICAgICBkcy5wdXNoKGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHNlbGVjdGlvbjogc2VsLCBkZWNvcmF0aW9uczogZHMgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuZWRpdG9yLm9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLkdldFN0YXJ0UG9pbnRFcnJvcixcbiAgICAgICAgICAgICAgICBuYXRpdmVFcnJvcjogZXJyb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgc2VsZWN0aW9uOiBudWxsLCBkZWNvcmF0aW9uczogW10gfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENvbnRleHQoKTogU2xhdGVFbGVtZW50Q29udGV4dCB8IFNsYXRlVGV4dENvbnRleHQge1xuICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQodGhpcy5kZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRDb250ZXh0ID0gdGhpcy5nZXRDb21tb25Db250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBBbmd1bGFyRWRpdG9yLmZpbmRLZXkodGhpcy52aWV3Q29udGV4dC5lZGl0b3IsIHRoaXMuZGVzY2VuZGFudCk7XG4gICAgICAgICAgICBjb25zdCBpc0lubGluZSA9IHRoaXMudmlld0NvbnRleHQuZWRpdG9yLmlzSW5saW5lKHRoaXMuZGVzY2VuZGFudCk7XG4gICAgICAgICAgICBjb25zdCBpc1ZvaWQgPSB0aGlzLnZpZXdDb250ZXh0LmVkaXRvci5pc1ZvaWQodGhpcy5kZXNjZW5kYW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZXh0OiBTbGF0ZUVsZW1lbnRDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZGVzY2VuZGFudCxcbiAgICAgICAgICAgICAgICAuLi5jb21wdXRlZENvbnRleHQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAnZGF0YS1zbGF0ZS1ub2RlJzogJ2VsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZGF0YS1zbGF0ZS1rZXknOiBrZXkuaWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlY29yYXRlOiB0aGlzLmNvbnRleHQuZGVjb3JhdGUsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMuY29udGV4dC5yZWFkb25seVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpc0lubGluZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZXh0LmF0dHJpYnV0ZXNbJ2RhdGEtc2xhdGUtaW5saW5lJ10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzVm9pZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZXh0LmF0dHJpYnV0ZXNbJ2RhdGEtc2xhdGUtdm9pZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Q29udGV4dC5hdHRyaWJ1dGVzLmNvbnRlbnRlZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRDb250ZXh0ID0gdGhpcy5nZXRDb21tb25Db250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBpc0xlYWZCbG9jayA9IEFuZ3VsYXJFZGl0b3IuaXNMZWFmQmxvY2sodGhpcy52aWV3Q29udGV4dC5lZGl0b3IsIHRoaXMuY29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRleHQ6IFNsYXRlVGV4dENvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnM6IGNvbXB1dGVkQ29udGV4dC5kZWNvcmF0aW9ucyxcbiAgICAgICAgICAgICAgICBpc0xhc3Q6IGlzTGVhZkJsb2NrICYmIHRoaXMuaW5kZXggPT09IHRoaXMuY29udGV4dC5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuY29udGV4dC5wYXJlbnQgYXMgRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmRlc2NlbmRhbnRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGV4dENvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRWaWV3VHlwZSgpOiBWaWV3VHlwZSB7XG4gICAgICAgIGlmIChFbGVtZW50LmlzRWxlbWVudCh0aGlzLmRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMudmlld0NvbnRleHQucmVuZGVyRWxlbWVudCAmJiB0aGlzLnZpZXdDb250ZXh0LnJlbmRlckVsZW1lbnQodGhpcy5kZXNjZW5kYW50KSkgfHwgdGhpcy5kZWZhdWx0RWxlbWVudENvbXBvbmVudFR5cGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZvaWQgPSB0aGlzLnZpZXdDb250ZXh0LmVkaXRvci5pc1ZvaWQodGhpcy5jb250ZXh0LnBhcmVudCBhcyBFbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBpc1ZvaWRcbiAgICAgICAgICAgICAgICA/IFNsYXRlVm9pZFRleHRcbiAgICAgICAgICAgICAgICA6ICh0aGlzLnZpZXdDb250ZXh0LnJlbmRlclRleHQgJiYgdGhpcy52aWV3Q29udGV4dC5yZW5kZXJUZXh0KHRoaXMuZGVzY2VuZGFudCkpIHx8IFNsYXRlRGVmYXVsdFRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vaXplZEVsZW1lbnRDb250ZXh0KHByZXY6IFNsYXRlRWxlbWVudENvbnRleHQsIG5leHQ6IFNsYXRlRWxlbWVudENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHByZXYuZWxlbWVudCA9PT0gbmV4dC5lbGVtZW50ICYmXG4gICAgICAgICAgICAoIXRoaXMudmlld0NvbnRleHQuaXNTdHJpY3REZWNvcmF0ZSB8fCBwcmV2LmRlY29yYXRlID09PSBuZXh0LmRlY29yYXRlKSAmJlxuICAgICAgICAgICAgcHJldi5yZWFkb25seSA9PT0gbmV4dC5yZWFkb25seSAmJlxuICAgICAgICAgICAgaXNEZWNvcmF0b3JSYW5nZUxpc3RFcXVhbChwcmV2LmRlY29yYXRpb25zLCBuZXh0LmRlY29yYXRpb25zKSAmJlxuICAgICAgICAgICAgKHByZXYuc2VsZWN0aW9uID09PSBuZXh0LnNlbGVjdGlvbiB8fCAoISFwcmV2LnNlbGVjdGlvbiAmJiAhIW5leHQuc2VsZWN0aW9uICYmIFJhbmdlLmVxdWFscyhwcmV2LnNlbGVjdGlvbiwgbmV4dC5zZWxlY3Rpb24pKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBtZW1vaXplZFRleHRDb250ZXh0KHByZXY6IFNsYXRlVGV4dENvbnRleHQsIG5leHQ6IFNsYXRlVGV4dENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5leHQucGFyZW50ID09PSBwcmV2LnBhcmVudCAmJlxuICAgICAgICAgICAgbmV4dC5pc0xhc3QgPT09IHByZXYuaXNMYXN0ICYmXG4gICAgICAgICAgICBuZXh0LnRleHQgPT09IHByZXYudGV4dCAmJlxuICAgICAgICAgICAgaXNEZWNvcmF0b3JSYW5nZUxpc3RFcXVhbChuZXh0LmRlY29yYXRpb25zLCBwcmV2LmRlY29yYXRpb25zKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1lbW9pemVkQ29udGV4dChwcmV2OiBTbGF0ZUVsZW1lbnRDb250ZXh0IHwgU2xhdGVUZXh0Q29udGV4dCwgbmV4dDogU2xhdGVFbGVtZW50Q29udGV4dCB8IFNsYXRlVGV4dENvbnRleHQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEVsZW1lbnQuaXNFbGVtZW50KHRoaXMuZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lbW9pemVkRWxlbWVudENvbnRleHQocHJldiBhcyBTbGF0ZUVsZW1lbnRDb250ZXh0LCBuZXh0IGFzIFNsYXRlRWxlbWVudENvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVtb2l6ZWRUZXh0Q29udGV4dChwcmV2IGFzIFNsYXRlVGV4dENvbnRleHQsIG5leHQgYXMgU2xhdGVUZXh0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|