slate-angular 1.6.5 → 1.7.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/bundles/slate-angular.umd.js +99 -42
- package/bundles/slate-angular.umd.js.map +1 -1
- package/components/editable/editable.component.d.ts +6 -2
- package/esm2015/components/editable/editable.component.js +60 -10
- package/esm2015/components/leaf/default-leaf.component.js +12 -3
- package/esm2015/types/feature.js +2 -0
- package/esm2015/types/index.js +2 -1
- package/esm2015/view/container.js +39 -33
- package/fesm2015/slate-angular.js +106 -42
- package/fesm2015/slate-angular.js.map +1 -1
- package/package.json +1 -1
- package/styles/index.scss +10 -0
- package/types/feature.d.ts +4 -0
- package/types/index.d.ts +1 -0
- package/view/container.d.ts +2 -1
|
@@ -2,19 +2,28 @@ import { ChangeDetectionStrategy, Component } from "@angular/core";
|
|
|
2
2
|
import { BaseLeafComponent } from "../../view/base";
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "../string/string.component";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
5
6
|
export class SlateDefaultLeafComponent extends BaseLeafComponent {
|
|
6
7
|
}
|
|
7
8
|
SlateDefaultLeafComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
8
|
-
SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template:
|
|
9
|
+
SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `
|
|
10
|
+
<ng-container *ngIf="context.leaf['placeholder']">
|
|
11
|
+
<span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
|
|
12
|
+
</ng-container>
|
|
13
|
+
<span slateString [context]="context" [viewContext]="viewContext"><span>`, isInline: true, components: [{ type: i1.SlateStringComponent, selector: "span[slateString]", inputs: ["context"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
9
14
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, decorators: [{
|
|
10
15
|
type: Component,
|
|
11
16
|
args: [{
|
|
12
17
|
selector: 'span[slateDefaultLeaf]',
|
|
13
|
-
template:
|
|
18
|
+
template: `
|
|
19
|
+
<ng-container *ngIf="context.leaf['placeholder']">
|
|
20
|
+
<span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
|
|
21
|
+
</ng-container>
|
|
22
|
+
<span slateString [context]="context" [viewContext]="viewContext"><span>`,
|
|
14
23
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
15
24
|
host: {
|
|
16
25
|
'data-slate-leaf': 'true'
|
|
17
26
|
}
|
|
18
27
|
}]
|
|
19
28
|
}] });
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1sZWFmLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb21wb25lbnRzL2xlYWYvZGVmYXVsdC1sZWFmLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBY3BELE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxpQkFBaUI7O3NIQUFuRCx5QkFBeUI7MEdBQXpCLHlCQUF5QiwwSUFWeEI7Ozs7aUZBSW1FOzJGQU1wRSx5QkFBeUI7a0JBWnJDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFOzs7O2lGQUltRTtvQkFDN0UsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLElBQUksRUFBRTt3QkFDRixpQkFBaUIsRUFBRSxNQUFNO3FCQUM1QjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCYXNlTGVhZkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi92aWV3L2Jhc2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzcGFuW3NsYXRlRGVmYXVsdExlYWZdJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dC5sZWFmWydwbGFjZWhvbGRlciddXCI+XG4gICAgICAgICAgICA8c3BhbiBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiIGRhdGEtc2xhdGUtcGxhY2Vob2xkZXI9XCJ0cnVlXCIgc2xhdGUtcGxhY2Vob2xkZXI9XCJ0cnVlXCI+e3tjb250ZXh0LmxlYWZbJ3BsYWNlaG9sZGVyJ119fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxzcGFuIHNsYXRlU3RyaW5nIFtjb250ZXh0XT1cImNvbnRleHRcIiBbdmlld0NvbnRleHRdPVwidmlld0NvbnRleHRcIj48c3Bhbj5gLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ2RhdGEtc2xhdGUtbGVhZic6ICd0cnVlJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgU2xhdGVEZWZhdWx0TGVhZkNvbXBvbmVudCBleHRlbmRzIEJhc2VMZWFmQ29tcG9uZW50IHtcbn0iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3NyYy90eXBlcy9mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlUmFuZ2UgfSBmcm9tIFwic2xhdGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTbGF0ZVBsYWNlaG9sZGVyIGV4dGVuZHMgQmFzZVJhbmdlIHtcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbn1cbiJdfQ==
|
package/esm2015/types/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './error';
|
|
2
2
|
export * from './view';
|
|
3
|
-
|
|
3
|
+
export * from './feature';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vdmlldyc7XG5leHBvcnQgKiBmcm9tICcuL2ZlYXR1cmUnO1xuIl19
|
|
@@ -18,7 +18,6 @@ export class ViewContainer {
|
|
|
18
18
|
// first diff
|
|
19
19
|
differ.diff(this.childrenComponent);
|
|
20
20
|
const parentElement = this.elementRef.nativeElement.parentElement;
|
|
21
|
-
let firstChildComponent = this.childrenComponent.first;
|
|
22
21
|
if (this.childrenComponent.length > 0) {
|
|
23
22
|
parentElement.insertBefore(this.createFragment(), this.elementRef.nativeElement);
|
|
24
23
|
this.elementRef.nativeElement.remove();
|
|
@@ -26,41 +25,15 @@ export class ViewContainer {
|
|
|
26
25
|
this.childrenComponent.changes.subscribe((value) => {
|
|
27
26
|
const iterableChanges = differ.diff(this.childrenComponent);
|
|
28
27
|
if (iterableChanges) {
|
|
29
|
-
iterableChanges.
|
|
30
|
-
//
|
|
31
|
-
if (
|
|
32
|
-
const fragment = document.createDocumentFragment();
|
|
33
|
-
fragment.append(...record.item.rootNodes);
|
|
34
|
-
parentElement.insertBefore(fragment, this.elementRef.nativeElement);
|
|
35
|
-
this.elementRef.nativeElement.remove();
|
|
28
|
+
iterableChanges.forEachOperation((record, previousIndex, currentIndex) => {
|
|
29
|
+
// removed
|
|
30
|
+
if (currentIndex === null) {
|
|
36
31
|
return;
|
|
37
32
|
}
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
const fragment = document.createDocumentFragment();
|
|
41
|
-
fragment.append(...record.item.rootNodes);
|
|
42
|
-
parentElement.prepend(fragment);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// insert afterend of previous component end
|
|
46
|
-
let previousRootNode = this.getPreviousRootNode(record.currentIndex);
|
|
47
|
-
if (previousRootNode) {
|
|
48
|
-
record.item.rootNodes.forEach((rootNode) => {
|
|
49
|
-
previousRootNode.insertAdjacentElement('afterend', rootNode);
|
|
50
|
-
previousRootNode = rootNode;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
this.viewContext.editor.onError({
|
|
55
|
-
code: SlateErrorCode.NotFoundPreviousRootNodeError,
|
|
56
|
-
name: 'not found previous rootNode',
|
|
57
|
-
nativeError: null
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
33
|
+
// added or moved
|
|
34
|
+
this.handleContainerItemChange(record, parentElement);
|
|
61
35
|
});
|
|
62
36
|
}
|
|
63
|
-
firstChildComponent = this.childrenComponent.first;
|
|
64
37
|
});
|
|
65
38
|
}
|
|
66
39
|
getPreviousRootNode(currentIndex) {
|
|
@@ -83,6 +56,39 @@ export class ViewContainer {
|
|
|
83
56
|
});
|
|
84
57
|
return fragment;
|
|
85
58
|
}
|
|
59
|
+
handleContainerItemChange(record, parentElement) {
|
|
60
|
+
// first insert
|
|
61
|
+
if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
|
|
62
|
+
const fragment = document.createDocumentFragment();
|
|
63
|
+
fragment.append(...record.item.rootNodes);
|
|
64
|
+
parentElement.insertBefore(fragment, this.elementRef.nativeElement);
|
|
65
|
+
this.elementRef.nativeElement.remove();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// insert at start location
|
|
69
|
+
if (record.currentIndex === 0) {
|
|
70
|
+
const fragment = document.createDocumentFragment();
|
|
71
|
+
fragment.append(...record.item.rootNodes);
|
|
72
|
+
parentElement.prepend(fragment);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// insert afterend of previous component end
|
|
76
|
+
let previousRootNode = this.getPreviousRootNode(record.currentIndex);
|
|
77
|
+
if (previousRootNode) {
|
|
78
|
+
record.item.rootNodes.forEach((rootNode) => {
|
|
79
|
+
previousRootNode.insertAdjacentElement('afterend', rootNode);
|
|
80
|
+
previousRootNode = rootNode;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.viewContext.editor.onError({
|
|
85
|
+
code: SlateErrorCode.NotFoundPreviousRootNodeError,
|
|
86
|
+
name: 'not found previous rootNode',
|
|
87
|
+
nativeError: null
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
86
92
|
}
|
|
87
93
|
ViewContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: ViewContainer, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive });
|
|
88
94
|
ViewContainer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.7", type: ViewContainer, inputs: { viewContext: "viewContext" }, ngImport: i0 });
|
|
@@ -91,4 +97,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImpor
|
|
|
91
97
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.IterableDiffers }]; }, propDecorators: { viewContext: [{
|
|
92
98
|
type: Input
|
|
93
99
|
}] } });
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvc3JjL3ZpZXcvY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBb0QsTUFBTSxlQUFlLENBQUM7QUFHOUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUVoRDs7OztHQUlHO0FBRUgsTUFBTSxPQUFnQixhQUFhO0lBSy9CLFlBQXNCLFVBQTJCLEVBQ25DLE9BQXdCO1FBRGhCLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQ25DLFlBQU8sR0FBUCxPQUFPLENBQWlCO0lBQ3RDLENBQUM7SUFFRCxlQUFlO1FBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzVFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUMvRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUss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RTtvQkFDdkMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUM3RCxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDO2FBQ047aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUM1QixJQUFJLEVBQUUsY0FBYyxDQUFDLDZCQUE2QjtvQkFDbEQsSUFBSSxFQUFFLDZCQUE2QjtvQkFDbkMsV0FBVyxFQUFFLElBQUk7aUJBQ3BCLENBQUMsQ0FBQTthQUNMO1NBQ0o7SUFDTCxDQUFDOzswR0F0RmlCLGFBQWE7OEZBQWIsYUFBYTsyRkFBYixhQUFhO2tCQURsQyxTQUFTOytIQUlHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBJdGVyYWJsZUNoYW5nZVJlY29yZCwgSXRlcmFibGVEaWZmZXJzLCBRdWVyeUxpc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU2xhdGVWaWV3Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IFZpZXdDb250YWluZXJJdGVtIH0gZnJvbSBcIi4vY29udGFpbmVyLWl0ZW1cIjtcbmltcG9ydCB7IFNsYXRlRXJyb3JDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9yXCI7XG5cbi8qKlxuICogdGhlIHNlcGNpYWwgY29udGFpbmVyIGZvciBhbmd1bGFyIHRlbXBsYXRlXG4gKiBBZGQgdGhlIHJvb3ROb2RlcyBvZiBlYWNoIGNoaWxkIGNvbXBvbmVudCB0byB0aGUgcGFyZW50RWxlbWVudFxuICogUmVtb3ZlIHVzZWxlc3MgRE9NIGVsZW1lbnRzLCBlZzogY29tbWVudC4uLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaWV3Q29udGFpbmVyPFQgZXh0ZW5kcyBWaWV3Q29udGFpbmVySXRlbT4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBhYnN0cmFjdCBjaGlsZHJlbkNvbXBvbmVudDogUXVlcnlMaXN0PFQ+O1xuXG4gICAgQElucHV0KCkgdmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZjxhbnk+LFxuICAgICAgICBwcm90ZWN0ZWQgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBjb25zdCBkaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh0aGlzLmNoaWxkcmVuQ29tcG9uZW50KS5jcmVhdGUoKGluZGV4LCBpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpcnN0IGRpZmZcbiAgICAgICAgZGlmZmVyLmRpZmYodGhpcy5jaGlsZHJlbkNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5Db21wb25lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5jcmVhdGVGcmFnbWVudCgpLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuQ29tcG9uZW50LmNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlcmFibGVDaGFuZ2VzID0gZGlmZmVyLmRpZmYodGhpcy5jaGlsZHJlbkNvbXBvbmVudCk7XG4gICAgICAgICAgICBpZiAoaXRlcmFibGVDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaXRlcmFibGVDaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8VD4sIHByZXZpb3VzSW5kZXg6IE51bWJlciwgY3VycmVudEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgb3IgbW92ZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb250YWluZXJJdGVtQ2hhbmdlKHJlY29yZCwgcGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByZXZpb3VzUm9vdE5vZGUoY3VycmVudEluZGV4KSB7XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ29tcG9uZW50ID0gdGhpcy5jaGlsZHJlbkNvbXBvbmVudC5maW5kKChpdGVtLCBpbmRleCkgPT4gaW5kZXggPT09IGN1cnJlbnRJbmRleCAtIDEpO1xuICAgICAgICBsZXQgcHJldmlvdXNSb290Tm9kZSA9IHByZXZpb3VzQ29tcG9uZW50LnJvb3ROb2Rlc1twcmV2aW91c0NvbXBvbmVudC5yb290Tm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChwcmV2aW91c1Jvb3ROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNSb290Tm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByZXZpb3VzUm9vdE5vZGUoY3VycmVudEluZGV4IC0gMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVGcmFnbWVudCgpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5Db21wb25lbnQuZm9yRWFjaCgoY29tcG9uZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKC4uLmNvbXBvbmVudC5yb290Tm9kZXMpO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfVxuXG4gICAgaGFuZGxlQ29udGFpbmVySXRlbUNoYW5nZShyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPFQ+LCBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBmaXJzdCBpbnNlcnRcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gcGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoLi4ucmVjb3JkLml0ZW0ucm9vdE5vZGVzKTtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnNlcnQgYXQgc3RhcnQgbG9jYXRpb25cbiAgICAgICAgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKC4uLnJlY29yZC5pdGVtLnJvb3ROb2Rlcyk7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LnByZXBlbmQoZnJhZ21lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGFmdGVyZW5kIG9mIHByZXZpb3VzIGNvbXBvbmVudCBlbmRcbiAgICAgICAgICAgIGxldCBwcmV2aW91c1Jvb3ROb2RlID0gdGhpcy5nZXRQcmV2aW91c1Jvb3ROb2RlKHJlY29yZC5jdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzUm9vdE5vZGUpIHtcbiAgICAgICAgICAgICAgICByZWNvcmQuaXRlbS5yb290Tm9kZXMuZm9yRWFjaCgocm9vdE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSb290Tm9kZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgcm9vdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Jvb3ROb2RlID0gcm9vdE5vZGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuZWRpdG9yLm9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTbGF0ZUVycm9yQ29kZS5Ob3RGb3VuZFByZXZpb3VzUm9vdE5vZGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ25vdCBmb3VuZCBwcmV2aW91cyByb290Tm9kZScsXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUVycm9yOiBudWxsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
|
|
@@ -1869,7 +1869,6 @@ class ViewContainer {
|
|
|
1869
1869
|
// first diff
|
|
1870
1870
|
differ.diff(this.childrenComponent);
|
|
1871
1871
|
const parentElement = this.elementRef.nativeElement.parentElement;
|
|
1872
|
-
let firstChildComponent = this.childrenComponent.first;
|
|
1873
1872
|
if (this.childrenComponent.length > 0) {
|
|
1874
1873
|
parentElement.insertBefore(this.createFragment(), this.elementRef.nativeElement);
|
|
1875
1874
|
this.elementRef.nativeElement.remove();
|
|
@@ -1877,41 +1876,15 @@ class ViewContainer {
|
|
|
1877
1876
|
this.childrenComponent.changes.subscribe((value) => {
|
|
1878
1877
|
const iterableChanges = differ.diff(this.childrenComponent);
|
|
1879
1878
|
if (iterableChanges) {
|
|
1880
|
-
iterableChanges.
|
|
1881
|
-
//
|
|
1882
|
-
if (
|
|
1883
|
-
const fragment = document.createDocumentFragment();
|
|
1884
|
-
fragment.append(...record.item.rootNodes);
|
|
1885
|
-
parentElement.insertBefore(fragment, this.elementRef.nativeElement);
|
|
1886
|
-
this.elementRef.nativeElement.remove();
|
|
1879
|
+
iterableChanges.forEachOperation((record, previousIndex, currentIndex) => {
|
|
1880
|
+
// removed
|
|
1881
|
+
if (currentIndex === null) {
|
|
1887
1882
|
return;
|
|
1888
1883
|
}
|
|
1889
|
-
//
|
|
1890
|
-
|
|
1891
|
-
const fragment = document.createDocumentFragment();
|
|
1892
|
-
fragment.append(...record.item.rootNodes);
|
|
1893
|
-
parentElement.prepend(fragment);
|
|
1894
|
-
}
|
|
1895
|
-
else {
|
|
1896
|
-
// insert afterend of previous component end
|
|
1897
|
-
let previousRootNode = this.getPreviousRootNode(record.currentIndex);
|
|
1898
|
-
if (previousRootNode) {
|
|
1899
|
-
record.item.rootNodes.forEach((rootNode) => {
|
|
1900
|
-
previousRootNode.insertAdjacentElement('afterend', rootNode);
|
|
1901
|
-
previousRootNode = rootNode;
|
|
1902
|
-
});
|
|
1903
|
-
}
|
|
1904
|
-
else {
|
|
1905
|
-
this.viewContext.editor.onError({
|
|
1906
|
-
code: SlateErrorCode.NotFoundPreviousRootNodeError,
|
|
1907
|
-
name: 'not found previous rootNode',
|
|
1908
|
-
nativeError: null
|
|
1909
|
-
});
|
|
1910
|
-
}
|
|
1911
|
-
}
|
|
1884
|
+
// added or moved
|
|
1885
|
+
this.handleContainerItemChange(record, parentElement);
|
|
1912
1886
|
});
|
|
1913
1887
|
}
|
|
1914
|
-
firstChildComponent = this.childrenComponent.first;
|
|
1915
1888
|
});
|
|
1916
1889
|
}
|
|
1917
1890
|
getPreviousRootNode(currentIndex) {
|
|
@@ -1934,6 +1907,39 @@ class ViewContainer {
|
|
|
1934
1907
|
});
|
|
1935
1908
|
return fragment;
|
|
1936
1909
|
}
|
|
1910
|
+
handleContainerItemChange(record, parentElement) {
|
|
1911
|
+
// first insert
|
|
1912
|
+
if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
|
|
1913
|
+
const fragment = document.createDocumentFragment();
|
|
1914
|
+
fragment.append(...record.item.rootNodes);
|
|
1915
|
+
parentElement.insertBefore(fragment, this.elementRef.nativeElement);
|
|
1916
|
+
this.elementRef.nativeElement.remove();
|
|
1917
|
+
return;
|
|
1918
|
+
}
|
|
1919
|
+
// insert at start location
|
|
1920
|
+
if (record.currentIndex === 0) {
|
|
1921
|
+
const fragment = document.createDocumentFragment();
|
|
1922
|
+
fragment.append(...record.item.rootNodes);
|
|
1923
|
+
parentElement.prepend(fragment);
|
|
1924
|
+
}
|
|
1925
|
+
else {
|
|
1926
|
+
// insert afterend of previous component end
|
|
1927
|
+
let previousRootNode = this.getPreviousRootNode(record.currentIndex);
|
|
1928
|
+
if (previousRootNode) {
|
|
1929
|
+
record.item.rootNodes.forEach((rootNode) => {
|
|
1930
|
+
previousRootNode.insertAdjacentElement('afterend', rootNode);
|
|
1931
|
+
previousRootNode = rootNode;
|
|
1932
|
+
});
|
|
1933
|
+
}
|
|
1934
|
+
else {
|
|
1935
|
+
this.viewContext.editor.onError({
|
|
1936
|
+
code: SlateErrorCode.NotFoundPreviousRootNodeError,
|
|
1937
|
+
name: 'not found previous rootNode',
|
|
1938
|
+
nativeError: null
|
|
1939
|
+
});
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1937
1943
|
}
|
|
1938
1944
|
ViewContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: ViewContainer, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive });
|
|
1939
1945
|
ViewContainer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.7", type: ViewContainer, inputs: { viewContext: "viewContext" }, ngImport: i0 });
|
|
@@ -2014,12 +2020,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImpor
|
|
|
2014
2020
|
class SlateDefaultLeafComponent extends BaseLeafComponent {
|
|
2015
2021
|
}
|
|
2016
2022
|
SlateDefaultLeafComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2017
|
-
SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template:
|
|
2023
|
+
SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `
|
|
2024
|
+
<ng-container *ngIf="context.leaf['placeholder']">
|
|
2025
|
+
<span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
|
|
2026
|
+
</ng-container>
|
|
2027
|
+
<span slateString [context]="context" [viewContext]="viewContext"><span>`, isInline: true, components: [{ type: SlateStringComponent, selector: "span[slateString]", inputs: ["context"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2018
2028
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, decorators: [{
|
|
2019
2029
|
type: Component,
|
|
2020
2030
|
args: [{
|
|
2021
2031
|
selector: 'span[slateDefaultLeaf]',
|
|
2022
|
-
template:
|
|
2032
|
+
template: `
|
|
2033
|
+
<ng-container *ngIf="context.leaf['placeholder']">
|
|
2034
|
+
<span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
|
|
2035
|
+
</ng-container>
|
|
2036
|
+
<span slateString [context]="context" [viewContext]="viewContext"><span>`,
|
|
2023
2037
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2024
2038
|
host: {
|
|
2025
2039
|
'data-slate-leaf': 'true'
|
|
@@ -2429,6 +2443,22 @@ class SlateEditableComponent {
|
|
|
2429
2443
|
this.onTouchedCallback = () => { };
|
|
2430
2444
|
this.onChangeCallback = () => { };
|
|
2431
2445
|
this.decorate = () => [];
|
|
2446
|
+
this.placeholderDecorate = (editor) => {
|
|
2447
|
+
if (this.placeholder &&
|
|
2448
|
+
editor.children.length === 1 &&
|
|
2449
|
+
Array.from(Node.texts(editor)).length === 1 &&
|
|
2450
|
+
Node.string(editor) === '') {
|
|
2451
|
+
const start = Editor.start(editor, []);
|
|
2452
|
+
return [{
|
|
2453
|
+
placeholder: this.placeholder,
|
|
2454
|
+
anchor: start,
|
|
2455
|
+
focus: start
|
|
2456
|
+
}];
|
|
2457
|
+
}
|
|
2458
|
+
else {
|
|
2459
|
+
return [];
|
|
2460
|
+
}
|
|
2461
|
+
};
|
|
2432
2462
|
this.isStrictDecorate = true;
|
|
2433
2463
|
this.trackBy = () => null;
|
|
2434
2464
|
this.readonly = false;
|
|
@@ -2500,6 +2530,7 @@ class SlateEditableComponent {
|
|
|
2500
2530
|
});
|
|
2501
2531
|
this.editor.children = normalize(value);
|
|
2502
2532
|
}
|
|
2533
|
+
this.initializeContext();
|
|
2503
2534
|
this.cdr.markForCheck();
|
|
2504
2535
|
}
|
|
2505
2536
|
}
|
|
@@ -2615,7 +2646,7 @@ class SlateEditableComponent {
|
|
|
2615
2646
|
// need exec after this.cdr.detectChanges() to render HTML
|
|
2616
2647
|
// need exec before this.toNativeSelection() to correct native selection
|
|
2617
2648
|
if (this.isComposing) {
|
|
2618
|
-
//
|
|
2649
|
+
// Composition input text be not rendered when user composition input with selection is expanded
|
|
2619
2650
|
// At this time, the following matching conditions are met, assign isComposing to false, and the status is wrong
|
|
2620
2651
|
// this time condition is true and isComposiing is assigned false
|
|
2621
2652
|
// Therefore, need to wait for the composition input text to be rendered before performing condition matching
|
|
@@ -2648,7 +2679,7 @@ class SlateEditableComponent {
|
|
|
2648
2679
|
this.context = {
|
|
2649
2680
|
parent: this.editor,
|
|
2650
2681
|
selection: this.editor.selection,
|
|
2651
|
-
decorations: this.
|
|
2682
|
+
decorations: this.generateDecorations(),
|
|
2652
2683
|
decorate: this.decorate,
|
|
2653
2684
|
readonly: this.readonly
|
|
2654
2685
|
};
|
|
@@ -2665,20 +2696,26 @@ class SlateEditableComponent {
|
|
|
2665
2696
|
};
|
|
2666
2697
|
}
|
|
2667
2698
|
detectContext() {
|
|
2699
|
+
const decorations = this.generateDecorations();
|
|
2668
2700
|
if (this.context.selection !== this.editor.selection ||
|
|
2669
2701
|
this.context.decorate !== this.decorate ||
|
|
2670
|
-
this.context.readonly !== this.readonly
|
|
2671
|
-
|
|
2672
|
-
const isSameDecorations = isDecoratorRangeListEqual(this.context.decorations, decorations);
|
|
2702
|
+
this.context.readonly !== this.readonly ||
|
|
2703
|
+
!isDecoratorRangeListEqual(this.context.decorations, decorations)) {
|
|
2673
2704
|
this.context = {
|
|
2674
2705
|
parent: this.editor,
|
|
2675
2706
|
selection: this.editor.selection,
|
|
2676
|
-
decorations:
|
|
2707
|
+
decorations: decorations,
|
|
2677
2708
|
decorate: this.decorate,
|
|
2678
2709
|
readonly: this.readonly
|
|
2679
2710
|
};
|
|
2680
2711
|
}
|
|
2681
2712
|
}
|
|
2713
|
+
generateDecorations() {
|
|
2714
|
+
const decorations = this.decorate([this.editor, []]);
|
|
2715
|
+
const placeholderDecorations = this.isComposing ? [] : this.placeholderDecorate(this.editor);
|
|
2716
|
+
decorations.push(...placeholderDecorations);
|
|
2717
|
+
return decorations;
|
|
2718
|
+
}
|
|
2682
2719
|
//#region event proxy
|
|
2683
2720
|
addEventListener(eventName, listener, target = this.elementRef.nativeElement) {
|
|
2684
2721
|
this.manualListeners.push(this.renderer2.listen(target, eventName, (event) => {
|
|
@@ -2897,6 +2934,8 @@ class SlateEditableComponent {
|
|
|
2897
2934
|
// so we need avoid repeat isnertText by isComposing === true,
|
|
2898
2935
|
this.isComposing = false;
|
|
2899
2936
|
}
|
|
2937
|
+
this.detectContext();
|
|
2938
|
+
this.cdr.detectChanges();
|
|
2900
2939
|
}
|
|
2901
2940
|
onDOMCompositionStart(event) {
|
|
2902
2941
|
const { selection } = this.editor;
|
|
@@ -2910,6 +2949,8 @@ class SlateEditableComponent {
|
|
|
2910
2949
|
if (hasEditableTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.compositionStart)) {
|
|
2911
2950
|
this.isComposing = true;
|
|
2912
2951
|
}
|
|
2952
|
+
this.detectContext();
|
|
2953
|
+
this.cdr.detectChanges();
|
|
2913
2954
|
}
|
|
2914
2955
|
onDOMCopy(event) {
|
|
2915
2956
|
const window = AngularEditor.getWindow(this.editor);
|
|
@@ -3179,6 +3220,25 @@ class SlateEditableComponent {
|
|
|
3179
3220
|
return;
|
|
3180
3221
|
}
|
|
3181
3222
|
}
|
|
3223
|
+
else {
|
|
3224
|
+
if (IS_CHROME || IS_SAFARI) {
|
|
3225
|
+
// COMPAT: Chrome and Safari support `beforeinput` event but do not fire
|
|
3226
|
+
// an event when deleting backwards in a selected void inline node
|
|
3227
|
+
if (selection &&
|
|
3228
|
+
(hotkeys.isDeleteBackward(nativeEvent) ||
|
|
3229
|
+
hotkeys.isDeleteForward(nativeEvent)) &&
|
|
3230
|
+
Range.isCollapsed(selection)) {
|
|
3231
|
+
const currentNode = Node.parent(editor, selection.anchor.path);
|
|
3232
|
+
if (Element.isElement(currentNode) &&
|
|
3233
|
+
Editor.isVoid(editor, currentNode) &&
|
|
3234
|
+
Editor.isInline(editor, currentNode)) {
|
|
3235
|
+
event.preventDefault();
|
|
3236
|
+
Editor.deleteBackward(editor, { unit: 'block' });
|
|
3237
|
+
return;
|
|
3238
|
+
}
|
|
3239
|
+
}
|
|
3240
|
+
}
|
|
3241
|
+
}
|
|
3182
3242
|
}
|
|
3183
3243
|
catch (error) {
|
|
3184
3244
|
this.editor.onError({ code: SlateErrorCode.OnDOMKeydownError, nativeError: error });
|
|
@@ -3241,11 +3301,11 @@ class SlateEditableComponent {
|
|
|
3241
3301
|
}
|
|
3242
3302
|
}
|
|
3243
3303
|
SlateEditableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateEditableComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
3244
|
-
SlateEditableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateEditableComponent, selector: "slate-editable", inputs: { editor: "editor", renderElement: "renderElement", renderLeaf: "renderLeaf", renderText: "renderText", decorate: "decorate", isStrictDecorate: "isStrictDecorate", trackBy: "trackBy", readonly: "readonly", beforeInput: "beforeInput", blur: "blur", click: "click", compositionEnd: "compositionEnd", compositionStart: "compositionStart", copy: "copy", cut: "cut", dragOver: "dragOver", dragStart: "dragStart", dragEnd: "dragEnd", drop: "drop", focus: "focus", keydown: "keydown", paste: "paste", spellCheck: "spellCheck", autoCorrect: "autoCorrect", autoCapitalize: "autoCapitalize" }, host: { properties: { "attr.contenteditable": "readonly ? undefined : true", "attr.role": "readonly ? undefined : 'textbox'", "attr.spellCheck": "!hasBeforeInputSupport ? false : spellCheck", "attr.autoCorrect": "!hasBeforeInputSupport ? 'false' : autoCorrect", "attr.autoCapitalize": "!hasBeforeInputSupport ? 'false' : autoCapitalize", "attr.data-slate-editor": "this.dataSlateEditor", "attr.data-slate-node": "this.dataSlateNode", "attr.data-gramm": "this.dataGramm" }, classAttribute: "slate-editable-container" }, providers: [{
|
|
3304
|
+
SlateEditableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateEditableComponent, selector: "slate-editable", inputs: { editor: "editor", renderElement: "renderElement", renderLeaf: "renderLeaf", renderText: "renderText", decorate: "decorate", placeholderDecorate: "placeholderDecorate", isStrictDecorate: "isStrictDecorate", trackBy: "trackBy", readonly: "readonly", placeholder: "placeholder", beforeInput: "beforeInput", blur: "blur", click: "click", compositionEnd: "compositionEnd", compositionStart: "compositionStart", copy: "copy", cut: "cut", dragOver: "dragOver", dragStart: "dragStart", dragEnd: "dragEnd", drop: "drop", focus: "focus", keydown: "keydown", paste: "paste", spellCheck: "spellCheck", autoCorrect: "autoCorrect", autoCapitalize: "autoCapitalize" }, host: { properties: { "attr.contenteditable": "readonly ? undefined : true", "attr.role": "readonly ? undefined : 'textbox'", "attr.spellCheck": "!hasBeforeInputSupport ? false : spellCheck", "attr.autoCorrect": "!hasBeforeInputSupport ? 'false' : autoCorrect", "attr.autoCapitalize": "!hasBeforeInputSupport ? 'false' : autoCapitalize", "attr.data-slate-editor": "this.dataSlateEditor", "attr.data-slate-node": "this.dataSlateNode", "attr.data-gramm": "this.dataGramm" }, classAttribute: "slate-editable-container" }, providers: [{
|
|
3245
3305
|
provide: NG_VALUE_ACCESSOR,
|
|
3246
3306
|
useExisting: forwardRef(() => SlateEditableComponent),
|
|
3247
3307
|
multi: true
|
|
3248
|
-
}], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-children [children]=\"editor.children\" [context]=\"context\" [viewContext]=\"viewContext\"
|
|
3308
|
+
}], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-children [children]=\"editor.children\" [context]=\"context\" [viewContext]=\"viewContext\"></slate-children>\n<slate-string-template #templateComponent></slate-string-template>", components: [{ type: SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { type: SlateStringTemplateComponent, selector: "slate-string-template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3249
3309
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateEditableComponent, decorators: [{
|
|
3250
3310
|
type: Component,
|
|
3251
3311
|
args: [{
|
|
@@ -3276,12 +3336,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImpor
|
|
|
3276
3336
|
type: Input
|
|
3277
3337
|
}], decorate: [{
|
|
3278
3338
|
type: Input
|
|
3339
|
+
}], placeholderDecorate: [{
|
|
3340
|
+
type: Input
|
|
3279
3341
|
}], isStrictDecorate: [{
|
|
3280
3342
|
type: Input
|
|
3281
3343
|
}], trackBy: [{
|
|
3282
3344
|
type: Input
|
|
3283
3345
|
}], readonly: [{
|
|
3284
3346
|
type: Input
|
|
3347
|
+
}], placeholder: [{
|
|
3348
|
+
type: Input
|
|
3285
3349
|
}], beforeInput: [{
|
|
3286
3350
|
type: Input
|
|
3287
3351
|
}], blur: [{
|