@worktile/theia 2.2.9 → 2.3.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/bundles/worktile-theia.umd.js +765 -187
  2. package/bundles/worktile-theia.umd.js.map +1 -1
  3. package/constants/default.d.ts +3 -0
  4. package/constants/node-types.d.ts +4 -0
  5. package/custom-types.d.ts +3 -1
  6. package/editor.component.d.ts +3 -1
  7. package/editor.module.d.ts +26 -24
  8. package/esm2015/constants/default.js +2 -1
  9. package/esm2015/constants/node-types.js +6 -1
  10. package/esm2015/custom-types.js +1 -1
  11. package/esm2015/editor.component.js +12 -6
  12. package/esm2015/editor.module.js +6 -3
  13. package/esm2015/interfaces/editor.js +1 -1
  14. package/esm2015/interfaces/image.js +1 -1
  15. package/esm2015/interfaces/valid-children-types.js +2 -1
  16. package/esm2015/plugins/align/align.editor.js +10 -2
  17. package/esm2015/plugins/align/options.js +3 -2
  18. package/esm2015/plugins/common/auto-insert-data..js +2 -18
  19. package/esm2015/plugins/dnd/component/dnd.component.js +254 -0
  20. package/esm2015/plugins/dnd/utils/get-current-target.js +19 -0
  21. package/esm2015/plugins/dnd/utils/get-hover-direction.js +13 -0
  22. package/esm2015/plugins/dnd/utils/is-valid-drag.js +38 -0
  23. package/esm2015/plugins/dnd/utils/move-drag-node.js +30 -0
  24. package/esm2015/plugins/dnd/utils/remove-drop-thumb-line.js +10 -0
  25. package/esm2015/plugins/image/image.component.js +167 -14
  26. package/esm2015/plugins/image/image.editor.js +4 -1
  27. package/esm2015/plugins/quick-insert/components/quick-insert.component.js +13 -2
  28. package/esm2015/services/context.service.js +5 -1
  29. package/esm2015/utils/dom.js +40 -2
  30. package/esm2015/utils/is-clean-empty-paragraph.js +4 -4
  31. package/esm2015/utils/merge-element-options.js +20 -0
  32. package/fesm2015/worktile-theia.js +716 -156
  33. package/fesm2015/worktile-theia.js.map +1 -1
  34. package/interfaces/editor.d.ts +6 -0
  35. package/interfaces/image.d.ts +7 -1
  36. package/interfaces/valid-children-types.d.ts +1 -0
  37. package/package.json +1 -1
  38. package/plugins/align/align.editor.d.ts +1 -0
  39. package/plugins/dnd/component/dnd.component.d.ts +42 -0
  40. package/plugins/dnd/component/dnd.component.scss +60 -0
  41. package/plugins/dnd/utils/get-current-target.d.ts +2 -0
  42. package/plugins/dnd/utils/get-hover-direction.d.ts +3 -0
  43. package/plugins/dnd/utils/is-valid-drag.d.ts +3 -0
  44. package/plugins/dnd/utils/move-drag-node.d.ts +2 -0
  45. package/plugins/dnd/utils/remove-drop-thumb-line.d.ts +2 -0
  46. package/plugins/image/image.component.d.ts +27 -3
  47. package/plugins/image/image.component.scss +9 -2
  48. package/plugins/image/image.editor.d.ts +6 -1
  49. package/plugins/quick-insert/components/quick-insert.component.d.ts +1 -0
  50. package/plugins/table/components/table.component.scss +1 -0
  51. package/services/context.service.d.ts +1 -0
  52. package/styles/editor.scss +4 -0
  53. package/styles/index.scss +1 -0
  54. package/styles/typo.scss +44 -0
  55. package/utils/dom.d.ts +5 -1
  56. package/utils/merge-element-options.d.ts +2 -0
