@ali-hm/angular-tree-component 12.0.6 → 16.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/{esm2020 → esm2022}/lib/angular-tree-component.module.mjs +33 -33
  2. package/{esm2020 → esm2022}/lib/components/loading.component.mjs +6 -6
  3. package/{esm2020 → esm2022}/lib/components/tree-node-checkbox.component.mjs +6 -6
  4. package/esm2022/lib/components/tree-node-collection.component.mjs +284 -0
  5. package/{esm2020 → esm2022}/lib/components/tree-node-content.component.mjs +6 -6
  6. package/{esm2020 → esm2022}/lib/components/tree-node-drop-slot.component.mjs +6 -6
  7. package/{esm2020 → esm2022}/lib/components/tree-node-expander.component.mjs +6 -6
  8. package/{esm2020 → esm2022}/lib/components/tree-node-wrapper.component.mjs +6 -6
  9. package/{esm2020 → esm2022}/lib/components/tree-viewport.component.mjs +6 -6
  10. package/esm2022/lib/components/tree.component.mjs +186 -0
  11. package/esm2022/lib/directives/tree-animate-open.directive.mjs +101 -0
  12. package/{esm2020 → esm2022}/lib/directives/tree-drag.directive.mjs +4 -4
  13. package/esm2022/lib/directives/tree-drop.directive.mjs +127 -0
  14. package/{esm2020 → esm2022}/lib/mobx-angular/tree-mobx-autorun.directive.mjs +4 -4
  15. package/{esm2020 → esm2022}/lib/models/tree-dragged-element.model.mjs +4 -4
  16. package/esm2022/lib/models/tree-node.model.mjs +390 -0
  17. package/esm2022/lib/models/tree-options.model.mjs +150 -0
  18. package/esm2022/lib/models/tree-virtual-scroll.model.mjs +197 -0
  19. package/esm2022/lib/models/tree.model.mjs +546 -0
  20. package/{fesm2020 → fesm2022}/ali-hm-angular-tree-component.mjs +174 -174
  21. package/{fesm2020 → fesm2022}/ali-hm-angular-tree-component.mjs.map +1 -1
  22. package/lib/components/loading.component.d.ts +1 -1
  23. package/lib/components/tree-node-checkbox.component.d.ts +1 -1
  24. package/lib/components/tree-node-collection.component.d.ts +3 -3
  25. package/lib/components/tree-node-content.component.d.ts +1 -1
  26. package/lib/components/tree-node-drop-slot.component.d.ts +1 -1
  27. package/lib/components/tree-node-expander.component.d.ts +1 -1
  28. package/lib/components/tree-node-wrapper.component.d.ts +1 -1
  29. package/lib/components/tree-viewport.component.d.ts +1 -1
  30. package/lib/components/tree.component.d.ts +1 -1
  31. package/lib/defs/api.d.ts +2 -2
  32. package/lib/directives/tree-animate-open.directive.d.ts +1 -1
  33. package/lib/directives/tree-drag.directive.d.ts +1 -1
  34. package/lib/directives/tree-drop.directive.d.ts +1 -1
  35. package/lib/mobx-angular/tree-mobx-autorun.directive.d.ts +1 -1
  36. package/package.json +8 -14
  37. package/esm2020/lib/components/tree-node-collection.component.mjs +0 -284
  38. package/esm2020/lib/components/tree.component.mjs +0 -186
  39. package/esm2020/lib/directives/tree-animate-open.directive.mjs +0 -101
  40. package/esm2020/lib/directives/tree-drop.directive.mjs +0 -127
  41. package/esm2020/lib/models/tree-node.model.mjs +0 -390
  42. package/esm2020/lib/models/tree-options.model.mjs +0 -150
  43. package/esm2020/lib/models/tree-virtual-scroll.model.mjs +0 -197
  44. package/esm2020/lib/models/tree.model.mjs +0 -546
  45. package/fesm2015/ali-hm-angular-tree-component.mjs +0 -2511
  46. package/fesm2015/ali-hm-angular-tree-component.mjs.map +0 -1
  47. /package/{esm2020 → esm2022}/ali-hm-angular-tree-component.mjs +0 -0
  48. /package/{esm2020 → esm2022}/lib/constants/events.mjs +0 -0
  49. /package/{esm2020 → esm2022}/lib/constants/keys.mjs +0 -0
  50. /package/{esm2020 → esm2022}/lib/defs/api.mjs +0 -0
  51. /package/{esm2020 → esm2022}/lib/mobx-angular/mobx-proxy.mjs +0 -0
  52. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,150 @@
