barsa-user-workspace 0.0.0-watch
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 +24 -0
- package/esm2022/barsa-user-workspace.mjs +5 -0
- package/esm2022/lib/barsa-user-workspace.module.mjs +82 -0
- package/esm2022/lib/coercion/boolean-property.mjs +5 -0
- package/esm2022/lib/coercion/number-property.mjs +14 -0
- package/esm2022/lib/directives/drag-handle.mjs +29 -0
- package/esm2022/lib/directives/placeholder.mjs +31 -0
- package/esm2022/lib/directives/resize-handle.mjs +29 -0
- package/esm2022/lib/grid/grid.component.mjs +609 -0
- package/esm2022/lib/grid-item/grid-item.component.mjs +196 -0
- package/esm2022/lib/grid.definitions.mjs +3 -0
- package/esm2022/lib/grid.service.mjs +49 -0
- package/esm2022/lib/layout-container/layout-container.component.mjs +213 -0
- package/esm2022/lib/layout-grid-mapper.pipe.mjs +29 -0
- package/esm2022/lib/nav-container/nav-container.component.mjs +27 -0
- package/esm2022/lib/report-grid-layout/report-grid-layout.component.mjs +15 -0
- package/esm2022/lib/utils/client-rect.mjs +57 -0
- package/esm2022/lib/utils/grid.utils.mjs +225 -0
- package/esm2022/lib/utils/operators.mjs +17 -0
- package/esm2022/lib/utils/passive-listeners.mjs +29 -0
- package/esm2022/lib/utils/pointer.utils.mjs +110 -0
- package/esm2022/lib/utils/react-grid-layout.utils.mjs +493 -0
- package/esm2022/lib/utils/scroll.mjs +233 -0
- package/esm2022/lib/utils/transition-duration.mjs +34 -0
- package/esm2022/lib/utils.mjs +14 -0
- package/esm2022/public-api.mjs +15 -0
- package/esm2022/types.mjs +2 -0
- package/fesm2022/barsa-user-workspace.mjs +2469 -0
- package/fesm2022/barsa-user-workspace.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/barsa-user-workspace.module.d.ts +34 -0
- package/lib/coercion/boolean-property.d.ts +7 -0
- package/lib/coercion/number-property.d.ts +9 -0
- package/lib/directives/drag-handle.d.ts +15 -0
- package/lib/directives/placeholder.d.ts +17 -0
- package/lib/directives/resize-handle.d.ts +15 -0
- package/lib/grid/grid.component.d.ts +147 -0
- package/lib/grid-item/grid-item.component.d.ts +83 -0
- package/lib/grid.definitions.d.ts +61 -0
- package/lib/grid.service.d.ts +15 -0
- package/lib/layout-container/layout-container.component.d.ts +79 -0
- package/lib/layout-grid-mapper.pipe.d.ts +9 -0
- package/lib/nav-container/nav-container.component.d.ts +10 -0
- package/lib/report-grid-layout/report-grid-layout.component.d.ts +7 -0
- package/lib/utils/client-rect.d.ts +36 -0
- package/lib/utils/grid.utils.d.ts +45 -0
- package/lib/utils/operators.d.ts +6 -0
- package/lib/utils/passive-listeners.d.ts +12 -0
- package/lib/utils/pointer.utils.d.ts +29 -0
- package/lib/utils/react-grid-layout.utils.d.ts +177 -0
- package/lib/utils/scroll.d.ts +28 -0
- package/lib/utils/transition-duration.d.ts +6 -0
- package/lib/utils.d.ts +6 -0
- package/package.json +25 -0
- package/public-api.d.ts +12 -0
- package/types.d.ts +3 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, Inject, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, NEVER, Subject, iif, merge } from 'rxjs';
|
|
3
|
+
import { exhaustMap, filter, map, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';
|
|
4
|
+
import { coerceBooleanProperty } from '../coercion/boolean-property';
|
|
5
|
+
import { coerceNumberProperty } from '../coercion/number-property';
|
|
6
|
+
import { KTD_GRID_DRAG_HANDLE } from '../directives/drag-handle';
|
|
7
|
+
import { KTD_GRID_ITEM_PLACEHOLDER } from '../directives/placeholder';
|
|
8
|
+
import { KTD_GRID_RESIZE_HANDLE } from '../directives/resize-handle';
|
|
9
|
+
import { GRID_ITEM_GET_RENDER_DATA_TOKEN } from '../grid.definitions';
|
|
10
|
+
import { ktdOutsideZone } from '../utils/operators';
|
|
11
|
+
import { ktdIsMouseEventOrMousePointerEvent, ktdPointerClient, ktdPointerDown, ktdPointerUp } from '../utils/pointer.utils';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "../grid.service";
|
|
14
|
+
export class KtdGridItemComponent {
|
|
15
|
+
/** Id of the grid item. This property is strictly compulsory. */
|
|
16
|
+
get id() {
|
|
17
|
+
return this._id;
|
|
18
|
+
}
|
|
19
|
+
set id(val) {
|
|
20
|
+
this._id = val;
|
|
21
|
+
}
|
|
22
|
+
/** Minimum amount of pixels that the user should move before it starts the drag sequence. */
|
|
23
|
+
get dragStartThreshold() {
|
|
24
|
+
return this._dragStartThreshold;
|
|
25
|
+
}
|
|
26
|
+
set dragStartThreshold(val) {
|
|
27
|
+
this._dragStartThreshold = coerceNumberProperty(val);
|
|
28
|
+
}
|
|
29
|
+
/** Whether the item is draggable or not. Defaults to true. Does not affect manual dragging using the startDragManually method. */
|
|
30
|
+
get draggable() {
|
|
31
|
+
return this._draggable;
|
|
32
|
+
}
|
|
33
|
+
set draggable(val) {
|
|
34
|
+
this._draggable = coerceBooleanProperty(val);
|
|
35
|
+
this._draggable$.next(this._draggable);
|
|
36
|
+
}
|
|
37
|
+
/** Whether the item is resizable or not. Defaults to true. */
|
|
38
|
+
get resizable() {
|
|
39
|
+
return this._resizable;
|
|
40
|
+
}
|
|
41
|
+
set resizable(val) {
|
|
42
|
+
this._resizable = coerceBooleanProperty(val);
|
|
43
|
+
this._resizable$.next(this._resizable);
|
|
44
|
+
}
|
|
45
|
+
constructor(elementRef, gridService, renderer, ngZone, getItemRenderData) {
|
|
46
|
+
this.elementRef = elementRef;
|
|
47
|
+
this.gridService = gridService;
|
|
48
|
+
this.renderer = renderer;
|
|
49
|
+
this.ngZone = ngZone;
|
|
50
|
+
this.getItemRenderData = getItemRenderData;
|
|
51
|
+
/** CSS transition style. Note that for more performance is preferable only make transition on transform property. */
|
|
52
|
+
this.transition = 'transform 500ms ease, width 500ms ease, height 500ms ease';
|
|
53
|
+
this._dragStartThreshold = 0;
|
|
54
|
+
this._draggable = true;
|
|
55
|
+
this._draggable$ = new BehaviorSubject(this._draggable);
|
|
56
|
+
this._manualDragEvents$ = new Subject();
|
|
57
|
+
this._resizable = true;
|
|
58
|
+
this._resizable$ = new BehaviorSubject(this._resizable);
|
|
59
|
+
this.dragStartSubject = new Subject();
|
|
60
|
+
this.resizeStartSubject = new Subject();
|
|
61
|
+
this.subscriptions = [];
|
|
62
|
+
this.dragStart$ = this.dragStartSubject.asObservable();
|
|
63
|
+
this.resizeStart$ = this.resizeStartSubject.asObservable();
|
|
64
|
+
}
|
|
65
|
+
ngOnInit() {
|
|
66
|
+
const gridItemRenderData = this.getItemRenderData(this.id);
|
|
67
|
+
this.setStyles(gridItemRenderData);
|
|
68
|
+
}
|
|
69
|
+
ngAfterContentInit() {
|
|
70
|
+
this.subscriptions.push(this._dragStart$().subscribe(this.dragStartSubject), this._resizeStart$().subscribe(this.resizeStartSubject));
|
|
71
|
+
}
|
|
72
|
+
ngOnDestroy() {
|
|
73
|
+
this.subscriptions.forEach((sub) => sub.unsubscribe());
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* To manually start dragging, route the desired pointer events to this method.
|
|
77
|
+
* Dragging initiated by this method will work regardless of the value of the draggable Input.
|
|
78
|
+
* It is the caller's responsibility to call this method with only the events that are desired to cause a drag.
|
|
79
|
+
* For example, if you only want left clicks to cause a drag, it is your responsibility to filter out other mouse button events.
|
|
80
|
+
* @param startEvent The pointer event that should initiate the drag.
|
|
81
|
+
*/
|
|
82
|
+
startDragManually(startEvent) {
|
|
83
|
+
this._manualDragEvents$.next(startEvent);
|
|
84
|
+
}
|
|
85
|
+
setStyles({ top, left, width, height }) {
|
|
86
|
+
// transform is 6x times faster than top/left
|
|
87
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'transform', `translateX(${left}) translateY(${top})`);
|
|
88
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'display', `block`);
|
|
89
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'transition', this.transition);
|
|
90
|
+
if (width != null) {
|
|
91
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'width', width);
|
|
92
|
+
}
|
|
93
|
+
if (height != null) {
|
|
94
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'height', height);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
_dragStart$() {
|
|
98
|
+
return merge(this._manualDragEvents$, this._draggable$.pipe(switchMap((draggable) => {
|
|
99
|
+
if (!draggable) {
|
|
100
|
+
return NEVER;
|
|
101
|
+
}
|
|
102
|
+
return this._dragHandles.changes.pipe(startWith(this._dragHandles), switchMap((dragHandles) => iif(() => dragHandles.length > 0, merge(...dragHandles
|
|
103
|
+
.toArray()
|
|
104
|
+
.map((dragHandle) => ktdPointerDown(dragHandle.element.nativeElement))), ktdPointerDown(this.elementRef.nativeElement))));
|
|
105
|
+
}))).pipe(exhaustMap((startEvent) => {
|
|
106
|
+
// If the event started from an element with the native HTML drag&drop, it'll interfere
|
|
107
|
+
// with our own dragging (e.g. `img` tags do it by default). Prevent the default action
|
|
108
|
+
// to stop it from happening. Note that preventing on `dragstart` also seems to work, but
|
|
109
|
+
// it's flaky and it fails if the user drags it away quickly. Also note that we only want
|
|
110
|
+
// to do this for `mousedown` and `pointerdown` since doing the same for `touchstart` will
|
|
111
|
+
// stop any `click` events from firing on touch devices.
|
|
112
|
+
if (ktdIsMouseEventOrMousePointerEvent(startEvent)) {
|
|
113
|
+
startEvent.preventDefault();
|
|
114
|
+
}
|
|
115
|
+
const startPointer = ktdPointerClient(startEvent);
|
|
116
|
+
return this.gridService.mouseOrTouchMove$(document).pipe(takeUntil(ktdPointerUp(document)), ktdOutsideZone(this.ngZone), filter((moveEvent) => {
|
|
117
|
+
moveEvent.preventDefault();
|
|
118
|
+
const movePointer = ktdPointerClient(moveEvent);
|
|
119
|
+
const distanceX = Math.abs(startPointer.clientX - movePointer.clientX);
|
|
120
|
+
const distanceY = Math.abs(startPointer.clientY - movePointer.clientY);
|
|
121
|
+
// When this conditions returns true mean that we are over threshold.
|
|
122
|
+
return distanceX + distanceY >= this.dragStartThreshold;
|
|
123
|
+
}), take(1),
|
|
124
|
+
// Return the original start event
|
|
125
|
+
map(() => startEvent));
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
_resizeStart$() {
|
|
129
|
+
return this._resizable$.pipe(switchMap((resizable) => {
|
|
130
|
+
if (!resizable) {
|
|
131
|
+
// Side effect to hide the resizeElem if resize is disabled.
|
|
132
|
+
this.renderer.setStyle(this.resizeElem.nativeElement, 'display', 'none');
|
|
133
|
+
return NEVER;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
return this._resizeHandles.changes.pipe(startWith(this._resizeHandles), switchMap((resizeHandles) => {
|
|
137
|
+
if (resizeHandles.length > 0) {
|
|
138
|
+
// Side effect to hide the resizeElem if there are resize handles.
|
|
139
|
+
this.renderer.setStyle(this.resizeElem.nativeElement, 'display', 'none');
|
|
140
|
+
return merge(...resizeHandles
|
|
141
|
+
.toArray()
|
|
142
|
+
.map((resizeHandle) => ktdPointerDown(resizeHandle.element.nativeElement)));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.renderer.setStyle(this.resizeElem.nativeElement, 'display', 'block');
|
|
146
|
+
return ktdPointerDown(this.resizeElem.nativeElement);
|
|
147
|
+
}
|
|
148
|
+
}), tap((startEvent) => {
|
|
149
|
+
if (ktdIsMouseEventOrMousePointerEvent(startEvent)) {
|
|
150
|
+
startEvent.preventDefault();
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KtdGridItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.KtdGridService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: GRID_ITEM_GET_RENDER_DATA_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
157
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: KtdGridItemComponent, selector: "buw-grid-item", inputs: { minW: "minW", minH: "minH", maxW: "maxW", maxH: "maxH", transition: "transition", id: "id", dragStartThreshold: "dragStartThreshold", draggable: "draggable", resizable: "resizable" }, queries: [{ propertyName: "placeholder", first: true, predicate: KTD_GRID_ITEM_PLACEHOLDER, descendants: true }, { propertyName: "_dragHandles", predicate: KTD_GRID_DRAG_HANDLE, descendants: true }, { propertyName: "_resizeHandles", predicate: KTD_GRID_RESIZE_HANDLE, descendants: true }], viewQueries: [{ propertyName: "resizeElem", first: true, predicate: ["resizeElem"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<ng-content></ng-content>\n<div #resizeElem class=\"grid-item-resize-icon\"></div>", styles: [":host{display:none;position:absolute;z-index:1;overflow:hidden;touch-action:none;border:1px dashed #000}:host div{position:absolute;-webkit-user-select:none;user-select:none;z-index:10}:host div.grid-item-resize-icon{cursor:se-resize;width:20px;height:20px;bottom:0;right:0;color:inherit}:host div.grid-item-resize-icon:after{content:\"\";position:absolute;right:3px;bottom:3px;width:5px;height:5px;border-right:2px solid;border-bottom:2px solid}.display-none{display:none!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
158
|
+
}
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KtdGridItemComponent, decorators: [{
|
|
160
|
+
type: Component,
|
|
161
|
+
args: [{ selector: 'buw-grid-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n<div #resizeElem class=\"grid-item-resize-icon\"></div>", styles: [":host{display:none;position:absolute;z-index:1;overflow:hidden;touch-action:none;border:1px dashed #000}:host div{position:absolute;-webkit-user-select:none;user-select:none;z-index:10}:host div.grid-item-resize-icon{cursor:se-resize;width:20px;height:20px;bottom:0;right:0;color:inherit}:host div.grid-item-resize-icon:after{content:\"\";position:absolute;right:3px;bottom:3px;width:5px;height:5px;border-right:2px solid;border-bottom:2px solid}.display-none{display:none!important}\n"] }]
|
|
162
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.KtdGridService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
163
|
+
type: Inject,
|
|
164
|
+
args: [GRID_ITEM_GET_RENDER_DATA_TOKEN]
|
|
165
|
+
}] }], propDecorators: { _dragHandles: [{
|
|
166
|
+
type: ContentChildren,
|
|
167
|
+
args: [KTD_GRID_DRAG_HANDLE, { descendants: true }]
|
|
168
|
+
}], _resizeHandles: [{
|
|
169
|
+
type: ContentChildren,
|
|
170
|
+
args: [KTD_GRID_RESIZE_HANDLE, { descendants: true }]
|
|
171
|
+
}], resizeElem: [{
|
|
172
|
+
type: ViewChild,
|
|
173
|
+
args: ['resizeElem', { static: true, read: ElementRef }]
|
|
174
|
+
}], placeholder: [{
|
|
175
|
+
type: ContentChild,
|
|
176
|
+
args: [KTD_GRID_ITEM_PLACEHOLDER]
|
|
177
|
+
}], minW: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}], minH: [{
|
|
180
|
+
type: Input
|
|
181
|
+
}], maxW: [{
|
|
182
|
+
type: Input
|
|
183
|
+
}], maxH: [{
|
|
184
|
+
type: Input
|
|
185
|
+
}], transition: [{
|
|
186
|
+
type: Input
|
|
187
|
+
}], id: [{
|
|
188
|
+
type: Input
|
|
189
|
+
}], dragStartThreshold: [{
|
|
190
|
+
type: Input
|
|
191
|
+
}], draggable: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], resizable: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}] } });
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvZ3JpZC1pdGVtL2dyaWQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL2dyaWQtaXRlbS9ncmlkLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFNTCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFnQixHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25GLE9BQU8sRUFBZSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBcUIsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRixPQUFPLEVBQUUseUJBQXlCLEVBQTBCLE1BQU0sMkJBQTJCLENBQUM7QUFDOUYsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQzFGLE9BQU8sRUFBRSwrQkFBK0IsRUFBa0MsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7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QixxSUFDUSxVQUFVLDJDQzNDN0Qsb0ZBQ3FEOzs0RkRzQ3hDLG9CQUFvQjtrQkFOaEMsU0FBUzsrQkFDSSxlQUFlLG1CQUdSLHVCQUF1QixDQUFDLE1BQU07OzBCQXVGMUMsTUFBTTsyQkFBQywrQkFBK0I7eUNBbkZtQixZQUFZO3NCQUF6RSxlQUFlO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFDSSxjQUFjO3NCQUE3RSxlQUFlO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFDRCxVQUFVO3NCQUF0RSxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHbEIsV0FBVztzQkFBbkQsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBRzlCLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQU9GLEVBQUU7c0JBREwsS0FBSztnQkFhRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBYUYsU0FBUztzQkFEWixLQUFLO2dCQWlCRixTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE5FVkVSLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGlpZiwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGV4aGF1c3RNYXAsIGZpbHRlciwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJy4uL2NvZXJjaW9uL2Jvb2xlYW4tcHJvcGVydHknO1xuaW1wb3J0IHsgTnVtYmVySW5wdXQsIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnLi4vY29lcmNpb24vbnVtYmVyLXByb3BlcnR5JztcbmltcG9ydCB7IEtURF9HUklEX0RSQUdfSEFORExFLCBLdGRHcmlkRHJhZ0hhbmRsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZHJhZy1oYW5kbGUnO1xuaW1wb3J0IHsgS1REX0dSSURfSVRFTV9QTEFDRUhPTERFUiwgS3RkR3JpZEl0ZW1QbGFjZWhvbGRlciB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcGxhY2Vob2xkZXInO1xuaW1wb3J0IHsgS1REX0dSSURfUkVTSVpFX0hBTkRMRSwgS3RkR3JpZFJlc2l6ZUhhbmRsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVzaXplLWhhbmRsZSc7XG5pbXBvcnQgeyBHUklEX0lURU1fR0VUX1JFTkRFUl9EQVRBX1RPS0VOLCBLdGRHcmlkSXRlbVJlbmRlckRhdGFUb2tlblR5cGUgfSBmcm9tICcuLi9ncmlkLmRlZmluaXRpb25zJztcbmltcG9ydCB7IEt0ZEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IGt0ZE91dHNpZGVab25lIH0gZnJvbSAnLi4vdXRpbHMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAga3RkSXNNb3VzZUV2ZW50T3JNb3VzZVBvaW50ZXJFdmVudCxcbiAgICBrdGRQb2ludGVyQ2xpZW50LFxuICAgIGt0ZFBvaW50ZXJEb3duLFxuICAgIGt0ZFBvaW50ZXJVcFxufSBmcm9tICcuLi91dGlscy9wb2ludGVyLnV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdidXctZ3JpZC1pdGVtJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9ncmlkLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBLdGRHcmlkSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgICAvKiogRWxlbWVudHMgdGhhdCBjYW4gYmUgdXNlZCB0byBkcmFnIHRoZSBncmlkIGl0ZW0uICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihLVERfR1JJRF9EUkFHX0hBTkRMRSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBfZHJhZ0hhbmRsZXM6IFF1ZXJ5TGlzdDxLdGRHcmlkRHJhZ0hhbmRsZT47XG4gICAgQENvbnRlbnRDaGlsZHJlbihLVERfR1JJRF9SRVNJWkVfSEFORExFLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIF9yZXNpemVIYW5kbGVzOiBRdWVyeUxpc3Q8S3RkR3JpZFJlc2l6ZUhhbmRsZT47XG4gICAgQFZpZXdDaGlsZCgncmVzaXplRWxlbScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pIHJlc2l6ZUVsZW06IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogVGVtcGxhdGUgcmVmIGZvciBwbGFjZWhvbGRlciAqL1xuICAgIEBDb250ZW50Q2hpbGQoS1REX0dSSURfSVRFTV9QTEFDRUhPTERFUikgcGxhY2Vob2xkZXI6IEt0ZEdyaWRJdGVtUGxhY2Vob2xkZXI7XG5cbiAgICAvKiogTWluIGFuZCBtYXggc2l6ZSBpbnB1dCBwcm9wZXJ0aWVzLiBBbnkgb2YgdGhlc2Ugd291bGQgJ292ZXJyaWRlJyB0aGUgbWluL21heCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBsYXlvdXQuICovXG4gICAgQElucHV0KCkgbWluVz86IG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5IPzogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1heFc/OiBudW1iZXI7XG4gICAgQElucHV0KCkgbWF4SD86IG51bWJlcjtcblxuICAgIC8qKiBDU1MgdHJhbnNpdGlvbiBzdHlsZS4gTm90ZSB0aGF0IGZvciBtb3JlIHBlcmZvcm1hbmNlIGlzIHByZWZlcmFibGUgb25seSBtYWtlIHRyYW5zaXRpb24gb24gdHJhbnNmb3JtIHByb3BlcnR5LiAqL1xuICAgIEBJbnB1dCgpIHRyYW5zaXRpb24gPSAndHJhbnNmb3JtIDUwMG1zIGVhc2UsIHdpZHRoIDUwMG1zIGVhc2UsIGhlaWdodCA1MDBtcyBlYXNlJztcblxuICAgIGRyYWdTdGFydCQ6IE9ic2VydmFibGU8TW91c2VFdmVudCB8IFRvdWNoRXZlbnQ+O1xuICAgIHJlc2l6ZVN0YXJ0JDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD47XG5cbiAgICAvKiogSWQgb2YgdGhlIGdyaWQgaXRlbS4gVGhpcyBwcm9wZXJ0eSBpcyBzdHJpY3RseSBjb21wdWxzb3J5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG5cbiAgICBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcblxuICAgIC8qKiBNaW5pbXVtIGFtb3VudCBvZiBwaXhlbHMgdGhhdCB0aGUgdXNlciBzaG91bGQgbW92ZSBiZWZvcmUgaXQgc3RhcnRzIHRoZSBkcmFnIHNlcXVlbmNlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRyYWdTdGFydFRocmVzaG9sZCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0VGhyZXNob2xkO1xuICAgIH1cblxuICAgIHNldCBkcmFnU3RhcnRUaHJlc2hvbGQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0VGhyZXNob2xkID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kcmFnU3RhcnRUaHJlc2hvbGQgPSAwO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGl0ZW0gaXMgZHJhZ2dhYmxlIG9yIG5vdC4gRGVmYXVsdHMgdG8gdHJ1ZS4gRG9lcyBub3QgYWZmZWN0IG1hbnVhbCBkcmFnZ2luZyB1c2luZyB0aGUgc3RhcnREcmFnTWFudWFsbHkgbWV0aG9kLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRyYWdnYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnYWJsZTtcbiAgICB9XG5cbiAgICBzZXQgZHJhZ2dhYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kcmFnZ2FibGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsKTtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlJC5uZXh0KHRoaXMuX2RyYWdnYWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9kcmFnZ2FibGUkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRoaXMuX2RyYWdnYWJsZSk7XG5cbiAgICBwcml2YXRlIF9tYW51YWxEcmFnRXZlbnRzJDogU3ViamVjdDxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4gPSBuZXcgU3ViamVjdDxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4oKTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBpdGVtIGlzIHJlc2l6YWJsZSBvciBub3QuIERlZmF1bHRzIHRvIHRydWUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcmVzaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzaXphYmxlO1xuICAgIH1cblxuICAgIHNldCByZXNpemFibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Jlc2l6YWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWwpO1xuICAgICAgICB0aGlzLl9yZXNpemFibGUkLm5leHQodGhpcy5fcmVzaXphYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNpemFibGUgPSB0cnVlO1xuICAgIHByaXZhdGUgX3Jlc2l6YWJsZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odGhpcy5fcmVzaXphYmxlKTtcblxuICAgIHByaXZhdGUgZHJhZ1N0YXJ0U3ViamVjdDogU3ViamVjdDxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4gPSBuZXcgU3ViamVjdDxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4oKTtcbiAgICBwcml2YXRlIHJlc2l6ZVN0YXJ0U3ViamVjdDogU3ViamVjdDxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4gPSBuZXcgU3ViamVjdDxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4oKTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBncmlkU2VydmljZTogS3RkR3JpZFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChHUklEX0lURU1fR0VUX1JFTkRFUl9EQVRBX1RPS0VOKSBwcml2YXRlIGdldEl0ZW1SZW5kZXJEYXRhOiBLdGRHcmlkSXRlbVJlbmRlckRhdGFUb2tlblR5cGVcbiAgICApIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnQkID0gdGhpcy5kcmFnU3RhcnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnJlc2l6ZVN0YXJ0JCA9IHRoaXMucmVzaXplU3RhcnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBncmlkSXRlbVJlbmRlckRhdGEgPSB0aGlzLmdldEl0ZW1SZW5kZXJEYXRhKHRoaXMuaWQpITtcbiAgICAgICAgdGhpcy5zZXRTdHlsZXMoZ3JpZEl0ZW1SZW5kZXJEYXRhKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0JCgpLnN1YnNjcmliZSh0aGlzLmRyYWdTdGFydFN1YmplY3QpLFxuICAgICAgICAgICAgdGhpcy5fcmVzaXplU3RhcnQkKCkuc3Vic2NyaWJlKHRoaXMucmVzaXplU3RhcnRTdWJqZWN0KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gbWFudWFsbHkgc3RhcnQgZHJhZ2dpbmcsIHJvdXRlIHRoZSBkZXNpcmVkIHBvaW50ZXIgZXZlbnRzIHRvIHRoaXMgbWV0aG9kLlxuICAgICAqIERyYWdnaW5nIGluaXRpYXRlZCBieSB0aGlzIG1ldGhvZCB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGRyYWdnYWJsZSBJbnB1dC5cbiAgICAgKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIG9ubHkgdGhlIGV2ZW50cyB0aGF0IGFyZSBkZXNpcmVkIHRvIGNhdXNlIGEgZHJhZy5cbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IG9ubHkgd2FudCBsZWZ0IGNsaWNrcyB0byBjYXVzZSBhIGRyYWcsIGl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZmlsdGVyIG91dCBvdGhlciBtb3VzZSBidXR0b24gZXZlbnRzLlxuICAgICAqIEBwYXJhbSBzdGFydEV2ZW50IFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgc2hvdWxkIGluaXRpYXRlIHRoZSBkcmFnLlxuICAgICAqL1xuICAgIHN0YXJ0RHJhZ01hbnVhbGx5KHN0YXJ0RXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21hbnVhbERyYWdFdmVudHMkLm5leHQoc3RhcnRFdmVudCk7XG4gICAgfVxuXG4gICAgc2V0U3R5bGVzKHsgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0IH06IHsgdG9wOiBzdHJpbmc7IGxlZnQ6IHN0cmluZzsgd2lkdGg/OiBzdHJpbmc7IGhlaWdodD86IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIC8vIHRyYW5zZm9ybSBpcyA2eCB0aW1lcyBmYXN0ZXIgdGhhbiB0b3AvbGVmdFxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHRyYW5zbGF0ZVgoJHtsZWZ0fSkgdHJhbnNsYXRlWSgke3RvcH0pYCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgYGJsb2NrYCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgdGhpcy50cmFuc2l0aW9uKTtcbiAgICAgICAgaWYgKHdpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd3aWR0aCcsIHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhZ1N0YXJ0JCgpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50PiB7XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICAgIHRoaXMuX21hbnVhbERyYWdFdmVudHMkLFxuICAgICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlJC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkVWRVI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdIYW5kbGVzLmNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0V2l0aCh0aGlzLl9kcmFnSGFuZGxlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGRyYWdIYW5kbGVzOiBRdWVyeUxpc3Q8S3RkR3JpZERyYWdIYW5kbGU+KSA9PiBpaWYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRyYWdIYW5kbGVzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZHJhZ0hhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZHJhZ0hhbmRsZSkgPT4ga3RkUG9pbnRlckRvd24oZHJhZ0hhbmRsZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdGRQb2ludGVyRG93bih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICAgIGV4aGF1c3RNYXAoKHN0YXJ0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgc3RhcnRlZCBmcm9tIGFuIGVsZW1lbnQgd2l0aCB0aGUgbmF0aXZlIEhUTUwgZHJhZyZkcm9wLCBpdCdsbCBpbnRlcmZlcmVcbiAgICAgICAgICAgICAgICAvLyB3aXRoIG91ciBvd24gZHJhZ2dpbmcgKGUuZy4gYGltZ2AgdGFncyBkbyBpdCBieSBkZWZhdWx0KS4gUHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAgICAgICAgICAvLyB0byBzdG9wIGl0IGZyb20gaGFwcGVuaW5nLiBOb3RlIHRoYXQgcHJldmVudGluZyBvbiBgZHJhZ3N0YXJ0YCBhbHNvIHNlZW1zIHRvIHdvcmssIGJ1dFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgZmxha3kgYW5kIGl0IGZhaWxzIGlmIHRoZSB1c2VyIGRyYWdzIGl0IGF3YXkgcXVpY2tseS4gQWxzbyBub3RlIHRoYXQgd2Ugb25seSB3YW50XG4gICAgICAgICAgICAgICAgLy8gdG8gZG8gdGhpcyBmb3IgYG1vdXNlZG93bmAgYW5kIGBwb2ludGVyZG93bmAgc2luY2UgZG9pbmcgdGhlIHNhbWUgZm9yIGB0b3VjaHN0YXJ0YCB3aWxsXG4gICAgICAgICAgICAgICAgLy8gc3RvcCBhbnkgYGNsaWNrYCBldmVudHMgZnJvbSBmaXJpbmcgb24gdG91Y2ggZGV2aWNlcy5cbiAgICAgICAgICAgICAgICBpZiAoa3RkSXNNb3VzZUV2ZW50T3JNb3VzZVBvaW50ZXJFdmVudChzdGFydEV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRQb2ludGVyID0ga3RkUG9pbnRlckNsaWVudChzdGFydEV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkU2VydmljZS5tb3VzZU9yVG91Y2hNb3ZlJChkb2N1bWVudCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKGt0ZFBvaW50ZXJVcChkb2N1bWVudCkpLFxuICAgICAgICAgICAgICAgICAgICBrdGRPdXRzaWRlWm9uZSh0aGlzLm5nWm9uZSksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigobW92ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vdmVQb2ludGVyID0ga3RkUG9pbnRlckNsaWVudChtb3ZlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VYID0gTWF0aC5hYnMoc3RhcnRQb2ludGVyLmNsaWVudFggLSBtb3ZlUG9pbnRlci5jbGllbnRYKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlWSA9IE1hdGguYWJzKHN0YXJ0UG9pbnRlci5jbGllbnRZIC0gbW92ZVBvaW50ZXIuY2xpZW50WSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoaXMgY29uZGl0aW9ucyByZXR1cm5zIHRydWUgbWVhbiB0aGF0IHdlIGFyZSBvdmVyIHRocmVzaG9sZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZVggKyBkaXN0YW5jZVkgPj0gdGhpcy5kcmFnU3RhcnRUaHJlc2hvbGQ7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG9yaWdpbmFsIHN0YXJ0IGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiBzdGFydEV2ZW50KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2l6ZVN0YXJ0JCgpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNpemFibGUkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc2l6YWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNpZGUgZWZmZWN0IHRvIGhpZGUgdGhlIHJlc2l6ZUVsZW0gaWYgcmVzaXplIGlzIGRpc2FibGVkLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmVzaXplRWxlbS5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzaXplSGFuZGxlcy5jaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgodGhpcy5fcmVzaXplSGFuZGxlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc2l6ZUhhbmRsZXM6IFF1ZXJ5TGlzdDxLdGRHcmlkUmVzaXplSGFuZGxlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNpemVIYW5kbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lkZSBlZmZlY3QgdG8gaGlkZSB0aGUgcmVzaXplRWxlbSBpZiB0aGVyZSBhcmUgcmVzaXplIGhhbmRsZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yZXNpemVFbGVtLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzaXplSGFuZGxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChyZXNpemVIYW5kbGUpID0+IGt0ZFBvaW50ZXJEb3duKHJlc2l6ZUhhbmRsZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yZXNpemVFbGVtLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrdGRQb2ludGVyRG93bih0aGlzLnJlc2l6ZUVsZW0ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXAoKHN0YXJ0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa3RkSXNNb3VzZUV2ZW50T3JNb3VzZVBvaW50ZXJFdmVudChzdGFydEV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9taW5XOiBOdW1iZXJJbnB1dDtcbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbWluSDogTnVtYmVySW5wdXQ7XG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX21heFc6IE51bWJlcklucHV0O1xuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9tYXhIOiBOdW1iZXJJbnB1dDtcbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZHJhZ2dhYmxlOiBCb29sZWFuSW5wdXQ7XG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3Jlc2l6YWJsZTogQm9vbGVhbklucHV0O1xuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kcmFnU3RhcnRUaHJlc2hvbGQ6IE51bWJlcklucHV0O1xufVxuXG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48ZGl2ICNyZXNpemVFbGVtIGNsYXNzPVwiZ3JpZC1pdGVtLXJlc2l6ZS1pY29uXCI+PC9kaXY+Il19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const GRID_ITEM_GET_RENDER_DATA_TOKEN = new InjectionToken('GRID_ITEM_GET_RENDER_DATA_TOKEN');
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5kZWZpbml0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvZ3JpZC5kZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBNEQvQyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBbUQsSUFBSSxjQUFjLENBQzdHLGlDQUFpQyxDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBhY3RUeXBlIH0gZnJvbSAnLi91dGlscy9yZWFjdC1ncmlkLWxheW91dC51dGlscyc7XG5pbXBvcnQgeyBLdGRDbGllbnRSZWN0IH0gZnJvbSAnLi91dGlscy9jbGllbnQtcmVjdCc7XG5pbXBvcnQgeyBFanJheU9sZ28gfSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS3RkR3JpZExheW91dEl0ZW0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3OiBudW1iZXI7XG4gICAgaDogbnVtYmVyO1xuICAgIG1pblc/OiBudW1iZXI7XG4gICAgbWluSD86IG51bWJlcjtcbiAgICBtYXhXPzogbnVtYmVyO1xuICAgIG1heEg/OiBudW1iZXIgICAgXG59XG5cbmV4cG9ydCB0eXBlIEt0ZEdyaWRDb21wYWN0VHlwZSA9IENvbXBhY3RUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIEt0ZEdyaWRCYWNrZ3JvdW5kQ2ZnIHtcbiAgICBzaG93OiAnbmV2ZXInIHwgJ2Fsd2F5cycgfCAnd2hlbkRyYWdnaW5nJztcbiAgICBib3JkZXJDb2xvcj86IHN0cmluZztcbiAgICBnYXBDb2xvcj86IHN0cmluZztcbiAgICByb3dDb2xvcj86IHN0cmluZztcbiAgICBjb2x1bW5Db2xvcj86IHN0cmluZztcbiAgICBib3JkZXJXaWR0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLdGRHcmlkQ2ZnIHtcbiAgICBjb2xzOiBudW1iZXI7XG4gICAgcm93SGVpZ2h0OiBudW1iZXIgfCAnZml0JzsgLy8gcm93IGhlaWdodCBpbiBwaXhlbHNcbiAgICBoZWlnaHQ/OiBudW1iZXIgfCBudWxsO1xuICAgIGxheW91dDogS3RkR3JpZExheW91dEl0ZW1bXTtcbiAgICBwcmV2ZW50Q29sbGlzaW9uOiBib29sZWFuO1xuICAgIGdhcDogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBLdGRHcmlkTGF5b3V0ID0gS3RkR3JpZExheW91dEl0ZW1bXTtcblxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW50ZXJmYWNlLiBJZiBjYW4ndCByZW1vdmUsIG1vdmUgYW5kIHJlbmFtZSB0aGlzIGludGVyZmFjZSBpbiB0aGUgY29yZSBtb2R1bGUgb3Igc2ltaWxhci5cbmV4cG9ydCBpbnRlcmZhY2UgS3RkR3JpZEl0ZW1SZWN0IHtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLdGRHcmlkSXRlbVJlbmRlckRhdGE8VCA9IG51bWJlciB8IHN0cmluZz4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdG9wOiBUO1xuICAgIGxlZnQ6IFQ7XG4gICAgd2lkdGg6IFQ7XG4gICAgaGVpZ2h0OiBUO1xufVxuXG4vKipcbiAqIFdlIGluamVjdCBhIHRva2VuIGJlY2F1c2Ugb2YgdGhlICdjaXJjdWxhciBkZXBlbmRlbmN5IGlzc3VlIHdhcm5pbmcnLiBJbiBjYXNlIHdlIGRvbid0IGhhZCB0aGlzIGlzc3VlIHdpdGggdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHdlIGNvdWxkIGp1c3RcbiAqIGltcG9ydCBLdGRHcmlkQ29tcG9uZW50IG9uIEt0ZEdyaWRJdGVtIGFuZCBleGVjdXRlIHRoZSBuZWVkZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZSByZW5kZXJpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IHR5cGUgS3RkR3JpZEl0ZW1SZW5kZXJEYXRhVG9rZW5UeXBlID0gKGlkOiBzdHJpbmcpID0+IEt0ZEdyaWRJdGVtUmVuZGVyRGF0YTxzdHJpbmc+O1xuZXhwb3J0IGNvbnN0IEdSSURfSVRFTV9HRVRfUkVOREVSX0RBVEFfVE9LRU46IEluamVjdGlvblRva2VuPEt0ZEdyaWRJdGVtUmVuZGVyRGF0YVRva2VuVHlwZT4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oXG4gICAgJ0dSSURfSVRFTV9HRVRfUkVOREVSX0RBVEFfVE9LRU4nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEt0ZERyYWdnaW5nRGF0YSB7XG4gICAgcG9pbnRlckRvd25FdmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQ7XG4gICAgcG9pbnRlckRyYWdFdmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQ7XG4gICAgZ3JpZEVsZW1DbGllbnRSZWN0OiBLdGRDbGllbnRSZWN0O1xuICAgIGRyYWdFbGVtQ2xpZW50UmVjdDogS3RkQ2xpZW50UmVjdDtcbiAgICBzY3JvbGxEaWZmZXJlbmNlOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfTtcbn1cblxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { ktdNormalizePassiveListenerOptions } from './utils/passive-listeners';
|
|
3
|
+
import { fromEvent, iif, Subject } from 'rxjs';
|
|
4
|
+
import { filter } from 'rxjs/operators';
|
|
5
|
+
import { ktdIsMobileOrTablet, ktdSupportsPointerEvents } from './utils/pointer.utils';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/** Event options that can be used to bind an active, capturing event. */
|
|
8
|
+
const activeCapturingEventOptions = ktdNormalizePassiveListenerOptions({
|
|
9
|
+
passive: false,
|
|
10
|
+
capture: true
|
|
11
|
+
});
|
|
12
|
+
export class KtdGridService {
|
|
13
|
+
constructor(ngZone) {
|
|
14
|
+
this.ngZone = ngZone;
|
|
15
|
+
this.touchMoveSubject = new Subject();
|
|
16
|
+
this.touchMove$ = this.touchMoveSubject.asObservable();
|
|
17
|
+
this.registerTouchMoveSubscription();
|
|
18
|
+
}
|
|
19
|
+
ngOnDestroy() {
|
|
20
|
+
this.touchMoveSubscription.unsubscribe();
|
|
21
|
+
}
|
|
22
|
+
mouseOrTouchMove$(element) {
|
|
23
|
+
if (!ktdSupportsPointerEvents()) {
|
|
24
|
+
return iif(() => ktdIsMobileOrTablet(), this.touchMove$, fromEvent(element, 'mousemove', activeCapturingEventOptions)
|
|
25
|
+
// TODO: Fix rxjs typings, boolean should be a good param too.
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return fromEvent(element, 'pointermove', activeCapturingEventOptions);
|
|
29
|
+
}
|
|
30
|
+
registerTouchMoveSubscription() {
|
|
31
|
+
// The `touchmove` event gets bound once, ahead of time, because WebKit
|
|
32
|
+
// won't preventDefault on a dynamically-added `touchmove` listener.
|
|
33
|
+
// See https://bugs.webkit.org/show_bug.cgi?id=184250.
|
|
34
|
+
this.touchMoveSubscription = this.ngZone.runOutsideAngular(() =>
|
|
35
|
+
// The event handler has to be explicitly active,
|
|
36
|
+
// because newer browsers make it passive by default.
|
|
37
|
+
fromEvent(document, 'touchmove', activeCapturingEventOptions)
|
|
38
|
+
// TODO: Fix rxjs typings, boolean should be a good param too.
|
|
39
|
+
.pipe(filter((touchEvent) => touchEvent.touches.length === 1))
|
|
40
|
+
.subscribe((touchEvent) => this.touchMoveSubject.next(touchEvent)));
|
|
41
|
+
}
|
|
42
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KtdGridService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
43
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KtdGridService, providedIn: 'root' }); }
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KtdGridService, decorators: [{
|
|
46
|
+
type: Injectable,
|
|
47
|
+
args: [{ providedIn: 'root' }]
|
|
48
|
+
}], ctorParameters: () => [{ type: i0.NgZone }] });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtdXNlci13b3Jrc3BhY2Uvc3JjL2xpYi9ncmlkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBRXRGLHlFQUF5RTtBQUN6RSxNQUFNLDJCQUEyQixHQUFHLGtDQUFrQyxDQUFDO0lBQ25FLE9BQU8sRUFBRSxLQUFLO0lBQ2QsT0FBTyxFQUFFLElBQUk7Q0FDaEIsQ0FBQyxDQUFDO0FBR0gsTUFBTSxPQUFPLGNBQWM7SUFLdkIsWUFBb0IsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFIMUIscUJBQWdCLEdBQXdCLElBQUksT0FBTyxFQUFjLENBQUM7UUFJdEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQU87UUFDckIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FDTixHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxFQUMzQixJQUFJLENBQUMsVUFBVSxFQUNmLFNBQVMsQ0FBYSxPQUFPLEVBQUUsV0FBVyxFQUFFLDJCQUFzRCxDQUFDO1lBQ25HLDhEQUE4RDthQUNqRSxDQUFDO1FBQ04sQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFhLE9BQU8sRUFBRSxhQUFhLEVBQUUsMkJBQXNELENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBRU8sNkJBQTZCO1FBQ2pDLHVFQUF1RTtRQUN2RSxvRUFBb0U7UUFDcEUsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtRQUM1RCxpREFBaUQ7UUFDakQscURBQXFEO1FBQ3JELFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLDJCQUFzRCxDQUFDO1lBQ3BGLDhEQUE4RDthQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUUsQ0FBRSxVQUF5QixDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDbEYsU0FBUyxDQUFDLENBQUMsVUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUNyRixDQUFDO0lBQ04sQ0FBQzsrR0F2Q1EsY0FBYzttSEFBZCxjQUFjLGNBREQsTUFBTTs7NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGt0ZE5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL3Bhc3NpdmUtbGlzdGVuZXJzJztcbmltcG9ydCB7IGZyb21FdmVudCwgaWlmLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGt0ZElzTW9iaWxlT3JUYWJsZXQsIGt0ZFN1cHBvcnRzUG9pbnRlckV2ZW50cyB9IGZyb20gJy4vdXRpbHMvcG9pbnRlci51dGlscyc7XG5cbi8qKiBFdmVudCBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gYmluZCBhbiBhY3RpdmUsIGNhcHR1cmluZyBldmVudC4gKi9cbmNvbnN0IGFjdGl2ZUNhcHR1cmluZ0V2ZW50T3B0aW9ucyA9IGt0ZE5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMoe1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWVcbn0pO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEt0ZEdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICB0b3VjaE1vdmUkOiBPYnNlcnZhYmxlPFRvdWNoRXZlbnQ+O1xuICAgIHByaXZhdGUgdG91Y2hNb3ZlU3ViamVjdDogU3ViamVjdDxUb3VjaEV2ZW50PiA9IG5ldyBTdWJqZWN0PFRvdWNoRXZlbnQ+KCk7XG4gICAgcHJpdmF0ZSB0b3VjaE1vdmVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcbiAgICAgICAgdGhpcy50b3VjaE1vdmUkID0gdGhpcy50b3VjaE1vdmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVG91Y2hNb3ZlU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91Y2hNb3ZlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgbW91c2VPclRvdWNoTW92ZSQoZWxlbWVudCk6IE9ic2VydmFibGU8TW91c2VFdmVudCB8IFRvdWNoRXZlbnQ+IHtcbiAgICAgICAgaWYgKCFrdGRTdXBwb3J0c1BvaW50ZXJFdmVudHMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlpZihcbiAgICAgICAgICAgICAgICAoKSA9PiBrdGRJc01vYmlsZU9yVGFibGV0KCksXG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaE1vdmUkLFxuICAgICAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50LCAnbW91c2Vtb3ZlJywgYWN0aXZlQ2FwdHVyaW5nRXZlbnRPcHRpb25zIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpeCByeGpzIHR5cGluZ3MsIGJvb2xlYW4gc2hvdWxkIGJlIGEgZ29vZCBwYXJhbSB0b28uXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50LCAncG9pbnRlcm1vdmUnLCBhY3RpdmVDYXB0dXJpbmdFdmVudE9wdGlvbnMgYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJUb3VjaE1vdmVTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSBgdG91Y2htb3ZlYCBldmVudCBnZXRzIGJvdW5kIG9uY2UsIGFoZWFkIG9mIHRpbWUsIGJlY2F1c2UgV2ViS2l0XG4gICAgICAgIC8vIHdvbid0IHByZXZlbnREZWZhdWx0IG9uIGEgZHluYW1pY2FsbHktYWRkZWQgYHRvdWNobW92ZWAgbGlzdGVuZXIuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MjUwLlxuICAgICAgICB0aGlzLnRvdWNoTW92ZVN1YnNjcmlwdGlvbiA9IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgICAgICAvLyBUaGUgZXZlbnQgaGFuZGxlciBoYXMgdG8gYmUgZXhwbGljaXRseSBhY3RpdmUsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIG5ld2VyIGJyb3dzZXJzIG1ha2UgaXQgcGFzc2l2ZSBieSBkZWZhdWx0LlxuICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2htb3ZlJywgYWN0aXZlQ2FwdHVyaW5nRXZlbnRPcHRpb25zIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpeCByeGpzIHR5cGluZ3MsIGJvb2xlYW4gc2hvdWxkIGJlIGEgZ29vZCBwYXJhbSB0b28uXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCh0b3VjaEV2ZW50OiBhbnkpID0+ICh0b3VjaEV2ZW50IGFzIFRvdWNoRXZlbnQpLnRvdWNoZXMubGVuZ3RoID09PSAxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh0b3VjaEV2ZW50OiBUb3VjaEV2ZW50KSA9PiB0aGlzLnRvdWNoTW92ZVN1YmplY3QubmV4dCh0b3VjaEV2ZW50KSlcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, Inject, ViewChild, Input } from '@angular/core';
|
|
4
|
+
import { BaseComponent } from 'barsa-novin-ray-core';
|
|
5
|
+
import { debounceTime, filter, fromEvent, merge } from 'rxjs';
|
|
6
|
+
import { KtdGridComponent } from '../grid/grid.component';
|
|
7
|
+
import { ktdGridCompact, ktdTrackById } from '../utils/grid.utils';
|
|
8
|
+
import { ktdArrayRemoveItem } from '../utils';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
import * as i2 from "barsa-novin-ray-core";
|
|
12
|
+
import * as i3 from "../grid/grid.component";
|
|
13
|
+
import * as i4 from "../grid-item/grid-item.component";
|
|
14
|
+
import * as i5 from "../directives/placeholder";
|
|
15
|
+
export class LayoutContainerComponent extends BaseComponent {
|
|
16
|
+
constructor(ngZone, elementRef, document) {
|
|
17
|
+
// this.ngZone.onUnstable.subscribe(() => console.log('UnStable'));
|
|
18
|
+
super();
|
|
19
|
+
this.ngZone = ngZone;
|
|
20
|
+
this.elementRef = elementRef;
|
|
21
|
+
this.document = document;
|
|
22
|
+
// @Input() layout: KtdGridLayout = [{ id: '0', x: 5, y: 0, w: 2, h: 3 }];
|
|
23
|
+
this.layout = [];
|
|
24
|
+
this.moDataList = [];
|
|
25
|
+
this.trackById = ktdTrackById;
|
|
26
|
+
this.cols = 12;
|
|
27
|
+
this.rowHeight = 50;
|
|
28
|
+
this.rowHeightFit = false;
|
|
29
|
+
this.gridHeight = null;
|
|
30
|
+
this.compactType = 'vertical';
|
|
31
|
+
this.transitions = [
|
|
32
|
+
{ name: 'ease', value: 'transform 500ms ease, width 500ms ease, height 500ms ease' },
|
|
33
|
+
{ name: 'ease-out', value: 'transform 500ms ease-out, width 500ms ease-out, height 500ms ease-out' },
|
|
34
|
+
{ name: 'linear', value: 'transform 500ms linear, width 500ms linear, height 500ms linear' },
|
|
35
|
+
{
|
|
36
|
+
name: 'overflowing',
|
|
37
|
+
value: 'transform 500ms cubic-bezier(.28,.49,.79,1.35), width 500ms cubic-bezier(.28,.49,.79,1.35), height 500ms cubic-bezier(.28,.49,.79,1.35)'
|
|
38
|
+
},
|
|
39
|
+
{ name: 'fast', value: 'transform 200ms ease, width 200ms linear, height 200ms linear' },
|
|
40
|
+
{ name: 'slow-motion', value: 'transform 1000ms linear, width 1000ms linear, height 1000ms linear' },
|
|
41
|
+
{ name: 'transform-only', value: 'transform 500ms ease' }
|
|
42
|
+
];
|
|
43
|
+
this.currentTransition = this.transitions[0].value;
|
|
44
|
+
this.placeholders = ['None', 'Default', 'Custom 1', 'Custom 2', 'Custom 3'];
|
|
45
|
+
this.currentPlaceholder = 'Default';
|
|
46
|
+
this.dragStartThreshold = 0;
|
|
47
|
+
this.gap = 10;
|
|
48
|
+
this.autoScroll = true;
|
|
49
|
+
this.disableDrag = false;
|
|
50
|
+
this.disableResize = false;
|
|
51
|
+
this.disableRemove = false;
|
|
52
|
+
this.autoResize = true;
|
|
53
|
+
this.preventCollision = false;
|
|
54
|
+
this.isDragging = false;
|
|
55
|
+
this.isResizing = false;
|
|
56
|
+
this.showBackground = false;
|
|
57
|
+
this.gridBackgroundVisibilityOptions = ['never', 'always', 'whenDragging'];
|
|
58
|
+
this.gridBackgroundConfig = {
|
|
59
|
+
show: 'always',
|
|
60
|
+
borderColor: 'rgba(255, 128, 0, 0.25)',
|
|
61
|
+
gapColor: 'transparent',
|
|
62
|
+
borderWidth: 1,
|
|
63
|
+
rowColor: 'rgba(128, 128, 128, 0.10)',
|
|
64
|
+
columnColor: 'rgba(128, 128, 128, 0.10)'
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
ngOnInit() {
|
|
68
|
+
this.resizeSubscription = merge(fromEvent(window, 'resize'), fromEvent(window, 'orientationchange'))
|
|
69
|
+
.pipe(debounceTime(50), filter(() => this.autoResize))
|
|
70
|
+
.subscribe(() => {
|
|
71
|
+
this.grid.resize();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
ngOnDestroy() {
|
|
75
|
+
this.resizeSubscription.unsubscribe();
|
|
76
|
+
}
|
|
77
|
+
ngOnChanges(changes) {
|
|
78
|
+
super.ngOnChanges(changes);
|
|
79
|
+
const { layout } = changes;
|
|
80
|
+
if (layout && !layout.firstChange) {
|
|
81
|
+
this.grid.resize();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
onDragStarted(event) {
|
|
85
|
+
this.isDragging = true;
|
|
86
|
+
}
|
|
87
|
+
onResizeStarted(event) {
|
|
88
|
+
this.isResizing = true;
|
|
89
|
+
}
|
|
90
|
+
onDragEnded(event) {
|
|
91
|
+
this.isDragging = false;
|
|
92
|
+
}
|
|
93
|
+
onResizeEnded(event) {
|
|
94
|
+
this.isResizing = false;
|
|
95
|
+
}
|
|
96
|
+
onLayoutUpdated(layout) {
|
|
97
|
+
console.log('on layout updated', layout);
|
|
98
|
+
this.layout = layout;
|
|
99
|
+
}
|
|
100
|
+
onAutoScrollChange(checked) {
|
|
101
|
+
this.autoScroll = checked;
|
|
102
|
+
}
|
|
103
|
+
onDisableDragChange(checked) {
|
|
104
|
+
this.disableDrag = checked;
|
|
105
|
+
}
|
|
106
|
+
onDisableResizeChange(checked) {
|
|
107
|
+
this.disableResize = checked;
|
|
108
|
+
}
|
|
109
|
+
onShowBackgroundChange(checked) {
|
|
110
|
+
this.showBackground = checked;
|
|
111
|
+
}
|
|
112
|
+
onDisableRemoveChange(checked) {
|
|
113
|
+
this.disableRemove = checked;
|
|
114
|
+
}
|
|
115
|
+
onAutoResizeChange(checked) {
|
|
116
|
+
this.autoResize = checked;
|
|
117
|
+
}
|
|
118
|
+
onPreventCollisionChange(checked) {
|
|
119
|
+
this.preventCollision = checked;
|
|
120
|
+
}
|
|
121
|
+
onColsChange(event) {
|
|
122
|
+
this.cols = coerceNumberProperty(event.target.value);
|
|
123
|
+
}
|
|
124
|
+
onRowHeightChange(event) {
|
|
125
|
+
this.rowHeight = coerceNumberProperty(event.target.value);
|
|
126
|
+
}
|
|
127
|
+
onGridHeightChange(event) {
|
|
128
|
+
this.gridHeight = coerceNumberProperty(event.target.value);
|
|
129
|
+
}
|
|
130
|
+
onDragStartThresholdChange(event) {
|
|
131
|
+
this.dragStartThreshold = coerceNumberProperty(event.target.value);
|
|
132
|
+
}
|
|
133
|
+
onGapChange(event) {
|
|
134
|
+
this.gap = coerceNumberProperty(event.target.value);
|
|
135
|
+
}
|
|
136
|
+
generateLayout() {
|
|
137
|
+
const layout = [];
|
|
138
|
+
for (let i = 0; i < this.cols; i++) {
|
|
139
|
+
const y = Math.ceil(Math.random() * 4) + 1;
|
|
140
|
+
layout.push({
|
|
141
|
+
x: Math.round(Math.random() * Math.floor(this.cols / 2 - 1)) * 2,
|
|
142
|
+
y: Math.floor(i / 6) * y,
|
|
143
|
+
w: 2,
|
|
144
|
+
h: y,
|
|
145
|
+
id: i.toString()
|
|
146
|
+
// static: Math.random() < 0.05
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
this.layout = ktdGridCompact(layout, this.compactType, this.cols);
|
|
150
|
+
console.log('generateLayout', this.layout);
|
|
151
|
+
}
|
|
152
|
+
/** Adds a grid item to the layout */
|
|
153
|
+
addItemToLayout() {
|
|
154
|
+
const maxId = this.layout.reduce((acc, cur) => Math.max(acc, parseInt(cur.id, 10)), -1);
|
|
155
|
+
const nextId = maxId + 1;
|
|
156
|
+
const newLayoutItem = {
|
|
157
|
+
id: nextId.toString(),
|
|
158
|
+
x: -1,
|
|
159
|
+
y: -1,
|
|
160
|
+
w: 2,
|
|
161
|
+
h: 2
|
|
162
|
+
};
|
|
163
|
+
// Important: Don't mutate the array, create new instance. This way notifies the Grid component that the layout has changed.
|
|
164
|
+
this.layout = [newLayoutItem, ...this.layout];
|
|
165
|
+
this.layout = ktdGridCompact(this.layout, this.compactType, this.cols);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Fired when a mousedown happens on the remove grid item button.
|
|
169
|
+
* Stops the event from propagating an causing the drag to start.
|
|
170
|
+
* We don't want to drag when mousedown is fired on remove icon button.
|
|
171
|
+
*/
|
|
172
|
+
stopEventPropagation(event) {
|
|
173
|
+
event.preventDefault();
|
|
174
|
+
event.stopPropagation();
|
|
175
|
+
}
|
|
176
|
+
/** Removes the item from the layout */
|
|
177
|
+
removeItem(id) {
|
|
178
|
+
// Important: Don't mutate the array. Let Angular know that the layout has changed creating a new reference.
|
|
179
|
+
this.layout = ktdArrayRemoveItem(this.layout, (item) => item.id === id);
|
|
180
|
+
}
|
|
181
|
+
updateGridBgBorderWidth(borderWidth) {
|
|
182
|
+
this.gridBackgroundConfig = {
|
|
183
|
+
...this.gridBackgroundConfig,
|
|
184
|
+
borderWidth: Number(borderWidth)
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
updateGridBgColor(color, property) {
|
|
188
|
+
this.gridBackgroundConfig = {
|
|
189
|
+
...this.gridBackgroundConfig,
|
|
190
|
+
[property]: color
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
getCurrentBackgroundVisibility() {
|
|
194
|
+
return this.gridBackgroundConfig?.show ?? 'never';
|
|
195
|
+
}
|
|
196
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayoutContainerComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
197
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LayoutContainerComponent, selector: "buw-layout-container", inputs: { layout: "layout", moDataList: "moDataList" }, providers: [], viewQueries: [{ propertyName: "grid", first: true, predicate: KtdGridComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div style=\"position: relative\" dir=\"ltr\" fillEmptySpace [setMinHeight]=\"true\">\r\n <buw-grid\r\n [cols]=\"cols\"\r\n [backgroundConfig]=\"gridBackgroundConfig\"\r\n [height]=\"rowHeightFit && gridHeight ? gridHeight : null\"\r\n [rowHeight]=\"rowHeightFit ? 'fit' : rowHeight\"\r\n [layout]=\"layout\"\r\n [compactType]=\"compactType\"\r\n [preventCollision]=\"preventCollision\"\r\n [scrollableParent]=\"autoScroll ? document : null\"\r\n [gap]=\"gap\"\r\n [scrollSpeed]=\"4\"\r\n (dragStarted)=\"onDragStarted($event)\"\r\n (resizeStarted)=\"onResizeStarted($event)\"\r\n (dragEnded)=\"onDragEnded($event)\"\r\n (resizeEnded)=\"onResizeEnded($event)\"\r\n (layoutUpdated)=\"onLayoutUpdated($event)\"\r\n >\r\n <buw-grid-item\r\n *ngFor=\"let item of layout; trackBy: trackById; let i = index\"\r\n [id]=\"item.id\"\r\n [transition]=\"currentTransition\"\r\n [dragStartThreshold]=\"dragStartThreshold\"\r\n [draggable]=\"!disableDrag\"\r\n [resizable]=\"!disableResize\"\r\n >\r\n <div class=\"grid-item-content\">\r\n @if(moDataList?.length && moDataList[i]?.EjrayOlgo ){\r\n <bnrc-dynamic-item-component [component]=\"moDataList[i].EjrayOlgo\"> </bnrc-dynamic-item-component>\r\n }\r\n \r\n </div>\r\n <div\r\n class=\"grid-item-remove-handle\"\r\n *ngIf=\"!disableRemove\"\r\n (mousedown)=\"stopEventPropagation($event)\"\r\n (click)=\"removeItem(item.id)\"\r\n ></div>\r\n <ng-template *ngIf=\"currentPlaceholder !== 'Default'\" buwGridItemPlaceholder>\r\n <div\r\n *ngIf=\"currentPlaceholder === 'Custom 1'\"\r\n class=\"grid-item-content custom-placeholder custom-placeholder-1\"\r\n >\r\n {{ item.id }}\r\n </div>\r\n <div\r\n *ngIf=\"currentPlaceholder === 'Custom 2'\"\r\n class=\"grid-item-content custom-placeholder custom-placeholder-2\"\r\n >\r\n {{ item.id }}\r\n </div>\r\n <div\r\n *ngIf=\"currentPlaceholder === 'Custom 3'\"\r\n class=\"grid-item-content custom-placeholder custom-placeholder-3\"\r\n >\r\n {{ item.id }}\r\n </div>\r\n </ng-template>\r\n </buw-grid-item>\r\n </buw-grid>\r\n</div>\r\n", styles: [":host{display:block}:host ::ng-deep .grid-item-content{box-sizing:border-box;background:#ccc;border:1px solid;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}:host ::ng-deep .grid-item-remove-handle{position:absolute;cursor:pointer;display:flex;justify-content:center;width:20px;height:20px;top:0;right:0}:host ::ng-deep .grid-item-remove-handle:after{content:\"x\";color:#121212;font-size:16px;font-weight:300;font-family:Arial,sans-serif}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.DynamicItemComponent, selector: "bnrc-dynamic-item-component", inputs: ["mo", "allColumns", "moDataList", "columns", "column", "index", "last", "hideOpenIcon", "deviceName", "deviceSize", "rtl", "editMode", "setting", "parameters", "contextMenuItems", "canView", "showRowNumber", "rowNumber", "formSetting", "conditionalFormats", "disableOverflowContextMenu", "navigationArrow", "isCheckList", "fields", "isChecked", "layout94$", "inlineEditMode", "isNewInlineMo", "allowInlineEdit", "typeDefId", "rowIndicator", "rowIndicatorColor", "UlvMainCtrlr"] }, { kind: "directive", type: i2.FillEmptySpaceDirective, selector: "[fillEmptySpace]", inputs: ["containerDom", "decrement", "disable", "height", "dontUseTopBound", "setMinHeight"], exportAs: ["fillEmptySpace"] }, { kind: "component", type: i3.KtdGridComponent, selector: "buw-grid", inputs: ["scrollableParent", "compactOnPropsChange", "preventCollision", "scrollSpeed", "compactType", "rowHeight", "cols", "layout", "gap", "height", "backgroundConfig"], outputs: ["layoutUpdated", "dragStarted", "resizeStarted", "dragEnded", "resizeEnded", "gridItemResize"] }, { kind: "component", type: i4.KtdGridItemComponent, selector: "buw-grid-item", inputs: ["minW", "minH", "maxW", "maxH", "transition", "id", "dragStartThreshold", "draggable", "resizable"] }, { kind: "directive", type: i5.KtdGridItemPlaceholder, selector: "ng-template[buwGridItemPlaceholder]", inputs: ["data"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
198
|
+
}
|
|
199
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayoutContainerComponent, decorators: [{
|
|
200
|
+
type: Component,
|
|
201
|
+
args: [{ selector: 'buw-layout-container', providers: [], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div style=\"position: relative\" dir=\"ltr\" fillEmptySpace [setMinHeight]=\"true\">\r\n <buw-grid\r\n [cols]=\"cols\"\r\n [backgroundConfig]=\"gridBackgroundConfig\"\r\n [height]=\"rowHeightFit && gridHeight ? gridHeight : null\"\r\n [rowHeight]=\"rowHeightFit ? 'fit' : rowHeight\"\r\n [layout]=\"layout\"\r\n [compactType]=\"compactType\"\r\n [preventCollision]=\"preventCollision\"\r\n [scrollableParent]=\"autoScroll ? document : null\"\r\n [gap]=\"gap\"\r\n [scrollSpeed]=\"4\"\r\n (dragStarted)=\"onDragStarted($event)\"\r\n (resizeStarted)=\"onResizeStarted($event)\"\r\n (dragEnded)=\"onDragEnded($event)\"\r\n (resizeEnded)=\"onResizeEnded($event)\"\r\n (layoutUpdated)=\"onLayoutUpdated($event)\"\r\n >\r\n <buw-grid-item\r\n *ngFor=\"let item of layout; trackBy: trackById; let i = index\"\r\n [id]=\"item.id\"\r\n [transition]=\"currentTransition\"\r\n [dragStartThreshold]=\"dragStartThreshold\"\r\n [draggable]=\"!disableDrag\"\r\n [resizable]=\"!disableResize\"\r\n >\r\n <div class=\"grid-item-content\">\r\n @if(moDataList?.length && moDataList[i]?.EjrayOlgo ){\r\n <bnrc-dynamic-item-component [component]=\"moDataList[i].EjrayOlgo\"> </bnrc-dynamic-item-component>\r\n }\r\n \r\n </div>\r\n <div\r\n class=\"grid-item-remove-handle\"\r\n *ngIf=\"!disableRemove\"\r\n (mousedown)=\"stopEventPropagation($event)\"\r\n (click)=\"removeItem(item.id)\"\r\n ></div>\r\n <ng-template *ngIf=\"currentPlaceholder !== 'Default'\" buwGridItemPlaceholder>\r\n <div\r\n *ngIf=\"currentPlaceholder === 'Custom 1'\"\r\n class=\"grid-item-content custom-placeholder custom-placeholder-1\"\r\n >\r\n {{ item.id }}\r\n </div>\r\n <div\r\n *ngIf=\"currentPlaceholder === 'Custom 2'\"\r\n class=\"grid-item-content custom-placeholder custom-placeholder-2\"\r\n >\r\n {{ item.id }}\r\n </div>\r\n <div\r\n *ngIf=\"currentPlaceholder === 'Custom 3'\"\r\n class=\"grid-item-content custom-placeholder custom-placeholder-3\"\r\n >\r\n {{ item.id }}\r\n </div>\r\n </ng-template>\r\n </buw-grid-item>\r\n </buw-grid>\r\n</div>\r\n", styles: [":host{display:block}:host ::ng-deep .grid-item-content{box-sizing:border-box;background:#ccc;border:1px solid;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}:host ::ng-deep .grid-item-remove-handle{position:absolute;cursor:pointer;display:flex;justify-content:center;width:20px;height:20px;top:0;right:0}:host ::ng-deep .grid-item-remove-handle:after{content:\"x\";color:#121212;font-size:16px;font-weight:300;font-family:Arial,sans-serif}\n"] }]
|
|
202
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: Document, decorators: [{
|
|
203
|
+
type: Inject,
|
|
204
|
+
args: [DOCUMENT]
|
|
205
|
+
}] }], propDecorators: { grid: [{
|
|
206
|
+
type: ViewChild,
|
|
207
|
+
args: [KtdGridComponent, { static: true }]
|
|
208
|
+
}], layout: [{
|
|
209
|
+
type: Input
|
|
210
|
+
}], moDataList: [{
|
|
211
|
+
type: Input
|
|
212
|
+
}] } });
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL2xheW91dC1jb250YWluZXIvbGF5b3V0LWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL2xheW91dC1jb250YWluZXIvbGF5b3V0LWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsTUFBTSxFQUlOLFNBQVMsRUFDVCxLQUFLLEVBRVIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBdUIsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQTRCLGdCQUFnQixFQUFnQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xILE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDOzs7Ozs7O0FBVTlDLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxhQUFhO0lBc0R2RCxZQUFvQixNQUFjLEVBQVMsVUFBc0IsRUFBMkIsUUFBa0I7UUFDMUcsbUVBQW1FO1FBQ25FLEtBQUssRUFBRSxDQUFDO1FBRlEsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFTLGVBQVUsR0FBVixVQUFVLENB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QTZEQTs7NEZEL0JhLHdCQUF3QjtrQkFScEMsU0FBUzsrQkFDSSxzQkFBc0IsYUFHckIsRUFBRSxtQkFDSSx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLEtBQUs7OzBCQXdEbUQsTUFBTTsyQkFBQyxRQUFRO3lDQXJEcEMsSUFBSTtzQkFBbEQsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBJbmplY3QsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBJbnB1dCxcclxuICAgIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIE1ldGFvYmplY3REYXRhTW9kZWwgfSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIG1lcmdlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgS3RkRHJhZ0VuZCwgS3RkRHJhZ1N0YXJ0LCBLdGRHcmlkQ29tcG9uZW50LCBLdGRSZXNpemVFbmQsIEt0ZFJlc2l6ZVN0YXJ0IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGt0ZEdyaWRDb21wYWN0LCBrdGRUcmFja0J5SWQgfSBmcm9tICcuLi91dGlscy9ncmlkLnV0aWxzJztcclxuaW1wb3J0IHsgS3RkR3JpZEJhY2tncm91bmRDZmcsIEt0ZEdyaWRMYXlvdXQsIEt0ZEdyaWRMYXlvdXRJdGVtIH0gZnJvbSAnLi4vZ3JpZC5kZWZpbml0aW9ucyc7XHJcbmltcG9ydCB7IGt0ZEFycmF5UmVtb3ZlSXRlbSB9IGZyb20gJy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdidXctbGF5b3V0LWNvbnRhaW5lcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbGF5b3V0LWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9sYXlvdXQtY29udGFpbmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtdLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGF5b3V0Q29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBWaWV3Q2hpbGQoS3RkR3JpZENvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgZ3JpZDogS3RkR3JpZENvbXBvbmVudDtcclxuICAgIC8vIEBJbnB1dCgpIGxheW91dDogS3RkR3JpZExheW91dCA9IFt7IGlkOiAnMCcsIHg6IDUsIHk6IDAsIHc6IDIsIGg6IDMgfV07XHJcbiAgICBASW5wdXQoKSBsYXlvdXQ6IEt0ZEdyaWRMYXlvdXQgPSBbXTtcclxuICAgIEBJbnB1dCgpIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSA9IFtdO1xyXG5cclxuICAgIHRyYWNrQnlJZCA9IGt0ZFRyYWNrQnlJZDtcclxuXHJcbiAgICBjb2xzID0gMTI7XHJcbiAgICByb3dIZWlnaHQgPSA1MDtcclxuICAgIHJvd0hlaWdodEZpdCA9IGZhbHNlO1xyXG4gICAgZ3JpZEhlaWdodDogbnVsbCB8IG51bWJlciA9IG51bGw7XHJcbiAgICBjb21wYWN0VHlwZTogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJyB8IG51bGwgPSAndmVydGljYWwnO1xyXG4gICAgdHJhbnNpdGlvbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcclxuICAgICAgICB7IG5hbWU6ICdlYXNlJywgdmFsdWU6ICd0cmFuc2Zvcm0gNTAwbXMgZWFzZSwgd2lkdGggNTAwbXMgZWFzZSwgaGVpZ2h0IDUwMG1zIGVhc2UnIH0sXHJcbiAgICAgICAgeyBuYW1lOiAnZWFzZS1vdXQnLCB2YWx1ZTogJ3RyYW5zZm9ybSA1MDBtcyBlYXNlLW91dCwgd2lkdGggNTAwbXMgZWFzZS1vdXQsIGhlaWdodCA1MDBtcyBlYXNlLW91dCcgfSxcclxuICAgICAgICB7IG5hbWU6ICdsaW5lYXInLCB2YWx1ZTogJ3RyYW5zZm9ybSA1MDBtcyBsaW5lYXIsIHdpZHRoIDUwMG1zIGxpbmVhciwgaGVpZ2h0IDUwMG1zIGxpbmVhcicgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdvdmVyZmxvd2luZycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAndHJhbnNmb3JtIDUwMG1zIGN1YmljLWJlemllciguMjgsLjQ5LC43OSwxLjM1KSwgd2lkdGggNTAwbXMgY3ViaWMtYmV6aWVyKC4yOCwuNDksLjc5LDEuMzUpLCBoZWlnaHQgNTAwbXMgY3ViaWMtYmV6aWVyKC4yOCwuNDksLjc5LDEuMzUpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBuYW1lOiAnZmFzdCcsIHZhbHVlOiAndHJhbnNmb3JtIDIwMG1zIGVhc2UsIHdpZHRoIDIwMG1zIGxpbmVhciwgaGVpZ2h0IDIwMG1zIGxpbmVhcicgfSxcclxuICAgICAgICB7IG5hbWU6ICdzbG93LW1vdGlvbicsIHZhbHVlOiAndHJhbnNmb3JtIDEwMDBtcyBsaW5lYXIsIHdpZHRoIDEwMDBtcyBsaW5lYXIsIGhlaWdodCAxMDAwbXMgbGluZWFyJyB9LFxyXG4gICAgICAgIHsgbmFtZTogJ3RyYW5zZm9ybS1vbmx5JywgdmFsdWU6ICd0cmFuc2Zvcm0gNTAwbXMgZWFzZScgfVxyXG4gICAgXTtcclxuICAgIGN1cnJlbnRUcmFuc2l0aW9uOiBzdHJpbmcgPSB0aGlzLnRyYW5zaXRpb25zWzBdLnZhbHVlO1xyXG5cclxuICAgIHBsYWNlaG9sZGVyczogc3RyaW5nW10gPSBbJ05vbmUnLCAnRGVmYXVsdCcsICdDdXN0b20gMScsICdDdXN0b20gMicsICdDdXN0b20gMyddO1xyXG5cclxuICAgIGN1cnJlbnRQbGFjZWhvbGRlciA9ICdEZWZhdWx0JztcclxuXHJcbiAgICBkcmFnU3RhcnRUaHJlc2hvbGQgPSAwO1xyXG4gICAgZ2FwID0gMTA7XHJcbiAgICBhdXRvU2Nyb2xsID0gdHJ1ZTtcclxuICAgIGRpc2FibGVEcmFnID0gZmFsc2U7XHJcbiAgICBkaXNhYmxlUmVzaXplID0gZmFsc2U7XHJcbiAgICBkaXNhYmxlUmVtb3ZlID0gZmFsc2U7XHJcbiAgICBhdXRvUmVzaXplID0gdHJ1ZTtcclxuICAgIHByZXZlbnRDb2xsaXNpb24gPSBmYWxzZTtcclxuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgIHNob3dCYWNrZ3JvdW5kID0gZmFsc2U7XHJcbiAgICByZXNpemVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICBncmlkQmFja2dyb3VuZFZpc2liaWxpdHlPcHRpb25zID0gWyduZXZlcicsICdhbHdheXMnLCAnd2hlbkRyYWdnaW5nJ107XHJcbiAgICBncmlkQmFja2dyb3VuZENvbmZpZzogUmVxdWlyZWQ8S3RkR3JpZEJhY2tncm91bmRDZmc+ID0ge1xyXG4gICAgICAgIHNob3c6ICdhbHdheXMnLFxyXG4gICAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgyNTUsIDEyOCwgMCwgMC4yNSknLFxyXG4gICAgICAgIGdhcENvbG9yOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgIGJvcmRlcldpZHRoOiAxLFxyXG4gICAgICAgIHJvd0NvbG9yOiAncmdiYSgxMjgsIDEyOCwgMTI4LCAwLjEwKScsXHJcbiAgICAgICAgY29sdW1uQ29sb3I6ICdyZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMTApJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50OiBEb2N1bWVudCkge1xyXG4gICAgICAgIC8vIHRoaXMubmdab25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKCgpID0+IGNvbnNvbGUubG9nKCdVblN0YWJsZScpKTtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVzaXplU3Vic2NyaXB0aW9uID0gbWVyZ2UoZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLCBmcm9tRXZlbnQod2luZG93LCAnb3JpZW50YXRpb25jaGFuZ2UnKSlcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTApLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuYXV0b1Jlc2l6ZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZXNpemUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgICBjb25zdCB7IGxheW91dCB9ID0gY2hhbmdlcztcclxuICAgICAgICBpZiAobGF5b3V0ICYmICFsYXlvdXQuZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkLnJlc2l6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkRyYWdTdGFydGVkKGV2ZW50OiBLdGREcmFnU3RhcnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmVzaXplU3RhcnRlZChldmVudDogS3RkUmVzaXplU3RhcnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRHJhZ0VuZGVkKGV2ZW50OiBLdGREcmFnRW5kKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25SZXNpemVFbmRlZChldmVudDogS3RkUmVzaXplRW5kKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25MYXlvdXRVcGRhdGVkKGxheW91dDogS3RkR3JpZExheW91dCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdvbiBsYXlvdXQgdXBkYXRlZCcsIGxheW91dCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25BdXRvU2Nyb2xsQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmF1dG9TY3JvbGwgPSBjaGVja2VkO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGlzYWJsZURyYWdDaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZURyYWcgPSBjaGVja2VkO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGlzYWJsZVJlc2l6ZUNoYW5nZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlUmVzaXplID0gY2hlY2tlZDtcclxuICAgIH1cclxuXHJcbiAgICBvblNob3dCYWNrZ3JvdW5kQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNob3dCYWNrZ3JvdW5kID0gY2hlY2tlZDtcclxuICAgIH1cclxuXHJcbiAgICBvbkRpc2FibGVSZW1vdmVDaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZVJlbW92ZSA9IGNoZWNrZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25BdXRvUmVzaXplQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmF1dG9SZXNpemUgPSBjaGVja2VkO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUHJldmVudENvbGxpc2lvbkNoYW5nZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcmV2ZW50Q29sbGlzaW9uID0gY2hlY2tlZDtcclxuICAgIH1cclxuXHJcbiAgICBvbkNvbHNDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb2xzID0gY29lcmNlTnVtYmVyUHJvcGVydHkoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Sb3dIZWlnaHRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkdyaWRIZWlnaHRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ncmlkSGVpZ2h0ID0gY29lcmNlTnVtYmVyUHJvcGVydHkoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EcmFnU3RhcnRUaHJlc2hvbGRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRUaHJlc2hvbGQgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkdhcENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdhcCA9IGNvZXJjZU51bWJlclByb3BlcnR5KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlTGF5b3V0KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxheW91dDogS3RkR3JpZExheW91dCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xzOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgeSA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogNCkgKyAxO1xyXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiBNYXRoLmZsb29yKHRoaXMuY29scyAvIDIgLSAxKSkgKiAyLFxyXG4gICAgICAgICAgICAgICAgeTogTWF0aC5mbG9vcihpIC8gNikgKiB5LFxyXG4gICAgICAgICAgICAgICAgdzogMixcclxuICAgICAgICAgICAgICAgIGg6IHksXHJcbiAgICAgICAgICAgICAgICBpZDogaS50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAvLyBzdGF0aWM6IE1hdGgucmFuZG9tKCkgPCAwLjA1XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxheW91dCA9IGt0ZEdyaWRDb21wYWN0KGxheW91dCwgdGhpcy5jb21wYWN0VHlwZSwgdGhpcy5jb2xzKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnZ2VuZXJhdGVMYXlvdXQnLCB0aGlzLmxheW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFkZHMgYSBncmlkIGl0ZW0gdG8gdGhlIGxheW91dCAqL1xyXG4gICAgYWRkSXRlbVRvTGF5b3V0KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG1heElkID0gdGhpcy5sYXlvdXQucmVkdWNlKChhY2MsIGN1cikgPT4gTWF0aC5tYXgoYWNjLCBwYXJzZUludChjdXIuaWQsIDEwKSksIC0xKTtcclxuICAgICAgICBjb25zdCBuZXh0SWQgPSBtYXhJZCArIDE7XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0xheW91dEl0ZW06IEt0ZEdyaWRMYXlvdXRJdGVtID0ge1xyXG4gICAgICAgICAgICBpZDogbmV4dElkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHg6IC0xLFxyXG4gICAgICAgICAgICB5OiAtMSxcclxuICAgICAgICAgICAgdzogMixcclxuICAgICAgICAgICAgaDogMlxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIEltcG9ydGFudDogRG9uJ3QgbXV0YXRlIHRoZSBhcnJheSwgY3JlYXRlIG5ldyBpbnN0YW5jZS4gVGhpcyB3YXkgbm90aWZpZXMgdGhlIEdyaWQgY29tcG9uZW50IHRoYXQgdGhlIGxheW91dCBoYXMgY2hhbmdlZC5cclxuICAgICAgICB0aGlzLmxheW91dCA9IFtuZXdMYXlvdXRJdGVtLCAuLi50aGlzLmxheW91dF07XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0ID0ga3RkR3JpZENvbXBhY3QodGhpcy5sYXlvdXQsIHRoaXMuY29tcGFjdFR5cGUsIHRoaXMuY29scyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaXJlZCB3aGVuIGEgbW91c2Vkb3duIGhhcHBlbnMgb24gdGhlIHJlbW92ZSBncmlkIGl0ZW0gYnV0dG9uLlxyXG4gICAgICogU3RvcHMgdGhlIGV2ZW50IGZyb20gcHJvcGFnYXRpbmcgYW4gY2F1c2luZyB0aGUgZHJhZyB0byBzdGFydC5cclxuICAgICAqIFdlIGRvbid0IHdhbnQgdG8gZHJhZyB3aGVuIG1vdXNlZG93biBpcyBmaXJlZCBvbiByZW1vdmUgaWNvbiBidXR0b24uXHJcbiAgICAgKi9cclxuICAgIHN0b3BFdmVudFByb3BhZ2F0aW9uKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgbGF5b3V0ICovXHJcbiAgICByZW1vdmVJdGVtKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICAvLyBJbXBvcnRhbnQ6IERvbid0IG11dGF0ZSB0aGUgYXJyYXkuIExldCBBbmd1bGFyIGtub3cgdGhhdCB0aGUgbGF5b3V0IGhhcyBjaGFuZ2VkIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZS5cclxuICAgICAgICB0aGlzLmxheW91dCA9IGt0ZEFycmF5UmVtb3ZlSXRlbSh0aGlzLmxheW91dCwgKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVHcmlkQmdCb3JkZXJXaWR0aChib3JkZXJXaWR0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ncmlkQmFja2dyb3VuZENvbmZpZyA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5ncmlkQmFja2dyb3VuZENvbmZpZyxcclxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IE51bWJlcihib3JkZXJXaWR0aClcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUdyaWRCZ0NvbG9yKGNvbG9yOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyaWRCYWNrZ3JvdW5kQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdyaWRCYWNrZ3JvdW5kQ29uZmlnLFxyXG4gICAgICAgICAgICBbcHJvcGVydHldOiBjb2xvclxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudEJhY2tncm91bmRWaXNpYmlsaXR5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEJhY2tncm91bmRDb25maWc/LnNob3cgPz8gJ25ldmVyJztcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCIgZGlyPVwibHRyXCIgZmlsbEVtcHR5U3BhY2UgW3NldE1pbkhlaWdodF09XCJ0cnVlXCI+XHJcbiAgICA8YnV3LWdyaWRcclxuICAgICAgICBbY29sc109XCJjb2xzXCJcclxuICAgICAgICBbYmFja2dyb3VuZENvbmZpZ109XCJncmlkQmFja2dyb3VuZENvbmZpZ1wiXHJcbiAgICAgICAgW2hlaWdodF09XCJyb3dIZWlnaHRGaXQgJiYgZ3JpZEhlaWdodCA/IGdyaWRIZWlnaHQgOiBudWxsXCJcclxuICAgICAgICBbcm93SGVpZ2h0XT1cInJvd0hlaWdodEZpdCA/ICdmaXQnIDogcm93SGVpZ2h0XCJcclxuICAgICAgICBbbGF5b3V0XT1cImxheW91dFwiXHJcbiAgICAgICAgW2NvbXBhY3RUeXBlXT1cImNvbXBhY3RUeXBlXCJcclxuICAgICAgICBbcHJldmVudENvbGxpc2lvbl09XCJwcmV2ZW50Q29sbGlzaW9uXCJcclxuICAgICAgICBbc2Nyb2xsYWJsZVBhcmVudF09XCJhdXRvU2Nyb2xsID8gZG9jdW1lbnQgOiBudWxsXCJcclxuICAgICAgICBbZ2FwXT1cImdhcFwiXHJcbiAgICAgICAgW3Njcm9sbFNwZWVkXT1cIjRcIlxyXG4gICAgICAgIChkcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKCRldmVudClcIlxyXG4gICAgICAgIChyZXNpemVTdGFydGVkKT1cIm9uUmVzaXplU3RhcnRlZCgkZXZlbnQpXCJcclxuICAgICAgICAoZHJhZ0VuZGVkKT1cIm9uRHJhZ0VuZGVkKCRldmVudClcIlxyXG4gICAgICAgIChyZXNpemVFbmRlZCk9XCJvblJlc2l6ZUVuZGVkKCRldmVudClcIlxyXG4gICAgICAgIChsYXlvdXRVcGRhdGVkKT1cIm9uTGF5b3V0VXBkYXRlZCgkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgICA8YnV3LWdyaWQtaXRlbVxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsYXlvdXQ7IHRyYWNrQnk6IHRyYWNrQnlJZDsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgIFtpZF09XCJpdGVtLmlkXCJcclxuICAgICAgICAgICAgW3RyYW5zaXRpb25dPVwiY3VycmVudFRyYW5zaXRpb25cIlxyXG4gICAgICAgICAgICBbZHJhZ1N0YXJ0VGhyZXNob2xkXT1cImRyYWdTdGFydFRocmVzaG9sZFwiXHJcbiAgICAgICAgICAgIFtkcmFnZ2FibGVdPVwiIWRpc2FibGVEcmFnXCJcclxuICAgICAgICAgICAgW3Jlc2l6YWJsZV09XCIhZGlzYWJsZVJlc2l6ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIEBpZihtb0RhdGFMaXN0Py5sZW5ndGggJiYgbW9EYXRhTGlzdFtpXT8uRWpyYXlPbGdvICl7XHJcbiAgICAgICAgICAgICAgICA8Ym5yYy1keW5hbWljLWl0ZW0tY29tcG9uZW50IFtjb21wb25lbnRdPVwibW9EYXRhTGlzdFtpXS5FanJheU9sZ29cIj4gPC9ibnJjLWR5bmFtaWMtaXRlbS1jb21wb25lbnQ+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQtaXRlbS1yZW1vdmUtaGFuZGxlXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVSZW1vdmVcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdG9wRXZlbnRQcm9wYWdhdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVJdGVtKGl0ZW0uaWQpXCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UGxhY2Vob2xkZXIgIT09ICdEZWZhdWx0J1wiIGJ1d0dyaWRJdGVtUGxhY2Vob2xkZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50UGxhY2Vob2xkZXIgPT09ICdDdXN0b20gMSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZC1pdGVtLWNvbnRlbnQgY3VzdG9tLXBsYWNlaG9sZGVyIGN1c3RvbS1wbGFjZWhvbGRlci0xXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmlkIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRQbGFjZWhvbGRlciA9PT0gJ0N1c3RvbSAyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkLWl0ZW0tY29udGVudCBjdXN0b20tcGxhY2Vob2xkZXIgY3VzdG9tLXBsYWNlaG9sZGVyLTJcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uaWQgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFBsYWNlaG9sZGVyID09PSAnQ3VzdG9tIDMnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQtaXRlbS1jb250ZW50IGN1c3RvbS1wbGFjZWhvbGRlciBjdXN0b20tcGxhY2Vob2xkZXItM1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5pZCB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9idXctZ3JpZC1pdGVtPlxyXG4gICAgPC9idXctZ3JpZD5cclxuPC9kaXY+XHJcbiJdfQ==
|