@cluetec/ngcx-tree 17.0.2 → 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/README.md CHANGED
@@ -50,10 +50,12 @@ Missing features? Let me know :)
50
50
  - [findNodeById](#findnodebyid)
51
51
  - [Styling](#styling)
52
52
  - [Include Styles](#include-styles)
53
+ - [CSS Variables](#css-variables)
53
54
  - [Common styling](#common-styling)
54
55
  - [Dotted tree lines](#dotted-tree-lines)
55
56
  - [Selection highlighting](#selection-highlighting)
56
57
  - [Icon color](#icon-color)
58
+ - [Prevent drop reason tooltip](#prevent-drop-reason-tooltip)
57
59
  - [Font Awesome](#font-awesome)
58
60
  - [Selection](#selection)
59
61
  - [Simple Sample](#simple-sample)
@@ -128,8 +130,15 @@ settings.
128
130
  `(node: NgcxTreeNodeWrapper<T>) => boolean` - all nodes are draggable by
129
131
  default<br><br>
130
132
  - `allowDrop` method that decides if node can be dropped into another node
131
- `(node: NgcxTreeNodeWrapper<T>, intoNode?: NgcxTreeNodeWrapper<T>) => boolean ` -
132
- every node may be draggable everywhere by default<br><br>
133
+ `(node: NgcxTreeNodeWrapper<T>, intoNode?: NgcxTreeNodeWrapper<T>) => boolean` -
134
+ every node may be draggable everywhere by default.<br><br>
135
+ - `preventDropReason` method that decides if node can be dropped into another
136
+ node
137
+ `(node: NgcxTreeNodeWrapper<T>, intoNode?: NgcxTreeNodeWrapper<T>) => string` -
138
+ every node may be draggable everywhere by default. If a non empty string is
139
+ returned, then the node cannot be dropped and the string will be displayed.
140
+ One of the methods `allowDrop` or `preventDropReason` is sufficient to prevent
141
+ the node to be dropped. <br><br>
133
142
  - `allowSelection` method that decides if node can be selected
134
143
  `(node: NgcxTreeNodeWrapper<T>) => boolean ` - nodes are not selectable by
135
144
  default<br><br>
@@ -250,14 +259,28 @@ styles.scss and styles.css contains all the parts described below in one file:
250
259
  @import 'node_modules/@cluetec/ngcx-tree/styles/styles';
251
260
  ```
252
261
 
262
+ ## CSS Variables
263
+
264
+ Css Variables may be defined to customize the Look and feel like this:
265
+
266
+ ```scss
267
+ --ngcx-tree-color-no-drop: #ff0000;
268
+ ```
269
+
270
+
271
+ | Variable name | Description |
272
+ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
273
+ | ngcx-tree-color-no-drop | Color which is shown at the drop box dashed border or line to indicate that drop is not possible here. You may set to transparent if you don't want the border in this case |
274
+
275
+
253
276
  ## Common styling
254
277
 
255
- you should set the width of cdk-drop-list to 100%, otherwise, the node content
278
+ you should set the width of cdk-drop-list to auto, otherwise, the node content
256
279
  may be on wrong place:
257
280
 
258
281
  ```css
259
282
  .ngcx-tree .cdk-drop-list {
260
- width: 100%;
283
+ width: auto;
261
284
  }
262
285
  ```
263
286
 
@@ -291,6 +314,14 @@ Import or copy the scss to set the color of the node icon:
291
314
  @import 'node_modules/@cluetec/ngcx-tree/styles/ngcx-icon-color';
292
315
  ```
293
316
 
317
+ ### Prevent drop reason tooltip
318
+
319
+ Import or copy the scss to style the tooltip, shown when `config.preventDropReason` is used:
320
+
321
+ ```scss
322
+ @import 'node_modules/@cluetec/ngcx-tree/styles/ngcx-tooltip';
323
+ ```
324
+
294
325
  ## Font Awesome
295
326
 
296
327
  Font Awesome is not included here, but to show icons for the nodes you may
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLW1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUtbW9kZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVDb25maWc8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICB0cmVlTm9kZUNvbnRlbnRDb21wb25lbnQ/OiBUeXBlPE5nY3hDdXN0b21Db21wb25lbnQ8VD4+O1xuICB0cmVlTm9kZUNvbnRlbnRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgYWxsb3dEcm9wPzogKFxuICAgIG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4sXG4gICAgaW50b05vZGU/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+XG4gICkgPT4gYm9vbGVhbjtcbiAgYWxsb3dEcmFnPzogKG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4pID0+IGJvb2xlYW47XG4gIGFsbG93U2VsZWN0aW9uPzogKG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4pID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeEN1c3RvbUNvbXBvbmVudDxUIGV4dGVuZHMgTmdjeFRyZWVOb2RlPiB7XG4gIG5vZGVXcmFwcGVyPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgY3VzdG9tRXZlbnQ/OiBFdmVudEVtaXR0ZXI8YW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ2N4VHJlZU5vZGUge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZT86IGFueTtcbiAgZmFJY29uPzogc3RyaW5nO1xuICBjaGlsZHJlbj86IE5nY3hUcmVlTm9kZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5nY3hUcmVlTm9kZVdyYXBwZXI8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICBpZDogc3RyaW5nO1xuICBkYXRhOiBUO1xuICBkZXB0aDogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBpc1NlbGVjdGFibGU/OiBib29sZWFuO1xuICBpc0ZpcnN0Q2hpbGQ6IGJvb2xlYW47XG4gIGlzTGFzdENoaWxkOiBib29sZWFuO1xuICBjaGlsZHJlbjogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPltdO1xuICBwYXJlbnQ/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+O1xuICBuZXh0PzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgcHJldmlvdXM/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5nY3hUcmVlTm9kZUNvbXBvbmVudDxUIGV4dGVuZHMgTmdjeFRyZWVOb2RlPiB7XG4gIG5vZGVXcmFwcGVyPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ2N4VHJlZU5vZGVNb3ZlZEV2ZW50PFQgZXh0ZW5kcyBOZ2N4VHJlZU5vZGU+IHtcbiAgbm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgcGFyZW50PzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgYWZ0ZXJOb2RlPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgYmVmb3JlTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLW1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUtbW9kZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVDb25maWc8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICB0cmVlTm9kZUNvbnRlbnRDb21wb25lbnQ/OiBUeXBlPE5nY3hDdXN0b21Db21wb25lbnQ8VD4+O1xuICB0cmVlTm9kZUNvbnRlbnRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgYWxsb3dEcm9wPzogKFxuICAgIG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4sXG4gICAgaW50b05vZGU/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+XG4gICkgPT4gYm9vbGVhbjtcbiAgcHJldmVudERyb3BSZWFzb24/OiAoXG4gICAgbm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgICBpbnRvTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5cbiAgKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFsbG93RHJhZz86IChub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBib29sZWFuO1xuICBhbGxvd1NlbGVjdGlvbj86IChub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5nY3hDdXN0b21Db21wb25lbnQ8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICBub2RlV3JhcHBlcj86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIGN1c3RvbUV2ZW50PzogRXZlbnRFbWl0dGVyPGFueT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVOb2RlIHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU/OiBhbnk7XG4gIGZhSWNvbj86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBOZ2N4VHJlZU5vZGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQgZXh0ZW5kcyBOZ2N4VHJlZU5vZGU+IHtcbiAgaWQ6IHN0cmluZztcbiAgZGF0YTogVDtcbiAgZGVwdGg6IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbiAgaXNTZWxlY3RhYmxlPzogYm9vbGVhbjtcbiAgaXNGaXJzdENoaWxkOiBib29sZWFuO1xuICBpc0xhc3RDaGlsZDogYm9vbGVhbjtcbiAgY2hpbGRyZW46IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5bXTtcbiAgcGFyZW50PzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbiAgbmV4dD86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIHByZXZpb3VzPzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ2N4VHJlZU5vZGVDb21wb25lbnQ8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4ge1xuICBub2RlV3JhcHBlcj86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdjeFRyZWVOb2RlTW92ZWRFdmVudDxUIGV4dGVuZHMgTmdjeFRyZWVOb2RlPiB7XG4gIG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIHBhcmVudD86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIGFmdGVyTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG4gIGJlZm9yZU5vZGU/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+O1xufVxuIl19
@@ -75,29 +75,38 @@ export class NgcxTreeComponent {
75
75
  });
76
76
  return wrapperNodes;
77
77
  }
78
- allowDrop(dropNode, dropType) {
78
+ hideDrop(dropNode, dropType) {
79
79
  if (!this.dragging ||
80
80
  this.dragging.id === dropNode.id ||
81
81
  isParentOf(this.dragging, dropNode)) {
82
- return false;
82
+ return true;
83
83
  }
84
84
  if (dropType == DropType.DROP_INTO &&
85
85
  dropNode.id === this.dragging.parent?.id) {
86
- return false;
86
+ return true;
87
87
  }
88
88
  if (dropType == DropType.DROP_AFTER &&
89
89
  dropNode.next?.id === this.dragging.id) {
90
- return false;
90
+ return true;
91
91
  }
92
92
  if (dropType == DropType.DROP_BEFORE &&
93
93
  dropNode.previous?.id === this.dragging.id) {
94
- return false;
94
+ return true;
95
95
  }
96
+ return false;
97
+ }
98
+ allowDrop(dropNode, dropType) {
99
+ const hideDrop = this.hideDrop(dropNode, dropType);
96
100
  const intoNode = dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;
97
- if (this.config?.allowDrop) {
98
- return this.config.allowDrop(this.dragging, intoNode);
101
+ let preventDropReason;
102
+ let allowDrop = true;
103
+ if (this.config?.preventDropReason && this.dragging) {
104
+ preventDropReason = this.config.preventDropReason(this.dragging, intoNode);
99
105
  }
100
- return true;
106
+ if (this.config?.allowDrop && this.dragging) {
107
+ allowDrop = this.config.allowDrop(this.dragging, intoNode);
108
+ }
109
+ return new DropControl(hideDrop, !allowDrop || !!preventDropReason, preventDropReason);
101
110
  }
102
111
  // prevent drop directly after a node on same level, that is expanded
103
112
  sortPredicate() {
@@ -178,7 +187,10 @@ export class NgcxTreeComponent {
178
187
  }
179
188
  }
180
189
  handleDragRelease(event) {
190
+ this.handleDragReleaseInternal(event);
181
191
  this.dragging = undefined;
192
+ }
193
+ handleDragReleaseInternal(event) {
182
194
  const movedNode = event.source.data;
183
195
  const target = event.event.target;
184
196
  const dropZoneId = target.id ?? target.parentElement?.id;
@@ -192,6 +204,10 @@ export class NgcxTreeComponent {
192
204
  console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);
193
205
  return;
194
206
  }
207
+ const dropControl = this.allowDrop(toNode, dropZoneInfo.dropType);
208
+ if (dropControl.hideDrop || dropControl.preventDrop) {
209
+ return;
210
+ }
195
211
  // dropType undefined can happen if dropped directly without moving
196
212
  if (this.canceledByEsc || dropZoneInfo.dropType === undefined) {
197
213
  this.canceledByEsc = false;
@@ -264,11 +280,11 @@ export class NgcxTreeComponent {
264
280
  }
265
281
  }
266
282
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: NgcxTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
267
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !allowDrop(node, DropType.DROP_AFTER) || !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !node.isFirstChild || !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n treeControl.isExpanded(node) || !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:2;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:3;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:3;bottom:-10px;display:flex;justify-content:center;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "trackBy"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
283
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:not(:hover) .tooltip{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "trackBy"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
268
284
  }
269
285
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: NgcxTreeComponent, decorators: [{
270
286
  type: Component,
271
- args: [{ selector: 'ngcx-tree', standalone: true, imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !allowDrop(node, DropType.DROP_AFTER) || !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !node.isFirstChild || !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n treeControl.isExpanded(node) || !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:2;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:3;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:3;bottom:-10px;display:flex;justify-content:center;flex-direction:column}\n"] }]
287
+ args: [{ selector: 'ngcx-tree', standalone: true, imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:not(:hover) .tooltip{display:none}\n"] }]
272
288
  }], propDecorators: { nodes: [{
273
289
  type: Input
274
290
  }], config: [{
@@ -330,4 +346,11 @@ class DropZoneInfo {
330
346
  this.dropType = id.substring(pos + 1);
331
347
  }
332
348
  }
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FFbEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFPN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBUy9DLE1BQU0sT0FBTyxpQkFBaUI7SUFQOUI7UUFhWSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFDMUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO1FBQ3BDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUN4RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRW5FOztXQUVHO1FBQ2EsZ0JBQVcsR0FBdUIsSUFBSSxlQUFlLENBQ25FLElBQUksRUFDSixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDdkI7WUFDRSxPQUFPLEVB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QyxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDZGtEcmFnLFxuICBDZGtEcmFnUmVsZWFzZSxcbiAgQ2RrRHJvcExpc3QsXG4gIERyYWdEcm9wTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gIENka1RyZWVNb2R1bGUsXG4gIE5lc3RlZFRyZWVDb250cm9sLFxuICBOZXN0ZWRUcmVlQ29udHJvbE9wdGlvbnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdjeFRyZWVEYXRhU291cmNlIH0gZnJvbSAnLi9uZ2N4LXRyZWUtZGF0YS5zb3VyY2UnO1xuaW1wb3J0IHtcbiAgTmdjeFRyZWVDb25maWcsXG4gIE5nY3hUcmVlTm9kZSxcbiAgTmdjeFRyZWVOb2RlTW92ZWRFdmVudCxcbiAgTmdjeFRyZWVOb2RlV3JhcHBlcixcbn0gZnJvbSAnLi9uZ2N4LXRyZWUtbW9kZWxzJztcbmltcG9ydCB7IE5nY3hUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vbmdjeC10cmVlLW5vZGUvbmdjeC10cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IGlzUGFyZW50T2YgfSBmcm9tICcuL25nY3gtdHJlZS11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nY3gtdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnbmdjeC10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ25nY3gtdHJlZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2RrVHJlZU1vZHVsZSwgRHJhZ0Ryb3BNb2R1bGUsIE5nY3hUcmVlTm9kZUNvbXBvbmVudCwgTmdJZl0sXG59KVxuZXhwb3J0IGNsYXNzIE5nY3hUcmVlQ29tcG9uZW50PFQgZXh0ZW5kcyBOZ2N4VHJlZU5vZGU+XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXRcbntcbiAgQElucHV0KCkgbm9kZXM/OiBOZ2N4VHJlZU5vZGVbXTtcbiAgQElucHV0KCkgY29uZmlnPzogTmdjeFRyZWVDb25maWc8VD47XG5cbiAgQE91dHB1dCgpIG5vZGVNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TmdjeFRyZWVOb2RlTW92ZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGN1c3RvbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PigpO1xuXG4gIC8qKlxuICAgKiBBcGkgZm9yIGZpbmRpbmcgYW5kIHNlbGVjdGluZyBub2RlLiBFeHRlbmRzIGZyb20gdGhlIENESyB0cmVlQ29udHJvbCBmb3IgZXhwYW5kaW5nL2NvbGxhcHNpbmcgdGhlIHRyZWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmVlQ29udHJvbDogTmdjeFRyZWVDb250cm9sPFQ+ID0gbmV3IE5nY3hUcmVlQ29udHJvbDxUPihcbiAgICB0aGlzLFxuICAgIChub2RlKSA9PiBub2RlLmNoaWxkcmVuLFxuICAgIHtcbiAgICAgIHRyYWNrQnk6IChub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBub2RlLmlkLFxuICAgIH1cbiAgKTtcblxuICBkYXRhU291cmNlOiBOZ2N4VHJlZURhdGFTb3VyY2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4gPVxuICAgIG5ldyBOZ2N4VHJlZURhdGFTb3VyY2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4oW10pO1xuXG4gIHByb3RlY3RlZCBkcmFnZ2luZz86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG5cbiAgcHJvdGVjdGVkIHNlbGVjdGVkTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERyb3BUeXBlID0gRHJvcFR5cGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc2FibGUgPSAoKSA9PiBmYWxzZTtcblxuICBwcml2YXRlIGNhbmNlbGVkQnlFc2M/OiBib29sZWFuO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVHJlZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydub2RlcyddKSB7XG4gICAgICBpZiAodGhpcy50cmVlQ29udHJvbCkge1xuICAgICAgICAvLyBpbml0aWFsaXplZCBhbHJlYWR5XG4gICAgICAgIHRoaXMudXBkYXRlVHJlZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZUlkID0gdGhpcy5zZWxlY3RlZE5vZGUuaWQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmVlQ29udHJvbC5zZWxlY3ROb2RlQnlJZChzZWxlY3RlZE5vZGVJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVHJlZSgpIHtcbiAgICBjb25zdCB3cmFwcGVyTm9kZXMgPSB0aGlzLmNyZWF0ZVdyYXBwZXJOb2Rlcyh0aGlzLm5vZGVzID8/IFtdKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTmdjeFRyZWVEYXRhU291cmNlKHdyYXBwZXJOb2Rlcyk7XG4gICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdyYXBwZXJOb2RlcyhcbiAgICBub2RlczogTmdjeFRyZWVOb2RlW10sXG4gICAgcGFyZW50PzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgICBkZXB0aDogbnVtYmVyID0gMFxuICApOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+W10ge1xuICAgIGNvbnN0IGNoaWxkQ291bnQgPSBub2Rlcy5sZW5ndGg7XG4gICAgY29uc3Qgd3JhcHBlck5vZGVzID0gbm9kZXMubWFwKChub2RlLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+ID0ge1xuICAgICAgICBpZDogbm9kZS5pZCxcbiAgICAgICAgZGF0YTogPFQ+bm9kZSxcbiAgICAgICAgaXNGaXJzdENoaWxkOiBpZHggPT09IDAsXG4gICAgICAgIGlzTGFzdENoaWxkOiBpZHggPT09IGNoaWxkQ291bnQgLSAxLFxuICAgICAgICBpbmRleDogaWR4LFxuICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgICAgbm9kZVdyYXBwZXIuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuXG4gICAgICAgID8gdGhpcy5jcmVhdGVXcmFwcGVyTm9kZXMobm9kZS5jaGlsZHJlbiwgbm9kZVdyYXBwZXIsIGRlcHRoICsgMSlcbiAgICAgICAgOiBbXTtcblxuICAgICAgcmV0dXJuIG5vZGVXcmFwcGVyO1xuICAgIH0pO1xuICAgIHdyYXBwZXJOb2Rlcy5mb3JFYWNoKCh3cmFwcGVyTm9kZSkgPT4ge1xuICAgICAgaWYgKCF3cmFwcGVyTm9kZS5pc0xhc3RDaGlsZCkge1xuICAgICAgICB3cmFwcGVyTm9kZS5uZXh0ID0gd3JhcHBlck5vZGVzW3dyYXBwZXJOb2RlLmluZGV4ICsgMV07XG4gICAgICB9XG4gICAgICBpZiAoIXdyYXBwZXJOb2RlLmlzRmlyc3RDaGlsZCkge1xuICAgICAgICB3cmFwcGVyTm9kZS5wcmV2aW91cyA9IHdyYXBwZXJOb2Rlc1t3cmFwcGVyTm9kZS5pbmRleCAtIDFdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnPy5hbGxvd1NlbGVjdGlvbj8uKHdyYXBwZXJOb2RlKSkge1xuICAgICAgICB3cmFwcGVyTm9kZS5pc1NlbGVjdGFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB3cmFwcGVyTm9kZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWxsb3dEcm9wKFxuICAgIGRyb3BOb2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+LFxuICAgIGRyb3BUeXBlOiBEcm9wVHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5kcmFnZ2luZyB8fFxuICAgICAgdGhpcy5kcmFnZ2luZy5pZCA9PT0gZHJvcE5vZGUuaWQgfHxcbiAgICAgIGlzUGFyZW50T2YodGhpcy5kcmFnZ2luZywgZHJvcE5vZGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRyb3BUeXBlID09IERyb3BUeXBlLkRST1BfSU5UTyAmJlxuICAgICAgZHJvcE5vZGUuaWQgPT09IHRoaXMuZHJhZ2dpbmcucGFyZW50Py5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0FGVEVSICYmXG4gICAgICBkcm9wTm9kZS5uZXh0Py5pZCA9PT0gdGhpcy5kcmFnZ2luZy5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0JFRk9SRSAmJlxuICAgICAgZHJvcE5vZGUucHJldmlvdXM/LmlkID09PSB0aGlzLmRyYWdnaW5nLmlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW50b05vZGUgPVxuICAgICAgZHJvcFR5cGUgPT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gZHJvcE5vZGUgOiBkcm9wTm9kZS5wYXJlbnQ7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5hbGxvd0Ryb3ApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5hbGxvd0Ryb3AodGhpcy5kcmFnZ2luZywgaW50b05vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHByZXZlbnQgZHJvcCBkaXJlY3RseSBhZnRlciBhIG5vZGUgb24gc2FtZSBsZXZlbCwgdGhhdCBpcyBleHBhbmRlZFxuICBwcm90ZWN0ZWQgc29ydFByZWRpY2F0ZSgpOiAoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkcmFnOiBDZGtEcmFnLFxuICAgIGRyb3A6IENka0Ryb3BMaXN0XG4gICkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBfZHJhZzogQ2RrRHJhZzxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PixcbiAgICAgIGRyb3A6IENka0Ryb3BMaXN0PE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4+XG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4gaW5kZXggPT0gMCB8fCAhdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKGRyb3AuZGF0YSk7XG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNhYmxlRHJhZyhub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5hbGxvd0RyYWcgPyAhdGhpcy5jb25maWcuYWxsb3dEcmFnKG5vZGUpIDogZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93VXAoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlLmlzRmlyc3RDaGlsZCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUucHJldmlvdXMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBrZXlEb3duQXJyb3dEb3duKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZS5pc0xhc3RDaGlsZCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUubmV4dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudD8ubmV4dCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50Lm5leHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93TGVmdChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQodGhpcy5zZWxlY3RlZE5vZGUpKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2UodGhpcy5zZWxlY3RlZE5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZT8ucGFyZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93UmlnaHQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlICYmIHRoaXMuc2VsZWN0ZWROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Tm9kZSh0aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlblswXSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKG5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLmVzY2FwZScpXG4gIHByb3RlY3RlZCBrZXlFc2NhcGVXaGlsZURyYWdnaW5nKCkge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XG4gICAgICB0aGlzLmNhbmNlbGVkQnlFc2MgPSB0cnVlO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ21vdXNldXAnKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZURyYWdSZWxlYXNlKGV2ZW50OiBDZGtEcmFnUmVsZWFzZTxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+Pikge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW92ZWROb2RlID0gZXZlbnQuc291cmNlLmRhdGE7XG4gICAgY29uc3QgdGFyZ2V0ID0gPEhUTUxEaXZFbGVtZW50PmV2ZW50LmV2ZW50LnRhcmdldDtcbiAgICBjb25zdCBkcm9wWm9uZUlkID0gdGFyZ2V0LmlkID8/IHRhcmdldC5wYXJlbnRFbGVtZW50Py5pZDtcbiAgICBpZiAoIWRyb3Bab25lSWQpIHtcbiAgICAgIC8vIG5vIHZhbGlkIGRyb3Agem9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3Bab25lSW5mbyA9IG5ldyBEcm9wWm9uZUluZm8oZHJvcFpvbmVJZCk7XG4gICAgY29uc3QgdG9Ob2RlID0gdGhpcy50cmVlQ29udHJvbC5maW5kTm9kZUJ5SWQoZHJvcFpvbmVJbmZvLm5vZGVJZCk7XG4gICAgaWYgKCF0b05vZGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG5vZGUgd2l0aCBpZCAnJHtkcm9wWm9uZUluZm8ubm9kZUlkfScgY291bGQgbm90IGJlIGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJvcFR5cGUgdW5kZWZpbmVkIGNhbiBoYXBwZW4gaWYgZHJvcHBlZCBkaXJlY3RseSB3aXRob3V0IG1vdmluZ1xuICAgIGlmICh0aGlzLmNhbmNlbGVkQnlFc2MgfHwgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsZWRCeUVzYyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydEludG9Ob2RlID1cbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gdG9Ob2RlIDogdG9Ob2RlLnBhcmVudDtcbiAgICBjb25zdCB3cmFwcGVyTGlzdCA9IGluc2VydEludG9Ob2RlPy5jaGlsZHJlbiA/PyB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgY29uc3QgYWRkQXROb2RlSWR4ID0gdGhpcy5maW5kQWRkSW5kZXgoXG4gICAgICBkcm9wWm9uZUluZm8sXG4gICAgICBpbnNlcnRJbnRvTm9kZSxcbiAgICAgIHdyYXBwZXJMaXN0XG4gICAgKTtcblxuICAgIGNvbnN0IHJlbW92ZWRGcm9tSWR4ID0gdGhpcy5yZW1vdmVFbGVtZW50RnJvbVByZXZpb3VzUG9zaXRpb24obW92ZWROb2RlKTtcbiAgICAvLyBhZGQgZWxlbWVudCB0byBuZXcgUG9zaXRpb24sIHN1YnRyYWN0IG9uZSBpZiBpbnNlcnRlZCBpbiBzYW1lIGxpc3QgYWZ0ZXIgdGhlIHJlbW92ZSBwb3NpdGlvblxuICAgIChpbnNlcnRJbnRvTm9kZT8uZGF0YS5jaGlsZHJlbiA/PyB0aGlzLm5vZGVzISkuc3BsaWNlKFxuICAgICAgbW92ZWROb2RlLnBhcmVudD8uaWQgPT09IGluc2VydEludG9Ob2RlPy5pZCAmJlxuICAgICAgICByZW1vdmVkRnJvbUlkeCA8IGFkZEF0Tm9kZUlkeFxuICAgICAgICA/IGFkZEF0Tm9kZUlkeCAtIDFcbiAgICAgICAgOiBhZGRBdE5vZGVJZHgsXG4gICAgICAwLFxuICAgICAgbW92ZWROb2RlLmRhdGFcbiAgICApO1xuXG4gICAgY29uc3QgYWZ0ZXJOb2RlSWR4ID0gYWRkQXROb2RlSWR4IC0gMTtcbiAgICBjb25zdCBhZnRlck5vZGUgPVxuICAgICAgYWZ0ZXJOb2RlSWR4ID4gLTEgJiYgd3JhcHBlckxpc3QubGVuZ3RoID4gYWZ0ZXJOb2RlSWR4XG4gICAgICAgID8gd3JhcHBlckxpc3RbYWZ0ZXJOb2RlSWR4XVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGJlZm9yZU5vZGUgPVxuICAgICAgYWRkQXROb2RlSWR4ID4gLTEgJiYgd3JhcHBlckxpc3QubGVuZ3RoID4gYWRkQXROb2RlSWR4XG4gICAgICAgID8gd3JhcHBlckxpc3RbYWRkQXROb2RlSWR4XVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5vZGVNb3ZlZC5lbWl0KHtcbiAgICAgIG5vZGU6IG1vdmVkTm9kZSxcbiAgICAgIHBhcmVudDpcbiAgICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0lOVE8gPyB0b05vZGUgOiB0b05vZGUucGFyZW50LFxuICAgICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGUsXG4gICAgICBiZWZvcmVOb2RlOiBiZWZvcmVOb2RlLFxuICAgIH0pO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBOZ2N4VHJlZURhdGFTb3VyY2UoXG4gICAgICB0aGlzLmNyZWF0ZVdyYXBwZXJOb2Rlcyh0aGlzLm5vZGVzISlcbiAgICApO1xuICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQWRkSW5kZXgoXG4gICAgZHJvcFpvbmVJbmZvOiBEcm9wWm9uZUluZm8sXG4gICAgaW5zZXJ0SW50b05vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4gfCB1bmRlZmluZWQsXG4gICAgaW5zZXJ0SW50b0xpc3Q6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5bXVxuICApIHtcbiAgICBpZiAoXG4gICAgICBpbnNlcnRJbnRvTm9kZSAmJlxuICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0lOVE8gJiZcbiAgICAgICFpbnNlcnRJbnRvTm9kZS5kYXRhLmNoaWxkcmVuXG4gICAgKSB7XG4gICAgICBpbnNlcnRJbnRvTm9kZS5kYXRhLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGxldCBhZGRBdE5vZGVJZHggPSAwO1xuICAgIGlmIChcbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9BRlRFUiB8fFxuICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0JFRk9SRVxuICAgICkge1xuICAgICAgYWRkQXROb2RlSWR4ID0gaW5zZXJ0SW50b0xpc3QuZmluZEluZGV4KFxuICAgICAgICAoY2hpbGQpID0+IGNoaWxkLmlkID09PSBkcm9wWm9uZUluZm8ubm9kZUlkXG4gICAgICApO1xuICAgICAgaWYgKGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9BRlRFUikge1xuICAgICAgICBhZGRBdE5vZGVJZHgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFkZEF0Tm9kZUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRWxlbWVudEZyb21QcmV2aW91c1Bvc2l0aW9uKFxuICAgIG1vdmVkTm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPlxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHJlbW92ZUZyb21MaXN0ID0gbW92ZWROb2RlLnBhcmVudD8uZGF0YS5jaGlsZHJlbiA/PyB0aGlzLm5vZGVzITtcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IHJlbW92ZUZyb21MaXN0LmZpbmRJbmRleChcbiAgICAgIChjaGlsZDogYW55KSA9PiBjaGlsZC5pZCA9PT0gbW92ZWROb2RlLmlkXG4gICAgKTtcbiAgICByZW1vdmVGcm9tTGlzdC5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIHJldHVybiByZW1vdmVJbmRleDtcbiAgfVxuXG4gIG5vZGVDbGlja2VkKG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSB7XG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQobm9kZVdyYXBwZXIpO1xuICAgIGlmIChub2RlV3JhcHBlci5pc1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID1cbiAgICAgICAgbm9kZVdyYXBwZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWROb2RlPy5pZCA/IHVuZGVmaW5lZCA6IG5vZGVXcmFwcGVyO1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHRoaXMuc2VsZWN0ZWROb2RlKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3ROb2RlKG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFub2RlV3JhcHBlciB8fCBub2RlV3JhcHBlci5pc1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZVdyYXBwZXI7XG4gICAgICBsZXQgZXhwYW5kTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlPy5wYXJlbnQ7XG4gICAgICB3aGlsZSAoZXhwYW5kTm9kZSkge1xuICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChleHBhbmROb2RlKTtcbiAgICAgICAgZXhwYW5kTm9kZSA9IGV4cGFuZE5vZGUucGFyZW50O1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHRoaXMuc2VsZWN0ZWROb2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZW51bSBEcm9wVHlwZSB7XG4gIERST1BfQUZURVIgPSAnRFJPUF9BRlRFUicsXG4gIERST1BfQkVGT1JFID0gJ0RST1BfQkVGT1JFJyxcbiAgRFJPUF9JTlRPID0gJ0RST1BfSU5UTycsXG59XG5cbmV4cG9ydCBjbGFzcyBOZ2N4VHJlZUNvbnRyb2w8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4gZXh0ZW5kcyBOZXN0ZWRUcmVlQ29udHJvbDxcbiAgTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgc3RyaW5nXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0cmVlQ29tcG9uZW50OiBOZ2N4VHJlZUNvbXBvbmVudDxUPixcbiAgICBnZXRDaGlsZHJlbjogKGRhdGFOb2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+W10sXG4gICAgb3B0aW9ucz86IE5lc3RlZFRyZWVDb250cm9sT3B0aW9uczxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+LCBzdHJpbmc+XG4gICkge1xuICAgIHN1cGVyKGdldENoaWxkcmVuLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZWxlY3QgYSBub2RlIGJ5IGlkLiB0aGUgc2VsZWN0RXZlbnQgaXMgZmlyZWQgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHNlbGVjdE5vZGVCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRyZWVDb21wb25lbnQuc2VsZWN0Tm9kZSh0aGlzLmZpbmROb2RlQnlJZChpZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgYSBub2RlIGJ5IGlkLlxuICAgKi9cbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTm9kZUJ5SWRJbk5vZGVzKFxuICAgICAgdGhpcy50cmVlQ29tcG9uZW50LmRhdGFTb3VyY2UuZGF0YSQudmFsdWUsXG4gICAgICBpZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbmROb2RlQnlJZEluTm9kZXMoXG4gICAgbm9kZXM6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5bXSxcbiAgICBpZDogc3RyaW5nXG4gICk6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKG5vZGUuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZm91bmROb2RlID0gdGhpcy5maW5kTm9kZUJ5SWRJbk5vZGVzKG5vZGUuY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kTm9kZSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmNsYXNzIERyb3Bab25lSW5mbyB7XG4gIGRyb3BUeXBlOiBEcm9wVHlwZTtcbiAgbm9kZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHBvcyA9IGlkLmluZGV4T2YoJ18nKTtcbiAgICB0aGlzLm5vZGVJZCA9IGlkLnN1YnN0cmluZygwLCBwb3MpO1xuICAgIHRoaXMuZHJvcFR5cGUgPSA8RHJvcFR5cGU+aWQuc3Vic3RyaW5nKHBvcyArIDEpO1xuICB9XG59XG4iLCI8Y2RrLXRyZWVcbiAgI3RyZWVcbiAgY2xhc3M9XCJuZ2N4LXRyZWVcIlxuICAqbmdJZj1cImRhdGFTb3VyY2VcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgY2RrRHJvcExpc3RHcm91cFxuICBbY2xhc3MuZHJhZ2dpbmddPVwiZHJhZ2dpbmdcIlxuICAoa2V5dXAuYXJyb3d1cCk9XCJrZXlEb3duQXJyb3dVcCgkZXZlbnQpXCJcbiAgKGtleWRvd24uYXJyb3dkb3duKT1cImtleURvd25BcnJvd0Rvd24oJGV2ZW50KVwiXG4gIChrZXlkb3duLmFycm93bGVmdCk9XCJrZXlEb3duQXJyb3dMZWZ0KCRldmVudClcIlxuICAoa2V5ZG93bi5hcnJvd3JpZ2h0KT1cImtleURvd25BcnJvd1JpZ2h0KCRldmVudClcIlxuICB0YWJpbmRleD1cIjBcIj5cbiAgPGNkay1uZXN0ZWQtdHJlZS1ub2RlICpjZGtUcmVlTm9kZURlZj1cImxldCBub2RlXCIgY2xhc3M9XCJ0cmVlLW5vZGVcIj5cbiAgICA8ZGl2XG4gICAgICBjZGtEcm9wTGlzdFxuICAgICAgW2lkXT1cIm5vZGUuaWQgKyAnXycgKyBEcm9wVHlwZS5EUk9QX0FGVEVSXCJcbiAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgYWZ0ZXItZXhwYW5kZWQtbm9kZVwiXG4gICAgICBbY2xhc3MuaGlkZV09XCJcbiAgICAgICAgIWFsbG93RHJvcChub2RlLCBEcm9wVHlwZS5EUk9QX0FGVEVSKSB8fCAhdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVxuICAgICAgXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1pbnNlcnQtbGluZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtpZF09XCJub2RlLmlkICsgJ18nICsgRHJvcFR5cGUuRFJPUF9CRUZPUkVcIlxuICAgICAgICBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXItZHJvcC16b25lIGJlZm9yZS1ub2RlXCJcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwiXG4gICAgICAgICAgIW5vZGUuaXNGaXJzdENoaWxkIHx8ICFhbGxvd0Ryb3Aobm9kZSwgRHJvcFR5cGUuRFJPUF9CRUZPUkUpXG4gICAgICAgIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1pbnNlcnQtbGluZVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtpZF09XCJub2RlLmlkICsgJ18nICsgRHJvcFR5cGUuRFJPUF9JTlRPXCJcbiAgICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGFpbmVyLWRyb3Atem9uZSBpbnRvLW5vZGVcIlxuICAgICAgICBbY2xhc3MuaGlkZV09XCIhYWxsb3dEcm9wKG5vZGUsIERyb3BUeXBlLkRST1BfSU5UTylcIj48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2lkXT1cIm5vZGUuaWQgKyAnXycgKyBEcm9wVHlwZS5EUk9QX0FGVEVSXCJcbiAgICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGFpbmVyLWRyb3Atem9uZSBhZnRlci1ub2RlXCJcbiAgICAgICAgW2NsYXNzLmxhc3RdPVwibm9kZS5pc0xhc3RDaGlsZFwiXG4gICAgICAgIFtjbGFzcy5oaWRlXT1cIlxuICAgICAgICAgIHRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgfHwgIWFsbG93RHJvcChub2RlLCBEcm9wVHlwZS5EUk9QX0FGVEVSKVxuICAgICAgICBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtaW5zZXJ0LWxpbmVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cIm5vZGVcIlxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJkaXNhYmxlXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0U29ydFByZWRpY2F0ZV09XCJkaXNhYmxlXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJkaXNhYmxlRHJhZyhub2RlKVwiXG4gICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIm5vZGVcIlxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJkcmFnZ2luZyA9IG5vZGVcIlxuICAgICAgICAgIChjZGtEcmFnUmVsZWFzZWQpPVwiaGFuZGxlRHJhZ1JlbGVhc2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgKmNka0RyYWdQbGFjZWhvbGRlcj48L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInRyZWUtbm9kZS1jb250ZW50LWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbY2xhc3MuZmlyc3RdPVwibm9kZS5pc0ZpcnN0Q2hpbGRcIlxuICAgICAgICAgICAgW2NsYXNzLmxhc3RdPVwibm9kZS5pc0xhc3RDaGlsZFwiXG4gICAgICAgICAgICBbY2xhc3MuZXhwYW5kZWRdPVwidHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVwiPlxuICAgICAgICAgICAgPG5nY3gtdHJlZS1ub2RlXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxuICAgICAgICAgICAgICBbbm9kZVdyYXBwZXJdPVwibm9kZVwiXG4gICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cIm5vZGUuaWQgPT09IHNlbGVjdGVkTm9kZT8uaWRcIlxuICAgICAgICAgICAgICBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbdHJlZUNvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgICAoY3VzdG9tRXZlbnQpPVwiY3VzdG9tRXZlbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrRXZlbnQpPVwibm9kZUNsaWNrZWQobm9kZSlcIj48L25nY3gtdHJlZS1ub2RlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nY3gtdHJlZS1ub2RlXG4gICAgICAgICAgKm5nSWY9XCJub2RlLmlkID09PSBkcmFnZ2luZz8uaWRcIlxuICAgICAgICAgIFtub2RlV3JhcHBlcl09XCJub2RlXCJcbiAgICAgICAgICBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIlxuICAgICAgICAgIFt0cmVlQ29uZmlnXT1cImNvbmZpZ1wiPjwvbmdjeC10cmVlLW5vZGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSlcIlxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY2hpbGRyZW4tY29udGFpbmVyXCJcbiAgICAgIFtjbGFzcy5maXJzdF09XCJub2RlLmlzRmlyc3RDaGlsZFwiXG4gICAgICBbY2xhc3MubGFzdF09XCJub2RlLmlzTGFzdENoaWxkXCI+XG4gICAgICA8ZGl2IGNka1RyZWVOb2RlT3V0bGV0PjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Nkay1uZXN0ZWQtdHJlZS1ub2RlPlxuPC9jZGstdHJlZT5cbiJdfQ==
349
+ class DropControl {
350
+ constructor(hideDrop, preventDrop, preventDropReason = '') {
351
+ this.hideDrop = hideDrop;
352
+ this.preventDrop = preventDrop;
353
+ this.preventDropReason = preventDropReason;
354
+ }
355
+ }
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FFbEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFPN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBUy9DLE1BQU0sT0FBTyxpQkFBaUI7SUFQOUI7UUFhWSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFDMUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO1FBQ3BDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUN4RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRW5FOztXQUVHO1FBQ2EsZ0JBQVcsR0FBdUIsSUFBSSxlQUFlLENBQ25FLElBQUksRUFDSixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDdkI7WUFDRSxPQUFPLEVB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QVgsV0FBVyxDQUFTO1FBQ3BCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBYTtJQUNwQyxDQUFDO0NBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDZGtEcmFnLFxuICBDZGtEcmFnUmVsZWFzZSxcbiAgQ2RrRHJvcExpc3QsXG4gIERyYWdEcm9wTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gIENka1RyZWVNb2R1bGUsXG4gIE5lc3RlZFRyZWVDb250cm9sLFxuICBOZXN0ZWRUcmVlQ29udHJvbE9wdGlvbnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdjeFRyZWVEYXRhU291cmNlIH0gZnJvbSAnLi9uZ2N4LXRyZWUtZGF0YS5zb3VyY2UnO1xuaW1wb3J0IHtcbiAgTmdjeFRyZWVDb25maWcsXG4gIE5nY3hUcmVlTm9kZSxcbiAgTmdjeFRyZWVOb2RlTW92ZWRFdmVudCxcbiAgTmdjeFRyZWVOb2RlV3JhcHBlcixcbn0gZnJvbSAnLi9uZ2N4LXRyZWUtbW9kZWxzJztcbmltcG9ydCB7IE5nY3hUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vbmdjeC10cmVlLW5vZGUvbmdjeC10cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IGlzUGFyZW50T2YgfSBmcm9tICcuL25nY3gtdHJlZS11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nY3gtdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnbmdjeC10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ25nY3gtdHJlZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2RrVHJlZU1vZHVsZSwgRHJhZ0Ryb3BNb2R1bGUsIE5nY3hUcmVlTm9kZUNvbXBvbmVudCwgTmdJZl0sXG59KVxuZXhwb3J0IGNsYXNzIE5nY3hUcmVlQ29tcG9uZW50PFQgZXh0ZW5kcyBOZ2N4VHJlZU5vZGU+XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXRcbntcbiAgQElucHV0KCkgbm9kZXM/OiBOZ2N4VHJlZU5vZGVbXTtcbiAgQElucHV0KCkgY29uZmlnPzogTmdjeFRyZWVDb25maWc8VD47XG5cbiAgQE91dHB1dCgpIG5vZGVNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TmdjeFRyZWVOb2RlTW92ZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGN1c3RvbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PigpO1xuXG4gIC8qKlxuICAgKiBBcGkgZm9yIGZpbmRpbmcgYW5kIHNlbGVjdGluZyBub2RlLiBFeHRlbmRzIGZyb20gdGhlIENESyB0cmVlQ29udHJvbCBmb3IgZXhwYW5kaW5nL2NvbGxhcHNpbmcgdGhlIHRyZWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmVlQ29udHJvbDogTmdjeFRyZWVDb250cm9sPFQ+ID0gbmV3IE5nY3hUcmVlQ29udHJvbDxUPihcbiAgICB0aGlzLFxuICAgIChub2RlKSA9PiBub2RlLmNoaWxkcmVuLFxuICAgIHtcbiAgICAgIHRyYWNrQnk6IChub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBub2RlLmlkLFxuICAgIH1cbiAgKTtcblxuICBkYXRhU291cmNlOiBOZ2N4VHJlZURhdGFTb3VyY2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4gPVxuICAgIG5ldyBOZ2N4VHJlZURhdGFTb3VyY2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj4oW10pO1xuXG4gIHByb3RlY3RlZCBkcmFnZ2luZz86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG5cbiAgcHJvdGVjdGVkIHNlbGVjdGVkTm9kZT86IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERyb3BUeXBlID0gRHJvcFR5cGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc2FibGUgPSAoKSA9PiBmYWxzZTtcblxuICBwcml2YXRlIGNhbmNlbGVkQnlFc2M/OiBib29sZWFuO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVHJlZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydub2RlcyddKSB7XG4gICAgICBpZiAodGhpcy50cmVlQ29udHJvbCkge1xuICAgICAgICAvLyBpbml0aWFsaXplZCBhbHJlYWR5XG4gICAgICAgIHRoaXMudXBkYXRlVHJlZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZUlkID0gdGhpcy5zZWxlY3RlZE5vZGUuaWQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmVlQ29udHJvbC5zZWxlY3ROb2RlQnlJZChzZWxlY3RlZE5vZGVJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVHJlZSgpIHtcbiAgICBjb25zdCB3cmFwcGVyTm9kZXMgPSB0aGlzLmNyZWF0ZVdyYXBwZXJOb2Rlcyh0aGlzLm5vZGVzID8/IFtdKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTmdjeFRyZWVEYXRhU291cmNlKHdyYXBwZXJOb2Rlcyk7XG4gICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdyYXBwZXJOb2RlcyhcbiAgICBub2RlczogTmdjeFRyZWVOb2RlW10sXG4gICAgcGFyZW50PzogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgICBkZXB0aDogbnVtYmVyID0gMFxuICApOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+W10ge1xuICAgIGNvbnN0IGNoaWxkQ291bnQgPSBub2Rlcy5sZW5ndGg7XG4gICAgY29uc3Qgd3JhcHBlck5vZGVzID0gbm9kZXMubWFwKChub2RlLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+ID0ge1xuICAgICAgICBpZDogbm9kZS5pZCxcbiAgICAgICAgZGF0YTogPFQ+bm9kZSxcbiAgICAgICAgaXNGaXJzdENoaWxkOiBpZHggPT09IDAsXG4gICAgICAgIGlzTGFzdENoaWxkOiBpZHggPT09IGNoaWxkQ291bnQgLSAxLFxuICAgICAgICBpbmRleDogaWR4LFxuICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgICAgbm9kZVdyYXBwZXIuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuXG4gICAgICAgID8gdGhpcy5jcmVhdGVXcmFwcGVyTm9kZXMobm9kZS5jaGlsZHJlbiwgbm9kZVdyYXBwZXIsIGRlcHRoICsgMSlcbiAgICAgICAgOiBbXTtcblxuICAgICAgcmV0dXJuIG5vZGVXcmFwcGVyO1xuICAgIH0pO1xuICAgIHdyYXBwZXJOb2Rlcy5mb3JFYWNoKCh3cmFwcGVyTm9kZSkgPT4ge1xuICAgICAgaWYgKCF3cmFwcGVyTm9kZS5pc0xhc3RDaGlsZCkge1xuICAgICAgICB3cmFwcGVyTm9kZS5uZXh0ID0gd3JhcHBlck5vZGVzW3dyYXBwZXJOb2RlLmluZGV4ICsgMV07XG4gICAgICB9XG4gICAgICBpZiAoIXdyYXBwZXJOb2RlLmlzRmlyc3RDaGlsZCkge1xuICAgICAgICB3cmFwcGVyTm9kZS5wcmV2aW91cyA9IHdyYXBwZXJOb2Rlc1t3cmFwcGVyTm9kZS5pbmRleCAtIDFdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnPy5hbGxvd1NlbGVjdGlvbj8uKHdyYXBwZXJOb2RlKSkge1xuICAgICAgICB3cmFwcGVyTm9kZS5pc1NlbGVjdGFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB3cmFwcGVyTm9kZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZURyb3AoXG4gICAgZHJvcE5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4sXG4gICAgZHJvcFR5cGU6IERyb3BUeXBlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmRyYWdnaW5nIHx8XG4gICAgICB0aGlzLmRyYWdnaW5nLmlkID09PSBkcm9wTm9kZS5pZCB8fFxuICAgICAgaXNQYXJlbnRPZih0aGlzLmRyYWdnaW5nLCBkcm9wTm9kZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0lOVE8gJiZcbiAgICAgIGRyb3BOb2RlLmlkID09PSB0aGlzLmRyYWdnaW5nLnBhcmVudD8uaWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0FGVEVSICYmXG4gICAgICBkcm9wTm9kZS5uZXh0Py5pZCA9PT0gdGhpcy5kcmFnZ2luZy5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRyb3BUeXBlID09IERyb3BUeXBlLkRST1BfQkVGT1JFICYmXG4gICAgICBkcm9wTm9kZS5wcmV2aW91cz8uaWQgPT09IHRoaXMuZHJhZ2dpbmcuaWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWxsb3dEcm9wKFxuICAgIGRyb3BOb2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+LFxuICAgIGRyb3BUeXBlOiBEcm9wVHlwZVxuICApOiBEcm9wQ29udHJvbCB7XG4gICAgY29uc3QgaGlkZURyb3AgPSB0aGlzLmhpZGVEcm9wKGRyb3BOb2RlLCBkcm9wVHlwZSk7XG5cbiAgICBjb25zdCBpbnRvTm9kZSA9XG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0lOVE8gPyBkcm9wTm9kZSA6IGRyb3BOb2RlLnBhcmVudDtcblxuICAgIGxldCBwcmV2ZW50RHJvcFJlYXNvbjtcbiAgICBsZXQgYWxsb3dEcm9wID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWc/LnByZXZlbnREcm9wUmVhc29uICYmIHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHByZXZlbnREcm9wUmVhc29uID0gdGhpcy5jb25maWcucHJldmVudERyb3BSZWFzb24oXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcsXG4gICAgICAgIGludG9Ob2RlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWc/LmFsbG93RHJvcCAmJiB0aGlzLmRyYWdnaW5nKSB7XG4gICAgICBhbGxvd0Ryb3AgPSB0aGlzLmNvbmZpZy5hbGxvd0Ryb3AodGhpcy5kcmFnZ2luZywgaW50b05vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHJvcENvbnRyb2woXG4gICAgICBoaWRlRHJvcCxcbiAgICAgICFhbGxvd0Ryb3AgfHwgISFwcmV2ZW50RHJvcFJlYXNvbixcbiAgICAgIHByZXZlbnREcm9wUmVhc29uXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByZXZlbnQgZHJvcCBkaXJlY3RseSBhZnRlciBhIG5vZGUgb24gc2FtZSBsZXZlbCwgdGhhdCBpcyBleHBhbmRlZFxuICBwcm90ZWN0ZWQgc29ydFByZWRpY2F0ZSgpOiAoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkcmFnOiBDZGtEcmFnLFxuICAgIGRyb3A6IENka0Ryb3BMaXN0XG4gICkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBfZHJhZzogQ2RrRHJhZzxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+PixcbiAgICAgIGRyb3A6IENka0Ryb3BMaXN0PE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4+XG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4gaW5kZXggPT0gMCB8fCAhdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKGRyb3AuZGF0YSk7XG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNhYmxlRHJhZyhub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5hbGxvd0RyYWcgPyAhdGhpcy5jb25maWcuYWxsb3dEcmFnKG5vZGUpIDogZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93VXAoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlLmlzRmlyc3RDaGlsZCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUucHJldmlvdXMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBrZXlEb3duQXJyb3dEb3duKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZS5pc0xhc3RDaGlsZCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUubmV4dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudD8ubmV4dCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50Lm5leHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93TGVmdChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQodGhpcy5zZWxlY3RlZE5vZGUpKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2UodGhpcy5zZWxlY3RlZE5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZT8ucGFyZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQga2V5RG93bkFycm93UmlnaHQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlICYmIHRoaXMuc2VsZWN0ZWROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Tm9kZSh0aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlblswXSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKG5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLmVzY2FwZScpXG4gIHByb3RlY3RlZCBrZXlFc2NhcGVXaGlsZURyYWdnaW5nKCkge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XG4gICAgICB0aGlzLmNhbmNlbGVkQnlFc2MgPSB0cnVlO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ21vdXNldXAnKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZURyYWdSZWxlYXNlKGV2ZW50OiBDZGtEcmFnUmVsZWFzZTxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+Pikge1xuICAgIHRoaXMuaGFuZGxlRHJhZ1JlbGVhc2VJbnRlcm5hbChldmVudCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ1JlbGVhc2VJbnRlcm5hbChcbiAgICBldmVudDogQ2RrRHJhZ1JlbGVhc2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxUPj5cbiAgKSB7XG4gICAgY29uc3QgbW92ZWROb2RlID0gZXZlbnQuc291cmNlLmRhdGE7XG4gICAgY29uc3QgdGFyZ2V0ID0gPEhUTUxEaXZFbGVtZW50PmV2ZW50LmV2ZW50LnRhcmdldDtcbiAgICBjb25zdCBkcm9wWm9uZUlkID0gdGFyZ2V0LmlkID8/IHRhcmdldC5wYXJlbnRFbGVtZW50Py5pZDtcbiAgICBpZiAoIWRyb3Bab25lSWQpIHtcbiAgICAgIC8vIG5vIHZhbGlkIGRyb3Agem9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3Bab25lSW5mbyA9IG5ldyBEcm9wWm9uZUluZm8oZHJvcFpvbmVJZCk7XG4gICAgY29uc3QgdG9Ob2RlID0gdGhpcy50cmVlQ29udHJvbC5maW5kTm9kZUJ5SWQoZHJvcFpvbmVJbmZvLm5vZGVJZCk7XG4gICAgaWYgKCF0b05vZGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG5vZGUgd2l0aCBpZCAnJHtkcm9wWm9uZUluZm8ubm9kZUlkfScgY291bGQgbm90IGJlIGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcENvbnRyb2wgPSB0aGlzLmFsbG93RHJvcCh0b05vZGUsIGRyb3Bab25lSW5mby5kcm9wVHlwZSk7XG4gICAgaWYgKGRyb3BDb250cm9sLmhpZGVEcm9wIHx8IGRyb3BDb250cm9sLnByZXZlbnREcm9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJvcFR5cGUgdW5kZWZpbmVkIGNhbiBoYXBwZW4gaWYgZHJvcHBlZCBkaXJlY3RseSB3aXRob3V0IG1vdmluZ1xuICAgIGlmICh0aGlzLmNhbmNlbGVkQnlFc2MgfHwgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsZWRCeUVzYyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydEludG9Ob2RlID1cbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gdG9Ob2RlIDogdG9Ob2RlLnBhcmVudDtcbiAgICBjb25zdCB3cmFwcGVyTGlzdCA9IGluc2VydEludG9Ob2RlPy5jaGlsZHJlbiA/PyB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgY29uc3QgYWRkQXROb2RlSWR4ID0gdGhpcy5maW5kQWRkSW5kZXgoXG4gICAgICBkcm9wWm9uZUluZm8sXG4gICAgICBpbnNlcnRJbnRvTm9kZSxcbiAgICAgIHdyYXBwZXJMaXN0XG4gICAgKTtcblxuICAgIGNvbnN0IHJlbW92ZWRGcm9tSWR4ID0gdGhpcy5yZW1vdmVFbGVtZW50RnJvbVByZXZpb3VzUG9zaXRpb24obW92ZWROb2RlKTtcbiAgICAvLyBhZGQgZWxlbWVudCB0byBuZXcgUG9zaXRpb24sIHN1YnRyYWN0IG9uZSBpZiBpbnNlcnRlZCBpbiBzYW1lIGxpc3QgYWZ0ZXIgdGhlIHJlbW92ZSBwb3NpdGlvblxuICAgIChpbnNlcnRJbnRvTm9kZT8uZGF0YS5jaGlsZHJlbiA/PyB0aGlzLm5vZGVzISkuc3BsaWNlKFxuICAgICAgbW92ZWROb2RlLnBhcmVudD8uaWQgPT09IGluc2VydEludG9Ob2RlPy5pZCAmJlxuICAgICAgICByZW1vdmVkRnJvbUlkeCA8IGFkZEF0Tm9kZUlkeFxuICAgICAgICA/IGFkZEF0Tm9kZUlkeCAtIDFcbiAgICAgICAgOiBhZGRBdE5vZGVJZHgsXG4gICAgICAwLFxuICAgICAgbW92ZWROb2RlLmRhdGFcbiAgICApO1xuXG4gICAgY29uc3QgYWZ0ZXJOb2RlSWR4ID0gYWRkQXROb2RlSWR4IC0gMTtcbiAgICBjb25zdCBhZnRlck5vZGUgPVxuICAgICAgYWZ0ZXJOb2RlSWR4ID4gLTEgJiYgd3JhcHBlckxpc3QubGVuZ3RoID4gYWZ0ZXJOb2RlSWR4XG4gICAgICAgID8gd3JhcHBlckxpc3RbYWZ0ZXJOb2RlSWR4XVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGJlZm9yZU5vZGUgPVxuICAgICAgYWRkQXROb2RlSWR4ID4gLTEgJiYgd3JhcHBlckxpc3QubGVuZ3RoID4gYWRkQXROb2RlSWR4XG4gICAgICAgID8gd3JhcHBlckxpc3RbYWRkQXROb2RlSWR4XVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5vZGVNb3ZlZC5lbWl0KHtcbiAgICAgIG5vZGU6IG1vdmVkTm9kZSxcbiAgICAgIHBhcmVudDpcbiAgICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0lOVE8gPyB0b05vZGUgOiB0b05vZGUucGFyZW50LFxuICAgICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGUsXG4gICAgICBiZWZvcmVOb2RlOiBiZWZvcmVOb2RlLFxuICAgIH0pO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBOZ2N4VHJlZURhdGFTb3VyY2UoXG4gICAgICB0aGlzLmNyZWF0ZVdyYXBwZXJOb2Rlcyh0aGlzLm5vZGVzISlcbiAgICApO1xuICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQWRkSW5kZXgoXG4gICAgZHJvcFpvbmVJbmZvOiBEcm9wWm9uZUluZm8sXG4gICAgaW5zZXJ0SW50b05vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4gfCB1bmRlZmluZWQsXG4gICAgaW5zZXJ0SW50b0xpc3Q6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5bXVxuICApIHtcbiAgICBpZiAoXG4gICAgICBpbnNlcnRJbnRvTm9kZSAmJlxuICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0lOVE8gJiZcbiAgICAgICFpbnNlcnRJbnRvTm9kZS5kYXRhLmNoaWxkcmVuXG4gICAgKSB7XG4gICAgICBpbnNlcnRJbnRvTm9kZS5kYXRhLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGxldCBhZGRBdE5vZGVJZHggPSAwO1xuICAgIGlmIChcbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9BRlRFUiB8fFxuICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0JFRk9SRVxuICAgICkge1xuICAgICAgYWRkQXROb2RlSWR4ID0gaW5zZXJ0SW50b0xpc3QuZmluZEluZGV4KFxuICAgICAgICAoY2hpbGQpID0+IGNoaWxkLmlkID09PSBkcm9wWm9uZUluZm8ubm9kZUlkXG4gICAgICApO1xuICAgICAgaWYgKGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9BRlRFUikge1xuICAgICAgICBhZGRBdE5vZGVJZHgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFkZEF0Tm9kZUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRWxlbWVudEZyb21QcmV2aW91c1Bvc2l0aW9uKFxuICAgIG1vdmVkTm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxUPlxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHJlbW92ZUZyb21MaXN0ID0gbW92ZWROb2RlLnBhcmVudD8uZGF0YS5jaGlsZHJlbiA/PyB0aGlzLm5vZGVzITtcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IHJlbW92ZUZyb21MaXN0LmZpbmRJbmRleChcbiAgICAgIChjaGlsZDogYW55KSA9PiBjaGlsZC5pZCA9PT0gbW92ZWROb2RlLmlkXG4gICAgKTtcbiAgICByZW1vdmVGcm9tTGlzdC5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIHJldHVybiByZW1vdmVJbmRleDtcbiAgfVxuXG4gIG5vZGVDbGlja2VkKG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSB7XG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQobm9kZVdyYXBwZXIpO1xuICAgIGlmIChub2RlV3JhcHBlci5pc1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID1cbiAgICAgICAgbm9kZVdyYXBwZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWROb2RlPy5pZCA/IHVuZGVmaW5lZCA6IG5vZGVXcmFwcGVyO1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHRoaXMuc2VsZWN0ZWROb2RlKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3ROb2RlKG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFub2RlV3JhcHBlciB8fCBub2RlV3JhcHBlci5pc1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZVdyYXBwZXI7XG4gICAgICBsZXQgZXhwYW5kTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlPy5wYXJlbnQ7XG4gICAgICB3aGlsZSAoZXhwYW5kTm9kZSkge1xuICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChleHBhbmROb2RlKTtcbiAgICAgICAgZXhwYW5kTm9kZSA9IGV4cGFuZE5vZGUucGFyZW50O1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHRoaXMuc2VsZWN0ZWROb2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZW51bSBEcm9wVHlwZSB7XG4gIERST1BfQUZURVIgPSAnRFJPUF9BRlRFUicsXG4gIERST1BfQkVGT1JFID0gJ0RST1BfQkVGT1JFJyxcbiAgRFJPUF9JTlRPID0gJ0RST1BfSU5UTycsXG59XG5cbmV4cG9ydCBjbGFzcyBOZ2N4VHJlZUNvbnRyb2w8VCBleHRlbmRzIE5nY3hUcmVlTm9kZT4gZXh0ZW5kcyBOZXN0ZWRUcmVlQ29udHJvbDxcbiAgTmdjeFRyZWVOb2RlV3JhcHBlcjxUPixcbiAgc3RyaW5nXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0cmVlQ29tcG9uZW50OiBOZ2N4VHJlZUNvbXBvbmVudDxUPixcbiAgICBnZXRDaGlsZHJlbjogKGRhdGFOb2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+KSA9PiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+W10sXG4gICAgb3B0aW9ucz86IE5lc3RlZFRyZWVDb250cm9sT3B0aW9uczxOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+LCBzdHJpbmc+XG4gICkge1xuICAgIHN1cGVyKGdldENoaWxkcmVuLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZWxlY3QgYSBub2RlIGJ5IGlkLiB0aGUgc2VsZWN0RXZlbnQgaXMgZmlyZWQgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHNlbGVjdE5vZGVCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRyZWVDb21wb25lbnQuc2VsZWN0Tm9kZSh0aGlzLmZpbmROb2RlQnlJZChpZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgYSBub2RlIGJ5IGlkLlxuICAgKi9cbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTm9kZUJ5SWRJbk5vZGVzKFxuICAgICAgdGhpcy50cmVlQ29tcG9uZW50LmRhdGFTb3VyY2UuZGF0YSQudmFsdWUsXG4gICAgICBpZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbmROb2RlQnlJZEluTm9kZXMoXG4gICAgbm9kZXM6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD5bXSxcbiAgICBpZDogc3RyaW5nXG4gICk6IE5nY3hUcmVlTm9kZVdyYXBwZXI8VD4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKG5vZGUuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZm91bmROb2RlID0gdGhpcy5maW5kTm9kZUJ5SWRJbk5vZGVzKG5vZGUuY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kTm9kZSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmNsYXNzIERyb3Bab25lSW5mbyB7XG4gIGRyb3BUeXBlOiBEcm9wVHlwZTtcbiAgbm9kZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHBvcyA9IGlkLmluZGV4T2YoJ18nKTtcbiAgICB0aGlzLm5vZGVJZCA9IGlkLnN1YnN0cmluZygwLCBwb3MpO1xuICAgIHRoaXMuZHJvcFR5cGUgPSA8RHJvcFR5cGU+aWQuc3Vic3RyaW5nKHBvcyArIDEpO1xuICB9XG59XG5cbmNsYXNzIERyb3BDb250cm9sIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGhpZGVEcm9wOiBib29sZWFuLFxuICAgIHB1YmxpYyBwcmV2ZW50RHJvcDogYm9vbGVhbixcbiAgICBwdWJsaWMgcHJldmVudERyb3BSZWFzb246IHN0cmluZyA9ICcnXG4gICkge31cbn1cbiIsIjxjZGstdHJlZVxuICAjdHJlZVxuICBjbGFzcz1cIm5nY3gtdHJlZVwiXG4gICpuZ0lmPVwiZGF0YVNvdXJjZVwiXG4gIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIlxuICBjZGtEcm9wTGlzdEdyb3VwXG4gIFtjbGFzcy5kcmFnZ2luZ109XCJkcmFnZ2luZ1wiXG4gIChrZXl1cC5hcnJvd3VwKT1cImtleURvd25BcnJvd1VwKCRldmVudClcIlxuICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwia2V5RG93bkFycm93RG93bigkZXZlbnQpXCJcbiAgKGtleWRvd24uYXJyb3dsZWZ0KT1cImtleURvd25BcnJvd0xlZnQoJGV2ZW50KVwiXG4gIChrZXlkb3duLmFycm93cmlnaHQpPVwia2V5RG93bkFycm93UmlnaHQoJGV2ZW50KVwiXG4gIHRhYmluZGV4PVwiMFwiPlxuICA8Y2RrLW5lc3RlZC10cmVlLW5vZGUgKmNka1RyZWVOb2RlRGVmPVwibGV0IG5vZGVcIiBjbGFzcz1cInRyZWUtbm9kZVwiPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiYWxsb3dEcm9wKG5vZGUsIERyb3BUeXBlLkRST1BfQUZURVIpIGFzIGRyb3BDb250cm9sXCJcbiAgICAgIGNka0Ryb3BMaXN0XG4gICAgICBbaWRdPVwibm9kZS5pZCArICdfJyArIERyb3BUeXBlLkRST1BfQUZURVJcIlxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGFpbmVyLWRyb3Atem9uZSBhZnRlci1leHBhbmRlZC1ub2RlXCJcbiAgICAgIFtjbGFzcy5oaWRlXT1cImRyb3BDb250cm9sLmhpZGVEcm9wIHx8ICF0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXCJcbiAgICAgIFtjbGFzcy5uby1kcm9wXT1cImRyb3BDb250cm9sLnByZXZlbnREcm9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1pbnNlcnQtbGluZVwiPjwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImRyb3BDb250cm9sLnByZXZlbnREcm9wUmVhc29uXCIgY2xhc3M9XCJ0b29sdGlwXCI+XG4gICAgICAgIHt7IGRyb3BDb250cm9sLnByZXZlbnREcm9wUmVhc29uIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImFsbG93RHJvcChub2RlLCBEcm9wVHlwZS5EUk9QX0JFRk9SRSkgYXMgZHJvcENvbnRyb2xcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbaWRdPVwibm9kZS5pZCArICdfJyArIERyb3BUeXBlLkRST1BfQkVGT1JFXCJcbiAgICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGFpbmVyLWRyb3Atem9uZSBiZWZvcmUtbm9kZVwiXG4gICAgICAgIFtjbGFzcy5oaWRlXT1cIiFub2RlLmlzRmlyc3RDaGlsZCB8fCBkcm9wQ29udHJvbC5oaWRlRHJvcFwiXG4gICAgICAgIFtjbGFzcy5uby1kcm9wXT1cImRyb3BDb250cm9sLnByZXZlbnREcm9wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWluc2VydC1saW5lXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFJlYXNvblwiIGNsYXNzPVwidG9vbHRpcFwiPlxuICAgICAgICAgIHt7IGRyb3BDb250cm9sLnByZXZlbnREcm9wUmVhc29uIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiYWxsb3dEcm9wKG5vZGUsIERyb3BUeXBlLkRST1BfSU5UTykgYXMgZHJvcENvbnRyb2xcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbaWRdPVwibm9kZS5pZCArICdfJyArIERyb3BUeXBlLkRST1BfSU5UT1wiXG4gICAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgaW50by1ub2RlXCJcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwiZHJvcENvbnRyb2wuaGlkZURyb3BcIlxuICAgICAgICBbY2xhc3Mubm8tZHJvcF09XCJkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcENvbnRyb2wucHJldmVudERyb3BSZWFzb25cIiBjbGFzcz1cInRvb2x0aXBcIj5cbiAgICAgICAgICB7eyBkcm9wQ29udHJvbC5wcmV2ZW50RHJvcFJlYXNvbiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImFsbG93RHJvcChub2RlLCBEcm9wVHlwZS5EUk9QX0FGVEVSKSBhcyBkcm9wQ29udHJvbFwiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtpZF09XCJub2RlLmlkICsgJ18nICsgRHJvcFR5cGUuRFJPUF9BRlRFUlwiXG4gICAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgYWZ0ZXItbm9kZVwiXG4gICAgICAgIFtjbGFzcy5sYXN0XT1cIm5vZGUuaXNMYXN0Q2hpbGRcIlxuICAgICAgICBbY2xhc3MuaGlkZV09XCJ0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpIHx8IGRyb3BDb250cm9sLmhpZGVEcm9wXCJcbiAgICAgICAgW2NsYXNzLm5vLWRyb3BdPVwiZHJvcENvbnRyb2wucHJldmVudERyb3BcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtaW5zZXJ0LWxpbmVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRyb3BDb250cm9sLnByZXZlbnREcm9wUmVhc29uXCIgY2xhc3M9XCJ0b29sdGlwXCI+XG4gICAgICAgICAge3sgZHJvcENvbnRyb2wucHJldmVudERyb3BSZWFzb24gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJub2RlXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RW50ZXJQcmVkaWNhdGVdPVwiZGlzYWJsZVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRQcmVkaWNhdGVdPVwiZGlzYWJsZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiZGlzYWJsZURyYWcobm9kZSlcIlxuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJub2RlXCJcbiAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwiZHJhZ2dpbmcgPSBub2RlXCJcbiAgICAgICAgICAoY2RrRHJhZ1JlbGVhc2VkKT1cImhhbmRsZURyYWdSZWxlYXNlKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2ICpjZGtEcmFnUGxhY2Vob2xkZXI+PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGVudC1jb250YWluZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmZpcnN0XT1cIm5vZGUuaXNGaXJzdENoaWxkXCJcbiAgICAgICAgICAgIFtjbGFzcy5sYXN0XT1cIm5vZGUuaXNMYXN0Q2hpbGRcIlxuICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cInRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSlcIj5cbiAgICAgICAgICAgIDxuZ2N4LXRyZWUtbm9kZVxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcbiAgICAgICAgICAgICAgW25vZGVXcmFwcGVyXT1cIm5vZGVcIlxuICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJub2RlLmlkID09PSBzZWxlY3RlZE5vZGU/LmlkXCJcbiAgICAgICAgICAgICAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgICAgICAgICAgICAgW3RyZWVDb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgICAgICAgKGN1c3RvbUV2ZW50KT1cImN1c3RvbUV2ZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cIm5vZGVDbGlja2VkKG5vZGUpXCI+PC9uZ2N4LXRyZWUtbm9kZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZ2N4LXRyZWUtbm9kZVxuICAgICAgICAgICpuZ0lmPVwibm9kZS5pZCA9PT0gZHJhZ2dpbmc/LmlkXCJcbiAgICAgICAgICBbbm9kZVdyYXBwZXJdPVwibm9kZVwiXG4gICAgICAgICAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgICAgICAgICBbdHJlZUNvbmZpZ109XCJjb25maWdcIj48L25nY3gtdHJlZS1ub2RlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJ0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXCJcbiAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNoaWxkcmVuLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3MuZmlyc3RdPVwibm9kZS5pc0ZpcnN0Q2hpbGRcIlxuICAgICAgW2NsYXNzLmxhc3RdPVwibm9kZS5pc0xhc3RDaGlsZFwiPlxuICAgICAgPGRpdiBjZGtUcmVlTm9kZU91dGxldD48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9jZGstbmVzdGVkLXRyZWUtbm9kZT5cbjwvY2RrLXRyZWU+XG4iXX0=
@@ -142,29 +142,38 @@ class NgcxTreeComponent {
142
142
  });
143
143
  return wrapperNodes;
144
144
  }
145
- allowDrop(dropNode, dropType) {
145
+ hideDrop(dropNode, dropType) {
146
146
  if (!this.dragging ||
147
147
  this.dragging.id === dropNode.id ||
148
148
  isParentOf(this.dragging, dropNode)) {
149
- return false;
149
+ return true;
150
150
  }
151
151
  if (dropType == DropType.DROP_INTO &&
152
152
  dropNode.id === this.dragging.parent?.id) {
153
- return false;
153
+ return true;
154
154
  }
155
155
  if (dropType == DropType.DROP_AFTER &&
156
156
  dropNode.next?.id === this.dragging.id) {
157
- return false;
157
+ return true;
158
158
  }
159
159
  if (dropType == DropType.DROP_BEFORE &&
160
160
  dropNode.previous?.id === this.dragging.id) {
161
- return false;
161
+ return true;
162
162
  }
163
+ return false;
164
+ }
165
+ allowDrop(dropNode, dropType) {
166
+ const hideDrop = this.hideDrop(dropNode, dropType);
163
167
  const intoNode = dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;
164
- if (this.config?.allowDrop) {
165
- return this.config.allowDrop(this.dragging, intoNode);
168
+ let preventDropReason;
169
+ let allowDrop = true;
170
+ if (this.config?.preventDropReason && this.dragging) {
171
+ preventDropReason = this.config.preventDropReason(this.dragging, intoNode);
166
172
  }
167
- return true;
173
+ if (this.config?.allowDrop && this.dragging) {
174
+ allowDrop = this.config.allowDrop(this.dragging, intoNode);
175
+ }
176
+ return new DropControl(hideDrop, !allowDrop || !!preventDropReason, preventDropReason);
168
177
  }
169
178
  // prevent drop directly after a node on same level, that is expanded
170
179
  sortPredicate() {
@@ -245,7 +254,10 @@ class NgcxTreeComponent {
245
254
  }
246
255
  }
247
256
  handleDragRelease(event) {
257
+ this.handleDragReleaseInternal(event);
248
258
  this.dragging = undefined;
259
+ }
260
+ handleDragReleaseInternal(event) {
249
261
  const movedNode = event.source.data;
250
262
  const target = event.event.target;
251
263
  const dropZoneId = target.id ?? target.parentElement?.id;
@@ -259,6 +271,10 @@ class NgcxTreeComponent {
259
271
  console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);
260
272
  return;
261
273
  }
274
+ const dropControl = this.allowDrop(toNode, dropZoneInfo.dropType);
275
+ if (dropControl.hideDrop || dropControl.preventDrop) {
276
+ return;
277
+ }
262
278
  // dropType undefined can happen if dropped directly without moving
263
279
  if (this.canceledByEsc || dropZoneInfo.dropType === undefined) {
264
280
  this.canceledByEsc = false;
@@ -331,11 +347,11 @@ class NgcxTreeComponent {
331
347
  }
332
348
  }
333
349
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: NgcxTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
334
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !allowDrop(node, DropType.DROP_AFTER) || !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !node.isFirstChild || !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n treeControl.isExpanded(node) || !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:2;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:3;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:3;bottom:-10px;display:flex;justify-content:center;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "trackBy"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
350
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:not(:hover) .tooltip{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "trackBy"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
335
351
  }
336
352
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: NgcxTreeComponent, decorators: [{
337
353
  type: Component,
338
- args: [{ selector: 'ngcx-tree', standalone: true, imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !allowDrop(node, DropType.DROP_AFTER) || !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !node.isFirstChild || !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n treeControl.isExpanded(node) || !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:2;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:3;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:3;bottom:-10px;display:flex;justify-content:center;flex-direction:column}\n"] }]
354
+ args: [{ selector: 'ngcx-tree', standalone: true, imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1001;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node,.tree-node-container-drop-zone.cdk-drop-list-dragging.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line,.tree-node-container-drop-zone.cdk-drop-list-dragging .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.no-drop{cursor:no-drop;border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.no-drop .drop-insert-line{border-color:var(--ngcx-tree-color-no-drop, transparent)!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:1002;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:1003;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:1003;bottom:-10px;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:not(:hover) .tooltip{display:none}\n"] }]
339
355
  }], propDecorators: { nodes: [{
340
356
  type: Input
341
357
  }], config: [{
@@ -397,6 +413,13 @@ class DropZoneInfo {
397
413
  this.dropType = id.substring(pos + 1);
398
414
  }
399
415
  }
416
+ class DropControl {
417
+ constructor(hideDrop, preventDrop, preventDropReason = '') {
418
+ this.hideDrop = hideDrop;
419
+ this.preventDrop = preventDrop;
420
+ this.preventDropReason = preventDropReason;
421
+ }
422
+ }
400
423
 
401
424
  /*
402
425
  * Public API Surface of ngcx-tree
@@ -1 +1 @@
1
- {"version":3,"file":"cluetec-ngcx-tree.mjs","sources":["../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-data.source.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.html","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-utils.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.html","../../../projects/ngcx-tree/src/public-api.ts","../../../projects/ngcx-tree/src/cluetec-ngcx-tree.ts"],"sourcesContent":["import { DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport class NgcxTreeDataSource<T> extends DataSource<T> {\n data$: BehaviorSubject<T[]>;\n\n constructor(data: T[]) {\n super();\n this.data$ = new BehaviorSubject(data);\n }\n\n connect(): Observable<readonly T[]> {\n return this.data$.asObservable();\n }\n disconnect(): void {}\n\n update(data: T[]) {\n this.data$.next([...data]);\n }\n}\n","import { CdkTreeModule, NestedTreeControl } from '@angular/cdk/tree';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgcxTreeConfig, NgcxTreeNodeWrapper } from '../ngcx-tree-models';\n\nimport { NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'ngcx-tree-node',\n templateUrl: './ngcx-tree-node.component.html',\n styleUrls: ['./ngcx-tree-node.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, NgTemplateOutlet, NgIf],\n})\nexport class NgcxTreeNodeComponent implements OnInit, OnDestroy {\n @Input() nodeWrapper!: NgcxTreeNodeWrapper<any>;\n @Input() treeControl!: NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;\n @Input() treeConfig?: NgcxTreeConfig<any>;\n @Input() isSelected = false;\n\n @Output() customEvent = new EventEmitter<any>();\n @Output() clickEvent = new EventEmitter<void>();\n\n @ViewChild('ref', { read: ViewContainerRef, static: true })\n vcRef?: ViewContainerRef;\n\n ngUnsubscribe = new Subject();\n\n ngOnInit() {\n if (this.vcRef && this.treeConfig?.treeNodeContentComponent) {\n const nodeComponent = this.vcRef.createComponent(\n this.treeConfig.treeNodeContentComponent\n );\n nodeComponent.instance.nodeWrapper = this.nodeWrapper;\n\n nodeComponent.instance.customEvent\n ?.pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((value: any) => this.customEvent.emit(value));\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next(undefined);\n this.ngUnsubscribe.complete();\n }\n}\n","<div\n class=\"tree-node-content-container\"\n [class.selected]=\"isSelected\"\n [class.first]=\"nodeWrapper.isFirstChild\"\n [class.last]=\"nodeWrapper.isLastChild\"\n [class.is-selectable]=\"nodeWrapper.isSelectable\"\n (click)=\"clickEvent.emit()\">\n <div class=\"tree-node-expand-container\">\n <button\n *ngIf=\"nodeWrapper.children.length > 0\"\n class=\"tree-node-expand\"\n cdkTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + nodeWrapper.data.title\"\n (click)=\"$event.preventDefault()\">\n <div class=\"chevron\" [class.rotate]=\"treeControl.isExpanded(nodeWrapper)\">\n <svg id=\"a\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 9\">\n <path\n d=\"m2.83.09l4.2,4.2c.05.05.09.14.09.21s-.04.15-.09.21l-4.2,4.2c-.05.05-.14.09-.21.09s-.15-.04-.21-.09l-.45-.45c-.05-.05-.09-.13-.09-.21,0-.07.04-.15.09-.21l3.54-3.54L1.97.96c-.05-.05-.09-.14-.09-.21s.04-.15.09-.21l.45-.45c.05-.05.14-.09.21-.09s.15.04.21.09Z\"\n style=\"fill: var(--icon-color, #333); stroke-width: 0px\" />\n </svg>\n </div>\n </button>\n </div>\n <div class=\"small-horizontal-tree-line\"></div>\n <div class=\"tree-node-icon-container\" *ngIf=\"nodeWrapper.data.faIcon\">\n <i class=\"fa\" [class]=\"nodeWrapper.data.faIcon\"></i>\n </div>\n <div class=\"tree-node-content\">\n <span\n *ngIf=\"\n !treeConfig?.treeNodeContentComponent &&\n !treeConfig?.treeNodeContentTemplate\n \">\n {{ nodeWrapper.data.title }}\n </span>\n <ng-container #ref></ng-container>\n <ng-container *ngIf=\"treeConfig?.treeNodeContentTemplate as template\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: {\n nodeWrapper: nodeWrapper\n }\n \"></ng-container>\n </ng-container>\n </div>\n</div>\n","import { NgcxTreeNodeWrapper } from './ngcx-tree-models';\n\nexport const isParentOf = (\n parent: NgcxTreeNodeWrapper<any>,\n node: NgcxTreeNodeWrapper<any>\n): boolean => {\n if (!node.parent) {\n return false;\n }\n if (parent.id === node.parent.id) {\n return true;\n }\n return isParentOf(parent, node.parent);\n};\n","import {\n CdkDrag,\n CdkDragRelease,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport {\n CdkTreeModule,\n NestedTreeControl,\n NestedTreeControlOptions,\n} from '@angular/cdk/tree';\nimport { NgIf } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { NgcxTreeDataSource } from './ngcx-tree-data.source';\nimport {\n NgcxTreeConfig,\n NgcxTreeNode,\n NgcxTreeNodeMovedEvent,\n NgcxTreeNodeWrapper,\n} from './ngcx-tree-models';\nimport { NgcxTreeNodeComponent } from './ngcx-tree-node/ngcx-tree-node.component';\nimport { isParentOf } from './ngcx-tree-utils';\n\n@Component({\n selector: 'ngcx-tree',\n templateUrl: 'ngcx-tree.component.html',\n styleUrls: ['ngcx-tree.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf],\n})\nexport class NgcxTreeComponent<T extends NgcxTreeNode>\n implements OnChanges, OnInit\n{\n @Input() nodes?: NgcxTreeNode[];\n @Input() config?: NgcxTreeConfig<T>;\n\n @Output() nodeMoved = new EventEmitter<NgcxTreeNodeMovedEvent<T>>();\n @Output() customEvent = new EventEmitter<T>();\n @Output() clickEvent = new EventEmitter<NgcxTreeNodeWrapper<T>>();\n @Output() selectEvent = new EventEmitter<NgcxTreeNodeWrapper<T>>();\n\n /**\n * Api for finding and selecting node. Extends from the CDK treeControl for expanding/collapsing the tree\n */\n public readonly treeControl: NgcxTreeControl<T> = new NgcxTreeControl<T>(\n this,\n (node) => node.children,\n {\n trackBy: (node: NgcxTreeNodeWrapper<T>) => node.id,\n }\n );\n\n dataSource: NgcxTreeDataSource<NgcxTreeNodeWrapper<T>> =\n new NgcxTreeDataSource<NgcxTreeNodeWrapper<T>>([]);\n\n protected dragging?: NgcxTreeNodeWrapper<T>;\n\n protected selectedNode?: NgcxTreeNodeWrapper<T>;\n\n protected readonly DropType = DropType;\n\n protected readonly disable = () => false;\n\n private canceledByEsc?: boolean;\n\n ngOnInit(): void {\n this.updateTree();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['nodes']) {\n if (this.treeControl) {\n // initialized already\n this.updateTree();\n }\n if (this.selectedNode) {\n const selectedNodeId = this.selectedNode.id;\n setTimeout(() => this.treeControl.selectNodeById(selectedNodeId));\n }\n }\n }\n\n private updateTree() {\n const wrapperNodes = this.createWrapperNodes(this.nodes ?? []);\n this.dataSource = new NgcxTreeDataSource(wrapperNodes);\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private createWrapperNodes(\n nodes: NgcxTreeNode[],\n parent?: NgcxTreeNodeWrapper<T>,\n depth: number = 0\n ): NgcxTreeNodeWrapper<T>[] {\n const childCount = nodes.length;\n const wrapperNodes = nodes.map((node, idx) => {\n const nodeWrapper: NgcxTreeNodeWrapper<T> = {\n id: node.id,\n data: <T>node,\n isFirstChild: idx === 0,\n isLastChild: idx === childCount - 1,\n index: idx,\n parent: parent,\n depth: depth,\n children: [],\n };\n nodeWrapper.children = node.children\n ? this.createWrapperNodes(node.children, nodeWrapper, depth + 1)\n : [];\n\n return nodeWrapper;\n });\n wrapperNodes.forEach((wrapperNode) => {\n if (!wrapperNode.isLastChild) {\n wrapperNode.next = wrapperNodes[wrapperNode.index + 1];\n }\n if (!wrapperNode.isFirstChild) {\n wrapperNode.previous = wrapperNodes[wrapperNode.index - 1];\n }\n if (this.config?.allowSelection?.(wrapperNode)) {\n wrapperNode.isSelectable = true;\n }\n });\n return wrapperNodes;\n }\n\n protected allowDrop(\n dropNode: NgcxTreeNodeWrapper<T>,\n dropType: DropType\n ): boolean {\n if (\n !this.dragging ||\n this.dragging.id === dropNode.id ||\n isParentOf(this.dragging, dropNode)\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_INTO &&\n dropNode.id === this.dragging.parent?.id\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_AFTER &&\n dropNode.next?.id === this.dragging.id\n ) {\n return false;\n }\n if (\n dropType == DropType.DROP_BEFORE &&\n dropNode.previous?.id === this.dragging.id\n ) {\n return false;\n }\n\n const intoNode =\n dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;\n if (this.config?.allowDrop) {\n return this.config.allowDrop(this.dragging, intoNode);\n }\n return true;\n }\n\n // prevent drop directly after a node on same level, that is expanded\n protected sortPredicate(): (\n index: number,\n drag: CdkDrag,\n drop: CdkDropList\n ) => boolean {\n return (\n index: number,\n _drag: CdkDrag<NgcxTreeNodeWrapper<T>>,\n drop: CdkDropList<NgcxTreeNodeWrapper<T>>\n ) => {\n return index == 0 || !this.treeControl.isExpanded(drop.data);\n };\n }\n\n protected disableDrag(node: NgcxTreeNodeWrapper<T>) {\n return this.config?.allowDrag ? !this.config.allowDrag(node) : false;\n }\n\n protected keyDownArrowUp(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isFirstChild) {\n this.selectNode(this.selectedNode.previous);\n } else if (this.selectedNode.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[nodes.length - 1]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowDown(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isLastChild) {\n this.selectNode(this.selectedNode.next);\n } else if (this.selectedNode.parent?.next) {\n this.selectNode(this.selectedNode.parent.next);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowLeft(event: Event) {\n if (this.selectedNode) {\n if (this.treeControl.isExpanded(this.selectedNode)) {\n this.treeControl.collapse(this.selectedNode);\n } else if (this.selectedNode?.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowRight(event: Event) {\n if (this.selectedNode && this.selectedNode.children.length > 0) {\n this.selectNode(this.selectedNode.children[0]);\n } else if (!this.selectedNode) {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n @HostListener('window:keydown.escape')\n protected keyEscapeWhileDragging() {\n if (this.dragging) {\n this.canceledByEsc = true;\n document.dispatchEvent(new Event('mouseup'));\n }\n }\n\n protected handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<T>>) {\n this.dragging = undefined;\n const movedNode = event.source.data;\n const target = <HTMLDivElement>event.event.target;\n const dropZoneId = target.id ?? target.parentElement?.id;\n if (!dropZoneId) {\n // no valid drop zone\n return;\n }\n\n const dropZoneInfo = new DropZoneInfo(dropZoneId);\n const toNode = this.treeControl.findNodeById(dropZoneInfo.nodeId);\n if (!toNode) {\n console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);\n return;\n }\n\n // dropType undefined can happen if dropped directly without moving\n if (this.canceledByEsc || dropZoneInfo.dropType === undefined) {\n this.canceledByEsc = false;\n return;\n }\n\n const insertIntoNode =\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent;\n const wrapperList = insertIntoNode?.children ?? this.dataSource.data$.value;\n const addAtNodeIdx = this.findAddIndex(\n dropZoneInfo,\n insertIntoNode,\n wrapperList\n );\n\n const removedFromIdx = this.removeElementFromPreviousPosition(movedNode);\n // add element to new Position, subtract one if inserted in same list after the remove position\n (insertIntoNode?.data.children ?? this.nodes!).splice(\n movedNode.parent?.id === insertIntoNode?.id &&\n removedFromIdx < addAtNodeIdx\n ? addAtNodeIdx - 1\n : addAtNodeIdx,\n 0,\n movedNode.data\n );\n\n const afterNodeIdx = addAtNodeIdx - 1;\n const afterNode =\n afterNodeIdx > -1 && wrapperList.length > afterNodeIdx\n ? wrapperList[afterNodeIdx]\n : undefined;\n\n const beforeNode =\n addAtNodeIdx > -1 && wrapperList.length > addAtNodeIdx\n ? wrapperList[addAtNodeIdx]\n : undefined;\n this.nodeMoved.emit({\n node: movedNode,\n parent:\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent,\n afterNode: afterNode,\n beforeNode: beforeNode,\n });\n this.dataSource = new NgcxTreeDataSource(\n this.createWrapperNodes(this.nodes!)\n );\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private findAddIndex(\n dropZoneInfo: DropZoneInfo,\n insertIntoNode: NgcxTreeNodeWrapper<T> | undefined,\n insertIntoList: NgcxTreeNodeWrapper<T>[]\n ) {\n if (\n insertIntoNode &&\n dropZoneInfo.dropType === DropType.DROP_INTO &&\n !insertIntoNode.data.children\n ) {\n insertIntoNode.data.children = [];\n }\n let addAtNodeIdx = 0;\n if (\n dropZoneInfo.dropType === DropType.DROP_AFTER ||\n dropZoneInfo.dropType === DropType.DROP_BEFORE\n ) {\n addAtNodeIdx = insertIntoList.findIndex(\n (child) => child.id === dropZoneInfo.nodeId\n );\n if (dropZoneInfo.dropType === DropType.DROP_AFTER) {\n addAtNodeIdx++;\n }\n }\n return addAtNodeIdx;\n }\n\n private removeElementFromPreviousPosition(\n movedNode: NgcxTreeNodeWrapper<T>\n ): number {\n const removeFromList = movedNode.parent?.data.children ?? this.nodes!;\n const removeIndex = removeFromList.findIndex(\n (child: any) => child.id === movedNode.id\n );\n removeFromList.splice(removeIndex, 1);\n return removeIndex;\n }\n\n nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<T>) {\n this.clickEvent.emit(nodeWrapper);\n if (nodeWrapper.isSelectable) {\n this.selectedNode =\n nodeWrapper.id === this.selectedNode?.id ? undefined : nodeWrapper;\n this.selectEvent.emit(this.selectedNode);\n }\n }\n\n selectNode(nodeWrapper: NgcxTreeNodeWrapper<T> | undefined) {\n if (!nodeWrapper || nodeWrapper.isSelectable) {\n this.selectedNode = nodeWrapper;\n let expandNode = this.selectedNode?.parent;\n while (expandNode) {\n this.treeControl.expand(expandNode);\n expandNode = expandNode.parent;\n }\n this.selectEvent.emit(this.selectedNode);\n }\n }\n}\n\nenum DropType {\n DROP_AFTER = 'DROP_AFTER',\n DROP_BEFORE = 'DROP_BEFORE',\n DROP_INTO = 'DROP_INTO',\n}\n\nexport class NgcxTreeControl<T extends NgcxTreeNode> extends NestedTreeControl<\n NgcxTreeNodeWrapper<T>,\n string\n> {\n constructor(\n private treeComponent: NgcxTreeComponent<T>,\n getChildren: (dataNode: NgcxTreeNodeWrapper<T>) => NgcxTreeNodeWrapper<T>[],\n options?: NestedTreeControlOptions<NgcxTreeNodeWrapper<T>, string>\n ) {\n super(getChildren, options);\n }\n\n /**\n * select a node by id. the selectEvent is fired afterwards.\n */\n selectNodeById(id: string) {\n this.treeComponent.selectNode(this.findNodeById(id));\n }\n\n /**\n * find a node by id.\n */\n findNodeById(id: string): NgcxTreeNodeWrapper<T> | undefined {\n return this.findNodeByIdInNodes(\n this.treeComponent.dataSource.data$.value,\n id\n );\n }\n\n private findNodeByIdInNodes(\n nodes: NgcxTreeNodeWrapper<T>[],\n id: string\n ): NgcxTreeNodeWrapper<T> | undefined {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n if (node.children?.length > 0) {\n const foundNode = this.findNodeByIdInNodes(node.children, id);\n if (foundNode) {\n return foundNode;\n }\n }\n }\n\n return undefined;\n }\n}\n\nclass DropZoneInfo {\n dropType: DropType;\n nodeId: string;\n\n constructor(id: string) {\n const pos = id.indexOf('_');\n this.nodeId = id.substring(0, pos);\n this.dropType = <DropType>id.substring(pos + 1);\n }\n}\n","<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !allowDrop(node, DropType.DROP_AFTER) || !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !node.isFirstChild || !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n treeControl.isExpanded(node) || !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n","/*\n * Public API Surface of ngcx-tree\n */\n\nexport * from './lib/ngcx-tree/ngcx-tree-models';\nexport * from './lib/ngcx-tree/ngcx-tree.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cluetec-ngcx-tree.mjs","sources":["../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-data.source.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-node/ngcx-tree-node.component.html","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree-utils.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.ts","../../../projects/ngcx-tree/src/lib/ngcx-tree/ngcx-tree.component.html","../../../projects/ngcx-tree/src/public-api.ts","../../../projects/ngcx-tree/src/cluetec-ngcx-tree.ts"],"sourcesContent":["import { DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport class NgcxTreeDataSource<T> extends DataSource<T> {\n data$: BehaviorSubject<T[]>;\n\n constructor(data: T[]) {\n super();\n this.data$ = new BehaviorSubject(data);\n }\n\n connect(): Observable<readonly T[]> {\n return this.data$.asObservable();\n }\n disconnect(): void {}\n\n update(data: T[]) {\n this.data$.next([...data]);\n }\n}\n","import { CdkTreeModule, NestedTreeControl } from '@angular/cdk/tree';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { NgcxTreeConfig, NgcxTreeNodeWrapper } from '../ngcx-tree-models';\n\nimport { NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n selector: 'ngcx-tree-node',\n templateUrl: './ngcx-tree-node.component.html',\n styleUrls: ['./ngcx-tree-node.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, NgTemplateOutlet, NgIf],\n})\nexport class NgcxTreeNodeComponent implements OnInit, OnDestroy {\n @Input() nodeWrapper!: NgcxTreeNodeWrapper<any>;\n @Input() treeControl!: NestedTreeControl<NgcxTreeNodeWrapper<any>, string>;\n @Input() treeConfig?: NgcxTreeConfig<any>;\n @Input() isSelected = false;\n\n @Output() customEvent = new EventEmitter<any>();\n @Output() clickEvent = new EventEmitter<void>();\n\n @ViewChild('ref', { read: ViewContainerRef, static: true })\n vcRef?: ViewContainerRef;\n\n ngUnsubscribe = new Subject();\n\n ngOnInit() {\n if (this.vcRef && this.treeConfig?.treeNodeContentComponent) {\n const nodeComponent = this.vcRef.createComponent(\n this.treeConfig.treeNodeContentComponent\n );\n nodeComponent.instance.nodeWrapper = this.nodeWrapper;\n\n nodeComponent.instance.customEvent\n ?.pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((value: any) => this.customEvent.emit(value));\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next(undefined);\n this.ngUnsubscribe.complete();\n }\n}\n","<div\n class=\"tree-node-content-container\"\n [class.selected]=\"isSelected\"\n [class.first]=\"nodeWrapper.isFirstChild\"\n [class.last]=\"nodeWrapper.isLastChild\"\n [class.is-selectable]=\"nodeWrapper.isSelectable\"\n (click)=\"clickEvent.emit()\">\n <div class=\"tree-node-expand-container\">\n <button\n *ngIf=\"nodeWrapper.children.length > 0\"\n class=\"tree-node-expand\"\n cdkTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + nodeWrapper.data.title\"\n (click)=\"$event.preventDefault()\">\n <div class=\"chevron\" [class.rotate]=\"treeControl.isExpanded(nodeWrapper)\">\n <svg id=\"a\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 9\">\n <path\n d=\"m2.83.09l4.2,4.2c.05.05.09.14.09.21s-.04.15-.09.21l-4.2,4.2c-.05.05-.14.09-.21.09s-.15-.04-.21-.09l-.45-.45c-.05-.05-.09-.13-.09-.21,0-.07.04-.15.09-.21l3.54-3.54L1.97.96c-.05-.05-.09-.14-.09-.21s.04-.15.09-.21l.45-.45c.05-.05.14-.09.21-.09s.15.04.21.09Z\"\n style=\"fill: var(--icon-color, #333); stroke-width: 0px\" />\n </svg>\n </div>\n </button>\n </div>\n <div class=\"small-horizontal-tree-line\"></div>\n <div class=\"tree-node-icon-container\" *ngIf=\"nodeWrapper.data.faIcon\">\n <i class=\"fa\" [class]=\"nodeWrapper.data.faIcon\"></i>\n </div>\n <div class=\"tree-node-content\">\n <span\n *ngIf=\"\n !treeConfig?.treeNodeContentComponent &&\n !treeConfig?.treeNodeContentTemplate\n \">\n {{ nodeWrapper.data.title }}\n </span>\n <ng-container #ref></ng-container>\n <ng-container *ngIf=\"treeConfig?.treeNodeContentTemplate as template\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: {\n nodeWrapper: nodeWrapper\n }\n \"></ng-container>\n </ng-container>\n </div>\n</div>\n","import { NgcxTreeNodeWrapper } from './ngcx-tree-models';\n\nexport const isParentOf = (\n parent: NgcxTreeNodeWrapper<any>,\n node: NgcxTreeNodeWrapper<any>\n): boolean => {\n if (!node.parent) {\n return false;\n }\n if (parent.id === node.parent.id) {\n return true;\n }\n return isParentOf(parent, node.parent);\n};\n","import {\n CdkDrag,\n CdkDragRelease,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport {\n CdkTreeModule,\n NestedTreeControl,\n NestedTreeControlOptions,\n} from '@angular/cdk/tree';\nimport { NgIf } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { NgcxTreeDataSource } from './ngcx-tree-data.source';\nimport {\n NgcxTreeConfig,\n NgcxTreeNode,\n NgcxTreeNodeMovedEvent,\n NgcxTreeNodeWrapper,\n} from './ngcx-tree-models';\nimport { NgcxTreeNodeComponent } from './ngcx-tree-node/ngcx-tree-node.component';\nimport { isParentOf } from './ngcx-tree-utils';\n\n@Component({\n selector: 'ngcx-tree',\n templateUrl: 'ngcx-tree.component.html',\n styleUrls: ['ngcx-tree.component.scss'],\n standalone: true,\n imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf],\n})\nexport class NgcxTreeComponent<T extends NgcxTreeNode>\n implements OnChanges, OnInit\n{\n @Input() nodes?: NgcxTreeNode[];\n @Input() config?: NgcxTreeConfig<T>;\n\n @Output() nodeMoved = new EventEmitter<NgcxTreeNodeMovedEvent<T>>();\n @Output() customEvent = new EventEmitter<T>();\n @Output() clickEvent = new EventEmitter<NgcxTreeNodeWrapper<T>>();\n @Output() selectEvent = new EventEmitter<NgcxTreeNodeWrapper<T>>();\n\n /**\n * Api for finding and selecting node. Extends from the CDK treeControl for expanding/collapsing the tree\n */\n public readonly treeControl: NgcxTreeControl<T> = new NgcxTreeControl<T>(\n this,\n (node) => node.children,\n {\n trackBy: (node: NgcxTreeNodeWrapper<T>) => node.id,\n }\n );\n\n dataSource: NgcxTreeDataSource<NgcxTreeNodeWrapper<T>> =\n new NgcxTreeDataSource<NgcxTreeNodeWrapper<T>>([]);\n\n protected dragging?: NgcxTreeNodeWrapper<T>;\n\n protected selectedNode?: NgcxTreeNodeWrapper<T>;\n\n protected readonly DropType = DropType;\n\n protected readonly disable = () => false;\n\n private canceledByEsc?: boolean;\n\n ngOnInit(): void {\n this.updateTree();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['nodes']) {\n if (this.treeControl) {\n // initialized already\n this.updateTree();\n }\n if (this.selectedNode) {\n const selectedNodeId = this.selectedNode.id;\n setTimeout(() => this.treeControl.selectNodeById(selectedNodeId));\n }\n }\n }\n\n private updateTree() {\n const wrapperNodes = this.createWrapperNodes(this.nodes ?? []);\n this.dataSource = new NgcxTreeDataSource(wrapperNodes);\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private createWrapperNodes(\n nodes: NgcxTreeNode[],\n parent?: NgcxTreeNodeWrapper<T>,\n depth: number = 0\n ): NgcxTreeNodeWrapper<T>[] {\n const childCount = nodes.length;\n const wrapperNodes = nodes.map((node, idx) => {\n const nodeWrapper: NgcxTreeNodeWrapper<T> = {\n id: node.id,\n data: <T>node,\n isFirstChild: idx === 0,\n isLastChild: idx === childCount - 1,\n index: idx,\n parent: parent,\n depth: depth,\n children: [],\n };\n nodeWrapper.children = node.children\n ? this.createWrapperNodes(node.children, nodeWrapper, depth + 1)\n : [];\n\n return nodeWrapper;\n });\n wrapperNodes.forEach((wrapperNode) => {\n if (!wrapperNode.isLastChild) {\n wrapperNode.next = wrapperNodes[wrapperNode.index + 1];\n }\n if (!wrapperNode.isFirstChild) {\n wrapperNode.previous = wrapperNodes[wrapperNode.index - 1];\n }\n if (this.config?.allowSelection?.(wrapperNode)) {\n wrapperNode.isSelectable = true;\n }\n });\n return wrapperNodes;\n }\n\n protected hideDrop(\n dropNode: NgcxTreeNodeWrapper<T>,\n dropType: DropType\n ): boolean {\n if (\n !this.dragging ||\n this.dragging.id === dropNode.id ||\n isParentOf(this.dragging, dropNode)\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_INTO &&\n dropNode.id === this.dragging.parent?.id\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_AFTER &&\n dropNode.next?.id === this.dragging.id\n ) {\n return true;\n }\n if (\n dropType == DropType.DROP_BEFORE &&\n dropNode.previous?.id === this.dragging.id\n ) {\n return true;\n }\n return false;\n }\n\n protected allowDrop(\n dropNode: NgcxTreeNodeWrapper<T>,\n dropType: DropType\n ): DropControl {\n const hideDrop = this.hideDrop(dropNode, dropType);\n\n const intoNode =\n dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;\n\n let preventDropReason;\n let allowDrop = true;\n if (this.config?.preventDropReason && this.dragging) {\n preventDropReason = this.config.preventDropReason(\n this.dragging,\n intoNode\n );\n }\n if (this.config?.allowDrop && this.dragging) {\n allowDrop = this.config.allowDrop(this.dragging, intoNode);\n }\n\n return new DropControl(\n hideDrop,\n !allowDrop || !!preventDropReason,\n preventDropReason\n );\n }\n\n // prevent drop directly after a node on same level, that is expanded\n protected sortPredicate(): (\n index: number,\n drag: CdkDrag,\n drop: CdkDropList\n ) => boolean {\n return (\n index: number,\n _drag: CdkDrag<NgcxTreeNodeWrapper<T>>,\n drop: CdkDropList<NgcxTreeNodeWrapper<T>>\n ) => {\n return index == 0 || !this.treeControl.isExpanded(drop.data);\n };\n }\n\n protected disableDrag(node: NgcxTreeNodeWrapper<T>) {\n return this.config?.allowDrag ? !this.config.allowDrag(node) : false;\n }\n\n protected keyDownArrowUp(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isFirstChild) {\n this.selectNode(this.selectedNode.previous);\n } else if (this.selectedNode.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[nodes.length - 1]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowDown(event: Event) {\n if (this.selectedNode) {\n if (!this.selectedNode.isLastChild) {\n this.selectNode(this.selectedNode.next);\n } else if (this.selectedNode.parent?.next) {\n this.selectNode(this.selectedNode.parent.next);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowLeft(event: Event) {\n if (this.selectedNode) {\n if (this.treeControl.isExpanded(this.selectedNode)) {\n this.treeControl.collapse(this.selectedNode);\n } else if (this.selectedNode?.parent) {\n this.selectNode(this.selectedNode.parent);\n }\n } else {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n protected keyDownArrowRight(event: Event) {\n if (this.selectedNode && this.selectedNode.children.length > 0) {\n this.selectNode(this.selectedNode.children[0]);\n } else if (!this.selectedNode) {\n const nodes = this.dataSource.data$.value;\n if (nodes.length > 0) {\n this.selectNode(nodes[0]);\n }\n }\n event.preventDefault();\n }\n\n @HostListener('window:keydown.escape')\n protected keyEscapeWhileDragging() {\n if (this.dragging) {\n this.canceledByEsc = true;\n document.dispatchEvent(new Event('mouseup'));\n }\n }\n\n protected handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<T>>) {\n this.handleDragReleaseInternal(event);\n this.dragging = undefined;\n }\n\n private handleDragReleaseInternal(\n event: CdkDragRelease<NgcxTreeNodeWrapper<T>>\n ) {\n const movedNode = event.source.data;\n const target = <HTMLDivElement>event.event.target;\n const dropZoneId = target.id ?? target.parentElement?.id;\n if (!dropZoneId) {\n // no valid drop zone\n return;\n }\n\n const dropZoneInfo = new DropZoneInfo(dropZoneId);\n const toNode = this.treeControl.findNodeById(dropZoneInfo.nodeId);\n if (!toNode) {\n console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);\n return;\n }\n\n const dropControl = this.allowDrop(toNode, dropZoneInfo.dropType);\n if (dropControl.hideDrop || dropControl.preventDrop) {\n return;\n }\n\n // dropType undefined can happen if dropped directly without moving\n if (this.canceledByEsc || dropZoneInfo.dropType === undefined) {\n this.canceledByEsc = false;\n return;\n }\n\n const insertIntoNode =\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent;\n const wrapperList = insertIntoNode?.children ?? this.dataSource.data$.value;\n const addAtNodeIdx = this.findAddIndex(\n dropZoneInfo,\n insertIntoNode,\n wrapperList\n );\n\n const removedFromIdx = this.removeElementFromPreviousPosition(movedNode);\n // add element to new Position, subtract one if inserted in same list after the remove position\n (insertIntoNode?.data.children ?? this.nodes!).splice(\n movedNode.parent?.id === insertIntoNode?.id &&\n removedFromIdx < addAtNodeIdx\n ? addAtNodeIdx - 1\n : addAtNodeIdx,\n 0,\n movedNode.data\n );\n\n const afterNodeIdx = addAtNodeIdx - 1;\n const afterNode =\n afterNodeIdx > -1 && wrapperList.length > afterNodeIdx\n ? wrapperList[afterNodeIdx]\n : undefined;\n\n const beforeNode =\n addAtNodeIdx > -1 && wrapperList.length > addAtNodeIdx\n ? wrapperList[addAtNodeIdx]\n : undefined;\n this.nodeMoved.emit({\n node: movedNode,\n parent:\n dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent,\n afterNode: afterNode,\n beforeNode: beforeNode,\n });\n this.dataSource = new NgcxTreeDataSource(\n this.createWrapperNodes(this.nodes!)\n );\n this.treeControl.dataNodes = this.dataSource.data$.value;\n }\n\n private findAddIndex(\n dropZoneInfo: DropZoneInfo,\n insertIntoNode: NgcxTreeNodeWrapper<T> | undefined,\n insertIntoList: NgcxTreeNodeWrapper<T>[]\n ) {\n if (\n insertIntoNode &&\n dropZoneInfo.dropType === DropType.DROP_INTO &&\n !insertIntoNode.data.children\n ) {\n insertIntoNode.data.children = [];\n }\n let addAtNodeIdx = 0;\n if (\n dropZoneInfo.dropType === DropType.DROP_AFTER ||\n dropZoneInfo.dropType === DropType.DROP_BEFORE\n ) {\n addAtNodeIdx = insertIntoList.findIndex(\n (child) => child.id === dropZoneInfo.nodeId\n );\n if (dropZoneInfo.dropType === DropType.DROP_AFTER) {\n addAtNodeIdx++;\n }\n }\n return addAtNodeIdx;\n }\n\n private removeElementFromPreviousPosition(\n movedNode: NgcxTreeNodeWrapper<T>\n ): number {\n const removeFromList = movedNode.parent?.data.children ?? this.nodes!;\n const removeIndex = removeFromList.findIndex(\n (child: any) => child.id === movedNode.id\n );\n removeFromList.splice(removeIndex, 1);\n return removeIndex;\n }\n\n nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<T>) {\n this.clickEvent.emit(nodeWrapper);\n if (nodeWrapper.isSelectable) {\n this.selectedNode =\n nodeWrapper.id === this.selectedNode?.id ? undefined : nodeWrapper;\n this.selectEvent.emit(this.selectedNode);\n }\n }\n\n selectNode(nodeWrapper: NgcxTreeNodeWrapper<T> | undefined) {\n if (!nodeWrapper || nodeWrapper.isSelectable) {\n this.selectedNode = nodeWrapper;\n let expandNode = this.selectedNode?.parent;\n while (expandNode) {\n this.treeControl.expand(expandNode);\n expandNode = expandNode.parent;\n }\n this.selectEvent.emit(this.selectedNode);\n }\n }\n}\n\nenum DropType {\n DROP_AFTER = 'DROP_AFTER',\n DROP_BEFORE = 'DROP_BEFORE',\n DROP_INTO = 'DROP_INTO',\n}\n\nexport class NgcxTreeControl<T extends NgcxTreeNode> extends NestedTreeControl<\n NgcxTreeNodeWrapper<T>,\n string\n> {\n constructor(\n private treeComponent: NgcxTreeComponent<T>,\n getChildren: (dataNode: NgcxTreeNodeWrapper<T>) => NgcxTreeNodeWrapper<T>[],\n options?: NestedTreeControlOptions<NgcxTreeNodeWrapper<T>, string>\n ) {\n super(getChildren, options);\n }\n\n /**\n * select a node by id. the selectEvent is fired afterwards.\n */\n selectNodeById(id: string) {\n this.treeComponent.selectNode(this.findNodeById(id));\n }\n\n /**\n * find a node by id.\n */\n findNodeById(id: string): NgcxTreeNodeWrapper<T> | undefined {\n return this.findNodeByIdInNodes(\n this.treeComponent.dataSource.data$.value,\n id\n );\n }\n\n private findNodeByIdInNodes(\n nodes: NgcxTreeNodeWrapper<T>[],\n id: string\n ): NgcxTreeNodeWrapper<T> | undefined {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n if (node.children?.length > 0) {\n const foundNode = this.findNodeByIdInNodes(node.children, id);\n if (foundNode) {\n return foundNode;\n }\n }\n }\n\n return undefined;\n }\n}\n\nclass DropZoneInfo {\n dropType: DropType;\n nodeId: string;\n\n constructor(id: string) {\n const pos = id.indexOf('_');\n this.nodeId = id.substring(0, pos);\n this.dropType = <DropType>id.substring(pos + 1);\n }\n}\n\nclass DropControl {\n constructor(\n public hideDrop: boolean,\n public preventDrop: boolean,\n public preventDropReason: string = ''\n ) {}\n}\n","<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"dropControl.hideDrop || !treeControl.isExpanded(node)\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div class=\"tree-node-container\">\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_BEFORE) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"!node.isFirstChild || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_INTO) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n *ngIf=\"allowDrop(node, DropType.DROP_AFTER) as dropControl\"\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"treeControl.isExpanded(node) || dropControl.hideDrop\"\n [class.no-drop]=\"dropControl.preventDrop\">\n <div class=\"drop-insert-line\"></div>\n <div *ngIf=\"dropControl.preventDropReason\" class=\"tooltip\">\n {{ dropControl.preventDropReason }}\n </div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n","/*\n * Public API Surface of ngcx-tree\n */\n\nexport * from './lib/ngcx-tree/ngcx-tree-models';\nexport * from './lib/ngcx-tree/ngcx-tree.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export interface NgcxTreeConfig<T extends NgcxTreeNode> {
3
3
  treeNodeContentComponent?: Type<NgcxCustomComponent<T>>;
4
4
  treeNodeContentTemplate?: TemplateRef<any>;
5
5
  allowDrop?: (node: NgcxTreeNodeWrapper<T>, intoNode?: NgcxTreeNodeWrapper<T>) => boolean;
6
+ preventDropReason?: (node: NgcxTreeNodeWrapper<T>, intoNode?: NgcxTreeNodeWrapper<T>) => string | undefined;
6
7
  allowDrag?: (node: NgcxTreeNodeWrapper<T>) => boolean;
7
8
  allowSelection?: (node: NgcxTreeNodeWrapper<T>) => boolean;
8
9
  }
@@ -25,7 +25,8 @@ export declare class NgcxTreeComponent<T extends NgcxTreeNode> implements OnChan
25
25
  ngOnChanges(changes: SimpleChanges): void;
26
26
  private updateTree;
27
27
  private createWrapperNodes;
28
- protected allowDrop(dropNode: NgcxTreeNodeWrapper<T>, dropType: DropType): boolean;
28
+ protected hideDrop(dropNode: NgcxTreeNodeWrapper<T>, dropType: DropType): boolean;
29
+ protected allowDrop(dropNode: NgcxTreeNodeWrapper<T>, dropType: DropType): DropControl;
29
30
  protected sortPredicate(): (index: number, drag: CdkDrag, drop: CdkDropList) => boolean;
30
31
  protected disableDrag(node: NgcxTreeNodeWrapper<T>): boolean;
31
32
  protected keyDownArrowUp(event: Event): void;
@@ -34,6 +35,7 @@ export declare class NgcxTreeComponent<T extends NgcxTreeNode> implements OnChan
34
35
  protected keyDownArrowRight(event: Event): void;
35
36
  protected keyEscapeWhileDragging(): void;
36
37
  protected handleDragRelease(event: CdkDragRelease<NgcxTreeNodeWrapper<T>>): void;
38
+ private handleDragReleaseInternal;
37
39
  private findAddIndex;
38
40
  private removeElementFromPreviousPosition;
39
41
  nodeClicked(nodeWrapper: NgcxTreeNodeWrapper<T>): void;
@@ -59,4 +61,10 @@ export declare class NgcxTreeControl<T extends NgcxTreeNode> extends NestedTreeC
59
61
  findNodeById(id: string): NgcxTreeNodeWrapper<T> | undefined;
60
62
  private findNodeByIdInNodes;
61
63
  }
64
+ declare class DropControl {
65
+ hideDrop: boolean;
66
+ preventDrop: boolean;
67
+ preventDropReason: string;
68
+ constructor(hideDrop: boolean, preventDrop: boolean, preventDropReason?: string);
69
+ }
62
70
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cluetec/ngcx-tree",
3
- "version": "17.0.2",
3
+ "version": "17.1.0",
4
4
  "description": "An angular tree component with drag and drop.",
5
5
  "author": "Michael Niedermaier <mn@cluetec.de>",
6
6
  "repository": "https://github.com/cluetec/ngcx-tree",
@@ -1,5 +1,5 @@
1
1
  .ngcx-tree {
2
2
  .cdk-drop-list {
3
- width: 100%;
3
+ width: auto;
4
4
  }
5
5
  }
@@ -0,0 +1,37 @@
1
+ .tree-node-container-drop-zone {
2
+ .tooltip {
3
+ border: 1px solid lightgrey;
4
+ background: white;
5
+ box-shadow: 3px 0px 10px rgba(0, 0, 0, 0.3);
6
+ padding: 5px 15px;
7
+ border-radius: 5px;
8
+ max-width: 400px;
9
+ font-size: 85%;
10
+ position: absolute;
11
+ top: 100%;
12
+ margin-top: 2px;
13
+ margin-left: 5px;
14
+ z-index: 1004;
15
+
16
+ &::before {
17
+ content: '';
18
+ position: absolute;
19
+ border-left: 1px solid lightgrey;
20
+ border-top: 1px solid lightgrey;
21
+ background-color: white;
22
+ top: -7px;
23
+ height: 10px;
24
+ width: 10px;
25
+ transform: rotate(45deg);
26
+ left: 25px;
27
+ z-index: 1005;
28
+ }
29
+ }
30
+
31
+ &.into-node .tooltip {
32
+ margin-top: 5px;
33
+ }
34
+ &.after-node.last .tooltip {
35
+ margin-top: 7px;
36
+ }
37
+ }
package/styles/styles.css CHANGED
@@ -1,5 +1,5 @@
1
1
  .ngcx-tree .cdk-drop-list {
2
- width: 100%;
2
+ width: auto;
3
3
  }
4
4
 
5
5
  .tree-node-content-container,
@@ -57,4 +57,38 @@
57
57
  --icon-color: #444;
58
58
  }
59
59
 
60
+ .tree-node-container-drop-zone .tooltip {
61
+ border: 1px solid lightgrey;
62
+ background: white;
63
+ box-shadow: 3px 0px 10px rgba(0, 0, 0, 0.3);
64
+ padding: 5px 15px;
65
+ border-radius: 5px;
66
+ max-width: 400px;
67
+ font-size: 85%;
68
+ position: absolute;
69
+ top: 100%;
70
+ margin-top: 2px;
71
+ margin-left: 5px;
72
+ z-index: 1004;
73
+ }
74
+ .tree-node-container-drop-zone .tooltip::before {
75
+ content: "";
76
+ position: absolute;
77
+ border-left: 1px solid lightgrey;
78
+ border-top: 1px solid lightgrey;
79
+ background-color: white;
80
+ top: -7px;
81
+ height: 10px;
82
+ width: 10px;
83
+ transform: rotate(45deg);
84
+ left: 25px;
85
+ z-index: 1005;
86
+ }
87
+ .tree-node-container-drop-zone.into-node .tooltip {
88
+ margin-top: 5px;
89
+ }
90
+ .tree-node-container-drop-zone.after-node.last .tooltip {
91
+ margin-top: 7px;
92
+ }
93
+
60
94
  /*# sourceMappingURL=styles.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../projects/ngcx-tree/styles/_ngcx-common.scss","../../../projects/ngcx-tree/styles/_ngcx-doted-tree-line.scss","../../../projects/ngcx-tree/styles/_ngcx-selection.scss","../../../projects/ngcx-tree/styles/_ngcx-icon-color.scss"],"names":[],"mappings":"AACE;EACE;;;ACFJ;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;AAAA;EACE;EACA;EACA;EACA;;;AAKF;EACE;;AAEF;EACE;;;AAIJ;EACE;;;AAKE;EACE;;AAEF;EACE;;;ACrCA;EACE;;AAOF;EACE;;;AAOJ;EACE;;;AClBF;EACE","file":"styles.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../projects/ngcx-tree/styles/_ngcx-common.scss","../../../projects/ngcx-tree/styles/_ngcx-doted-tree-line.scss","../../../projects/ngcx-tree/styles/_ngcx-selection.scss","../../../projects/ngcx-tree/styles/_ngcx-icon-color.scss","../../../projects/ngcx-tree/styles/_ngcx-tooltip.scss"],"names":[],"mappings":"AACE;EACE;;;ACFJ;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;AAAA;EACE;EACA;EACA;EACA;;;AAKF;EACE;;AAEF;EACE;;;AAIJ;EACE;;;AAKE;EACE;;AAEF;EACE;;;ACrCA;EACE;;AAOF;EACE;;;AAOJ;EACE;;;AClBF;EACE;;;ACFJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACE;;AAEF;EACE","file":"styles.css"}
@@ -2,3 +2,4 @@
2
2
  @import 'ngcx-doted-tree-line';
3
3
  @import 'ngcx-selection';
4
4
  @import 'ngcx-icon-color';
5
+ @import 'ngcx-tooltip';