@worktile/gantt 15.0.0 → 15.1.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/class/event.d.ts +13 -0
- package/class/item.d.ts +7 -1
- package/components/bar/bar-drag.d.ts +10 -0
- package/components/bar/bar.component.d.ts +2 -1
- package/components/bar/bar.component.scss +22 -0
- package/components/calendar/calendar.scss +91 -0
- package/components/calendar/grid/calendar-grid.component.d.ts +24 -0
- package/components/calendar/header/calendar-header.component.d.ts +21 -0
- package/components/icon/icons.d.ts +1 -0
- package/components/links/links.component.d.ts +5 -5
- package/components/main/gantt-main.component.d.ts +3 -3
- package/components/table/body/gantt-table-body.component.d.ts +58 -0
- package/components/table/gantt-table.component.scss +169 -85
- package/components/table/gantt-table.scss +271 -0
- package/components/table/header/gantt-table-header.component.d.ts +31 -0
- package/esm2020/class/event.mjs +5 -1
- package/esm2020/class/item.mjs +9 -4
- package/esm2020/components/bar/bar-drag.mjs +106 -42
- package/esm2020/components/bar/bar.component.mjs +8 -2
- package/esm2020/components/calendar/grid/calendar-grid.component.mjs +71 -0
- package/esm2020/components/calendar/header/calendar-header.component.mjs +67 -0
- package/esm2020/components/icon/icons.mjs +4 -2
- package/esm2020/components/links/links.component.mjs +72 -54
- package/esm2020/components/main/gantt-main.component.mjs +5 -5
- package/esm2020/components/table/body/gantt-table-body.component.mjs +286 -0
- package/esm2020/components/table/header/gantt-table-header.component.mjs +140 -0
- package/esm2020/gantt-dom.service.mjs +8 -12
- package/esm2020/gantt-item-upper.mjs +15 -6
- package/esm2020/gantt-print.service.mjs +2 -2
- package/esm2020/gantt-upper.mjs +18 -15
- package/esm2020/gantt.component.mjs +114 -24
- package/esm2020/gantt.module.mjs +25 -10
- package/esm2020/root.component.mjs +10 -8
- package/esm2020/table/gantt-table.component.mjs +12 -4
- package/esm2020/utils/helpers.mjs +11 -1
- package/fesm2015/worktile-gantt.mjs +900 -377
- package/fesm2015/worktile-gantt.mjs.map +1 -1
- package/fesm2020/worktile-gantt.mjs +891 -379
- package/fesm2020/worktile-gantt.mjs.map +1 -1
- package/gantt-dom.service.d.ts +1 -0
- package/gantt-item-upper.d.ts +3 -2
- package/gantt-upper.d.ts +4 -1
- package/gantt.component.d.ts +20 -7
- package/gantt.component.scss +35 -0
- package/gantt.module.d.ts +18 -15
- package/package.json +1 -1
- package/root.component.d.ts +1 -1
- package/styles/index.scss +4 -2
- package/styles/variables.scss +9 -7
- package/table/gantt-table.component.d.ts +5 -2
- package/components/calendar/calendar.component.d.ts +0 -26
- package/components/table/gantt-table.component.d.ts +0 -42
- package/esm2020/components/calendar/calendar.component.mjs +0 -88
- package/esm2020/components/table/gantt-table.component.mjs +0 -166
|
@@ -20,16 +20,16 @@ export class GanttMainComponent {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
GanttMainComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttMainComponent, deps: [{ token: GANTT_UPPER_TOKEN }], target: i0.ɵɵFactoryTarget.Component });
|
|
23
|
-
GanttMainComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: GanttMainComponent, selector: "gantt-main", inputs: {
|
|
23
|
+
GanttMainComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: GanttMainComponent, selector: "gantt-main", inputs: { renderData: "renderData", flatData: "flatData", groupHeaderTemplate: "groupHeaderTemplate", itemTemplate: "itemTemplate", barTemplate: "barTemplate", rangeTemplate: "rangeTemplate" }, outputs: { barClick: "barClick", lineClick: "lineClick" }, host: { properties: { "class.gantt-main-container": "this.ganttMainClass" } }, ngImport: i0, template: "<!-- <gantt-links-overlay [groups]=\"groups\" [items]=\"items\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay> -->\n<!-- groups -->\n<!-- <div class=\"gantt-main-groups\" *ngIf=\"groups && groups.length > 0; else itemsTemplate\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-group\" [ngClass]=\"group.class\">\n <ng-template [ngTemplateOutlet]=\"groupHeaderTemplate\" [ngTemplateOutletContext]=\"{ group: group }\"></ng-template>\n </div>\n <div *ngIf=\"group.expanded\" class=\"gantt-items\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: group.items }\"></ng-template>\n </div>\n </ng-container>\n</div> -->\n\n<!-- items -->\n<!-- <ng-template #itemsTemplate>\n <div class=\"gantt-main-items\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items }\"></ng-template>\n </div>\n</ng-template>\n\n<ng-template #ganttItems let-items=\"items\">\n <ng-container *ngFor=\"let item of items\">\n <div\n class=\"gantt-item\"\n [style.height.px]=\"ganttUpper.styles.lineHeight\"\n [class.gantt-main-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-container *ngIf=\"item.type | isGanttCustomItem\">\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: item.origin,\n refs: item.refs,\n baseline: ganttUpper.baselineItemsMap[item.id]?.origin,\n baselineRefs: ganttUpper.baselineItemsMap[item.id]?.refs\n }\"\n >\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"(item.type | isGanttRangeItem) || (item.type | isGanttBarItem)\">\n <gantt-range *ngIf=\"item.type | isGanttRangeItem\" [template]=\"rangeTemplate\" [item]=\"item\"></gantt-range>\n <gantt-bar *ngIf=\"item.type | isGanttBarItem\" [item]=\"item\" [template]=\"barTemplate\" (barClick)=\"barClick.emit($event)\"></gantt-bar>\n <gantt-baseline *ngIf=\"ganttUpper.baselineItemsMap[item.id]\" [baselineItem]=\"ganttUpper.baselineItemsMap[item.id]\"></gantt-baseline>\n </ng-container>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children }\"\n ></ng-template>\n </ng-container>\n</ng-template> -->\n\n<gantt-links-overlay [flatData]=\"flatData\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay>\n<div class=\"gantt-main-groups\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-container *ngFor=\"let data of renderData; trackBy: trackBy\">\n <div class=\"gantt-group\" [ngClass]=\"data.class\" *ngIf=\"data.items\">\n <ng-template [ngTemplateOutlet]=\"groupHeaderTemplate\" [ngTemplateOutletContext]=\"{ group: data }\"></ng-template>\n </div>\n <div\n *ngIf=\"!data.items\"\n class=\"gantt-item\"\n [style.height.px]=\"ganttUpper.styles.lineHeight\"\n [class.gantt-main-item-active]=\"ganttUpper.isSelected(data.id)\"\n >\n <ng-container *ngIf=\"data.type | isGanttCustomItem\">\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: data.origin,\n refs: data.refs,\n baseline: ganttUpper.baselineItemsMap[data.id]?.origin,\n baselineRefs: ganttUpper.baselineItemsMap[data.id]?.refs\n }\"\n >\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"(data.type | isGanttRangeItem) || (data.type | isGanttBarItem)\">\n <gantt-range *ngIf=\"data.type | isGanttRangeItem\" [template]=\"rangeTemplate\" [item]=\"data\"></gantt-range>\n <gantt-bar *ngIf=\"data.type | isGanttBarItem\" [item]=\"data\" [template]=\"barTemplate\" (barClick)=\"barClick.emit($event)\"></gantt-bar>\n <gantt-baseline *ngIf=\"ganttUpper.baselineItemsMap[data.id]\" [baselineItem]=\"ganttUpper.baselineItemsMap[data.id]\"></gantt-baseline>\n </ng-container>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.GanttLinksComponent, selector: "gantt-links-overlay", inputs: ["flatData"], outputs: ["lineClick"] }, { kind: "component", type: i3.NgxGanttBarComponent, selector: "ngx-gantt-bar,gantt-bar", outputs: ["barClick"] }, { kind: "component", type: i4.NgxGanttRangeComponent, selector: "ngx-gantt-range,gantt-range" }, { kind: "component", type: i5.NgxGanttBaselineComponent, selector: "ngx-gantt-baseline,gantt-baseline", inputs: ["baselineItem"] }, { kind: "pipe", type: i6.IsGanttRangeItemPipe, name: "isGanttRangeItem" }, { kind: "pipe", type: i6.IsGanttBarItemPipe, name: "isGanttBarItem" }, { kind: "pipe", type: i6.IsGanttCustomItemPipe, name: "isGanttCustomItem" }] });
|
|
24
24
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttMainComponent, decorators: [{
|
|
25
25
|
type: Component,
|
|
26
|
-
args: [{ selector: 'gantt-main', template: "<gantt-links-overlay [groups]=\"groups\" [items]=\"items\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay
|
|
26
|
+
args: [{ selector: 'gantt-main', template: "<!-- <gantt-links-overlay [groups]=\"groups\" [items]=\"items\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay> -->\n<!-- groups -->\n<!-- <div class=\"gantt-main-groups\" *ngIf=\"groups && groups.length > 0; else itemsTemplate\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-container *ngFor=\"let group of groups; trackBy: trackBy\">\n <div class=\"gantt-group\" [ngClass]=\"group.class\">\n <ng-template [ngTemplateOutlet]=\"groupHeaderTemplate\" [ngTemplateOutletContext]=\"{ group: group }\"></ng-template>\n </div>\n <div *ngIf=\"group.expanded\" class=\"gantt-items\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: group.items }\"></ng-template>\n </div>\n </ng-container>\n</div> -->\n\n<!-- items -->\n<!-- <ng-template #itemsTemplate>\n <div class=\"gantt-main-items\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-template [ngTemplateOutlet]=\"ganttItems\" [ngTemplateOutletContext]=\"{ items: items }\"></ng-template>\n </div>\n</ng-template>\n\n<ng-template #ganttItems let-items=\"items\">\n <ng-container *ngFor=\"let item of items\">\n <div\n class=\"gantt-item\"\n [style.height.px]=\"ganttUpper.styles.lineHeight\"\n [class.gantt-main-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-container *ngIf=\"item.type | isGanttCustomItem\">\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: item.origin,\n refs: item.refs,\n baseline: ganttUpper.baselineItemsMap[item.id]?.origin,\n baselineRefs: ganttUpper.baselineItemsMap[item.id]?.refs\n }\"\n >\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"(item.type | isGanttRangeItem) || (item.type | isGanttBarItem)\">\n <gantt-range *ngIf=\"item.type | isGanttRangeItem\" [template]=\"rangeTemplate\" [item]=\"item\"></gantt-range>\n <gantt-bar *ngIf=\"item.type | isGanttBarItem\" [item]=\"item\" [template]=\"barTemplate\" (barClick)=\"barClick.emit($event)\"></gantt-bar>\n <gantt-baseline *ngIf=\"ganttUpper.baselineItemsMap[item.id]\" [baselineItem]=\"ganttUpper.baselineItemsMap[item.id]\"></gantt-baseline>\n </ng-container>\n </div>\n <ng-template\n *ngIf=\"item.children && item.expanded\"\n [ngTemplateOutlet]=\"ganttItems\"\n [ngTemplateOutletContext]=\"{ items: item.children }\"\n ></ng-template>\n </ng-container>\n</ng-template> -->\n\n<gantt-links-overlay [flatData]=\"flatData\" (lineClick)=\"lineClick.emit($event)\"></gantt-links-overlay>\n<div class=\"gantt-main-groups\" [style.width.px]=\"ganttUpper.view.width\">\n <ng-container *ngFor=\"let data of renderData; trackBy: trackBy\">\n <div class=\"gantt-group\" [ngClass]=\"data.class\" *ngIf=\"data.items\">\n <ng-template [ngTemplateOutlet]=\"groupHeaderTemplate\" [ngTemplateOutletContext]=\"{ group: data }\"></ng-template>\n </div>\n <div\n *ngIf=\"!data.items\"\n class=\"gantt-item\"\n [style.height.px]=\"ganttUpper.styles.lineHeight\"\n [class.gantt-main-item-active]=\"ganttUpper.isSelected(data.id)\"\n >\n <ng-container *ngIf=\"data.type | isGanttCustomItem\">\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{\n item: data.origin,\n refs: data.refs,\n baseline: ganttUpper.baselineItemsMap[data.id]?.origin,\n baselineRefs: ganttUpper.baselineItemsMap[data.id]?.refs\n }\"\n >\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"(data.type | isGanttRangeItem) || (data.type | isGanttBarItem)\">\n <gantt-range *ngIf=\"data.type | isGanttRangeItem\" [template]=\"rangeTemplate\" [item]=\"data\"></gantt-range>\n <gantt-bar *ngIf=\"data.type | isGanttBarItem\" [item]=\"data\" [template]=\"barTemplate\" (barClick)=\"barClick.emit($event)\"></gantt-bar>\n <gantt-baseline *ngIf=\"ganttUpper.baselineItemsMap[data.id]\" [baselineItem]=\"ganttUpper.baselineItemsMap[data.id]\"></gantt-baseline>\n </ng-container>\n </div>\n </ng-container>\n</div>\n" }]
|
|
27
27
|
}], ctorParameters: function () { return [{ type: i7.GanttUpper, decorators: [{
|
|
28
28
|
type: Inject,
|
|
29
29
|
args: [GANTT_UPPER_TOKEN]
|
|
30
|
-
}] }]; }, propDecorators: {
|
|
30
|
+
}] }]; }, propDecorators: { renderData: [{
|
|
31
31
|
type: Input
|
|
32
|
-
}],
|
|
32
|
+
}], flatData: [{
|
|
33
33
|
type: Input
|
|
34
34
|
}], groupHeaderTemplate: [{
|
|
35
35
|
type: Input
|
|
@@ -47,4 +47,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImpor
|
|
|
47
47
|
type: HostBinding,
|
|
48
48
|
args: ['class.gantt-main-container']
|
|
49
49
|
}] } });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtbWFpbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy9tYWluL2dhbnR0LW1haW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2FudHQvc3JjL2NvbXBvbmVudHMvbWFpbi9nYW50dC1tYWluLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQUUsaUJBQWlCLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7O0FBTWxFLE1BQU0sT0FBTyxrQkFBa0I7SUFzQjNCLFlBQThDLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFOMUQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRWxELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUVuQixtQkFBYyxHQUFHLElBQUksQ0FBQztJQUVNLENBQUM7SUFFeEUsT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUE0QztRQUMvRCxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQzVCLENBQUM7OytHQTFCUSxrQkFBa0Isa0JBc0JQLGlCQUFpQjttR0F0QjVCLGtCQUFrQiw4WENSL0IscXBJQXVGQTsyRkQvRWEsa0JBQWtCO2tCQUo5QixTQUFTOytCQUNJLFlBQVk7OzBCQXlCVCxNQUFNOzJCQUFDLGlCQUFpQjs0Q0FsQjVCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFFRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVvQyxjQUFjO3NCQUF4RCxXQUFXO3VCQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIEluamVjdCwgSW5wdXQsIFRlbXBsYXRlUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR2FudHRHcm91cEludGVybmFsLCBHYW50dEl0ZW1JbnRlcm5hbCwgR2FudHRCYXJDbGlja0V2ZW50LCBHYW50dExpbmVDbGlja0V2ZW50IH0gZnJvbSAnLi4vLi4vY2xhc3MnO1xuaW1wb3J0IHsgR0FOVFRfVVBQRVJfVE9LRU4sIEdhbnR0VXBwZXIgfSBmcm9tICcuLi8uLi9nYW50dC11cHBlcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2FudHQtbWFpbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dhbnR0LW1haW4uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0TWFpbkNvbXBvbmVudCB7XG4gICAgLy8gQElucHV0KCkgZ3JvdXBzOiBHYW50dEdyb3VwSW50ZXJuYWxbXTtcblxuICAgIC8vIEBJbnB1dCgpIGl0ZW1zOiBHYW50dEl0ZW1JbnRlcm5hbFtdO1xuICAgIEBJbnB1dCgpIHJlbmRlckRhdGE6IChHYW50dEdyb3VwSW50ZXJuYWwgfCBHYW50dEl0ZW1JbnRlcm5hbClbXTtcblxuICAgIEBJbnB1dCgpIGZsYXREYXRhOiAoR2FudHRHcm91cEludGVybmFsIHwgR2FudHRJdGVtSW50ZXJuYWwpW107XG5cbiAgICBASW5wdXQoKSBncm91cEhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgYmFyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBASW5wdXQoKSByYW5nZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQE91dHB1dCgpIGJhckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxHYW50dEJhckNsaWNrRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KCkgbGluZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxHYW50dExpbmVDbGlja0V2ZW50PigpO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5nYW50dC1tYWluLWNvbnRhaW5lcicpIGdhbnR0TWFpbkNsYXNzID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoR0FOVFRfVVBQRVJfVE9LRU4pIHB1YmxpYyBnYW50dFVwcGVyOiBHYW50dFVwcGVyKSB7fVxuXG4gICAgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBHYW50dEdyb3VwSW50ZXJuYWwgfCBHYW50dEl0ZW1JbnRlcm5hbCkge1xuICAgICAgICByZXR1cm4gaXRlbS5pZCB8fCBpbmRleDtcbiAgICB9XG59XG4iLCI8IS0tIDxnYW50dC1saW5rcy1vdmVybGF5IFtncm91cHNdPVwiZ3JvdXBzXCIgW2l0ZW1zXT1cIml0ZW1zXCIgKGxpbmVDbGljayk9XCJsaW5lQ2xpY2suZW1pdCgkZXZlbnQpXCI+PC9nYW50dC1saW5rcy1vdmVybGF5PiAtLT5cbjwhLS0gZ3JvdXBzIC0tPlxuPCEtLSA8ZGl2IGNsYXNzPVwiZ2FudHQtbWFpbi1ncm91cHNcIiAqbmdJZj1cImdyb3VwcyAmJiBncm91cHMubGVuZ3RoID4gMDsgZWxzZSBpdGVtc1RlbXBsYXRlXCIgW3N0eWxlLndpZHRoLnB4XT1cImdhbnR0VXBwZXIudmlldy53aWR0aFwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHM7IHRyYWNrQnk6IHRyYWNrQnlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2FudHQtZ3JvdXBcIiBbbmdDbGFzc109XCJncm91cC5jbGFzc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBncm91cDogZ3JvdXAgfVwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImdyb3VwLmV4cGFuZGVkXCIgY2xhc3M9XCJnYW50dC1pdGVtc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdhbnR0SXRlbXNcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtczogZ3JvdXAuaXRlbXMgfVwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+IC0tPlxuXG48IS0tIGl0ZW1zIC0tPlxuPCEtLSA8bmctdGVtcGxhdGUgI2l0ZW1zVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJnYW50dC1tYWluLWl0ZW1zXCIgW3N0eWxlLndpZHRoLnB4XT1cImdhbnR0VXBwZXIudmlldy53aWR0aFwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJnYW50dEl0ZW1zXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgaXRlbXM6IGl0ZW1zIH1cIj48L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZ2FudHRJdGVtcyBsZXQtaXRlbXM9XCJpdGVtc1wiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJnYW50dC1pdGVtXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZ2FudHRVcHBlci5zdHlsZXMubGluZUhlaWdodFwiXG4gICAgICBbY2xhc3MuZ2FudHQtbWFpbi1pdGVtLWFjdGl2ZV09XCJnYW50dFVwcGVyLmlzU2VsZWN0ZWQoaXRlbS5pZClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgfCBpc0dhbnR0Q3VzdG9tSXRlbVwiPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICBpdGVtOiBpdGVtLm9yaWdpbixcbiAgICAgICAgICAgIHJlZnM6IGl0ZW0ucmVmcyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiBnYW50dFVwcGVyLmJhc2VsaW5lSXRlbXNNYXBbaXRlbS5pZF0/Lm9yaWdpbixcbiAgICAgICAgICAgIGJhc2VsaW5lUmVmczogZ2FudHRVcHBlci5iYXNlbGluZUl0ZW1zTWFwW2l0ZW0uaWRdPy5yZWZzXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGl0ZW0udHlwZSB8IGlzR2FudHRSYW5nZUl0ZW0pIHx8IChpdGVtLnR5cGUgfCBpc0dhbnR0QmFySXRlbSlcIj5cbiAgICAgICAgPGdhbnR0LXJhbmdlICpuZ0lmPVwiaXRlbS50eXBlIHwgaXNHYW50dFJhbmdlSXRlbVwiIFt0ZW1wbGF0ZV09XCJyYW5nZVRlbXBsYXRlXCIgW2l0ZW1dPVwiaXRlbVwiPjwvZ2FudHQtcmFuZ2U+XG4gICAgICAgIDxnYW50dC1iYXIgKm5nSWY9XCJpdGVtLnR5cGUgfCBpc0dhbnR0QmFySXRlbVwiIFtpdGVtXT1cIml0ZW1cIiBbdGVtcGxhdGVdPVwiYmFyVGVtcGxhdGVcIiAoYmFyQ2xpY2spPVwiYmFyQ2xpY2suZW1pdCgkZXZlbnQpXCI+PC9nYW50dC1iYXI+XG4gICAgICAgIDxnYW50dC1iYXNlbGluZSAqbmdJZj1cImdhbnR0VXBwZXIuYmFzZWxpbmVJdGVtc01hcFtpdGVtLmlkXVwiIFtiYXNlbGluZUl0ZW1dPVwiZ2FudHRVcHBlci5iYXNlbGluZUl0ZW1zTWFwW2l0ZW0uaWRdXCI+PC9nYW50dC1iYXNlbGluZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgKm5nSWY9XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uZXhwYW5kZWRcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2FudHRJdGVtc1wiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBpdGVtczogaXRlbS5jaGlsZHJlbiB9XCJcbiAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPiAtLT5cblxuPGdhbnR0LWxpbmtzLW92ZXJsYXkgW2ZsYXREYXRhXT1cImZsYXREYXRhXCIgKGxpbmVDbGljayk9XCJsaW5lQ2xpY2suZW1pdCgkZXZlbnQpXCI+PC9nYW50dC1saW5rcy1vdmVybGF5PlxuPGRpdiBjbGFzcz1cImdhbnR0LW1haW4tZ3JvdXBzXCIgW3N0eWxlLndpZHRoLnB4XT1cImdhbnR0VXBwZXIudmlldy53aWR0aFwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhIG9mIHJlbmRlckRhdGE7IHRyYWNrQnk6IHRyYWNrQnlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2FudHQtZ3JvdXBcIiBbbmdDbGFzc109XCJkYXRhLmNsYXNzXCIgKm5nSWY9XCJkYXRhLml0ZW1zXCI+XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGdyb3VwOiBkYXRhIH1cIj48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiIWRhdGEuaXRlbXNcIlxuICAgICAgY2xhc3M9XCJnYW50dC1pdGVtXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZ2FudHRVcHBlci5zdHlsZXMubGluZUhlaWdodFwiXG4gICAgICBbY2xhc3MuZ2FudHQtbWFpbi1pdGVtLWFjdGl2ZV09XCJnYW50dFVwcGVyLmlzU2VsZWN0ZWQoZGF0YS5pZClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhLnR5cGUgfCBpc0dhbnR0Q3VzdG9tSXRlbVwiPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICBpdGVtOiBkYXRhLm9yaWdpbixcbiAgICAgICAgICAgIHJlZnM6IGRhdGEucmVmcyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiBnYW50dFVwcGVyLmJhc2VsaW5lSXRlbXNNYXBbZGF0YS5pZF0/Lm9yaWdpbixcbiAgICAgICAgICAgIGJhc2VsaW5lUmVmczogZ2FudHRVcHBlci5iYXNlbGluZUl0ZW1zTWFwW2RhdGEuaWRdPy5yZWZzXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGRhdGEudHlwZSB8IGlzR2FudHRSYW5nZUl0ZW0pIHx8IChkYXRhLnR5cGUgfCBpc0dhbnR0QmFySXRlbSlcIj5cbiAgICAgICAgPGdhbnR0LXJhbmdlICpuZ0lmPVwiZGF0YS50eXBlIHwgaXNHYW50dFJhbmdlSXRlbVwiIFt0ZW1wbGF0ZV09XCJyYW5nZVRlbXBsYXRlXCIgW2l0ZW1dPVwiZGF0YVwiPjwvZ2FudHQtcmFuZ2U+XG4gICAgICAgIDxnYW50dC1iYXIgKm5nSWY9XCJkYXRhLnR5cGUgfCBpc0dhbnR0QmFySXRlbVwiIFtpdGVtXT1cImRhdGFcIiBbdGVtcGxhdGVdPVwiYmFyVGVtcGxhdGVcIiAoYmFyQ2xpY2spPVwiYmFyQ2xpY2suZW1pdCgkZXZlbnQpXCI+PC9nYW50dC1iYXI+XG4gICAgICAgIDxnYW50dC1iYXNlbGluZSAqbmdJZj1cImdhbnR0VXBwZXIuYmFzZWxpbmVJdGVtc01hcFtkYXRhLmlkXVwiIFtiYXNlbGluZUl0ZW1dPVwiZ2FudHRVcHBlci5iYXNlbGluZUl0ZW1zTWFwW2RhdGEuaWRdXCI+PC9nYW50dC1iYXNlbGluZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { debounceTime, filter, startWith, Subject, takeUntil } from 'rxjs';
|
|
2
|
+
import { Component, HostBinding, Input, Inject, Output, EventEmitter, ViewChildren } from '@angular/core';
|
|
3
|
+
import { coerceCssPixelValue } from '@angular/cdk/coercion';
|
|
4
|
+
import { GANTT_ABSTRACT_TOKEN } from '../../../gantt-abstract';
|
|
5
|
+
import { defaultColumnWidth } from '../header/gantt-table-header.component';
|
|
6
|
+
import { GANTT_UPPER_TOKEN } from '../../../gantt-upper';
|
|
7
|
+
import { CdkDrag } from '@angular/cdk/drag-drop';
|
|
8
|
+
import { DOCUMENT } from '@angular/common';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
import * as i2 from "@angular/cdk/drag-drop";
|
|
12
|
+
import * as i3 from "../../icon/icon.component";
|
|
13
|
+
import * as i4 from "../../../gantt.pipe";
|
|
14
|
+
import * as i5 from "../../../gantt-upper";
|
|
15
|
+
export class GanttTableBodyComponent {
|
|
16
|
+
set renderData(data) {
|
|
17
|
+
const firstData = data[0];
|
|
18
|
+
if (firstData && firstData.hasOwnProperty('items')) {
|
|
19
|
+
this.hasGroup = true;
|
|
20
|
+
}
|
|
21
|
+
this.ganttTableEmptyClass = data?.length ? false : true;
|
|
22
|
+
this._renderData = data;
|
|
23
|
+
}
|
|
24
|
+
get renderData() {
|
|
25
|
+
return this._renderData;
|
|
26
|
+
}
|
|
27
|
+
constructor(gantt, ganttUpper, cdr, document) {
|
|
28
|
+
this.gantt = gantt;
|
|
29
|
+
this.ganttUpper = ganttUpper;
|
|
30
|
+
this.cdr = cdr;
|
|
31
|
+
this.document = document;
|
|
32
|
+
this.draggable = false;
|
|
33
|
+
this.dragDropped = new EventEmitter();
|
|
34
|
+
this.itemClick = new EventEmitter();
|
|
35
|
+
this.ganttTableClass = true;
|
|
36
|
+
this.ganttTableEmptyClass = false;
|
|
37
|
+
this.ganttTableDragging = false;
|
|
38
|
+
this.hasExpandIcon = false;
|
|
39
|
+
// 缓存 Element 和 DragRef 的关系,方便在 Item 拖动时查找
|
|
40
|
+
this.itemDragRefMap = new Map();
|
|
41
|
+
this.itemDragMoved = new Subject();
|
|
42
|
+
this.destroy$ = new Subject();
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.columns.changes.pipe(startWith(this.columns), takeUntil(this.destroy$)).subscribe(() => {
|
|
46
|
+
this.hasExpandIcon = false;
|
|
47
|
+
this.columns.forEach((column) => {
|
|
48
|
+
if (!column.columnWidth) {
|
|
49
|
+
column.columnWidth = coerceCssPixelValue(defaultColumnWidth);
|
|
50
|
+
}
|
|
51
|
+
if (column.showExpandIcon) {
|
|
52
|
+
this.hasExpandIcon = true;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
this.cdr.detectChanges();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
ngAfterViewInit() {
|
|
59
|
+
this.cdkDrags.changes
|
|
60
|
+
.pipe(startWith(this.cdkDrags), takeUntil(this.destroy$))
|
|
61
|
+
.subscribe((drags) => {
|
|
62
|
+
this.itemDragRefMap.clear();
|
|
63
|
+
drags.forEach((drag) => {
|
|
64
|
+
if (drag.data) {
|
|
65
|
+
// cdkDrag 变化时,缓存 Element 与 DragRef 的关系,方便 Drag Move 时查找
|
|
66
|
+
this.itemDragRefMap.set(drag.element.nativeElement, drag);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
this.itemDragMoved
|
|
71
|
+
.pipe(debounceTime(30),
|
|
72
|
+
// debounce 可能会导致拖动结束后仍然执行 moved ,所以通过判断 dragging 状态来过滤无效 moved
|
|
73
|
+
filter((event) => event.source._dragRef.isDragging()), takeUntil(this.destroy$))
|
|
74
|
+
.subscribe((event) => {
|
|
75
|
+
this.onItemDragMoved(event);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
expandGroup(group) {
|
|
79
|
+
this.gantt.expandGroup(group);
|
|
80
|
+
}
|
|
81
|
+
expandChildren(event, item) {
|
|
82
|
+
event.stopPropagation();
|
|
83
|
+
this.gantt.expandChildren(item);
|
|
84
|
+
}
|
|
85
|
+
onItemDragStarted(event) {
|
|
86
|
+
this.ganttTableDragging = true;
|
|
87
|
+
// 拖动开始时隐藏所有的子项
|
|
88
|
+
const children = this.getChildrenElementsByDragRef(event.source);
|
|
89
|
+
children.forEach((element) => {
|
|
90
|
+
element.classList.add('drag-item-hide');
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
emitItemDragMoved(event) {
|
|
94
|
+
this.itemDragMoved.next(event);
|
|
95
|
+
}
|
|
96
|
+
onItemDragMoved(event) {
|
|
97
|
+
// 通过鼠标位置查找对应的目标 Item 元素
|
|
98
|
+
let currentPointElement = this.document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y);
|
|
99
|
+
if (!currentPointElement) {
|
|
100
|
+
this.cleanupDragArtifacts();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
let targetElement = currentPointElement.classList.contains('gantt-table-item')
|
|
104
|
+
? currentPointElement
|
|
105
|
+
: currentPointElement.closest('.gantt-table-item');
|
|
106
|
+
if (!targetElement) {
|
|
107
|
+
this.cleanupDragArtifacts();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// 缓存放置目标Id 并计算鼠标相对应的位置
|
|
111
|
+
this.itemDropTarget = {
|
|
112
|
+
id: this.itemDragRefMap.get(targetElement)?.data.id,
|
|
113
|
+
position: this.getTargetPosition(targetElement, event)
|
|
114
|
+
};
|
|
115
|
+
// 执行外部传入的 dropEnterPredicate 判断是否允许拖入目标项
|
|
116
|
+
if (this.dropEnterPredicate) {
|
|
117
|
+
const targetDragRef = this.itemDragRefMap.get(targetElement);
|
|
118
|
+
if (this.dropEnterPredicate({
|
|
119
|
+
source: event.source.data.origin,
|
|
120
|
+
target: targetDragRef.data.origin,
|
|
121
|
+
dropPosition: this.itemDropTarget.position
|
|
122
|
+
})) {
|
|
123
|
+
this.showDropPositionPlaceholder(targetElement);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.itemDropTarget = null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.showDropPositionPlaceholder(targetElement);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
onItemDragEnded(event) {
|
|
134
|
+
this.ganttTableDragging = false;
|
|
135
|
+
}
|
|
136
|
+
onListDropped(event) {
|
|
137
|
+
if (!this.itemDropTarget) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const targetDragRef = this.cdkDrags.find((item) => item.data?.id === this.itemDropTarget.id);
|
|
141
|
+
const sourceItem = event.item.data;
|
|
142
|
+
const targetItem = targetDragRef?.data;
|
|
143
|
+
this.removeItem(sourceItem);
|
|
144
|
+
switch (this.itemDropTarget.position) {
|
|
145
|
+
case 'before':
|
|
146
|
+
case 'after':
|
|
147
|
+
this.insertItem(targetItem, sourceItem, this.itemDropTarget.position);
|
|
148
|
+
sourceItem.updateLevel(targetItem.level);
|
|
149
|
+
break;
|
|
150
|
+
case 'inside':
|
|
151
|
+
this.insertChildrenItem(targetItem, sourceItem);
|
|
152
|
+
sourceItem.updateLevel(targetItem.level + 1);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
this.dragDropped.emit({
|
|
156
|
+
source: sourceItem.origin,
|
|
157
|
+
sourceParent: this.getParentByItem(sourceItem)?.origin,
|
|
158
|
+
target: targetItem.origin,
|
|
159
|
+
targetParent: this.getParentByItem(targetItem)?.origin,
|
|
160
|
+
dropPosition: this.itemDropTarget.position
|
|
161
|
+
});
|
|
162
|
+
this.cleanupDragArtifacts(true);
|
|
163
|
+
}
|
|
164
|
+
trackBy(index, item) {
|
|
165
|
+
return item.id || index;
|
|
166
|
+
}
|
|
167
|
+
ngOnDestroy() {
|
|
168
|
+
this.destroy$.next();
|
|
169
|
+
this.destroy$.complete();
|
|
170
|
+
}
|
|
171
|
+
removeItem(item) {
|
|
172
|
+
this.renderData.splice(this.renderData.indexOf(item), 1);
|
|
173
|
+
this.flatData.splice(this.flatData.indexOf(item), 1);
|
|
174
|
+
}
|
|
175
|
+
insertItem(target, inserted, position) {
|
|
176
|
+
const appendIndex = position === 'after' ? 1 : 0;
|
|
177
|
+
this.renderData.splice(this.renderData.indexOf(target) + appendIndex, 0, inserted);
|
|
178
|
+
this.flatData.splice(this.flatData.indexOf(target) + appendIndex, 0, inserted);
|
|
179
|
+
}
|
|
180
|
+
insertChildrenItem(target, inserted) {
|
|
181
|
+
if (target.expanded) {
|
|
182
|
+
this.renderData.splice(this.renderData.indexOf(target) + target.children.length + 1, 0, inserted);
|
|
183
|
+
this.flatData.splice(this.flatData.indexOf(target) + target.children.length + 1, 0, inserted);
|
|
184
|
+
}
|
|
185
|
+
target.children.push(inserted);
|
|
186
|
+
}
|
|
187
|
+
getParentByItem(item) {
|
|
188
|
+
return (this.flatData || []).find((n) => {
|
|
189
|
+
return n.children?.includes(item);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
getChildrenElementsByDragRef(dragRef) {
|
|
193
|
+
// 通过循环持续查找 next element,如果 element 的 level 小于当前 item 的 level,则为它的 children
|
|
194
|
+
const children = [];
|
|
195
|
+
let nextElement = dragRef.getPlaceholderElement().nextElementSibling;
|
|
196
|
+
let nextDragRef = this.itemDragRefMap.get(nextElement);
|
|
197
|
+
while (nextDragRef && nextDragRef.data.level > dragRef.data.level) {
|
|
198
|
+
children.push(nextElement);
|
|
199
|
+
nextElement = nextElement.nextElementSibling;
|
|
200
|
+
nextDragRef = this.itemDragRefMap.get(nextElement);
|
|
201
|
+
}
|
|
202
|
+
return children;
|
|
203
|
+
}
|
|
204
|
+
getTargetPosition(target, event) {
|
|
205
|
+
const targetRect = target.getBoundingClientRect();
|
|
206
|
+
const beforeOrAfterGap = targetRect.height * 0.3;
|
|
207
|
+
// 将 Item 高度分为上中下三段,其中上下的 Gap 为 height 的 30%,通过判断鼠标位置在哪一段 gap 来计算对应的位置
|
|
208
|
+
if (event.pointerPosition.y - targetRect.top < beforeOrAfterGap) {
|
|
209
|
+
return 'before';
|
|
210
|
+
}
|
|
211
|
+
else if (event.pointerPosition.y >= targetRect.bottom - beforeOrAfterGap) {
|
|
212
|
+
return 'after';
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return 'inside';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
showDropPositionPlaceholder(targetElement) {
|
|
219
|
+
this.cleanupDragArtifacts();
|
|
220
|
+
if (this.itemDropTarget && targetElement) {
|
|
221
|
+
targetElement.classList.add(`drop-position-${this.itemDropTarget.position}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
cleanupDragArtifacts(dropped = false) {
|
|
225
|
+
if (dropped) {
|
|
226
|
+
this.itemDropTarget = null;
|
|
227
|
+
}
|
|
228
|
+
this.document.querySelectorAll('.drop-position-before').forEach((element) => element.classList.remove('drop-position-before'));
|
|
229
|
+
this.document.querySelectorAll('.drop-position-after').forEach((element) => element.classList.remove('drop-position-after'));
|
|
230
|
+
this.document.querySelectorAll('.drop-position-inside').forEach((element) => element.classList.remove('drop-position-inside'));
|
|
231
|
+
this.document.querySelectorAll('.drag-item-hide').forEach((element) => element.classList.remove('drop-item-hide'));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
GanttTableBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttTableBodyComponent, deps: [{ token: GANTT_ABSTRACT_TOKEN }, { token: GANTT_UPPER_TOKEN }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
235
|
+
GanttTableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: GanttTableBodyComponent, selector: "gantt-table-body", inputs: { renderData: "renderData", flatData: "flatData", columns: "columns", groupTemplate: "groupTemplate", emptyTemplate: "emptyTemplate", rowBeforeTemplate: "rowBeforeTemplate", rowAfterTemplate: "rowAfterTemplate", draggable: "draggable", dropEnterPredicate: "dropEnterPredicate" }, outputs: { dragDropped: "dragDropped", itemClick: "itemClick" }, host: { properties: { "class.gantt-table-draggable": "this.draggable", "class.gantt-table-body": "this.ganttTableClass", "class.gantt-table-empty": "this.ganttTableEmptyClass", "class.gantt-table-dragging": "this.ganttTableDragging" } }, viewQueries: [{ propertyName: "cdkDrags", predicate: (CdkDrag), descendants: true }], ngImport: i0, template: "<div\n class=\"gantt-table-body-container\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"renderData\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\"\n>\n <ng-container *ngIf=\"!renderData?.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"renderData && renderData.length > 0\">\n <ng-container *ngFor=\"let item of renderData; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [ngClass]=\"item.class\" *ngIf=\"item.items\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"item.expanded\" (click)=\"expandGroup(item)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, group: item.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ item.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <div\n *ngIf=\"!item.items\"\n (click)=\"itemClick.emit({ event: $event, selectedValue: item.origin })\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n (cdkDragStarted)=\"onItemDragStarted($event)\"\n (cdkDragEnded)=\"onItemDragEnded($event)\"\n (cdkDragMoved)=\"emitItemDragMoved($event)\"\n class=\"gantt-table-item\"\n [class.gantt-table-item-with-group]=\"hasGroup\"\n [class.gantt-table-item-first-level-group]=\"item.level === 0 && (item.type | isGanttRangeItem)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n\n <div class=\"gantt-table-column\" *ngFor=\"let column of columns; let first = first\" [style.width]=\"column.columnWidth\">\n <!-- drag icon -->\n <gantt-icon\n *ngIf=\"first && draggable\"\n class=\"gantt-drag-handle\"\n iconName=\"drag\"\n cdkDragHandle\n [cdkDragHandleDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n ></gantt-icon>\n <!-- expand icon -->\n <div\n *ngIf=\"column?.showExpandIcon || (!hasExpandIcon && first)\"\n class=\"gantt-expand-icon\"\n [style.marginLeft.px]=\"item.level * 20\"\n >\n <ng-container *ngIf=\"item.level < gantt.maxLevel - 1 && item.expandable\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n >\n </gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <!-- column content -->\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i3.GanttIconComponent, selector: "gantt-icon", inputs: ["iconName"] }, { kind: "pipe", type: i4.IsGanttRangeItemPipe, name: "isGanttRangeItem" }] });
|
|
236
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: GanttTableBodyComponent, decorators: [{
|
|
237
|
+
type: Component,
|
|
238
|
+
args: [{ selector: 'gantt-table-body', template: "<div\n class=\"gantt-table-body-container\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"renderData\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\"\n>\n <ng-container *ngIf=\"!renderData?.length\">\n <ng-container *ngIf=\"!emptyTemplate\">\n <gantt-icon class=\"empty-icon\" iconName=\"empty\"></gantt-icon>\n <div class=\"empty-text\">\u6CA1\u6709\u6570\u636E</div>\n </ng-container>\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"renderData && renderData.length > 0\">\n <ng-container *ngFor=\"let item of renderData; trackBy: trackBy\">\n <div class=\"gantt-table-group\" [ngClass]=\"item.class\" *ngIf=\"item.items\">\n <div class=\"gantt-table-group-title\" [class.expanded]=\"item.expanded\" (click)=\"expandGroup(item)\">\n <gantt-icon class=\"expand-icon\" [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"></gantt-icon>\n <ng-container *ngIf=\"groupTemplate; else default\">\n <ng-template\n [ngTemplateOutlet]=\"groupTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, group: item.origin }\"\n ></ng-template>\n </ng-container>\n <ng-template #default>\n <span class=\"group-title\">{{ item.title }}</span>\n </ng-template>\n </div>\n </div>\n\n <div\n *ngIf=\"!item.items\"\n (click)=\"itemClick.emit({ event: $event, selectedValue: item.origin })\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n (cdkDragStarted)=\"onItemDragStarted($event)\"\n (cdkDragEnded)=\"onItemDragEnded($event)\"\n (cdkDragMoved)=\"emitItemDragMoved($event)\"\n class=\"gantt-table-item\"\n [class.gantt-table-item-with-group]=\"hasGroup\"\n [class.gantt-table-item-first-level-group]=\"item.level === 0 && (item.type | isGanttRangeItem)\"\n [style.height.px]=\"gantt.styles.lineHeight\"\n [style.lineHeight.px]=\"gantt.styles.lineHeight\"\n [class.gantt-table-item-active]=\"ganttUpper.isSelected(item.id)\"\n >\n <ng-template\n [ngTemplateOutlet]=\"rowBeforeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n\n <div class=\"gantt-table-column\" *ngFor=\"let column of columns; let first = first\" [style.width]=\"column.columnWidth\">\n <!-- drag icon -->\n <gantt-icon\n *ngIf=\"first && draggable\"\n class=\"gantt-drag-handle\"\n iconName=\"drag\"\n cdkDragHandle\n [cdkDragHandleDisabled]=\"(draggable && item.itemDraggable === false) || !draggable\"\n ></gantt-icon>\n <!-- expand icon -->\n <div\n *ngIf=\"column?.showExpandIcon || (!hasExpandIcon && first)\"\n class=\"gantt-expand-icon\"\n [style.marginLeft.px]=\"item.level * 20\"\n >\n <ng-container *ngIf=\"item.level < gantt.maxLevel - 1 && item.expandable\">\n <gantt-icon\n *ngIf=\"!item.loading\"\n class=\"expand-icon\"\n [iconName]=\"item.expanded ? 'angle-down' : 'angle-right'\"\n (click)=\"expandChildren($event, item)\"\n >\n </gantt-icon>\n <gantt-icon *ngIf=\"item.loading\" [iconName]=\"'loading'\"></gantt-icon>\n </ng-container>\n </div>\n <!-- column content -->\n <div class=\"gantt-table-column-content\">\n <ng-template\n [ngTemplateOutlet]=\"column.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </div>\n <ng-template\n [ngTemplateOutlet]=\"rowAfterTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item.origin, item: item.origin }\"\n ></ng-template>\n </div>\n </ng-container>\n </ng-container>\n</div>\n" }]
|
|
239
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
240
|
+
type: Inject,
|
|
241
|
+
args: [GANTT_ABSTRACT_TOKEN]
|
|
242
|
+
}] }, { type: i5.GanttUpper, decorators: [{
|
|
243
|
+
type: Inject,
|
|
244
|
+
args: [GANTT_UPPER_TOKEN]
|
|
245
|
+
}] }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
|
|
246
|
+
type: Inject,
|
|
247
|
+
args: [DOCUMENT]
|
|
248
|
+
}] }]; }, propDecorators: { renderData: [{
|
|
249
|
+
type: Input
|
|
250
|
+
}], flatData: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}], columns: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], groupTemplate: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], emptyTemplate: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}], rowBeforeTemplate: [{
|
|
259
|
+
type: Input
|
|
260
|
+
}], rowAfterTemplate: [{
|
|
261
|
+
type: Input
|
|
262
|
+
}], draggable: [{
|
|
263
|
+
type: HostBinding,
|
|
264
|
+
args: ['class.gantt-table-draggable']
|
|
265
|
+
}, {
|
|
266
|
+
type: Input
|
|
267
|
+
}], dropEnterPredicate: [{
|
|
268
|
+
type: Input
|
|
269
|
+
}], dragDropped: [{
|
|
270
|
+
type: Output
|
|
271
|
+
}], itemClick: [{
|
|
272
|
+
type: Output
|
|
273
|
+
}], ganttTableClass: [{
|
|
274
|
+
type: HostBinding,
|
|
275
|
+
args: ['class.gantt-table-body']
|
|
276
|
+
}], ganttTableEmptyClass: [{
|
|
277
|
+
type: HostBinding,
|
|
278
|
+
args: ['class.gantt-table-empty']
|
|
279
|
+
}], ganttTableDragging: [{
|
|
280
|
+
type: HostBinding,
|
|
281
|
+
args: ['class.gantt-table-dragging']
|
|
282
|
+
}], cdkDrags: [{
|
|
283
|
+
type: ViewChildren,
|
|
284
|
+
args: [(CdkDrag)]
|
|
285
|
+
}] } });
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtdGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy90YWJsZS9ib2R5L2dhbnR0LXRhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2FudHQvc3JjL2NvbXBvbmVudHMvdGFibGUvYm9keS9nYW50dC10YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFDSCxTQUFTLEVBQ1QsV0FBVyxFQUdYLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFHWixZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFVdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUEwQixvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBYyxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQXNELE1BQU0sd0JBQXdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBSzNDLE1BQU0sT0FBTyx1QkFBdUI7SUFFaEMsSUFBYSxVQUFVLENBQUMsSUFBZ0Q7UUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDaEQs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LE9BQU87c0JBQWYsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFJTixTQUFTO3NCQUZSLFdBQVc7dUJBQUMsNkJBQTZCOztzQkFDekMsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVnQyxlQUFlO3NCQUFyRCxXQUFXO3VCQUFDLHdCQUF3QjtnQkFFRyxvQkFBb0I7c0JBQTNELFdBQVc7dUJBQUMseUJBQXlCO2dCQUVLLGtCQUFrQjtzQkFBNUQsV0FBVzt1QkFBQyw0QkFBNEI7Z0JBRVYsUUFBUTtzQkFBdEMsWUFBWTt1QkFBQyxDQUFBLE9BQWUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBzdGFydFdpdGgsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgUXVlcnlMaXN0LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBJbmplY3QsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEdhbnR0SXRlbUludGVybmFsLFxuICAgIEdhbnR0R3JvdXBJbnRlcm5hbCxcbiAgICBHYW50dFNlbGVjdGVkRXZlbnQsXG4gICAgR2FudHRUYWJsZURyb3BQb3NpdGlvbixcbiAgICBHYW50dFRhYmxlRHJhZ0VudGVyUHJlZGljYXRlQ29udGV4dCxcbiAgICBHYW50dFRhYmxlRHJhZ0Ryb3BwZWRFdmVudFxufSBmcm9tICcuLi8uLi8uLi9jbGFzcyc7XG5pbXBvcnQgeyBOZ3hHYW50dFRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdGFibGUvZ2FudHQtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEdhbnR0QWJzdHJhY3RDb21wb25lbnQsIEdBTlRUX0FCU1RSQUNUX1RPS0VOIH0gZnJvbSAnLi4vLi4vLi4vZ2FudHQtYWJzdHJhY3QnO1xuaW1wb3J0IHsgZGVmYXVsdENvbHVtbldpZHRoIH0gZnJvbSAnLi4vaGVhZGVyL2dhbnR0LXRhYmxlLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FudHRVcHBlciwgR0FOVFRfVVBQRVJfVE9LRU4gfSBmcm9tICcuLi8uLi8uLi9nYW50dC11cHBlcic7XG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJhZ0VuZCwgQ2RrRHJhZ01vdmUsIENka0RyYWdTdGFydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdnYW50dC10YWJsZS1ib2R5JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ2FudHQtdGFibGUtYm9keS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgR2FudHRUYWJsZUJvZHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgcHJpdmF0ZSBfcmVuZGVyRGF0YTogKEdhbnR0R3JvdXBJbnRlcm5hbCB8IEdhbnR0SXRlbUludGVybmFsKVtdO1xuICAgIEBJbnB1dCgpIHNldCByZW5kZXJEYXRhKGRhdGE6IChHYW50dEdyb3VwSW50ZXJuYWwgfCBHYW50dEl0ZW1JbnRlcm5hbClbXSkge1xuICAgICAgICBjb25zdCBmaXJzdERhdGEgPSBkYXRhWzBdO1xuICAgICAgICBpZiAoZmlyc3REYXRhICYmIGZpcnN0RGF0YS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSkge1xuICAgICAgICAgICAgdGhpcy5oYXNHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nYW50dFRhYmxlRW1wdHlDbGFzcyA9IGRhdGE/Lmxlbmd0aCA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVuZGVyRGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlckRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJEYXRhO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGZsYXREYXRhOiAoR2FudHRHcm91cEludGVybmFsIHwgR2FudHRJdGVtSW50ZXJuYWwpW107XG5cbiAgICBASW5wdXQoKSBjb2x1bW5zOiBRdWVyeUxpc3Q8Tmd4R2FudHRUYWJsZUNvbHVtbkNvbXBvbmVudD47XG5cbiAgICBASW5wdXQoKSBncm91cFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgZW1wdHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpIHJvd0JlZm9yZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KCkgcm93QWZ0ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ2FudHQtdGFibGUtZHJhZ2dhYmxlJylcbiAgICBASW5wdXQoKVxuICAgIGRyYWdnYWJsZSA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgZHJvcEVudGVyUHJlZGljYXRlPzogKGNvbnRleHQ6IEdhbnR0VGFibGVEcmFnRW50ZXJQcmVkaWNhdGVDb250ZXh0KSA9PiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpIGRyYWdEcm9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcjxHYW50dFRhYmxlRHJhZ0Ryb3BwZWRFdmVudD4oKTtcblxuICAgIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEdhbnR0U2VsZWN0ZWRFdmVudD4oKTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ2FudHQtdGFibGUtYm9keScpIGdhbnR0VGFibGVDbGFzcyA9IHRydWU7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdhbnR0LXRhYmxlLWVtcHR5JykgZ2FudHRUYWJsZUVtcHR5Q2xhc3MgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ2FudHQtdGFibGUtZHJhZ2dpbmcnKSBnYW50dFRhYmxlRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oQ2RrRHJhZzxzdHJpbmc+KSBjZGtEcmFnczogUXVlcnlMaXN0PENka0RyYWc8R2FudHRJdGVtSW50ZXJuYWw+PjtcblxuICAgIHB1YmxpYyBoYXNHcm91cDogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBoYXNFeHBhbmRJY29uID0gZmFsc2U7XG5cbiAgICAvLyDnvJPlrZggRWxlbWVudCDlkowgRHJhZ1JlZiDnmoTlhbPns7vvvIzmlrnkvr/lnKggSXRlbSDmi5bliqjml7bmn6Xmib5cbiAgICBwcml2YXRlIGl0ZW1EcmFnUmVmTWFwID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgQ2RrRHJhZzxHYW50dEl0ZW1JbnRlcm5hbD4+KCk7XG5cbiAgICBwcml2YXRlIGl0ZW1EcmFnTW92ZWQgPSBuZXcgU3ViamVjdDxDZGtEcmFnTW92ZT4oKTtcblxuICAgIC8vIEl0ZW0g5ouW5Yqo57uP6L+H55uu5qCH5pe25Li05pe26K6w5b2V55uu5qCHaWTku6Xlj4rnm7jlr7nlupTnm67moIfnmoTkvY3nva5cbiAgICBwcml2YXRlIGl0ZW1Ecm9wVGFyZ2V0OiB7XG4gICAgICAgIHBvc2l0aW9uPzogR2FudHRUYWJsZURyb3BQb3NpdGlvbjtcbiAgICAgICAgaWQ/OiBzdHJpbmc7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoR0FOVFRfQUJTVFJBQ1RfVE9LRU4pIHB1YmxpYyBnYW50dDogR2FudHRBYnN0cmFjdENvbXBvbmVudCxcbiAgICAgICAgQEluamVjdChHQU5UVF9VUFBFUl9UT0tFTikgcHVibGljIGdhbnR0VXBwZXI6IEdhbnR0VXBwZXIsXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zLmNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb2x1bW5zKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNFeHBhbmRJY29uID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2x1bW4uY29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmNvbHVtbldpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShkZWZhdWx0Q29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnNob3dFeHBhbmRJY29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRXhwYW5kSWNvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZGtEcmFncy5jaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShzdGFydFdpdGgodGhpcy5jZGtEcmFncyksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRyYWdzOiBRdWVyeUxpc3Q8Q2RrRHJhZzxHYW50dEl0ZW1JbnRlcm5hbD4+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtRHJhZ1JlZk1hcC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGRyYWdzLmZvckVhY2goKGRyYWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWcuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2RrRHJhZyDlj5jljJbml7bvvIznvJPlrZggRWxlbWVudCDkuI4gRHJhZ1JlZiDnmoTlhbPns7vvvIzmlrnkvr8gRHJhZyBNb3ZlIOaXtuafpeaJvlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtRHJhZ1JlZk1hcC5zZXQoZHJhZy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGRyYWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1EcmFnTW92ZWRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMCksXG4gICAgICAgICAgICAgICAgLy8gIGRlYm91bmNlIOWPr+iDveS8muWvvOiHtOaLluWKqOe7k+adn+WQjuS7jeeEtuaJp+ihjCBtb3ZlZCDvvIzmiYDku6XpgJrov4fliKTmlq0gZHJhZ2dpbmcg54q25oCB5p2l6L+H5ruk5peg5pWIIG1vdmVkXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldmVudDogQ2RrRHJhZ01vdmUpID0+IGV2ZW50LnNvdXJjZS5fZHJhZ1JlZi5pc0RyYWdnaW5nKCkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uSXRlbURyYWdNb3ZlZChldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBleHBhbmRHcm91cChncm91cDogR2FudHRHcm91cEludGVybmFsKSB7XG4gICAgICAgIHRoaXMuZ2FudHQuZXhwYW5kR3JvdXAoZ3JvdXApO1xuICAgIH1cblxuICAgIGV4cGFuZENoaWxkcmVuKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBHYW50dEl0ZW1JbnRlcm5hbCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5nYW50dC5leHBhbmRDaGlsZHJlbihpdGVtKTtcbiAgICB9XG5cbiAgICBvbkl0ZW1EcmFnU3RhcnRlZChldmVudDogQ2RrRHJhZ1N0YXJ0PEdhbnR0SXRlbUludGVybmFsPikge1xuICAgICAgICB0aGlzLmdhbnR0VGFibGVEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIC8vIOaLluWKqOW8gOWni+aXtumakOiXj+aJgOacieeahOWtkOmhuVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5FbGVtZW50c0J5RHJhZ1JlZihldmVudC5zb3VyY2UpO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWctaXRlbS1oaWRlJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGVtaXRJdGVtRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZSkge1xuICAgICAgICB0aGlzLml0ZW1EcmFnTW92ZWQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgb25JdGVtRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZTxHYW50dEl0ZW1JbnRlcm5hbD4pIHtcbiAgICAgICAgLy8g6YCa6L+H6byg5qCH5L2N572u5p+l5om+5a+55bqU55qE55uu5qCHIEl0ZW0g5YWD57SgXG4gICAgICAgIGxldCBjdXJyZW50UG9pbnRFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54LCBldmVudC5wb2ludGVyUG9zaXRpb24ueSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghY3VycmVudFBvaW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0YXJnZXRFbGVtZW50ID0gY3VycmVudFBvaW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2dhbnR0LXRhYmxlLWl0ZW0nKVxuICAgICAgICAgICAgPyBjdXJyZW50UG9pbnRFbGVtZW50XG4gICAgICAgICAgICA6IChjdXJyZW50UG9pbnRFbGVtZW50LmNsb3Nlc3QoJy5nYW50dC10YWJsZS1pdGVtJykgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOe8k+WtmOaUvue9ruebruagh0lkIOW5tuiuoeeul+m8oOagh+ebuOWvueW6lOeahOS9jee9rlxuICAgICAgICB0aGlzLml0ZW1Ecm9wVGFyZ2V0ID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaXRlbURyYWdSZWZNYXAuZ2V0KHRhcmdldEVsZW1lbnQpPy5kYXRhLmlkLFxuICAgICAgICAgICAgcG9zaXRpb246IHRoaXMuZ2V0VGFyZ2V0UG9zaXRpb24odGFyZ2V0RWxlbWVudCwgZXZlbnQpXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g5omn6KGM5aSW6YOo5Lyg5YWl55qEIGRyb3BFbnRlclByZWRpY2F0ZSDliKTmlq3mmK/lkKblhYHorrjmi5blhaXnm67moIfpoblcbiAgICAgICAgaWYgKHRoaXMuZHJvcEVudGVyUHJlZGljYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXREcmFnUmVmID0gdGhpcy5pdGVtRHJhZ1JlZk1hcC5nZXQodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRW50ZXJQcmVkaWNhdGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LnNvdXJjZS5kYXRhLm9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXREcmFnUmVmLmRhdGEub3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICBkcm9wUG9zaXRpb246IHRoaXMuaXRlbURyb3BUYXJnZXQucG9zaXRpb25cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbURyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93RHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkl0ZW1EcmFnRW5kZWQoZXZlbnQ6IENka0RyYWdFbmQ8R2FudHRJdGVtSW50ZXJuYWw+KSB7XG4gICAgICAgIHRoaXMuZ2FudHRUYWJsZURyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25MaXN0RHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8R2FudHRJdGVtSW50ZXJuYWxbXSwgR2FudHRJdGVtSW50ZXJuYWxbXSwgR2FudHRJdGVtSW50ZXJuYWw+KSB7XG4gICAgICAgIGlmICghdGhpcy5pdGVtRHJvcFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldERyYWdSZWYgPSB0aGlzLmNka0RyYWdzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGF0YT8uaWQgPT09IHRoaXMuaXRlbURyb3BUYXJnZXQuaWQpO1xuICAgICAgICBjb25zdCBzb3VyY2VJdGVtID0gZXZlbnQuaXRlbS5kYXRhO1xuICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGFyZ2V0RHJhZ1JlZj8uZGF0YTtcblxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oc291cmNlSXRlbSk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLml0ZW1Ecm9wVGFyZ2V0LnBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SXRlbSh0YXJnZXRJdGVtLCBzb3VyY2VJdGVtLCB0aGlzLml0ZW1Ecm9wVGFyZ2V0LnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VJdGVtLnVwZGF0ZUxldmVsKHRhcmdldEl0ZW0ubGV2ZWwpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydENoaWxkcmVuSXRlbSh0YXJnZXRJdGVtLCBzb3VyY2VJdGVtKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VJdGVtLnVwZGF0ZUxldmVsKHRhcmdldEl0ZW0ubGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BwZWQuZW1pdCh7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUl0ZW0ub3JpZ2luLFxuICAgICAgICAgICAgc291cmNlUGFyZW50OiB0aGlzLmdldFBhcmVudEJ5SXRlbShzb3VyY2VJdGVtKT8ub3JpZ2luLFxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRJdGVtLm9yaWdpbixcbiAgICAgICAgICAgIHRhcmdldFBhcmVudDogdGhpcy5nZXRQYXJlbnRCeUl0ZW0odGFyZ2V0SXRlbSk/Lm9yaWdpbixcbiAgICAgICAgICAgIGRyb3BQb3NpdGlvbjogdGhpcy5pdGVtRHJvcFRhcmdldC5wb3NpdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsZWFudXBEcmFnQXJ0aWZhY3RzKHRydWUpO1xuICAgIH1cblxuICAgIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogR2FudHRHcm91cEludGVybmFsIHwgR2FudHRJdGVtSW50ZXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQgfHwgaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVJdGVtKGl0ZW06IEdhbnR0SXRlbUludGVybmFsKSB7XG4gICAgICAgIHRoaXMucmVuZGVyRGF0YS5zcGxpY2UodGhpcy5yZW5kZXJEYXRhLmluZGV4T2YoaXRlbSksIDEpO1xuICAgICAgICB0aGlzLmZsYXREYXRhLnNwbGljZSh0aGlzLmZsYXREYXRhLmluZGV4T2YoaXRlbSksIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5zZXJ0SXRlbSh0YXJnZXQ6IEdhbnR0SXRlbUludGVybmFsLCBpbnNlcnRlZDogR2FudHRJdGVtSW50ZXJuYWwsIHBvc2l0aW9uOiAnYmVmb3JlJyB8ICdhZnRlcicpIHtcbiAgICAgICAgY29uc3QgYXBwZW5kSW5kZXggPSBwb3NpdGlvbiA9PT0gJ2FmdGVyJyA/IDEgOiAwO1xuICAgICAgICB0aGlzLnJlbmRlckRhdGEuc3BsaWNlKHRoaXMucmVuZGVyRGF0YS5pbmRleE9mKHRhcmdldCkgKyBhcHBlbmRJbmRleCwgMCwgaW5zZXJ0ZWQpO1xuICAgICAgICB0aGlzLmZsYXREYXRhLnNwbGljZSh0aGlzLmZsYXREYXRhLmluZGV4T2YodGFyZ2V0KSArIGFwcGVuZEluZGV4LCAwLCBpbnNlcnRlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnNlcnRDaGlsZHJlbkl0ZW0odGFyZ2V0OiBHYW50dEl0ZW1JbnRlcm5hbCwgaW5zZXJ0ZWQ6IEdhbnR0SXRlbUludGVybmFsKSB7XG4gICAgICAgIGlmICh0YXJnZXQuZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRGF0YS5zcGxpY2UodGhpcy5yZW5kZXJEYXRhLmluZGV4T2YodGFyZ2V0KSArIHRhcmdldC5jaGlsZHJlbi5sZW5ndGggKyAxLCAwLCBpbnNlcnRlZCk7XG4gICAgICAgICAgICB0aGlzLmZsYXREYXRhLnNwbGljZSh0aGlzLmZsYXREYXRhLmluZGV4T2YodGFyZ2V0KSArIHRhcmdldC5jaGlsZHJlbi5sZW5ndGggKyAxLCAwLCBpbnNlcnRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmNoaWxkcmVuLnB1c2goaW5zZXJ0ZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50QnlJdGVtKGl0ZW06IEdhbnR0SXRlbUludGVybmFsKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5mbGF0RGF0YSB8fCBbXSkuZmluZCgobjogR2FudHRJdGVtSW50ZXJuYWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuLmNoaWxkcmVuPy5pbmNsdWRlcyhpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGlsZHJlbkVsZW1lbnRzQnlEcmFnUmVmKGRyYWdSZWY6IENka0RyYWc8R2FudHRJdGVtSW50ZXJuYWw+KSB7XG4gICAgICAgIC8vIOmAmui/h+W+queOr+aMgee7reafpeaJviBuZXh0IGVsZW1lbnTvvIzlpoLmnpwgZWxlbWVudCDnmoQgbGV2ZWwg5bCP5LqO5b2T5YmNIGl0ZW0g55qEIGxldmVs77yM5YiZ5Li65a6D55qEIGNoaWxkcmVuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGRyYWdSZWYuZ2V0UGxhY2Vob2xkZXJFbGVtZW50KCkubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbmV4dERyYWdSZWYgPSB0aGlzLml0ZW1EcmFnUmVmTWFwLmdldChuZXh0RWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChuZXh0RHJhZ1JlZiAmJiBuZXh0RHJhZ1JlZi5kYXRhLmxldmVsID4gZHJhZ1JlZi5kYXRhLmxldmVsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5leHRFbGVtZW50KTtcbiAgICAgICAgICAgIG5leHRFbGVtZW50ID0gbmV4dEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbmV4dERyYWdSZWYgPSB0aGlzLml0ZW1EcmFnUmVmTWFwLmdldChuZXh0RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGFyZ2V0UG9zaXRpb24odGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IENka0RyYWdNb3ZlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZU9yQWZ0ZXJHYXAgPSB0YXJnZXRSZWN0LmhlaWdodCAqIDAuMztcbiAgICAgICAgLy8g5bCGIEl0ZW0g6auY5bqm5YiG5Li65LiK5Lit5LiL5LiJ5q6177yM5YW25Lit5LiK5LiL55qEIEdhcCDkuLogaGVpZ2h0IOeahCAzMCXvvIzpgJrov4fliKTmlq3pvKDmoIfkvY3nva7lnKjlk6rkuIDmrrUgZ2FwIOadpeiuoeeul+WvueW6lOeahOS9jee9rlxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA8IGJlZm9yZU9yQWZ0ZXJHYXApIHtcbiAgICAgICAgICAgIHJldHVybiAnYmVmb3JlJztcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5wb2ludGVyUG9zaXRpb24ueSA+PSB0YXJnZXRSZWN0LmJvdHRvbSAtIGJlZm9yZU9yQWZ0ZXJHYXApIHtcbiAgICAgICAgICAgIHJldHVybiAnYWZ0ZXInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdpbnNpZGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93RHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICBpZiAodGhpcy5pdGVtRHJvcFRhcmdldCAmJiB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoYGRyb3AtcG9zaXRpb24tJHt0aGlzLml0ZW1Ecm9wVGFyZ2V0LnBvc2l0aW9ufWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbnVwRHJhZ0FydGlmYWN0cyhkcm9wcGVkID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRyb3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbURyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3AtcG9zaXRpb24tYmVmb3JlJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wLXBvc2l0aW9uLWJlZm9yZScpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1wb3NpdGlvbi1hZnRlcicpLmZvckVhY2goKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcC1wb3NpdGlvbi1hZnRlcicpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1wb3NpdGlvbi1pbnNpZGUnKS5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3AtcG9zaXRpb24taW5zaWRlJykpO1xuICAgICAgICB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcmFnLWl0ZW0taGlkZScpLmZvckVhY2goKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcC1pdGVtLWhpZGUnKSk7XG4gICAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImdhbnR0LXRhYmxlLWJvZHktY29udGFpbmVyXCJcbiAgY2RrRHJvcExpc3RcbiAgW2Nka0Ryb3BMaXN0QXV0b1Njcm9sbFN0ZXBdPVwiNlwiXG4gIFtjZGtEcm9wTGlzdERhdGFdPVwicmVuZGVyRGF0YVwiXG4gIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcbiAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkxpc3REcm9wcGVkKCRldmVudClcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJlbmRlckRhdGE/Lmxlbmd0aFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZW1wdHlUZW1wbGF0ZVwiPlxuICAgICAgPGdhbnR0LWljb24gY2xhc3M9XCJlbXB0eS1pY29uXCIgaWNvbk5hbWU9XCJlbXB0eVwiPjwvZ2FudHQtaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS10ZXh0XCI+5rKh5pyJ5pWw5o2uPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVtcHR5VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVuZGVyRGF0YSAmJiByZW5kZXJEYXRhLmxlbmd0aCA+IDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJlbmRlckRhdGE7IHRyYWNrQnk6IHRyYWNrQnlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnYW50dC10YWJsZS1ncm91cFwiIFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3NcIiAqbmdJZj1cIml0ZW0uaXRlbXNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbnR0LXRhYmxlLWdyb3VwLXRpdGxlXCIgW2NsYXNzLmV4cGFuZGVkXT1cIml0ZW0uZXhwYW5kZWRcIiAoY2xpY2spPVwiZXhwYW5kR3JvdXAoaXRlbSlcIj5cbiAgICAgICAgICA8Z2FudHQtaWNvbiBjbGFzcz1cImV4cGFuZC1pY29uXCIgW2ljb25OYW1lXT1cIml0ZW0uZXhwYW5kZWQgPyAnYW5nbGUtZG93bicgOiAnYW5nbGUtcmlnaHQnXCI+PC9nYW50dC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJncm91cFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtLm9yaWdpbiwgZ3JvdXA6IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC10aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIiFpdGVtLml0ZW1zXCJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgc2VsZWN0ZWRWYWx1ZTogaXRlbS5vcmlnaW4gfSlcIlxuICAgICAgICBjZGtEcmFnXG4gICAgICAgIFtjZGtEcmFnRGF0YV09XCJpdGVtXCJcbiAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCIoZHJhZ2dhYmxlICYmIGl0ZW0uaXRlbURyYWdnYWJsZSA9PT0gZmFsc2UpIHx8ICFkcmFnZ2FibGVcIlxuICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25JdGVtRHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25JdGVtRHJhZ0VuZGVkKCRldmVudClcIlxuICAgICAgICAoY2RrRHJhZ01vdmVkKT1cImVtaXRJdGVtRHJhZ01vdmVkKCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImdhbnR0LXRhYmxlLWl0ZW1cIlxuICAgICAgICBbY2xhc3MuZ2FudHQtdGFibGUtaXRlbS13aXRoLWdyb3VwXT1cImhhc0dyb3VwXCJcbiAgICAgICAgW2NsYXNzLmdhbnR0LXRhYmxlLWl0ZW0tZmlyc3QtbGV2ZWwtZ3JvdXBdPVwiaXRlbS5sZXZlbCA9PT0gMCAmJiAoaXRlbS50eXBlIHwgaXNHYW50dFJhbmdlSXRlbSlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImdhbnR0LnN0eWxlcy5saW5lSGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLmxpbmVIZWlnaHQucHhdPVwiZ2FudHQuc3R5bGVzLmxpbmVIZWlnaHRcIlxuICAgICAgICBbY2xhc3MuZ2FudHQtdGFibGUtaXRlbS1hY3RpdmVdPVwiZ2FudHRVcHBlci5pc1NlbGVjdGVkKGl0ZW0uaWQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicm93QmVmb3JlVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5vcmlnaW4sIGl0ZW06IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FudHQtdGFibGUtY29sdW1uXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgZmlyc3QgPSBmaXJzdFwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4uY29sdW1uV2lkdGhcIj5cbiAgICAgICAgICA8IS0tIGRyYWcgaWNvbiAtLT5cbiAgICAgICAgICA8Z2FudHQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJmaXJzdCAmJiBkcmFnZ2FibGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJnYW50dC1kcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICBpY29uTmFtZT1cImRyYWdcIlxuICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgW2Nka0RyYWdIYW5kbGVEaXNhYmxlZF09XCIoZHJhZ2dhYmxlICYmIGl0ZW0uaXRlbURyYWdnYWJsZSA9PT0gZmFsc2UpIHx8ICFkcmFnZ2FibGVcIlxuICAgICAgICAgID48L2dhbnR0LWljb24+XG4gICAgICAgICAgPCEtLSBleHBhbmQgaWNvbiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbHVtbj8uc2hvd0V4cGFuZEljb24gfHwgKCFoYXNFeHBhbmRJY29uICYmIGZpcnN0KVwiXG4gICAgICAgICAgICBjbGFzcz1cImdhbnR0LWV4cGFuZC1pY29uXCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5MZWZ0LnB4XT1cIml0ZW0ubGV2ZWwgKiAyMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubGV2ZWwgPCBnYW50dC5tYXhMZXZlbCAtIDEgJiYgaXRlbS5leHBhbmRhYmxlXCI+XG4gICAgICAgICAgICAgIDxnYW50dC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXRlbS5sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImV4cGFuZC1pY29uXCJcbiAgICAgICAgICAgICAgICBbaWNvbk5hbWVdPVwiaXRlbS5leHBhbmRlZCA/ICdhbmdsZS1kb3duJyA6ICdhbmdsZS1yaWdodCdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRDaGlsZHJlbigkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2dhbnR0LWljb24+XG4gICAgICAgICAgICAgIDxnYW50dC1pY29uICpuZ0lmPVwiaXRlbS5sb2FkaW5nXCIgW2ljb25OYW1lXT1cIidsb2FkaW5nJ1wiPjwvZ2FudHQtaWNvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gY29sdW1uIGNvbnRlbnQgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbnR0LXRhYmxlLWNvbHVtbi1jb250ZW50XCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtLm9yaWdpbiwgaXRlbTogaXRlbS5vcmlnaW4gfVwiXG4gICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJvd0FmdGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5vcmlnaW4sIGl0ZW06IGl0ZW0ub3JpZ2luIH1cIlxuICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
|