@@ -0,0 +1,254 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { fromEvent, merge, Subject } from 'rxjs';
3
+ import { filter, takeUntil } from 'rxjs/operators';
4
+ import { Editor, Operation } from 'slate';
5
+ import { AngularEditor, EDITOR_TO_ELEMENT } from 'slate-angular';
6
+ import { DROP_THUMB_LINE } from '../../../constants';
7
+ import { TheContextService } from '../../../services/context.service';
8
+ import { coercePixelsFromCssValue, findNodeEntryByPoint } from '../../../utils/dom';
9
+ import { getCurrentTarget } from '../utils/get-current-target';
10
+ import { getHoverDirection } from '../utils/get-hover-direction';
11
+ import { moveDragNode } from '../utils/move-drag-node';
12
+ import { isValidDrag } from '../utils/is-valid-drag';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "ngx-tethys/icon";
15
+ import * as i2 from "@angular/common";
16
+ const SNAPSHOT_PADDING_WIDTH = 5;
17
+ const SNAPSHOT_LIMI_HEIGHT = 70;
18
+ const DRAG_ICON_SIZE = 24;
19
+ const DRAG_ICON_OFFSET = 5;
20
+ const DRAG_SNAPSHOT_OFFSET = 15; // 拖拽内容距离鼠标偏移量
21
+ export class TheDndComponent {
22
+ constructor(renderer, elementRef, ngZone, cdr) {
23
+ this.renderer = renderer;
24
+ this.elementRef = elementRef;
25
+ this.ngZone = ngZone;
26
+ this.cdr = cdr;
27
+ this.isDraging = false;
28
+ this.destroy$ = new Subject();
29
+ this.dragChange = new EventEmitter();
30
+ this.dropThumbLine = document.createElement('div');
31
+ this.dropThumbLine.className = DROP_THUMB_LINE;
32
+ }
33
+ get nativeElement() {
34
+ return this.elementRef.nativeElement;
35
+ }
36
+ get editableElement() {
37
+ return this.editor && EDITOR_TO_ELEMENT.get(this.editor);
38
+ }
39
+ ngAfterViewInit() {
40
+ const contextService = this.editor.injector.get(TheContextService);
41
+ this.ngZone.runOutsideAngular(() => {
42
+ merge(fromEvent(this.editableElement, `mousemove`), fromEvent(this.editableElement, `mouseleave`))
43
+ .pipe(takeUntil(this.destroy$), filter(() => {
44
+ return !contextService.getOptions().theOptions.readonly && contextService.getOptions().theOptions.dragAndDrop;
45
+ }))
46
+ .subscribe(e => this.setDragIcon(e));
47
+ fromEvent(document, `drop`)
48
+ .pipe(takeUntil(this.destroy$), filter(() => {
49
+ return !contextService.getOptions().theOptions.readonly && contextService.getOptions().theOptions.dragAndDrop;
50
+ }))
51
+ .subscribe(e => this.onDrop(e));
52
+ fromEvent(document, `dragover`)
53
+ .pipe(takeUntil(this.destroy$), filter(() => {
54
+ return !contextService.getOptions().theOptions.readonly && contextService.getOptions().theOptions.dragAndDrop;
55
+ }))
56
+ .subscribe(e => this.onDragover(e));
57
+ fromEvent(document, `scroll`)
58
+ .pipe(takeUntil(this.destroy$), filter(() => {
59
+ return !contextService.getOptions().theOptions.readonly && contextService.getOptions().theOptions.dragAndDrop;
60
+ }))
61
+ .subscribe(e => {
62
+ e.preventDefault();
63
+ let scrollPosition = window.scrollY;
64
+ if (!this.isScrolling && this.isDraging) {
65
+ window.requestAnimationFrame(() => {
66
+ if (this.editableTop) {
67
+ // 滚动过程中,通过设置父级元素来设置snapshot位置
68
+ this.updateDndContainerPosition(null, scrollPosition + this.editableTop + 'px');
69
+ }
70
+ this.isScrolling = false;
71
+ });
72
+ this.isScrolling = true;
73
+ }
74
+ });
75
+ });
76
+ this.setVisibility(false);
77
+ this.valueChangeHandle();
78
+ }
79
+ valueChangeHandle() {
80
+ const { onChange } = this.editor;
81
+ this.editor.onChange = () => {
82
+ const ops = this.editor.operations;
83
+ const skip = ops.length === 1 && Operation.isSelectionOperation(ops[0]);
84
+ if (!skip) {
85
+ this.setVisibility(false);
86
+ }
87
+ onChange();
88
+ };
89
+ }
90
+ updateDndContainerPosition(left, top) {
91
+ const element = this.elementRef.nativeElement;
92
+ const parentElement = element.parentElement;
93
+ top && this.renderer.setStyle(parentElement, 'top', top);
94
+ left && this.renderer.setStyle(parentElement, 'left', left);
95
+ }
96
+ getEditableTop(event) {
97
+ const offsetHeight = document.documentElement.offsetHeight;
98
+ const { height } = this.editableElement.getBoundingClientRect();
99
+ if (event.clientY < this.dragElementHeight) {
100
+ this.editableTop = -this.editableElement.offsetTop;
101
+ return;
102
+ }
103
+ if (height > event.pageY && event.clientY + this.dragElementHeight >= offsetHeight) {
104
+ this.editableTop = event.clientY - this.editableElement.offsetTop;
105
+ return;
106
+ }
107
+ this.editableTop = null;
108
+ }
109
+ onDragStart(event) {
110
+ this.isDraging = true;
111
+ this.dragChange.emit(this.isDraging);
112
+ this.dragSnapshotContent = this.elementRef.nativeElement.nextSibling;
113
+ this.dragSnapshotContent.className = 'the-editor-typo drag-snapshot-container';
114
+ this.dragSnapshotContent.appendChild(this.dragElement.cloneNode(true));
115
+ this.dragElement.style.opacity = '0.3';
116
+ }
117
+ onDragEnd(event) {
118
+ this.dragElement.style.opacity = '';
119
+ this.isDraging = false;
120
+ this.setVisibility(false);
121
+ this.resetDragSnapshotContent();
122
+ this.dragChange.emit(this.isDraging);
123
+ }
124
+ onDrop(event) {
125
+ event.preventDefault();
126
+ if (this.isDraging) {
127
+ moveDragNode(this.editor, this.dragNode, event);
128
+ }
129
+ }
130
+ onDragover(event) {
131
+ event.preventDefault();
132
+ if (this.isDraging && !this.isScrolling) {
133
+ this.getEditableTop(event);
134
+ const offsetWidth = document.documentElement.offsetWidth;
135
+ const { left: editorLeft, top: editorTop, height } = this.editableElement.getBoundingClientRect();
136
+ let top = 0;
137
+ let left = 0;
138
+ if (event.clientX + this.dragElementWidth / 2 > offsetWidth) {
139
+ left = event.pageX - editorLeft - this.nativeElement.offsetWidth;
140
+ }
141
+ else {
142
+ left = Math.max(event.pageX - editorLeft, -editorLeft) + DRAG_SNAPSHOT_OFFSET;
143
+ }
144
+ const scrollTop = document.documentElement.scrollTop;
145
+ const editorMarginTop = editorTop + scrollTop; // 编辑器距离顶部间距
146
+ if (event.clientY + this.dragElementHeight + DRAG_SNAPSHOT_OFFSET > document.documentElement.offsetHeight) {
147
+ top = event.pageY - editorMarginTop - this.nativeElement.offsetHeight + DRAG_SNAPSHOT_OFFSET;
148
+ top = Math.min(top, height - this.editableElement.offsetTop);
149
+ }
150
+ else {
151
+ top = event.pageY - editorMarginTop + this.editableElement.offsetTop + DRAG_SNAPSHOT_OFFSET;
152
+ }
153
+ this.updateDndContainerPosition(left + 'px', top + 'px');
154
+ this.setSnapshotStyle(event);
155
+ this.setDropThumbLine(event);
156
+ }
157
+ }
158
+ setDropThumbLine(event) {
159
+ var _a;
160
+ let element = getCurrentTarget(this.editor, event);
161
+ const direction = getHoverDirection(this.editor, event);
162
+ if (element) {
163
+ if (direction && direction === 'top') {
164
+ element = (_a = element.previousElementSibling) === null || _a === void 0 ? void 0 : _a.querySelector('[data-slate-node="element"]');
165
+ }
166
+ if (element && isValidDrag(this.editor, this.dragNode.node, element)) {
167
+ element.appendChild(this.dropThumbLine);
168
+ }
169
+ }
170
+ }
171
+ setDragIcon(event) {
172
+ if (!this.isDraging) {
173
+ const nodeEntry = findNodeEntryByPoint(this.editor, event.x, event.y, 'highest');
174
+ if (nodeEntry && !Editor.isEmpty(this.editor, nodeEntry[0])) {
175
+ const rootNode = AngularEditor.toDOMNode(this.editor, nodeEntry[0]);
176
+ this.dragNode = {
177
+ node: nodeEntry[0],
178
+ path: nodeEntry[1]
179
+ };
180
+ this.dragElement = rootNode;
181
+ let lineHeight = coercePixelsFromCssValue(window.getComputedStyle(rootNode)['lineHeight']);
182
+ const offsetTop = rootNode.offsetTop + rootNode.offsetParent.offsetTop + (lineHeight - DRAG_ICON_SIZE) / 2;
183
+ const offsetLeft = rootNode.offsetLeft + rootNode.offsetParent.offsetLeft;
184
+ this.updateDndContainerPosition(offsetLeft - DRAG_ICON_SIZE - DRAG_ICON_OFFSET + 'px', offsetTop + 'px');
185
+ this.setVisibility(true);
186
+ }
187
+ else {
188
+ this.setVisibility(false);
189
+ }
190
+ }
191
+ }
192
+ setSnapshotStyle(event) {
193
+ const { width, height } = this.dragElement.getBoundingClientRect();
194
+ this.dragElementHeight = height;
195
+ this.dragElementWidth = width;
196
+ let dragSnapshotContentStyle = `display: block; min-height: 0; width: ${width + SNAPSHOT_PADDING_WIDTH * 2}px;`;
197
+ if (height > SNAPSHOT_LIMI_HEIGHT) {
198
+ dragSnapshotContentStyle = dragSnapshotContentStyle + 'transform: scale(0.45);';
199
+ this.dragElementHeight = this.dragElementHeight * 0.45;
200
+ this.dragElementWidth = this.dragElementWidth * 0.45;
201
+ }
202
+ let snapshotTop = 0;
203
+ let snapshotLeft = 0;
204
+ // 上下移动:超出屏幕高度,重新设置snapshot的位置
205
+ if (event.clientY + this.dragElementHeight + DRAG_SNAPSHOT_OFFSET > document.documentElement.offsetHeight) {
206
+ snapshotTop = this.dragElementHeight;
207
+ }
208
+ else {
209
+ snapshotTop = 0;
210
+ }
211
+ // 左右移动:超出屏幕宽度,重新设置snapshot的位置
212
+ if (event.clientX + this.dragElementWidth / 2 > document.documentElement.offsetWidth) {
213
+ snapshotLeft = this.dragElementWidth;
214
+ }
215
+ else {
216
+ snapshotLeft = 0;
217
+ }
218
+ dragSnapshotContentStyle = dragSnapshotContentStyle + `top: ${-snapshotTop}px; left: ${-snapshotLeft}px;`;
219
+ this.dragSnapshotContent.setAttribute('style', dragSnapshotContentStyle);
220
+ }
221
+ resetDragSnapshotContent() {
222
+ this.dragSnapshotContent.className = 'drag-snapshot-container';
223
+ this.dragSnapshotContent.setAttribute('style', '');
224
+ this.dragSnapshotContent.innerHTML = '';
225
+ }
226
+ setVisibility(visible = true) {
227
+ const dndContainer = this.nativeElement.parentNode;
228
+ dndContainer.style.display = visible ? 'block' : 'none';
229
+ }
230
+ ngOnDestroy() {
231
+ this.destroy$.next();
232
+ this.destroy$.complete();
233
+ }
234
+ }
235
+ TheDndComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TheDndComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
236
+ TheDndComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: TheDndComponent, selector: "[theDnd]", inputs: { editor: "editor" }, outputs: { dragChange: "dragChange" }, host: { classAttribute: "the-drag-drop" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<div\n draggable=\"true\"\n class=\"the-drag-drop-icon\"\n [ngStyle]=\"{ opacity: isDraging ? 0 : '' }\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd($event)\"\n>\n <thy-icon thyIconName=\"drag\"> </thy-icon>\n</div>\n", components: [{ type: i1.ThyIconComponent, selector: "thy-icon", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }], directives: [{ type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TheDndComponent, decorators: [{
238
+ type: Component,
239
+ args: [{
240
+ selector: '[theDnd]',
241
+ templateUrl: './dnd.component.html',
242
+ host: {
243
+ class: 'the-drag-drop'
244
+ }
245
+ }]
246
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { editor: [{
247
+ type: Input
248
+ }], dragChange: [{
249
+ type: Output
250
+ }], content: [{
251
+ type: ViewChild,
252
+ args: ['content', { static: false }]
253
+ }] } });
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL2RuZC9jb21wb25lbnQvZG5kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL2RuZC9jb21wb25lbnQvZG5kLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFFckQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFDakMsTUFB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d0JBQ0YsS0FBSyxFQUFFLGVBQWU7cUJBQ3pCO2lCQUNKOzhLQVVZLE1BQU07c0JBQWQsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQWNrQyxPQUFPO3NCQUEvQyxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVkaXRvciwgT3BlcmF0aW9uIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciwgRURJVE9SX1RPX0VMRU1FTlQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERST1BfVEhVTUJfTElORSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBEcmFnTm9kZSwgRWxlbWVudE9wdGlvbnNJbmZvIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUsIGZpbmROb2RlRW50cnlCeVBvaW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZG9tJztcbmltcG9ydCB7IGdldEN1cnJlbnRUYXJnZXQgfSBmcm9tICcuLi91dGlscy9nZXQtY3VycmVudC10YXJnZXQnO1xuaW1wb3J0IHsgZ2V0SG92ZXJEaXJlY3Rpb24gfSBmcm9tICcuLi91dGlscy9nZXQtaG92ZXItZGlyZWN0aW9uJztcbmltcG9ydCB7IG1vdmVEcmFnTm9kZSB9IGZyb20gJy4uL3V0aWxzL21vdmUtZHJhZy1ub2RlJztcbmltcG9ydCB7IGlzVmFsaWREcmFnIH0gZnJvbSAnLi4vdXRpbHMvaXMtdmFsaWQtZHJhZyc7XG5cbmNvbnN0IFNOQVBTSE9UX1BBRERJTkdfV0lEVEggPSA1O1xuY29uc3QgU05BUFNIT1RfTElNSV9IRUlHSFQgPSA3MDtcbmNvbnN0IERSQUdfSUNPTl9TSVpFID0gMjQ7XG5jb25zdCBEUkFHX0lDT05fT0ZGU0VUID0gNTtcbmNvbnN0IERSQUdfU05BUFNIT1RfT0ZGU0VUID0gMTU7IC8vIOaLluaLveWGheWuuei3neemu+m8oOagh+WBj+enu+mHj1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t0aGVEbmRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZG5kLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAndGhlLWRyYWctZHJvcCdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFRoZURuZENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgaXNEcmFnaW5nID0gZmFsc2U7XG5cbiAgICBkcmFnTm9kZTogRHJhZ05vZGU7XG5cbiAgICBkcmFnU25hcHNob3RDb250ZW50OiBIVE1MRWxlbWVudDtcblxuICAgIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAgIEBJbnB1dCgpIGVkaXRvcjogRWRpdG9yO1xuXG4gICAgQE91dHB1dCgpIGRyYWdDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGRyYWdFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIGRyYWdFbGVtZW50SGVpZ2h0OiBudW1iZXI7XG5cbiAgICBkcmFnRWxlbWVudFdpZHRoOiBudW1iZXI7XG5cbiAgICBpc1Njcm9sbGluZzogYm9vbGVhbjtcblxuICAgIGRyb3BUaHVtYkxpbmU6IEhUTUxFbGVtZW50O1xuXG4gICAgZWRpdGFibGVUb3A6IG51bWJlcjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGVudDogRWxlbWVudFJlZjtcblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCBlZGl0YWJsZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvciAmJiBFRElUT1JfVE9fRUxFTUVOVC5nZXQodGhpcy5lZGl0b3IpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgdGhpcy5kcm9wVGh1bWJMaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMuZHJvcFRodW1iTGluZS5jbGFzc05hbWUgPSBEUk9QX1RIVU1CX0xJTkU7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZXh0U2VydmljZSA9IHRoaXMuZWRpdG9yLmluamVjdG9yLmdldChUaGVDb250ZXh0U2VydmljZSk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIG1lcmdlKGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmVkaXRhYmxlRWxlbWVudCwgYG1vdXNlbW92ZWApLCBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5lZGl0YWJsZUVsZW1lbnQsIGBtb3VzZWxlYXZlYCkpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGV4dFNlcnZpY2UuZ2V0T3B0aW9ucygpLnRoZU9wdGlvbnMucmVhZG9ubHkgJiYgY29udGV4dFNlcnZpY2UuZ2V0T3B0aW9ucygpLnRoZU9wdGlvbnMuZHJhZ0FuZERyb3A7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB0aGlzLnNldERyYWdJY29uKGUpKTtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgYGRyb3BgKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWNvbnRleHRTZXJ2aWNlLmdldE9wdGlvbnMoKS50aGVPcHRpb25zLnJlYWRvbmx5ICYmIGNvbnRleHRTZXJ2aWNlLmdldE9wdGlvbnMoKS50aGVPcHRpb25zLmRyYWdBbmREcm9wO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4gdGhpcy5vbkRyb3AoZSkpO1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCBgZHJhZ292ZXJgKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWNvbnRleHRTZXJ2aWNlLmdldE9wdGlvbnMoKS50aGVPcHRpb25zLnJlYWRvbmx5ICYmIGNvbnRleHRTZXJ2aWNlLmdldE9wdGlvbnMoKS50aGVPcHRpb25zLmRyYWdBbmREcm9wO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4gdGhpcy5vbkRyYWdvdmVyKGUpKTtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgYHNjcm9sbGApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGV4dFNlcnZpY2UuZ2V0T3B0aW9ucygpLnRoZU9wdGlvbnMucmVhZG9ubHkgJiYgY29udGV4dFNlcnZpY2UuZ2V0T3B0aW9ucygpLnRoZU9wdGlvbnMuZHJhZ0FuZERyb3A7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbFBvc2l0aW9uID0gd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Njcm9sbGluZyAmJiB0aGlzLmlzRHJhZ2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVUb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5rua5Yqo6L+H56iL5Lit77yM6YCa6L+H6K6+572u54i257qn5YWD57Sg5p2l6K6+572uc25hcHNob3TkvY3nva5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEbmRDb250YWluZXJQb3NpdGlvbihudWxsLCBzY3JvbGxQb3NpdGlvbiArIHRoaXMuZWRpdGFibGVUb3AgKyAncHgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXRWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUhhbmRsZSgpO1xuICAgIH1cblxuICAgIHZhbHVlQ2hhbmdlSGFuZGxlKCkge1xuICAgICAgICBjb25zdCB7IG9uQ2hhbmdlIH0gPSB0aGlzLmVkaXRvcjtcbiAgICAgICAgdGhpcy5lZGl0b3Iub25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHMgPSB0aGlzLmVkaXRvci5vcGVyYXRpb25zO1xuICAgICAgICAgICAgY29uc3Qgc2tpcCA9IG9wcy5sZW5ndGggPT09IDEgJiYgT3BlcmF0aW9uLmlzU2VsZWN0aW9uT3BlcmF0aW9uKG9wc1swXSk7XG4gICAgICAgICAgICBpZiAoIXNraXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25DaGFuZ2UoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURuZENvbnRhaW5lclBvc2l0aW9uKGxlZnQ6IHN0cmluZywgdG9wOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB0b3AgJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwYXJlbnRFbGVtZW50LCAndG9wJywgdG9wKTtcbiAgICAgICAgbGVmdCAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBhcmVudEVsZW1lbnQsICdsZWZ0JywgbGVmdCk7XG4gICAgfVxuXG4gICAgZ2V0RWRpdGFibGVUb3AoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IHRoaXMuZWRpdGFibGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoZXZlbnQuY2xpZW50WSA8IHRoaXMuZHJhZ0VsZW1lbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVUb3AgPSAtdGhpcy5lZGl0YWJsZUVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHQgPiBldmVudC5wYWdlWSAmJiBldmVudC5jbGllbnRZICsgdGhpcy5kcmFnRWxlbWVudEhlaWdodCA+PSBvZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVUb3AgPSBldmVudC5jbGllbnRZIC0gdGhpcy5lZGl0YWJsZUVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdGFibGVUb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdDaGFuZ2UuZW1pdCh0aGlzLmlzRHJhZ2luZyk7XG4gICAgICAgIHRoaXMuZHJhZ1NuYXBzaG90Q29udGVudCA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkubmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ1NuYXBzaG90Q29udGVudC5jbGFzc05hbWUgPSAndGhlLWVkaXRvci10eXBvIGRyYWctc25hcHNob3QtY29udGFpbmVyJztcbiAgICAgICAgdGhpcy5kcmFnU25hcHNob3RDb250ZW50LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0VsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuMyc7XG4gICAgfVxuXG4gICAgb25EcmFnRW5kKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICAgIHRoaXMuaXNEcmFnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgIHRoaXMucmVzZXREcmFnU25hcHNob3RDb250ZW50KCk7XG4gICAgICAgIHRoaXMuZHJhZ0NoYW5nZS5lbWl0KHRoaXMuaXNEcmFnaW5nKTtcbiAgICB9XG5cbiAgICBvbkRyb3AoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcmFnaW5nKSB7XG4gICAgICAgICAgICBtb3ZlRHJhZ05vZGUodGhpcy5lZGl0b3IsIHRoaXMuZHJhZ05vZGUsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ292ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcmFnaW5nICYmICF0aGlzLmlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmdldEVkaXRhYmxlVG9wKGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgeyBsZWZ0OiBlZGl0b3JMZWZ0LCB0b3A6IGVkaXRvclRvcCwgaGVpZ2h0IH0gPSB0aGlzLmVkaXRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGxldCB0b3AgPSAwO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAwO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNsaWVudFggKyB0aGlzLmRyYWdFbGVtZW50V2lkdGggLyAyID4gb2Zmc2V0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gZXZlbnQucGFnZVggLSBlZGl0b3JMZWZ0IC0gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgoZXZlbnQucGFnZVggLSBlZGl0b3JMZWZ0LCAtZWRpdG9yTGVmdCkgKyBEUkFHX1NOQVBTSE9UX09GRlNFVDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvck1hcmdpblRvcCA9IGVkaXRvclRvcCArIHNjcm9sbFRvcDsgLy8g57yW6L6R5Zmo6Led56a76aG26YOo6Ze06LedXG4gICAgICAgICAgICBpZiAoZXZlbnQuY2xpZW50WSArIHRoaXMuZHJhZ0VsZW1lbnRIZWlnaHQgKyBEUkFHX1NOQVBTSE9UX09GRlNFVCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0b3AgPSBldmVudC5wYWdlWSAtIGVkaXRvck1hcmdpblRvcCAtIHRoaXMubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyBEUkFHX1NOQVBTSE9UX09GRlNFVDtcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1pbih0b3AsIGhlaWdodCAtIHRoaXMuZWRpdGFibGVFbGVtZW50Lm9mZnNldFRvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvcCA9IGV2ZW50LnBhZ2VZIC0gZWRpdG9yTWFyZ2luVG9wICsgdGhpcy5lZGl0YWJsZUVsZW1lbnQub2Zmc2V0VG9wICsgRFJBR19TTkFQU0hPVF9PRkZTRVQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURuZENvbnRhaW5lclBvc2l0aW9uKGxlZnQgKyAncHgnLCB0b3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U25hcHNob3RTdHlsZShldmVudCk7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BUaHVtYkxpbmUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RHJvcFRodW1iTGluZShldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBsZXQgZWxlbWVudCA9IGdldEN1cnJlbnRUYXJnZXQodGhpcy5lZGl0b3IsIGV2ZW50KTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0SG92ZXJEaXJlY3Rpb24odGhpcy5lZGl0b3IsIGV2ZW50KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gJiYgZGlyZWN0aW9uID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc/LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNsYXRlLW5vZGU9XCJlbGVtZW50XCJdJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudCAmJiBpc1ZhbGlkRHJhZyh0aGlzLmVkaXRvciwgdGhpcy5kcmFnTm9kZS5ub2RlLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5kcm9wVGh1bWJMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERyYWdJY29uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc0RyYWdpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVFbnRyeSA9IGZpbmROb2RlRW50cnlCeVBvaW50KHRoaXMuZWRpdG9yLCBldmVudC54LCBldmVudC55LCAnaGlnaGVzdCcpO1xuICAgICAgICAgICAgaWYgKG5vZGVFbnRyeSAmJiAhRWRpdG9yLmlzRW1wdHkodGhpcy5lZGl0b3IsIG5vZGVFbnRyeVswXSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb290Tm9kZSA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBub2RlRW50cnlbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ05vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGVFbnRyeVswXSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogbm9kZUVudHJ5WzFdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdFbGVtZW50ID0gcm9vdE5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUod2luZG93LmdldENvbXB1dGVkU3R5bGUocm9vdE5vZGUpWydsaW5lSGVpZ2h0J10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IHJvb3ROb2RlLm9mZnNldFRvcCArIChyb290Tm9kZS5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFRvcCArIChsaW5lSGVpZ2h0IC0gRFJBR19JQ09OX1NJWkUpIC8gMjtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRMZWZ0ID0gcm9vdE5vZGUub2Zmc2V0TGVmdCArIChyb290Tm9kZS5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldExlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEbmRDb250YWluZXJQb3NpdGlvbihvZmZzZXRMZWZ0IC0gRFJBR19JQ09OX1NJWkUgLSBEUkFHX0lDT05fT0ZGU0VUICsgJ3B4Jywgb2Zmc2V0VG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWaXNpYmlsaXR5KHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U25hcHNob3RTdHlsZShldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuZHJhZ0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRXaWR0aCA9IHdpZHRoO1xuICAgICAgICBsZXQgZHJhZ1NuYXBzaG90Q29udGVudFN0eWxlID0gYGRpc3BsYXk6IGJsb2NrOyBtaW4taGVpZ2h0OiAwOyB3aWR0aDogJHt3aWR0aCArIFNOQVBTSE9UX1BBRERJTkdfV0lEVEggKiAyfXB4O2A7XG4gICAgICAgIGlmIChoZWlnaHQgPiBTTkFQU0hPVF9MSU1JX0hFSUdIVCkge1xuICAgICAgICAgICAgZHJhZ1NuYXBzaG90Q29udGVudFN0eWxlID0gZHJhZ1NuYXBzaG90Q29udGVudFN0eWxlICsgJ3RyYW5zZm9ybTogc2NhbGUoMC40NSk7JztcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRIZWlnaHQgPSB0aGlzLmRyYWdFbGVtZW50SGVpZ2h0ICogMC40NTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsZW1lbnRXaWR0aCA9IHRoaXMuZHJhZ0VsZW1lbnRXaWR0aCAqIDAuNDU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNuYXBzaG90VG9wID0gMDtcbiAgICAgICAgbGV0IHNuYXBzaG90TGVmdCA9IDA7XG4gICAgICAgIC8vIOS4iuS4i+enu+WKqO+8mui2heWHuuWxj+W5lemrmOW6pu+8jOmHjeaWsOiuvue9rnNuYXBzaG9055qE5L2N572uXG4gICAgICAgIGlmIChldmVudC5jbGllbnRZICsgdGhpcy5kcmFnRWxlbWVudEhlaWdodCArIERSQUdfU05BUFNIT1RfT0ZGU0VUID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCkge1xuICAgICAgICAgICAgc25hcHNob3RUb3AgPSB0aGlzLmRyYWdFbGVtZW50SGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc25hcHNob3RUb3AgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5bem5Y+z56e75Yqo77ya6LaF5Ye65bGP5bmV5a695bqm77yM6YeN5paw6K6+572uc25hcHNob3TnmoTkvY3nva5cbiAgICAgICAgaWYgKGV2ZW50LmNsaWVudFggKyB0aGlzLmRyYWdFbGVtZW50V2lkdGggLyAyID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoKSB7XG4gICAgICAgICAgICBzbmFwc2hvdExlZnQgPSB0aGlzLmRyYWdFbGVtZW50V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzbmFwc2hvdExlZnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGRyYWdTbmFwc2hvdENvbnRlbnRTdHlsZSA9IGRyYWdTbmFwc2hvdENvbnRlbnRTdHlsZSArIGB0b3A6ICR7LXNuYXBzaG90VG9wfXB4OyBsZWZ0OiAkey1zbmFwc2hvdExlZnR9cHg7YDtcbiAgICAgICAgdGhpcy5kcmFnU25hcHNob3RDb250ZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBkcmFnU25hcHNob3RDb250ZW50U3R5bGUpO1xuICAgIH1cblxuICAgIHJlc2V0RHJhZ1NuYXBzaG90Q29udGVudCgpIHtcbiAgICAgICAgdGhpcy5kcmFnU25hcHNob3RDb250ZW50LmNsYXNzTmFtZSA9ICdkcmFnLXNuYXBzaG90LWNvbnRhaW5lcic7XG4gICAgICAgIHRoaXMuZHJhZ1NuYXBzaG90Q29udGVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICB0aGlzLmRyYWdTbmFwc2hvdENvbnRlbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxuXG4gICAgc2V0VmlzaWJpbGl0eSh2aXNpYmxlID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkbmRDb250YWluZXIgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZG5kQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgY2xhc3M9XCJ0aGUtZHJhZy1kcm9wLWljb25cIlxuICAgIFtuZ1N0eWxlXT1cInsgb3BhY2l0eTogaXNEcmFnaW5nID8gMCA6ICcnIH1cIlxuICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgKGRyYWdlbmQpPVwib25EcmFnRW5kKCRldmVudClcIlxuPlxuICAgIDx0aHktaWNvbiB0aHlJY29uTmFtZT1cImRyYWdcIj4gPC90aHktaWNvbj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,19 @@
1
+ import { coercePixelsFromCssValue, findNodeEntryByPoint } from '../../../utils/dom';
2
+ import { TheEditor } from '../../../interfaces';
3
+ import { EDITOR_TO_ELEMENT } from 'slate-angular';
4
+ export const getCurrentTarget = (editor, event) => {
5
+ const editorElement = EDITOR_TO_ELEMENT.get(editor);
6
+ const { left, right } = editorElement.getBoundingClientRect();
7
+ let { paddingLeft, paddingRight } = window.getComputedStyle(editorElement, null);
8
+ const paddingLeftPixels = coercePixelsFromCssValue(paddingLeft);
9
+ const paddingRightPixels = coercePixelsFromCssValue(paddingRight);
10
+ let x = event.x;
11
+ if (event.x <= left + paddingLeftPixels || event.x >= right - paddingRightPixels) {
12
+ x = left + paddingLeftPixels;
13
+ }
14
+ const nodeEntry = findNodeEntryByPoint(editor, x, event.y);
15
+ if (nodeEntry) {
16
+ return TheEditor.toDOMNode(editor, nodeEntry[0]);
17
+ }
18
+ };
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWN1cnJlbnQtdGFyZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvZG5kL3V0aWxzL2dldC1jdXJyZW50LXRhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBaUIsRUFBRSxLQUFpQixFQUFlLEVBQUU7SUFDbEYsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBZ0IsQ0FBQztJQUNuRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzlELElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRixNQUFNLGlCQUFpQixHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoQixJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLGtCQUFrQixFQUFFO1FBQzlFLENBQUMsR0FBRyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7S0FDaEM7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLFNBQVMsRUFBRTtRQUNYLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEQ7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUsIGZpbmROb2RlRW50cnlCeVBvaW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZG9tJztcbmltcG9ydCB7IFRoZUVkaXRvciB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRURJVE9SX1RPX0VMRU1FTlQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRUYXJnZXQgPSAoZWRpdG9yOiBUaGVFZGl0b3IsIGV2ZW50OiBNb3VzZUV2ZW50KTogSFRNTEVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGVkaXRvckVsZW1lbnQgPSBFRElUT1JfVE9fRUxFTUVOVC5nZXQoZWRpdG9yKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCB7IGxlZnQsIHJpZ2h0IH0gPSBlZGl0b3JFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCB7IHBhZGRpbmdMZWZ0LCBwYWRkaW5nUmlnaHQgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVkaXRvckVsZW1lbnQsIG51bGwpO1xuICAgIGNvbnN0IHBhZGRpbmdMZWZ0UGl4ZWxzID0gY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlKHBhZGRpbmdMZWZ0KTtcbiAgICBjb25zdCBwYWRkaW5nUmlnaHRQaXhlbHMgPSBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUocGFkZGluZ1JpZ2h0KTtcbiAgICBsZXQgeCA9IGV2ZW50Lng7XG4gICAgaWYgKGV2ZW50LnggPD0gbGVmdCArIHBhZGRpbmdMZWZ0UGl4ZWxzIHx8IGV2ZW50LnggPj0gcmlnaHQgLSBwYWRkaW5nUmlnaHRQaXhlbHMpIHtcbiAgICAgICAgeCA9IGxlZnQgKyBwYWRkaW5nTGVmdFBpeGVscztcbiAgICB9XG4gICAgY29uc3Qgbm9kZUVudHJ5ID0gZmluZE5vZGVFbnRyeUJ5UG9pbnQoZWRpdG9yLCB4LCBldmVudC55KTtcbiAgICBpZiAobm9kZUVudHJ5KSB7XG4gICAgICAgIHJldHVybiBUaGVFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgbm9kZUVudHJ5WzBdKTtcbiAgICB9XG59O1xuIl19
@@ -0,0 +1,13 @@
1
+ import { getCurrentTarget } from './get-current-target';
2
+ export const getHoverDirection = (editor, event) => {
3
+ const rootNode = getCurrentTarget(editor, event);
4
+ if (rootNode) {
5
+ const { top, bottom } = rootNode.getBoundingClientRect();
6
+ const middleHeight = (bottom - top) / 2;
7
+ if (top + middleHeight > event.clientY) {
8
+ return 'top';
9
+ }
10
+ return 'bottom';
11
+ }
12
+ };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWhvdmVyLWRpcmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL2RuZC91dGlscy9nZXQtaG92ZXItZGlyZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXhELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBaUIsRUFBRSxLQUFpQixFQUFpQixFQUFFO0lBQ3JGLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxJQUFJLFFBQVEsRUFBRTtRQUNWLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDekQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksR0FBRyxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxRQUFRLENBQUM7S0FDbkI7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERyb3BEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFRhcmdldCB9IGZyb20gJy4vZ2V0LWN1cnJlbnQtdGFyZ2V0JztcblxuZXhwb3J0IGNvbnN0IGdldEhvdmVyRGlyZWN0aW9uID0gKGVkaXRvcjogVGhlRWRpdG9yLCBldmVudDogTW91c2VFdmVudCk6IERyb3BEaXJlY3Rpb24gPT4ge1xuICAgIGNvbnN0IHJvb3ROb2RlID0gZ2V0Q3VycmVudFRhcmdldChlZGl0b3IsIGV2ZW50KTtcbiAgICBpZiAocm9vdE5vZGUpIHtcbiAgICAgICAgY29uc3QgeyB0b3AsIGJvdHRvbSB9ID0gcm9vdE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IG1pZGRsZUhlaWdodCA9IChib3R0b20gLSB0b3ApIC8gMjtcbiAgICAgICAgaWYgKHRvcCArIG1pZGRsZUhlaWdodCA+IGV2ZW50LmNsaWVudFkpIHtcbiAgICAgICAgICAgIHJldHVybiAndG9wJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgfVxufTtcbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import { Editor } from 'slate';
2
+ import { DefaultElementOptions, TheEditor } from '../../../interfaces';
3
+ import { mergeElementOptions } from '../../../utils/merge-element-options';
4
+ export const isValidDrag = (editor, dragNode, currentTarget) => {
5
+ var _a;
6
+ const node = TheEditor.toSlateNode(editor, currentTarget);
7
+ const dropPath = TheEditor.findPath(editor, node);
8
+ const dragPath = TheEditor.findPath(editor, dragNode);
9
+ if (dragPath[0] === dropPath[0] && dropPath.length > 1) {
10
+ // 阻止list元素拖入自身
11
+ return false;
12
+ }
13
+ let allElementOptions = DefaultElementOptions;
14
+ if ((_a = editor.extraElementOptions) === null || _a === void 0 ? void 0 : _a.length) {
15
+ const extraInfo = mergeElementOptions(editor.extraElementOptions);
16
+ allElementOptions = Object.values(extraInfo);
17
+ }
18
+ const types = allElementOptions.map(item => item.type);
19
+ if (types.indexOf(node.type) > -1 && allElementOptions[types.indexOf(node.type)].isSecondaryContainer) {
20
+ // 阻止向table-celld等二级容器中拖入
21
+ return false;
22
+ }
23
+ let containerParent = Editor.above(editor, {
24
+ at: dropPath,
25
+ mode: 'lowest',
26
+ match: (node) => {
27
+ return node && node.type && types.includes(node.type);
28
+ }
29
+ });
30
+ if (containerParent) {
31
+ const { inValidChildrenTypes } = allElementOptions.find(item => item.type === containerParent[0].type);
32
+ if (inValidChildrenTypes.includes(dragNode.type)) {
33
+ return false;
34
+ }
35
+ }
36
+ return true;
37
+ };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtdmFsaWQtZHJhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL2RuZC91dGlscy9pcy12YWxpZC1kcmFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWlCLEVBQUUsUUFBdUIsRUFBRSxhQUEwQixFQUFFLEVBQUU7O0lBQ2xHLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBa0IsQ0FBQztJQUMzRSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDcEQsZUFBZTtRQUNmLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBQ0QsSUFBSSxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztJQUM5QyxJQUFJLE1BQUEsTUFBTSxDQUFDLG1CQUFtQiwwQ0FBRSxNQUFNLEVBQUU7UUFDcEMsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEUsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNoRDtJQUNELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLEVBQUU7UUFDbkcseUJBQXlCO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBQ0QsSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDdkMsRUFBRSxFQUFFLFFBQVE7UUFDWixJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUMzQixPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUM7S0FDSixDQUFDLENBQUM7SUFFSCxJQUFJLGVBQWUsRUFBRTtRQUNqQixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUMsT0FBTyxLQUFLLENBQUM7U0FDaEI7S0FDSjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVkaXRvciB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jdXN0b20tdHlwZXMnO1xuaW1wb3J0IHsgRGVmYXVsdEVsZW1lbnRPcHRpb25zLCBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IG1lcmdlRWxlbWVudE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tZXJnZS1lbGVtZW50LW9wdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZERyYWcgPSAoZWRpdG9yOiBUaGVFZGl0b3IsIGRyYWdOb2RlOiBDdXN0b21FbGVtZW50LCBjdXJyZW50VGFyZ2V0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBUaGVFZGl0b3IudG9TbGF0ZU5vZGUoZWRpdG9yLCBjdXJyZW50VGFyZ2V0KSBhcyBDdXN0b21FbGVtZW50O1xuICAgIGNvbnN0IGRyb3BQYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgbm9kZSk7XG4gICAgY29uc3QgZHJhZ1BhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgoZWRpdG9yLCBkcmFnTm9kZSk7XG4gICAgaWYgKGRyYWdQYXRoWzBdID09PSBkcm9wUGF0aFswXSAmJiBkcm9wUGF0aC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIOmYu+atomxpc3TlhYPntKDmi5blhaXoh6rouqtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgYWxsRWxlbWVudE9wdGlvbnMgPSBEZWZhdWx0RWxlbWVudE9wdGlvbnM7XG4gICAgaWYgKGVkaXRvci5leHRyYUVsZW1lbnRPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZXh0cmFJbmZvID0gbWVyZ2VFbGVtZW50T3B0aW9ucyhlZGl0b3IuZXh0cmFFbGVtZW50T3B0aW9ucyk7XG4gICAgICAgIGFsbEVsZW1lbnRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhleHRyYUluZm8pO1xuICAgIH1cbiAgICBjb25zdCB0eXBlcyA9IGFsbEVsZW1lbnRPcHRpb25zLm1hcChpdGVtID0+IGl0ZW0udHlwZSk7XG4gICAgaWYgKHR5cGVzLmluZGV4T2Yobm9kZS50eXBlKSA+IC0xICYmIGFsbEVsZW1lbnRPcHRpb25zW3R5cGVzLmluZGV4T2Yobm9kZS50eXBlKV0uaXNTZWNvbmRhcnlDb250YWluZXIpIHtcbiAgICAgICAgLy8g6Zi75q2i5ZCRdGFibGUtY2VsbGTnrYnkuoznuqflrrnlmajkuK3mi5blhaVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgY29udGFpbmVyUGFyZW50ID0gRWRpdG9yLmFib3ZlKGVkaXRvciwge1xuICAgICAgICBhdDogZHJvcFBhdGgsXG4gICAgICAgIG1vZGU6ICdsb3dlc3QnLFxuICAgICAgICBtYXRjaDogKG5vZGU6IEN1c3RvbUVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBub2RlICYmIG5vZGUudHlwZSAmJiB0eXBlcy5pbmNsdWRlcyhub2RlLnR5cGUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoY29udGFpbmVyUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IHsgaW5WYWxpZENoaWxkcmVuVHlwZXMgfSA9IGFsbEVsZW1lbnRPcHRpb25zLmZpbmQoaXRlbSA9PiBpdGVtLnR5cGUgPT09IGNvbnRhaW5lclBhcmVudFswXS50eXBlKTtcbiAgICAgICAgaWYgKGluVmFsaWRDaGlsZHJlblR5cGVzLmluY2x1ZGVzKGRyYWdOb2RlLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuIl19
@@ -0,0 +1,30 @@
1
+ import { TheEditor } from '../../../interfaces';
2
+ import { Path, Editor, Transforms } from 'slate';
3
+ import { removeDropThumbLine } from './remove-drop-thumb-line';
4
+ import { EDITOR_TO_ELEMENT } from 'slate-angular';
5
+ import { DROP_THUMB_LINE } from '../../../constants';
6
+ export const moveDragNode = (editor, dragNode, event) => {
7
+ event.stopPropagation();
8
+ const element = EDITOR_TO_ELEMENT.get(editor);
9
+ const dropThumbLine = element.querySelector('.' + DROP_THUMB_LINE);
10
+ const parentElement = dropThumbLine && dropThumbLine.parentNode;
11
+ if (parentElement) {
12
+ const node = TheEditor.toSlateNode(editor, parentElement);
13
+ let dropPath = node && TheEditor.findPath(editor, node);
14
+ if (dropPath.length) {
15
+ const dragPath = dragNode.path;
16
+ const before = Path.isBefore(dragPath, dropPath) && Path.isSibling(dragPath, dropPath);
17
+ dropPath = before ? dropPath : Path.next(dropPath);
18
+ if (dropPath.length) {
19
+ Editor.withoutNormalizing(editor, () => {
20
+ Transforms.moveNodes(editor, {
21
+ at: dragPath,
22
+ to: dropPath
23
+ });
24
+ });
25
+ }
26
+ }
27
+ }
28
+ removeDropThumbLine(editor);
29
+ };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS1kcmFnLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9kbmQvdXRpbHMvbW92ZS1kcmFnLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQWlCLEVBQUUsUUFBa0IsRUFBRSxLQUFpQixFQUFFLEVBQUU7SUFDckYsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUNuRSxNQUFNLGFBQWEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQztJQUNoRSxJQUFJLGFBQWEsRUFBRTtRQUNmLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDakIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RixRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNqQixNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtvQkFDbkMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7d0JBQ3pCLEVBQUUsRUFBRSxRQUFRO3dCQUNaLEVBQUUsRUFBRSxRQUFRO3FCQUNmLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7S0FDSjtJQUVELG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERyYWdOb2RlLCBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBhdGgsIEVkaXRvciwgVHJhbnNmb3JtcyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IHJlbW92ZURyb3BUaHVtYkxpbmUgfSBmcm9tICcuL3JlbW92ZS1kcm9wLXRodW1iLWxpbmUnO1xuaW1wb3J0IHsgRURJVE9SX1RPX0VMRU1FTlQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERST1BfVEhVTUJfTElORSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCBtb3ZlRHJhZ05vZGUgPSAoZWRpdG9yOiBUaGVFZGl0b3IsIGRyYWdOb2RlOiBEcmFnTm9kZSwgZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBlbGVtZW50ID0gRURJVE9SX1RPX0VMRU1FTlQuZ2V0KGVkaXRvcik7XG4gICAgY29uc3QgZHJvcFRodW1iTGluZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLicgKyBEUk9QX1RIVU1CX0xJTkUpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSBkcm9wVGh1bWJMaW5lICYmIGRyb3BUaHVtYkxpbmUucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb25zdCBub2RlID0gVGhlRWRpdG9yLnRvU2xhdGVOb2RlKGVkaXRvciwgcGFyZW50RWxlbWVudCk7XG4gICAgICAgIGxldCBkcm9wUGF0aCA9IG5vZGUgJiYgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgbm9kZSk7XG4gICAgICAgIGlmIChkcm9wUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyYWdQYXRoID0gZHJhZ05vZGUucGF0aDtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IFBhdGguaXNCZWZvcmUoZHJhZ1BhdGgsIGRyb3BQYXRoKSAmJiBQYXRoLmlzU2libGluZyhkcmFnUGF0aCwgZHJvcFBhdGgpO1xuICAgICAgICAgICAgZHJvcFBhdGggPSBiZWZvcmUgPyBkcm9wUGF0aCA6IFBhdGgubmV4dChkcm9wUGF0aCk7XG4gICAgICAgICAgICBpZiAoZHJvcFBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5tb3ZlTm9kZXMoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdDogZHJhZ1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0bzogZHJvcFBhdGhcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVEcm9wVGh1bWJMaW5lKGVkaXRvcik7XG59O1xuIl19
@@ -0,0 +1,10 @@
1
+ import { EDITOR_TO_ELEMENT } from 'slate-angular';
2
+ import { DROP_THUMB_LINE } from '../../../constants';
3
+ export const removeDropThumbLine = (editor) => {
4
+ const element = EDITOR_TO_ELEMENT.get(editor);
5
+ const dropThumbLine = element.querySelector('.' + DROP_THUMB_LINE);
6
+ if (dropThumbLine) {
7
+ dropThumbLine.remove();
8
+ }
9
+ };
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLWRyb3AtdGh1bWItbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL2RuZC91dGlscy9yZW1vdmUtZHJvcC10aHVtYi1saW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHckQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFpQixFQUFFLEVBQUU7SUFDckQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0lBQ25FLElBQUksYUFBYSxFQUFFO1FBQ2YsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQzFCO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRURJVE9SX1RPX0VMRU1FTlQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERST1BfVEhVTUJfTElORSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNvbnN0IHJlbW92ZURyb3BUaHVtYkxpbmUgPSAoZWRpdG9yOiBUaGVFZGl0b3IpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gRURJVE9SX1RPX0VMRU1FTlQuZ2V0KGVkaXRvcik7XG4gICAgY29uc3QgZHJvcFRodW1iTGluZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLicgKyBEUk9QX1RIVU1CX0xJTkUpO1xuICAgIGlmIChkcm9wVGh1bWJMaW5lKSB7XG4gICAgICAgIGRyb3BUaHVtYkxpbmUucmVtb3ZlKCk7XG4gICAgfVxufTtcbiJdfQ==