1
+ import { KEYS } from '../constants/keys';
2
+ export const TREE_ACTIONS = {
3
+ TOGGLE_ACTIVE: (tree, node, $event) => node && node.toggleActivated(),
4
+ TOGGLE_ACTIVE_MULTI: (tree, node, $event) => node && node.toggleActivated(true),
5
+ TOGGLE_SELECTED: (tree, node, $event) => node && node.toggleSelected(),
6
+ ACTIVATE: (tree, node, $event) => node.setIsActive(true),
7
+ DEACTIVATE: (tree, node, $event) => node.setIsActive(false),
8
+ SELECT: (tree, node, $event) => node.setIsSelected(true),
9
+ DESELECT: (tree, node, $event) => node.setIsSelected(false),
10
+ FOCUS: (tree, node, $event) => node.focus(),
11
+ TOGGLE_EXPANDED: (tree, node, $event) => node.hasChildren && node.toggleExpanded(),
12
+ EXPAND: (tree, node, $event) => node.expand(),
13
+ COLLAPSE: (tree, node, $event) => node.collapse(),
14
+ DRILL_DOWN: (tree, node, $event) => tree.focusDrillDown(),
15
+ DRILL_UP: (tree, node, $event) => tree.focusDrillUp(),
16
+ NEXT_NODE: (tree, node, $event) => tree.focusNextNode(),
17
+ PREVIOUS_NODE: (tree, node, $event) => tree.focusPreviousNode(),
18
+ MOVE_NODE: (tree, node, $event, { from, to }) => {
19
+ // default action assumes from = node, to = {parent, index}
20
+ if ($event.ctrlKey) {
21
+ tree.copyNode(from, to);
22
+ }
23
+ else {
24
+ tree.moveNode(from, to);
25
+ }
26
+ }
27
+ };
28
+ const defaultActionMapping = {
29
+ mouse: {
30
+ click: TREE_ACTIONS.TOGGLE_ACTIVE,
31
+ dblClick: null,
32
+ contextMenu: null,
33
+ expanderClick: TREE_ACTIONS.TOGGLE_EXPANDED,
34
+ checkboxClick: TREE_ACTIONS.TOGGLE_SELECTED,
35
+ drop: TREE_ACTIONS.MOVE_NODE
36
+ },
37
+ keys: {
38
+ [KEYS.RIGHT]: TREE_ACTIONS.DRILL_DOWN,
39
+ [KEYS.LEFT]: TREE_ACTIONS.DRILL_UP,
40
+ [KEYS.DOWN]: TREE_ACTIONS.NEXT_NODE,
41
+ [KEYS.UP]: TREE_ACTIONS.PREVIOUS_NODE,
42
+ [KEYS.SPACE]: TREE_ACTIONS.TOGGLE_ACTIVE,
43
+ [KEYS.ENTER]: TREE_ACTIONS.TOGGLE_ACTIVE
44
+ }
45
+ };
46
+ export class TreeOptions {
47
+ get hasChildrenField() { return this.options.hasChildrenField || 'hasChildren'; }
48
+ get childrenField() { return this.options.childrenField || 'children'; }
49
+ get displayField() { return this.options.displayField || 'name'; }
50
+ get idField() { return this.options.idField || 'id'; }
51
+ get isExpandedField() { return this.options.isExpandedField || 'isExpanded'; }
52
+ get getChildren() { return this.options.getChildren; }
53
+ get levelPadding() { return this.options.levelPadding || 0; }
54
+ get useVirtualScroll() { return this.options.useVirtualScroll; }
55
+ get animateExpand() { return this.options.animateExpand; }
56
+ get animateSpeed() { return this.options.animateSpeed || 1; }
57
+ get animateAcceleration() { return this.options.animateAcceleration || 1.2; }
58
+ get scrollOnActivate() { return this.options.scrollOnActivate === undefined ? true : this.options.scrollOnActivate; }
59
+ get rtl() { return !!this.options.rtl; }
60
+ get rootId() { return this.options.rootId; }
61
+ get useCheckbox() { return this.options.useCheckbox; }
62
+ get useTriState() { return this.options.useTriState === undefined ? true : this.options.useTriState; }
63
+ get scrollContainer() { return this.options.scrollContainer; }
64
+ get allowDragoverStyling() { return this.options.allowDragoverStyling === undefined ? true : this.options.allowDragoverStyling; }
65
+ constructor(options = {}) {
66
+ this.options = options;
67
+ this.actionMapping = {
68
+ mouse: {
69
+ click: this.options?.actionMapping?.mouse?.click ?? defaultActionMapping.mouse.click,
70
+ dblClick: this.options?.actionMapping?.mouse?.dblClick ?? defaultActionMapping.mouse.dblClick,
71
+ contextMenu: this.options?.actionMapping?.mouse?.contextMenu ?? defaultActionMapping.mouse.contextMenu,
72
+ expanderClick: this.options?.actionMapping?.mouse?.expanderClick ?? defaultActionMapping.mouse.expanderClick,
73
+ checkboxClick: this.options?.actionMapping?.mouse?.checkboxClick ?? defaultActionMapping.mouse.checkboxClick,
74
+ drop: this.options?.actionMapping?.mouse?.drop ?? defaultActionMapping.mouse.drop,
75
+ dragStart: this.options?.actionMapping?.mouse?.dragStart ?? undefined,
76
+ drag: this.options?.actionMapping?.mouse?.drag ?? undefined,
77
+ dragEnd: this.options?.actionMapping?.mouse?.dragEnd ?? undefined,
78
+ dragOver: this.options?.actionMapping?.mouse?.dragOver ?? undefined,
79
+ dragLeave: this.options?.actionMapping?.mouse?.dragLeave ?? undefined,
80
+ dragEnter: this.options?.actionMapping?.mouse?.dragEnter ?? undefined,
81
+ mouseOver: this.options?.actionMapping?.mouse?.mouseOver ?? undefined,
82
+ mouseOut: this.options?.actionMapping?.mouse?.mouseOut ?? undefined,
83
+ },
84
+ keys: {
85
+ [KEYS.RIGHT]: TREE_ACTIONS.DRILL_DOWN,
86
+ [KEYS.LEFT]: TREE_ACTIONS.DRILL_UP,
87
+ [KEYS.DOWN]: TREE_ACTIONS.NEXT_NODE,
88
+ [KEYS.UP]: TREE_ACTIONS.PREVIOUS_NODE,
89
+ [KEYS.SPACE]: TREE_ACTIONS.TOGGLE_ACTIVE,
90
+ [KEYS.ENTER]: TREE_ACTIONS.TOGGLE_ACTIVE
91
+ }
92
+ };
93
+ if (this.options?.actionMapping?.keys) {
94
+ this.actionMapping.keys = {
95
+ ...this.actionMapping.keys,
96
+ ...this.options.actionMapping.keys
97
+ };
98
+ }
99
+ if (options.rtl) {
100
+ this.actionMapping.keys[KEYS.RIGHT] = options.actionMapping?.keys[KEYS.RIGHT] || TREE_ACTIONS.DRILL_UP;
101
+ this.actionMapping.keys[KEYS.LEFT] = options.actionMapping?.keys[KEYS.LEFT] || TREE_ACTIONS.DRILL_DOWN;
102
+ }
103
+ }
104
+ getNodeClone(node) {
105
+ if (this.options.getNodeClone) {
106
+ return this.options.getNodeClone(node);
107
+ }
108
+ // remove id from clone
109
+ // keeping ie11 compatibility
110
+ const nodeClone = Object.assign({}, node.data);
111
+ if (nodeClone.id) {
112
+ delete nodeClone.id;
113
+ }
114
+ return nodeClone;
115
+ }
116
+ allowDrop(element, to, $event) {
117
+ if (this.options.allowDrop instanceof Function) {
118
+ return this.options.allowDrop(element, to, $event);
119
+ }
120
+ else {
121
+ return this.options.allowDrop === undefined ? true : this.options.allowDrop;
122
+ }
123
+ }
124
+ allowDrag(node) {
125
+ if (this.options.allowDrag instanceof Function) {
126
+ return this.options.allowDrag(node);
127
+ }
128
+ else {
129
+ return this.options.allowDrag;
130
+ }
131
+ }
132
+ nodeClass(node) {
133
+ return this.options.nodeClass ? this.options.nodeClass(node) : '';
134
+ }
135
+ nodeHeight(node) {
136
+ if (node.data.virtual) {
137
+ return 0;
138
+ }
139
+ let nodeHeight = this.options.nodeHeight || 22;
140
+ if (typeof nodeHeight === 'function') {
141
+ nodeHeight = nodeHeight(node);
142
+ }
143
+ // account for drop slots:
144
+ return nodeHeight + (node.index === 0 ? 2 : 1) * this.dropSlotHeight;
145
+ }
146
+ get dropSlotHeight() {
147
+ return typeof this.options.dropSlotHeight === 'number' ? this.options.dropSlotHeight : 2;
148
+ }
149
+ }
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1vcHRpb25zLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZGVscy90cmVlLW9wdGlvbnMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT3pDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixhQUFhLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7SUFDL0YsbUJBQW1CLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ3pHLGVBQWUsRUFBRSxDQUFDLElBQWUsRUFBRSxJQUFjLEVBQUUsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtJQUNoRyxRQUFRLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDbEYsVUFBVSxFQUFFLENBQUMsSUFBZSxFQUFFLElBQWMsRUFBRSxNQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ3JGLE1BQU0sRUFBRSxDQUFDLElBQWUsRUFBRSxJQUFjLEVBQUUsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUNsRixRQUFRLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENB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L0I7UUFFRCwwQkFBMEI7UUFDMUIsT0FBTyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJy4vdHJlZS1ub2RlLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZU1vZGVsIH0gZnJvbSAnLi90cmVlLm1vZGVsJztcclxuaW1wb3J0IHsgS0VZUyB9IGZyb20gJy4uL2NvbnN0YW50cy9rZXlzJztcclxuaW1wb3J0IHsgSVRyZWVPcHRpb25zIH0gZnJvbSAnLi4vZGVmcy9hcGknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uSGFuZGxlciB7XHJcbiAgKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55LCAuLi5yZXN0KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFRSRUVfQUNUSU9OUyA9IHtcclxuICBUT0dHTEVfQUNUSVZFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUgJiYgbm9kZS50b2dnbGVBY3RpdmF0ZWQoKSxcclxuICBUT0dHTEVfQUNUSVZFX01VTFRJOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUgJiYgbm9kZS50b2dnbGVBY3RpdmF0ZWQodHJ1ZSksXHJcbiAgVE9HR0xFX1NFTEVDVEVEOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUgJiYgbm9kZS50b2dnbGVTZWxlY3RlZCgpLFxyXG4gIEFDVElWQVRFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuc2V0SXNBY3RpdmUodHJ1ZSksXHJcbiAgREVBQ1RJVkFURTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLnNldElzQWN0aXZlKGZhbHNlKSxcclxuICBTRUxFQ1Q6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5zZXRJc1NlbGVjdGVkKHRydWUpLFxyXG4gIERFU0VMRUNUOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuc2V0SXNTZWxlY3RlZChmYWxzZSksXHJcbiAgRk9DVVM6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5mb2N1cygpLFxyXG4gIFRPR0dMRV9FWFBBTkRFRDogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLmhhc0NoaWxkcmVuICYmIG5vZGUudG9nZ2xlRXhwYW5kZWQoKSxcclxuICBFWFBBTkQ6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5leHBhbmQoKSxcclxuICBDT0xMQVBTRTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLmNvbGxhcHNlKCksXHJcbiAgRFJJTExfRE9XTjogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiB0cmVlLmZvY3VzRHJpbGxEb3duKCksXHJcbiAgRFJJTExfVVA6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gdHJlZS5mb2N1c0RyaWxsVXAoKSxcclxuICBORVhUX05PREU6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gIHRyZWUuZm9jdXNOZXh0Tm9kZSgpLFxyXG4gIFBSRVZJT1VTX05PREU6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gIHRyZWUuZm9jdXNQcmV2aW91c05vZGUoKSxcclxuICBNT1ZFX05PREU6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSwge2Zyb20gLCB0b306IHtmcm9tOiBhbnksIHRvOiBhbnl9KSA9PiB7XHJcbiAgICAvLyBkZWZhdWx0IGFjdGlvbiBhc3N1bWVzIGZyb20gPSBub2RlLCB0byA9IHtwYXJlbnQsIGluZGV4fVxyXG4gICAgaWYgKCRldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgIHRyZWUuY29weU5vZGUoZnJvbSwgdG8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJlZS5tb3ZlTm9kZShmcm9tLCB0byk7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZGVmYXVsdEFjdGlvbk1hcHBpbmc6IElBY3Rpb25NYXBwaW5nID0ge1xyXG4gIG1vdXNlOiB7XHJcbiAgICBjbGljazogVFJFRV9BQ1RJT05TLlRPR0dMRV9BQ1RJVkUsXHJcbiAgICBkYmxDbGljazogbnVsbCxcclxuICAgIGNvbnRleHRNZW51OiBudWxsLFxyXG4gICAgZXhwYW5kZXJDbGljazogVFJFRV9BQ1RJT05TLlRPR0dMRV9FWFBBTkRFRCxcclxuICAgIGNoZWNrYm94Q2xpY2s6IFRSRUVfQUNUSU9OUy5UT0dHTEVfU0VMRUNURUQsXHJcbiAgICBkcm9wOiBUUkVFX0FDVElPTlMuTU9WRV9OT0RFXHJcbiAgfSxcclxuICBrZXlzOiB7XHJcbiAgICBbS0VZUy5SSUdIVF06IFRSRUVfQUNUSU9OUy5EUklMTF9ET1dOLFxyXG4gICAgW0tFWVMuTEVGVF06IFRSRUVfQUNUSU9OUy5EUklMTF9VUCxcclxuICAgIFtLRVlTLkRPV05dOiBUUkVFX0FDVElPTlMuTkVYVF9OT0RFLFxyXG4gICAgW0tFWVMuVVBdOiBUUkVFX0FDVElPTlMuUFJFVklPVVNfTk9ERSxcclxuICAgIFtLRVlTLlNQQUNFXTogVFJFRV9BQ1RJT05TLlRPR0dMRV9BQ1RJVkUsXHJcbiAgICBbS0VZUy5FTlRFUl06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFXHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uTWFwcGluZyB7XHJcbiAgbW91c2U/OiB7XHJcbiAgICBjbGljaz86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgZGJsQ2xpY2s/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGNvbnRleHRNZW51PzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBleHBhbmRlckNsaWNrPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBjaGVja2JveENsaWNrPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBkcmFnU3RhcnQ/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGRyYWc/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGRyYWdFbmQ/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGRyYWdPdmVyPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBkcmFnTGVhdmU/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGRyYWdFbnRlcj86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgZHJvcD86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgbW91c2VPdmVyPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBtb3VzZU91dD86IElBY3Rpb25IYW5kbGVyXHJcbiAgfTtcclxuICBrZXlzPzoge1xyXG4gICAgW2tleTogbnVtYmVyXTogSUFjdGlvbkhhbmRsZXJcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHJlZU9wdGlvbnMge1xyXG4gIGdldCBoYXNDaGlsZHJlbkZpZWxkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm9wdGlvbnMuaGFzQ2hpbGRyZW5GaWVsZCB8fCAnaGFzQ2hpbGRyZW4nOyB9XHJcbiAgZ2V0IGNoaWxkcmVuRmllbGQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGlsZHJlbkZpZWxkIHx8ICdjaGlsZHJlbic7IH1cclxuICBnZXQgZGlzcGxheUZpZWxkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm9wdGlvbnMuZGlzcGxheUZpZWxkIHx8ICduYW1lJzsgfVxyXG4gIGdldCBpZEZpZWxkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm9wdGlvbnMuaWRGaWVsZCB8fCAnaWQnOyB9XHJcbiAgZ2V0IGlzRXhwYW5kZWRGaWVsZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmlzRXhwYW5kZWRGaWVsZCB8fCAnaXNFeHBhbmRlZCc7IH1cclxuICBnZXQgZ2V0Q2hpbGRyZW4oKTogYW55IHsgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXRDaGlsZHJlbjsgfVxyXG4gIGdldCBsZXZlbFBhZGRpbmcoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5sZXZlbFBhZGRpbmcgfHwgMDsgfVxyXG4gIGdldCB1c2VWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLnVzZVZpcnR1YWxTY3JvbGw7IH1cclxuICBnZXQgYW5pbWF0ZUV4cGFuZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5hbmltYXRlRXhwYW5kOyB9XHJcbiAgZ2V0IGFuaW1hdGVTcGVlZCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5vcHRpb25zLmFuaW1hdGVTcGVlZCB8fCAxOyB9XHJcbiAgZ2V0IGFuaW1hdGVBY2NlbGVyYXRpb24oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5hbmltYXRlQWNjZWxlcmF0aW9uIHx8IDEuMjsgfVxyXG4gIGdldCBzY3JvbGxPbkFjdGl2YXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLnNjcm9sbE9uQWN0aXZhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLm9wdGlvbnMuc2Nyb2xsT25BY3RpdmF0ZTsgfVxyXG4gIGdldCBydGwoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMub3B0aW9ucy5ydGw7IH1cclxuICBnZXQgcm9vdElkKCk6IGFueSB7cmV0dXJuIHRoaXMub3B0aW9ucy5yb290SWQ7IH1cclxuICBnZXQgdXNlQ2hlY2tib3goKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wdGlvbnMudXNlQ2hlY2tib3g7IH1cclxuICBnZXQgdXNlVHJpU3RhdGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wdGlvbnMudXNlVHJpU3RhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLm9wdGlvbnMudXNlVHJpU3RhdGU7IH1cclxuICBnZXQgc2Nyb2xsQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMub3B0aW9ucy5zY3JvbGxDb250YWluZXI7IH1cclxuICBnZXQgYWxsb3dEcmFnb3ZlclN0eWxpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dEcmFnb3ZlclN0eWxpbmcgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLm9wdGlvbnMuYWxsb3dEcmFnb3ZlclN0eWxpbmc7IH1cclxuICBhY3Rpb25NYXBwaW5nOiBJQWN0aW9uTWFwcGluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvcHRpb25zOiBJVHJlZU9wdGlvbnMgPSB7fSkge1xyXG4gICAgdGhpcy5hY3Rpb25NYXBwaW5nID0ge1xyXG4gICAgICBtb3VzZToge1xyXG4gICAgICAgIGNsaWNrOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5jbGljayA/PyBkZWZhdWx0QWN0aW9uTWFwcGluZy5tb3VzZS5jbGljayxcclxuICAgICAgICBkYmxDbGljazogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZGJsQ2xpY2sgPz8gZGVmYXVsdEFjdGlvbk1hcHBpbmcubW91c2UuZGJsQ2xpY2ssXHJcbiAgICAgICAgY29udGV4dE1lbnU6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmNvbnRleHRNZW51ID8/IGRlZmF1bHRBY3Rpb25NYXBwaW5nLm1vdXNlLmNvbnRleHRNZW51LFxyXG4gICAgICAgIGV4cGFuZGVyQ2xpY2s6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmV4cGFuZGVyQ2xpY2sgPz8gZGVmYXVsdEFjdGlvbk1hcHBpbmcubW91c2UuZXhwYW5kZXJDbGljayxcclxuICAgICAgICBjaGVja2JveENsaWNrOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5jaGVja2JveENsaWNrID8/IGRlZmF1bHRBY3Rpb25NYXBwaW5nLm1vdXNlLmNoZWNrYm94Q2xpY2ssXHJcbiAgICAgICAgZHJvcDogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJvcCA/PyBkZWZhdWx0QWN0aW9uTWFwcGluZy5tb3VzZS5kcm9wLFxyXG4gICAgICAgIGRyYWdTdGFydDogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJhZ1N0YXJ0ID8/IHVuZGVmaW5lZCxcclxuICAgICAgICBkcmFnOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5kcmFnID8/IHVuZGVmaW5lZCxcclxuICAgICAgICBkcmFnRW5kOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5kcmFnRW5kID8/IHVuZGVmaW5lZCxcclxuICAgICAgICBkcmFnT3ZlcjogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJhZ092ZXIgPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgIGRyYWdMZWF2ZTogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJhZ0xlYXZlID8/IHVuZGVmaW5lZCxcclxuICAgICAgICBkcmFnRW50ZXI6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdFbnRlciA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgbW91c2VPdmVyOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5tb3VzZU92ZXIgPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgIG1vdXNlT3V0OiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5tb3VzZU91dCA/PyB1bmRlZmluZWQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGtleXM6IHtcclxuICAgICAgICBbS0VZUy5SSUdIVF06IFRSRUVfQUNUSU9OUy5EUklMTF9ET1dOLFxyXG4gICAgICAgIFtLRVlTLkxFRlRdOiBUUkVFX0FDVElPTlMuRFJJTExfVVAsXHJcbiAgICAgICAgW0tFWVMuRE9XTl06IFRSRUVfQUNUSU9OUy5ORVhUX05PREUsXHJcbiAgICAgICAgW0tFWVMuVVBdOiBUUkVFX0FDVElPTlMuUFJFVklPVVNfTk9ERSxcclxuICAgICAgICBbS0VZUy5TUEFDRV06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFLFxyXG4gICAgICAgIFtLRVlTLkVOVEVSXTogVFJFRV9BQ1RJT05TLlRPR0dMRV9BQ1RJVkVcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/LmtleXMpIHtcclxuICAgICAgdGhpcy5hY3Rpb25NYXBwaW5nLmtleXMgPSB7XHJcbiAgICAgICAgLi4udGhpcy5hY3Rpb25NYXBwaW5nLmtleXMsXHJcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmFjdGlvbk1hcHBpbmcua2V5c1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMucnRsKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uTWFwcGluZy5rZXlzW0tFWVMuUklHSFRdID0gPElBY3Rpb25IYW5kbGVyPm9wdGlvbnMuYWN0aW9uTWFwcGluZz8ua2V5c1tLRVlTLlJJR0hUXSB8fCBUUkVFX0FDVElPTlMuRFJJTExfVVA7XHJcbiAgICAgIHRoaXMuYWN0aW9uTWFwcGluZy5rZXlzW0tFWVMuTEVGVF0gPSA8SUFjdGlvbkhhbmRsZXI+b3B0aW9ucy5hY3Rpb25NYXBwaW5nPy5rZXlzW0tFWVMuTEVGVF0gfHwgVFJFRV9BQ1RJT05TLkRSSUxMX0RPV047XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROb2RlQ2xvbmUobm9kZTogVHJlZU5vZGUpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5nZXROb2RlQ2xvbmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXROb2RlQ2xvbmUobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVtb3ZlIGlkIGZyb20gY2xvbmVcclxuICAgIC8vIGtlZXBpbmcgaWUxMSBjb21wYXRpYmlsaXR5XHJcbiAgICBjb25zdCBub2RlQ2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlLmRhdGEpO1xyXG4gICAgaWYgKG5vZGVDbG9uZS5pZCkge1xyXG4gICAgICBkZWxldGUgbm9kZUNsb25lLmlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGVDbG9uZTtcclxuICB9XHJcblxyXG4gIGFsbG93RHJvcChlbGVtZW50LCB0bywgJGV2ZW50Pyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJvcChlbGVtZW50LCB0bywgJGV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJvcCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMub3B0aW9ucy5hbGxvd0Ryb3A7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhbGxvd0RyYWcobm9kZTogVHJlZU5vZGUpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEcmFnIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0RyYWcobm9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJhZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5vZGVDbGFzcyhub2RlOiBUcmVlTm9kZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm5vZGVDbGFzcyA/IHRoaXMub3B0aW9ucy5ub2RlQ2xhc3Mobm9kZSkgOiAnJztcclxuICB9XHJcblxyXG4gIG5vZGVIZWlnaHQobm9kZTogVHJlZU5vZGUpOiBudW1iZXIge1xyXG4gICAgaWYgKG5vZGUuZGF0YS52aXJ0dWFsKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBub2RlSGVpZ2h0ID0gdGhpcy5vcHRpb25zLm5vZGVIZWlnaHQgfHwgMjI7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBub2RlSGVpZ2h0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIG5vZGVIZWlnaHQgPSBub2RlSGVpZ2h0KG5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFjY291bnQgZm9yIGRyb3Agc2xvdHM6XHJcbiAgICByZXR1cm4gbm9kZUhlaWdodCArIChub2RlLmluZGV4ID09PSAwID8gIDIgOiAxKSAqIHRoaXMuZHJvcFNsb3RIZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBnZXQgZHJvcFNsb3RIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0eXBlb2YgdGhpcy5vcHRpb25zLmRyb3BTbG90SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHRoaXMub3B0aW9ucy5kcm9wU2xvdEhlaWdodCA6IDI7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,197 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Injectable } from '@angular/core';
8
+ import { observable, computed, action, autorun, reaction } from 'mobx';
9
+ import { TREE_EVENTS } from '../constants/events';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./tree.model";
12
+ const Y_OFFSET = 500; // Extra pixels outside the viewport, in each direction, to render nodes in
13
+ const Y_EPSILON = 150; // Minimum pixel change required to recalculate the rendered nodes
14
+ export class TreeVirtualScroll {
15
+ get y() {
16
+ return this.yBlocks * Y_EPSILON;
17
+ }
18
+ get totalHeight() {
19
+ return this.treeModel.virtualRoot ? this.treeModel.virtualRoot.height : 0;
20
+ }
21
+ constructor(treeModel) {
22
+ this.treeModel = treeModel;
23
+ this.yBlocks = 0;
24
+ this.x = 0;
25
+ this.viewportHeight = null;
26
+ this.viewport = null;
27
+ treeModel.virtualScroll = this;
28
+ this._dispose = [autorun(() => this.fixScroll())];
29
+ }
30
+ fireEvent(event) {
31
+ this.treeModel.fireEvent(event);
32
+ }
33
+ init() {
34
+ const fn = this.recalcPositions.bind(this);
35
+ fn();
36
+ this._dispose = [
37
+ ...this._dispose,
38
+ reaction(() => this.treeModel.roots, fn),
39
+ reaction(() => this.treeModel.expandedNodeIds, fn),
40
+ reaction(() => this.treeModel.hiddenNodeIds, fn)
41
+ ];
42
+ this.treeModel.subscribe(TREE_EVENTS.loadNodeChildren, fn);
43
+ }
44
+ isEnabled() {
45
+ return this.treeModel.options.useVirtualScroll;
46
+ }
47
+ _setYBlocks(value) {
48
+ this.yBlocks = value;
49
+ }
50
+ recalcPositions() {
51
+ this.treeModel.virtualRoot.height = this._getPositionAfter(this.treeModel.getVisibleRoots(), 0);
52
+ }
53
+ _getPositionAfter(nodes, startPos) {
54
+ let position = startPos;
55
+ nodes.forEach((node) => {
56
+ node.position = position;
57
+ position = this._getPositionAfterNode(node, position);
58
+ });
59
+ return position;
60
+ }
61
+ _getPositionAfterNode(node, startPos) {
62
+ let position = node.getSelfHeight() + startPos;
63
+ if (node.children && node.isExpanded) { // TBD: consider loading component as well
64
+ position = this._getPositionAfter(node.visibleChildren, position);
65
+ }
66
+ node.height = position - startPos;
67
+ return position;
68
+ }
69
+ clear() {
70
+ this._dispose.forEach((d) => d());
71
+ }
72
+ setViewport(viewport) {
73
+ Object.assign(this, {
74
+ viewport,
75
+ x: viewport.scrollLeft,
76
+ yBlocks: Math.round(viewport.scrollTop / Y_EPSILON),
77
+ viewportHeight: viewport.getBoundingClientRect ? viewport.getBoundingClientRect().height : 0
78
+ });
79
+ }
80
+ scrollIntoView(node, force, scrollToMiddle = true) {
81
+ if (node.options.scrollContainer) {
82
+ const scrollContainer = node.options.scrollContainer;
83
+ const scrollContainerHeight = scrollContainer.getBoundingClientRect().height;
84
+ const scrollContainerTop = scrollContainer.getBoundingClientRect().top;
85
+ const nodeTop = this.viewport.getBoundingClientRect().top + node.position - scrollContainerTop;
86
+ if (force || // force scroll to node
87
+ nodeTop < scrollContainer.scrollTop || // node is above scroll container
88
+ nodeTop + node.getSelfHeight() > scrollContainer.scrollTop + scrollContainerHeight) { // node is below container
89
+ scrollContainer.scrollTop = scrollToMiddle ?
90
+ nodeTop - scrollContainerHeight / 2 : // scroll to middle
91
+ nodeTop; // scroll to start
92
+ }
93
+ }
94
+ else {
95
+ if (force || // force scroll to node
96
+ node.position < this.y || // node is above viewport
97
+ node.position + node.getSelfHeight() > this.y + this.viewportHeight) { // node is below viewport
98
+ if (this.viewport) {
99
+ this.viewport.scrollTop = scrollToMiddle ?
100
+ node.position - this.viewportHeight / 2 : // scroll to middle
101
+ node.position; // scroll to start
102
+ this._setYBlocks(Math.floor(this.viewport.scrollTop / Y_EPSILON));
103
+ }
104
+ }
105
+ }
106
+ }
107
+ getViewportNodes(nodes) {
108
+ if (!nodes)
109
+ return [];
110
+ const visibleNodes = nodes.filter((node) => !node.isHidden);
111
+ if (!this.isEnabled())
112
+ return visibleNodes;
113
+ if (!this.viewportHeight || !visibleNodes.length)
114
+ return [];
115
+ // When loading children async this method is called before their height and position is calculated.
116
+ // In that case firstIndex === 0 and lastIndex === visibleNodes.length - 1 (e.g. 1000),
117
+ // which means that it loops through every visibleNodes item and push them into viewportNodes array.
118
+ // We can prevent nodes from being pushed to the array and wait for the appropriate calculations to take place
119
+ const lastVisibleNode = visibleNodes.slice(-1)[0];
120
+ if (!lastVisibleNode.height && lastVisibleNode.position === 0)
121
+ return [];
122
+ // Search for first node in the viewport using binary search
123
+ // Look for first node that starts after the beginning of the viewport (with buffer)
124
+ // Or that ends after the beginning of the viewport
125
+ const firstIndex = binarySearch(visibleNodes, (node) => {
126
+ return (node.position + Y_OFFSET > this.y) ||
127
+ (node.position + node.height > this.y);
128
+ });
129
+ // Search for last node in the viewport using binary search
130
+ // Look for first node that starts after the end of the viewport (with buffer)
131
+ const lastIndex = binarySearch(visibleNodes, (node) => {
132
+ return node.position - Y_OFFSET > this.y + this.viewportHeight;
133
+ }, firstIndex);
134
+ const viewportNodes = [];
135
+ for (let i = firstIndex; i <= lastIndex; i++) {
136
+ viewportNodes.push(visibleNodes[i]);
137
+ }
138
+ return viewportNodes;
139
+ }
140
+ fixScroll() {
141
+ const maxY = Math.max(0, this.totalHeight - this.viewportHeight);
142
+ if (this.y < 0)
143
+ this._setYBlocks(0);
144
+ if (this.y > maxY)
145
+ this._setYBlocks(maxY / Y_EPSILON);
146
+ }
147
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeVirtualScroll, deps: [{ token: i1.TreeModel }], target: i0.ɵɵFactoryTarget.Injectable }); }
148
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeVirtualScroll }); }
149
+ }
150
+ __decorate([
151
+ observable
152
+ ], TreeVirtualScroll.prototype, "yBlocks", void 0);
153
+ __decorate([
154
+ observable
155
+ ], TreeVirtualScroll.prototype, "x", void 0);
156
+ __decorate([
157
+ observable
158
+ ], TreeVirtualScroll.prototype, "viewportHeight", void 0);
159
+ __decorate([
160
+ computed
161
+ ], TreeVirtualScroll.prototype, "y", null);
162
+ __decorate([
163
+ computed
164
+ ], TreeVirtualScroll.prototype, "totalHeight", null);
165
+ __decorate([
166
+ action
167
+ ], TreeVirtualScroll.prototype, "_setYBlocks", null);
168
+ __decorate([
169
+ action
170
+ ], TreeVirtualScroll.prototype, "recalcPositions", null);
171
+ __decorate([
172
+ action
173
+ ], TreeVirtualScroll.prototype, "setViewport", null);
174
+ __decorate([
175
+ action
176
+ ], TreeVirtualScroll.prototype, "scrollIntoView", null);
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeVirtualScroll, decorators: [{
178
+ type: Injectable
179
+ }], ctorParameters: function () { return [{ type: i1.TreeModel }]; }, propDecorators: { yBlocks: [], x: [], viewportHeight: [], y: [], totalHeight: [], _setYBlocks: [], recalcPositions: [], setViewport: [], scrollIntoView: [] } });
180
+ function binarySearch(nodes, condition, firstIndex = 0) {
181
+ let index = firstIndex;
182
+ let toIndex = nodes.length - 1;
183
+ while (index !== toIndex) {
184
+ let midIndex = Math.floor((index + toIndex) / 2);
185
+ if (condition(nodes[midIndex])) {
186
+ toIndex = midIndex;
187
+ }
188
+ else {
189
+ if (index === midIndex)
190
+ index = toIndex;
191
+ else
192
+ index = midIndex;
193
+ }
194
+ }
195
+ return index;
196
+ }
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aXJ0dWFsLXNjcm9sbC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdHJlZS1jb21wb25lbnQvc3JjL2xpYi9tb2RlbHMvdHJlZS12aXJ0dWFsLXNjcm9sbC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBRWxELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLDJFQUEyRTtBQUNqRyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxrRUFBa0U7QUFHekYsTUFBTSxPQUFPLGlCQUFpQjtJQVFsQixJQUFJLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFUyxJQUFJLFdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELFlBQW9CLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFiNUIsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUNsQyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBV2QsU0FBUyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FB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VTs0Q0FBTztBQUNOO0lBQVgsVUFBVTt5REFBdUI7QUFHeEI7SUFBVCxRQUFROzBDQUVSO0FBRVM7SUFBVCxRQUFRO29EQUVSO0FBNEJPO0lBQVAsTUFBTTtvREFFTjtBQUVPO0lBQVAsTUFBTTt3REFFTjtBQTJCTztJQUFQLE1BQU07b0RBT047QUFFTztJQUFQLE1BQU07dURBMkJOOzRGQS9HVSxpQkFBaUI7a0JBRDdCLFVBQVU7Z0dBSUcsT0FBTyxNQUNQLENBQUMsTUFDRCxjQUFjLE1BR1osQ0FBQyxNQUlELFdBQVcsTUE4QlQsV0FBVyxNQUluQixlQUFlLE1BNkJmLFdBQVcsTUFTWCxjQUFjO0FBNEV4QixTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsR0FBRyxDQUFDO0lBQ3BELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUN2QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUUvQixPQUFPLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDeEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVqRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUM5QixPQUFPLEdBQUcsUUFBUSxDQUFDO1NBQ3BCO2FBQ0k7WUFDSCxJQUFJLEtBQUssS0FBSyxRQUFRO2dCQUFFLEtBQUssR0FBRyxPQUFPLENBQUM7O2dCQUNuQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ3ZCO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IG9ic2VydmFibGUsIGNvbXB1dGVkLCBhY3Rpb24sIGF1dG9ydW4sIHJlYWN0aW9uIH0gZnJvbSAnbW9ieCc7XHJcbmltcG9ydCB7IFRyZWVNb2RlbCB9IGZyb20gJy4vdHJlZS5tb2RlbCc7XHJcbmltcG9ydCB7IFRSRUVfRVZFTlRTIH0gZnJvbSAnLi4vY29uc3RhbnRzL2V2ZW50cyc7XHJcblxyXG5jb25zdCBZX09GRlNFVCA9IDUwMDsgLy8gRXh0cmEgcGl4ZWxzIG91dHNpZGUgdGhlIHZpZXdwb3J0LCBpbiBlYWNoIGRpcmVjdGlvbiwgdG8gcmVuZGVyIG5vZGVzIGluXHJcbmNvbnN0IFlfRVBTSUxPTiA9IDE1MDsgLy8gTWluaW11bSBwaXhlbCBjaGFuZ2UgcmVxdWlyZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHJlbmRlcmVkIG5vZGVzXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUcmVlVmlydHVhbFNjcm9sbCB7XHJcbiAgcHJpdmF0ZSBfZGlzcG9zZTogYW55O1xyXG5cclxuICBAb2JzZXJ2YWJsZSB5QmxvY2tzID0gMDtcclxuICBAb2JzZXJ2YWJsZSB4ID0gMDtcclxuICBAb2JzZXJ2YWJsZSB2aWV3cG9ydEhlaWdodCA9IG51bGw7XHJcbiAgdmlld3BvcnQgPSBudWxsO1xyXG5cclxuICBAY29tcHV0ZWQgZ2V0IHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy55QmxvY2tzICogWV9FUFNJTE9OO1xyXG4gIH1cclxuXHJcbiAgQGNvbXB1dGVkIGdldCB0b3RhbEhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRyZWVNb2RlbC52aXJ0dWFsUm9vdCA/IHRoaXMudHJlZU1vZGVsLnZpcnR1YWxSb290LmhlaWdodCA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyZWVNb2RlbDogVHJlZU1vZGVsKSB7XHJcbiAgICB0cmVlTW9kZWwudmlydHVhbFNjcm9sbCA9IHRoaXM7XHJcbiAgICB0aGlzLl9kaXNwb3NlID0gW2F1dG9ydW4oKCkgPT4gdGhpcy5maXhTY3JvbGwoKSldO1xyXG4gIH1cclxuXHJcbiAgZmlyZUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnRyZWVNb2RlbC5maXJlRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIGNvbnN0IGZuID0gdGhpcy5yZWNhbGNQb3NpdGlvbnMuYmluZCh0aGlzKTtcclxuXHJcbiAgICBmbigpO1xyXG4gICAgdGhpcy5fZGlzcG9zZSA9IFtcclxuICAgICAgLi4udGhpcy5fZGlzcG9zZSxcclxuICAgICAgcmVhY3Rpb24oKCkgPT4gdGhpcy50cmVlTW9kZWwucm9vdHMsIGZuKSxcclxuICAgICAgcmVhY3Rpb24oKCkgPT4gdGhpcy50cmVlTW9kZWwuZXhwYW5kZWROb2RlSWRzLCBmbiksXHJcbiAgICAgIHJlYWN0aW9uKCgpID0+IHRoaXMudHJlZU1vZGVsLmhpZGRlbk5vZGVJZHMsIGZuKVxyXG4gICAgXTtcclxuICAgIHRoaXMudHJlZU1vZGVsLnN1YnNjcmliZShUUkVFX0VWRU5UUy5sb2FkTm9kZUNoaWxkcmVuLCBmbik7XHJcbiAgfVxyXG5cclxuICBpc0VuYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50cmVlTW9kZWwub3B0aW9ucy51c2VWaXJ0dWFsU2Nyb2xsO1xyXG4gIH1cclxuXHJcbiAgQGFjdGlvbiBwcml2YXRlIF9zZXRZQmxvY2tzKHZhbHVlKSB7XHJcbiAgICB0aGlzLnlCbG9ja3MgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBhY3Rpb24gcmVjYWxjUG9zaXRpb25zKCkge1xyXG4gICAgdGhpcy50cmVlTW9kZWwudmlydHVhbFJvb3QuaGVpZ2h0ID0gdGhpcy5fZ2V0UG9zaXRpb25BZnRlcih0aGlzLnRyZWVNb2RlbC5nZXRWaXNpYmxlUm9vdHMoKSwgMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQb3NpdGlvbkFmdGVyKG5vZGVzLCBzdGFydFBvcykge1xyXG4gICAgbGV0IHBvc2l0aW9uID0gc3RhcnRQb3M7XHJcblxyXG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICBub2RlLnBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgIHBvc2l0aW9uID0gdGhpcy5fZ2V0UG9zaXRpb25BZnRlck5vZGUobm9kZSwgcG9zaXRpb24pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQb3NpdGlvbkFmdGVyTm9kZShub2RlLCBzdGFydFBvcykge1xyXG4gICAgbGV0IHBvc2l0aW9uID0gbm9kZS5nZXRTZWxmSGVpZ2h0KCkgKyBzdGFydFBvcztcclxuXHJcbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmlzRXhwYW5kZWQpIHsgLy8gVEJEOiBjb25zaWRlciBsb2FkaW5nIGNvbXBvbmVudCBhcyB3ZWxsXHJcbiAgICAgIHBvc2l0aW9uID0gdGhpcy5fZ2V0UG9zaXRpb25BZnRlcihub2RlLnZpc2libGVDaGlsZHJlbiwgcG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgbm9kZS5oZWlnaHQgPSBwb3NpdGlvbiAtIHN0YXJ0UG9zO1xyXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gIH1cclxuXHJcblxyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5fZGlzcG9zZS5mb3JFYWNoKChkKSA9PiBkKCkpO1xyXG4gIH1cclxuXHJcbiAgQGFjdGlvbiBzZXRWaWV3cG9ydCh2aWV3cG9ydCkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XHJcbiAgICAgIHZpZXdwb3J0LFxyXG4gICAgICB4OiB2aWV3cG9ydC5zY3JvbGxMZWZ0LFxyXG4gICAgICB5QmxvY2tzOiBNYXRoLnJvdW5kKHZpZXdwb3J0LnNjcm9sbFRvcCAvIFlfRVBTSUxPTiksXHJcbiAgICAgIHZpZXdwb3J0SGVpZ2h0OiB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPyB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgOiAwXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBhY3Rpb24gc2Nyb2xsSW50b1ZpZXcobm9kZSwgZm9yY2UsIHNjcm9sbFRvTWlkZGxlID0gdHJ1ZSkge1xyXG4gICAgaWYgKG5vZGUub3B0aW9ucy5zY3JvbGxDb250YWluZXIpIHtcclxuICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gbm9kZS5vcHRpb25zLnNjcm9sbENvbnRhaW5lcjtcclxuICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVySGVpZ2h0ID0gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyVG9wID0gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgY29uc3Qgbm9kZVRvcCA9IHRoaXMudmlld3BvcnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgbm9kZS5wb3NpdGlvbiAtIHNjcm9sbENvbnRhaW5lclRvcDtcclxuXHJcbiAgICAgIGlmIChmb3JjZSB8fCAvLyBmb3JjZSBzY3JvbGwgdG8gbm9kZVxyXG4gICAgICAgIG5vZGVUb3AgPCBzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wIHx8IC8vIG5vZGUgaXMgYWJvdmUgc2Nyb2xsIGNvbnRhaW5lclxyXG4gICAgICAgIG5vZGVUb3AgKyBub2RlLmdldFNlbGZIZWlnaHQoKSA+IHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgKyBzY3JvbGxDb250YWluZXJIZWlnaHQpIHsgLy8gbm9kZSBpcyBiZWxvdyBjb250YWluZXJcclxuICAgICAgICBzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wID0gc2Nyb2xsVG9NaWRkbGUgP1xyXG4gICAgICAgICAgbm9kZVRvcCAtIHNjcm9sbENvbnRhaW5lckhlaWdodCAvIDIgOiAvLyBzY3JvbGwgdG8gbWlkZGxlXHJcbiAgICAgICAgICBub2RlVG9wOyAvLyBzY3JvbGwgdG8gc3RhcnRcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGZvcmNlIHx8IC8vIGZvcmNlIHNjcm9sbCB0byBub2RlXHJcbiAgICAgICAgbm9kZS5wb3NpdGlvbiA8IHRoaXMueSB8fCAvLyBub2RlIGlzIGFib3ZlIHZpZXdwb3J0XHJcbiAgICAgICAgbm9kZS5wb3NpdGlvbiArIG5vZGUuZ2V0U2VsZkhlaWdodCgpID4gdGhpcy55ICsgdGhpcy52aWV3cG9ydEhlaWdodCkgeyAvLyBub2RlIGlzIGJlbG93IHZpZXdwb3J0XHJcbiAgICAgICAgaWYgKHRoaXMudmlld3BvcnQpIHtcclxuICAgICAgICAgIHRoaXMudmlld3BvcnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9NaWRkbGUgP1xyXG4gICAgICAgICAgbm9kZS5wb3NpdGlvbiAtIHRoaXMudmlld3BvcnRIZWlnaHQgLyAyIDogLy8gc2Nyb2xsIHRvIG1pZGRsZVxyXG4gICAgICAgICAgbm9kZS5wb3NpdGlvbjsgLy8gc2Nyb2xsIHRvIHN0YXJ0XHJcblxyXG4gICAgICAgICAgdGhpcy5fc2V0WUJsb2NrcyhNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuc2Nyb2xsVG9wIC8gWV9FUFNJTE9OKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3cG9ydE5vZGVzKG5vZGVzKSB7XHJcbiAgICBpZiAoIW5vZGVzKSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3QgdmlzaWJsZU5vZGVzID0gbm9kZXMuZmlsdGVyKChub2RlKSA9PiAhbm9kZS5pc0hpZGRlbik7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm4gdmlzaWJsZU5vZGVzO1xyXG5cclxuICAgIGlmICghdGhpcy52aWV3cG9ydEhlaWdodCB8fCAhdmlzaWJsZU5vZGVzLmxlbmd0aCkgcmV0dXJuIFtdO1xyXG5cclxuICAgIC8vIFdoZW4gbG9hZGluZyBjaGlsZHJlbiBhc3luYyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoZWlyIGhlaWdodCBhbmQgcG9zaXRpb24gaXMgY2FsY3VsYXRlZC5cclxuICAgIC8vIEluIHRoYXQgY2FzZSBmaXJzdEluZGV4ID09PSAwIGFuZCBsYXN0SW5kZXggPT09IHZpc2libGVOb2Rlcy5sZW5ndGggLSAxIChlLmcuIDEwMDApLFxyXG4gICAgLy8gd2hpY2ggbWVhbnMgdGhhdCBpdCBsb29wcyB0aHJvdWdoIGV2ZXJ5IHZpc2libGVOb2RlcyBpdGVtIGFuZCBwdXNoIHRoZW0gaW50byB2aWV3cG9ydE5vZGVzIGFycmF5LlxyXG4gICAgLy8gV2UgY2FuIHByZXZlbnQgbm9kZXMgZnJvbSBiZWluZyBwdXNoZWQgdG8gdGhlIGFycmF5IGFuZCB3YWl0IGZvciB0aGUgYXBwcm9wcmlhdGUgY2FsY3VsYXRpb25zIHRvIHRha2UgcGxhY2VcclxuICAgIGNvbnN0IGxhc3RWaXNpYmxlTm9kZSA9IHZpc2libGVOb2Rlcy5zbGljZSgtMSlbMF1cclxuICAgIGlmICghbGFzdFZpc2libGVOb2RlLmhlaWdodCAmJiBsYXN0VmlzaWJsZU5vZGUucG9zaXRpb24gPT09IDApIHJldHVybiBbXTtcclxuXHJcbiAgICAvLyBTZWFyY2ggZm9yIGZpcnN0IG5vZGUgaW4gdGhlIHZpZXdwb3J0IHVzaW5nIGJpbmFyeSBzZWFyY2hcclxuICAgIC8vIExvb2sgZm9yIGZpcnN0IG5vZGUgdGhhdCBzdGFydHMgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlld3BvcnQgKHdpdGggYnVmZmVyKVxyXG4gICAgLy8gT3IgdGhhdCBlbmRzIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZXdwb3J0XHJcbiAgICBjb25zdCBmaXJzdEluZGV4ID0gYmluYXJ5U2VhcmNoKHZpc2libGVOb2RlcywgKG5vZGUpID0+IHtcclxuICAgICAgcmV0dXJuIChub2RlLnBvc2l0aW9uICsgWV9PRkZTRVQgPiB0aGlzLnkpIHx8XHJcbiAgICAgICAgICAgICAobm9kZS5wb3NpdGlvbiArIG5vZGUuaGVpZ2h0ID4gdGhpcy55KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNlYXJjaCBmb3IgbGFzdCBub2RlIGluIHRoZSB2aWV3cG9ydCB1c2luZyBiaW5hcnkgc2VhcmNoXHJcbiAgICAvLyBMb29rIGZvciBmaXJzdCBub2RlIHRoYXQgc3RhcnRzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHZpZXdwb3J0ICh3aXRoIGJ1ZmZlcilcclxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGJpbmFyeVNlYXJjaCh2aXNpYmxlTm9kZXMsIChub2RlKSA9PiB7XHJcbiAgICAgIHJldHVybiBub2RlLnBvc2l0aW9uIC0gWV9PRkZTRVQgPiB0aGlzLnkgKyB0aGlzLnZpZXdwb3J0SGVpZ2h0O1xyXG4gICAgfSwgZmlyc3RJbmRleCk7XHJcblxyXG4gICAgY29uc3Qgdmlld3BvcnROb2RlcyA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBmaXJzdEluZGV4OyBpIDw9IGxhc3RJbmRleDsgaSsrKSB7XHJcbiAgICAgIHZpZXdwb3J0Tm9kZXMucHVzaCh2aXNpYmxlTm9kZXNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2aWV3cG9ydE5vZGVzO1xyXG4gIH1cclxuXHJcbiAgZml4U2Nyb2xsKCkge1xyXG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KDAsIHRoaXMudG90YWxIZWlnaHQgLSB0aGlzLnZpZXdwb3J0SGVpZ2h0KTtcclxuXHJcbiAgICBpZiAodGhpcy55IDwgMCkgdGhpcy5fc2V0WUJsb2NrcygwKTtcclxuICAgIGlmICh0aGlzLnkgPiBtYXhZKSB0aGlzLl9zZXRZQmxvY2tzKG1heFkgLyBZX0VQU0lMT04pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKG5vZGVzLCBjb25kaXRpb24sIGZpcnN0SW5kZXggPSAwKSB7XHJcbiAgbGV0IGluZGV4ID0gZmlyc3RJbmRleDtcclxuICBsZXQgdG9JbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7XHJcblxyXG4gIHdoaWxlIChpbmRleCAhPT0gdG9JbmRleCkge1xyXG4gICAgbGV0IG1pZEluZGV4ID0gTWF0aC5mbG9vcigoaW5kZXggKyB0b0luZGV4KSAvIDIpO1xyXG5cclxuICAgIGlmIChjb25kaXRpb24obm9kZXNbbWlkSW5kZXhdKSkge1xyXG4gICAgICB0b0luZGV4ID0gbWlkSW5kZXg7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID09PSBtaWRJbmRleCkgaW5kZXggPSB0b0luZGV4O1xyXG4gICAgICBlbHNlIGluZGV4ID0gbWlkSW5kZXg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBpbmRleDtcclxufVxyXG4iXX0=