igniteui-angular-extras 15.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +36 -0
  2. package/esm2020/igniteui-angular-extras.mjs +5 -0
  3. package/esm2020/images/charts.mjs +408 -0
  4. package/esm2020/images/conditions.mjs +95 -0
  5. package/esm2020/lib/context-menu/chart-dialog/chart-dialog.component.mjs +67 -0
  6. package/esm2020/lib/context-menu/context-menu.component.mjs +177 -0
  7. package/esm2020/lib/context-menu/igx-context-menu.directive.mjs +160 -0
  8. package/esm2020/lib/directives/chart-integration/chart-integration.directive.mjs +312 -0
  9. package/esm2020/lib/directives/chart-integration/chart-types.mjs +28 -0
  10. package/esm2020/lib/directives/chart-integration/initializers.mjs +103 -0
  11. package/esm2020/lib/directives/conditional-formatting/conditional-formatting.directive.mjs +311 -0
  12. package/esm2020/lib/igniteui-angular-extras.module.mjs +104 -0
  13. package/esm2020/lib/pipes/svg.pipe.mjs +20 -0
  14. package/esm2020/public-api.mjs +21 -0
  15. package/fesm2015/igniteui-angular-extras.mjs +1789 -0
  16. package/fesm2015/igniteui-angular-extras.mjs.map +1 -0
  17. package/fesm2020/igniteui-angular-extras.mjs +1782 -0
  18. package/fesm2020/igniteui-angular-extras.mjs.map +1 -0
  19. package/images/charts.d.ts +16 -0
  20. package/images/conditions.d.ts +10 -0
  21. package/index.d.ts +5 -0
  22. package/lib/context-menu/chart-dialog/chart-dialog.component.d.ts +31 -0
  23. package/lib/context-menu/context-menu.component.d.ts +38 -0
  24. package/lib/context-menu/igx-context-menu.directive.d.ts +33 -0
  25. package/lib/directives/chart-integration/chart-integration.directive.d.ts +52 -0
  26. package/lib/directives/chart-integration/chart-types.d.ts +25 -0
  27. package/lib/directives/chart-integration/initializers.d.ts +39 -0
  28. package/lib/directives/conditional-formatting/conditional-formatting.directive.d.ts +95 -0
  29. package/lib/igniteui-angular-extras.module.d.ts +14 -0
  30. package/lib/pipes/svg.pipe.d.ts +10 -0
  31. package/package.json +35 -0
  32. package/public-api.d.ts +17 -0
@@ -0,0 +1,160 @@
1
+ import { Directive, EventEmitter, Optional, Output } from '@angular/core';
2
+ import { AbsoluteScrollStrategy, AutoPositionStrategy, HorizontalAlignment, VerticalAlignment } from '@infragistics/igniteui-angular';
3
+ import { Subject } from 'rxjs';
4
+ import { debounceTime, filter, merge, takeUntil } from 'rxjs/operators';
5
+ import { IgxContextMenuComponent } from './context-menu.component';
6
+ import { ResizeObserver } from '@juggle/resize-observer';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@infragistics/igniteui-angular";
9
+ import * as i2 from "../directives/conditional-formatting/conditional-formatting.directive";
10
+ import * as i3 from "../directives/chart-integration/chart-integration.directive";
11
+ export class IgxContextMenuDirective {
12
+ constructor(grid, textFormatter, chartsDirective, overlayService) {
13
+ this.grid = grid;
14
+ this.textFormatter = textFormatter;
15
+ this.chartsDirective = chartsDirective;
16
+ this.overlayService = overlayService;
17
+ this.onButtonClose = new EventEmitter();
18
+ this.formatters = [];
19
+ this.charts = [];
20
+ this.gridResizeNotify = new Subject();
21
+ this._collapsed = true;
22
+ this.destroy$ = new Subject();
23
+ this._analyticsBtnSettings = {
24
+ closeOnOutsideClick: false,
25
+ modal: false
26
+ };
27
+ }
28
+ ngOnInit() {
29
+ this.gridResizeNotify.pipe(takeUntil(this.destroy$))
30
+ .subscribe(() => {
31
+ if (this._id && !this._collapsed) {
32
+ this.renderButton();
33
+ }
34
+ });
35
+ }
36
+ ngAfterViewInit() {
37
+ this.setUpGridListeners();
38
+ if (this.textFormatter) {
39
+ this.textFormatter.onFormattersReady.pipe(takeUntil(this.destroy$))
40
+ .subscribe(names => this.formatters = names);
41
+ }
42
+ if (this.chartsDirective) {
43
+ this.chartsDirective.onChartTypesDetermined.pipe(takeUntil(this.destroy$))
44
+ .subscribe((args) => this.charts = args.chartsForCreation);
45
+ }
46
+ this.overlayService.opening.pipe(takeUntil(this.destroy$))
47
+ .subscribe((args) => {
48
+ if (args.componentRef) {
49
+ const instance = args.componentRef.instance;
50
+ instance.contextDirective = this;
51
+ }
52
+ });
53
+ }
54
+ ngOnDestroy() {
55
+ this.destroy$.next(true);
56
+ this.destroy$.complete();
57
+ if (!this._collapsed) {
58
+ this.close();
59
+ }
60
+ }
61
+ setUpGridListeners() {
62
+ this.contentObserver = new ResizeObserver(() => this.gridResizeNotify.next());
63
+ this.contentObserver.observe(this.grid.nativeElement);
64
+ this.grid.rangeSelected.pipe(takeUntil(this.destroy$))
65
+ .subscribe((args) => {
66
+ this._range = args;
67
+ if (this.chartsDirective) {
68
+ if (this.grid.getSelectedRanges().length === 1) {
69
+ this.chartsDirective.chartData = this.grid.getSelectedData();
70
+ }
71
+ else {
72
+ this.chartsDirective.chartData = [];
73
+ }
74
+ }
75
+ if (!this._collapsed) {
76
+ this.onButtonClose.emit();
77
+ }
78
+ this.renderButton();
79
+ });
80
+ this.grid.verticalScrollContainer.chunkLoad.pipe(merge(this.grid.parentVirtDir.chunkLoad, this.grid.filteringDone, this.grid.columnResized, this.grid.columnVisibilityChanged.pipe(debounceTime(30))), filter(() => this._range), takeUntil(this.destroy$)).subscribe(() => {
81
+ this.onButtonClose.emit();
82
+ this.renderButton();
83
+ });
84
+ this.grid.selected.pipe(merge(this.grid.pagingDone, this.grid.onGroupingDone, this.grid.perPageChange), takeUntil(this.destroy$)).subscribe((args) => {
85
+ if (this.grid.selectedCells.length < 2 || args.expressions) {
86
+ this._range = undefined;
87
+ this.close();
88
+ }
89
+ });
90
+ }
91
+ renderButton() {
92
+ if (!this._range) {
93
+ return;
94
+ }
95
+ let rowIndex = this._range.rowEnd;
96
+ let colIndex = +this._range.columnEnd;
97
+ while (colIndex >= this._range.columnStart && !this.grid.navigation.isColumnFullyVisible(colIndex)) {
98
+ colIndex--;
99
+ }
100
+ while (rowIndex >= this._range.rowStart && this.grid.navigation.shouldPerformVerticalScroll(rowIndex, -1)) {
101
+ rowIndex--;
102
+ }
103
+ const field = this.grid.visibleColumns[colIndex] ? this.grid.visibleColumns[colIndex].field : '';
104
+ const cell = this.grid.gridAPI.get_cell_by_index(rowIndex, field);
105
+ if (!cell || !this.isWithInRange(cell.row.key, cell.column.index - 1)) {
106
+ this.close();
107
+ return;
108
+ }
109
+ this._analyticsBtnSettings.positionStrategy = new AutoPositionStrategy({
110
+ horizontalDirection: HorizontalAlignment.Right,
111
+ horizontalStartPoint: HorizontalAlignment.Right,
112
+ verticalStartPoint: VerticalAlignment.Bottom,
113
+ verticalDirection: VerticalAlignment.Bottom, closeAnimation: null,
114
+ target: cell.nativeElement
115
+ });
116
+ this._analyticsBtnSettings.scrollStrategy = new AbsoluteScrollStrategy();
117
+ const info = this.overlayService.getOverlayById(this._id);
118
+ if (info) {
119
+ info.settings.positionStrategy = this._analyticsBtnSettings.positionStrategy;
120
+ }
121
+ this._collapsed ? this.show() : this.overlayService.reposition(this._id);
122
+ }
123
+ show() {
124
+ if (!this._collapsed) {
125
+ return;
126
+ }
127
+ this._collapsed = false;
128
+ this._id = this._id ? this._id :
129
+ this.overlayService.attach(IgxContextMenuComponent, this._analyticsBtnSettings);
130
+ this.overlayService.show(this._id);
131
+ }
132
+ close() {
133
+ if (this._collapsed) {
134
+ return;
135
+ }
136
+ this._collapsed = true;
137
+ this.overlayService.hide(this._id);
138
+ this.onButtonClose.emit();
139
+ this._id = undefined;
140
+ }
141
+ isWithInRange(rInex, cIndex) {
142
+ return rInex >= this._range.rowStart && rInex <= this._range.rowEnd
143
+ && cIndex >= this._range.columnStart && cIndex <= this._range.columnEnd;
144
+ }
145
+ }
146
+ IgxContextMenuDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: IgxContextMenuDirective, deps: [{ token: i1.IgxGridComponent }, { token: i2.IgxConditionalFormattingDirective, optional: true }, { token: i3.IgxChartIntegrationDirective, optional: true }, { token: i1.IgxOverlayService }], target: i0.ɵɵFactoryTarget.Directive });
147
+ IgxContextMenuDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.3", type: IgxContextMenuDirective, selector: "[igxContextMenu]", outputs: { onButtonClose: "onButtonClose" }, ngImport: i0 });
148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: IgxContextMenuDirective, decorators: [{
149
+ type: Directive,
150
+ args: [{
151
+ selector: '[igxContextMenu]'
152
+ }]
153
+ }], ctorParameters: function () { return [{ type: i1.IgxGridComponent }, { type: i2.IgxConditionalFormattingDirective, decorators: [{
154
+ type: Optional
155
+ }] }, { type: i3.IgxChartIntegrationDirective, decorators: [{
156
+ type: Optional
157
+ }] }, { type: i1.IgxOverlayService }]; }, propDecorators: { onButtonClose: [{
158
+ type: Output
159
+ }] } });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWd4LWNvbnRleHQtbWVudS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyLWV4dHJhcy9zcmMvbGliL2NvbnRleHQtbWVudS9pZ3gtY29udGV4dC1tZW51LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUN2QixpQkFBaUIsRUFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5SCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBS3pELE1BQU0sT0FBTyx1QkFBdUI7SUFnQmhDLFlBQW1CLElBQXNCLEVBQ1YsYUFBZ0QsRUFDaEQsZUFBNkMsRUFDeEQsY0FBaUM7UUFIbEMsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUFDVixrQkFBYSxHQUFiLGFBQWEsQ0FBbUM7UUFDaEQsb0JBQWUsR0FBZixlQUFlLENBQThCO1FBQ3hELG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQWpCcEMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWxELGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFJaEMsZUFBVSxHQUFHLElBQUks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QztZQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7SUFDekIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUMvQixPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2VBQzVELE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDaEYsQ0FBQzs7b0hBOUlRLHVCQUF1Qjt3R0FBdkIsdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGtCQUFrQjtpQkFDL0I7OzBCQWtCZ0IsUUFBUTs7MEJBQ1IsUUFBUTs0RUFoQkosYUFBYTtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBPcHRpb25hbCwgT3V0cHV0LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgSG9yaXpvbnRhbEFsaWdubWVudCwgSWd4R3JpZENvbXBvbmVudCxcclxuICAgIElneE92ZXJsYXlTZXJ2aWNlLCBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncywgVmVydGljYWxBbGlnbm1lbnQsIE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJ0BpbmZyYWdpc3RpY3MvaWduaXRldWktYW5ndWxhcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1lcmdlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IElneENoYXJ0SW50ZWdyYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NoYXJ0LWludGVncmF0aW9uL2NoYXJ0LWludGVncmF0aW9uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IElneENvbmRpdGlvbmFsRm9ybWF0dGluZ0RpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtZm9ybWF0dGluZy9jb25kaXRpb25hbC1mb3JtYXR0aW5nLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IElneENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9jb250ZXh0LW1lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXIgfSBmcm9tICdAanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlcic7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW2lneENvbnRleHRNZW51XSdcclxufSlcclxuZXhwb3J0IGNsYXNzIElneENvbnRleHRNZW51RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25CdXR0b25DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIHB1YmxpYyBmb3JtYXR0ZXJzID0gW107XHJcbiAgICBwdWJsaWMgY2hhcnRzID0gW107XHJcbiAgICBwdWJsaWMgZ3JpZFJlc2l6ZU5vdGlmeSA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgICBwcml2YXRlIGNvbnRlbnRPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XHJcbiAgICBwcml2YXRlIF9yYW5nZTtcclxuICAgIHByaXZhdGUgX2lkO1xyXG4gICAgcHJpdmF0ZSBfY29sbGFwc2VkID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICBwcml2YXRlIF9hbmFseXRpY3NCdG5TZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xyXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgIG1vZGFsOiBmYWxzZVxyXG4gICAgfTtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBncmlkOiBJZ3hHcmlkQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIHRleHRGb3JtYXR0ZXI6IElneENvbmRpdGlvbmFsRm9ybWF0dGluZ0RpcmVjdGl2ZSxcclxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjaGFydHNEaXJlY3RpdmU6IElneENoYXJ0SW50ZWdyYXRpb25EaXJlY3RpdmUsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSkgeyB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0ICgpIHtcclxuICAgICAgICB0aGlzLmdyaWRSZXNpemVOb3RpZnkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faWQgJiYgIXRoaXMuX2NvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQnV0dG9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnNldFVwR3JpZExpc3RlbmVycygpO1xyXG4gICAgICAgIGlmICh0aGlzLnRleHRGb3JtYXR0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXh0Rm9ybWF0dGVyLm9uRm9ybWF0dGVyc1JlYWR5LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShuYW1lcyA9PiB0aGlzLmZvcm1hdHRlcnMgPSBuYW1lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0c0RpcmVjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYXJ0c0RpcmVjdGl2ZS5vbkNoYXJ0VHlwZXNEZXRlcm1pbmVkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoYXJncykgPT4gdGhpcy5jaGFydHMgPSBhcmdzLmNoYXJ0c0ZvckNyZWF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChhcmdzOiBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MuY29tcG9uZW50UmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoYXJncy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4Q29udGV4dE1lbnVDb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbnRleHREaXJlY3RpdmUgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0VXBHcmlkTGlzdGVuZXJzKCkge1xyXG4gICAgICAgIHRoaXMuY29udGVudE9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuZ3JpZFJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xyXG4gICAgICAgIHRoaXMuY29udGVudE9ic2VydmVyLm9ic2VydmUodGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmdyaWQucmFuZ2VTZWxlY3RlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmFuZ2UgPSBhcmdzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRzRGlyZWN0aXZlICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICggdGhpcy5ncmlkLmdldFNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRzRGlyZWN0aXZlLmNoYXJ0RGF0YSA9IHRoaXMuZ3JpZC5nZXRTZWxlY3RlZERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0c0RpcmVjdGl2ZS5jaGFydERhdGEgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25CdXR0b25DbG9zZS5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJCdXR0b24oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5ncmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmNodW5rTG9hZC5waXBlKFxyXG4gICAgICAgICAgICBtZXJnZSh0aGlzLmdyaWQucGFyZW50VmlydERpci5jaHVua0xvYWQsIHRoaXMuZ3JpZC5maWx0ZXJpbmdEb25lLCB0aGlzLmdyaWQuY29sdW1uUmVzaXplZCxcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZC5waXBlKGRlYm91bmNlVGltZSgzMCkpKSxcclxuICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX3JhbmdlKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkJ1dHRvbkNsb3NlLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQnV0dG9uKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZ3JpZC5zZWxlY3RlZC5waXBlKG1lcmdlKHRoaXMuZ3JpZC5wYWdpbmdEb25lLCB0aGlzLmdyaWQub25Hcm91cGluZ0RvbmUsIHRoaXMuZ3JpZC5wZXJQYWdlQ2hhbmdlKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFyZ3M6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5zZWxlY3RlZENlbGxzLmxlbmd0aCA8IDIgfHwgYXJncy5leHByZXNzaW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yYW5nZSkgeyByZXR1cm47IH1cclxuICAgICAgICBsZXQgcm93SW5kZXggPSB0aGlzLl9yYW5nZS5yb3dFbmQ7XHJcbiAgICAgICAgbGV0IGNvbEluZGV4ID0gK3RoaXMuX3JhbmdlLmNvbHVtbkVuZDtcclxuICAgICAgICB3aGlsZSAoY29sSW5kZXggPj0gdGhpcy5fcmFuZ2UuY29sdW1uU3RhcnQgJiYgIXRoaXMuZ3JpZC5uYXZpZ2F0aW9uLmlzQ29sdW1uRnVsbHlWaXNpYmxlKGNvbEluZGV4KSkge1xyXG4gICAgICAgICAgICBjb2xJbmRleC0tO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAocm93SW5kZXggPj0gdGhpcy5fcmFuZ2Uucm93U3RhcnQgJiYgdGhpcy5ncmlkLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybVZlcnRpY2FsU2Nyb2xsKHJvd0luZGV4LCAtMSkpIHtcclxuICAgICAgICAgICAgcm93SW5kZXgtLTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdID8gdGhpcy5ncmlkLnZpc2libGVDb2x1bW5zW2NvbEluZGV4XS5maWVsZCA6ICcnO1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmdyaWQuZ3JpZEFQSS5nZXRfY2VsbF9ieV9pbmRleChyb3dJbmRleCwgZmllbGQpO1xyXG4gICAgICAgIGlmICghY2VsbCB8fCAhdGhpcy5pc1dpdGhJblJhbmdlKGNlbGwucm93LmtleSwgY2VsbC5jb2x1bW4uaW5kZXggLSAxKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYW5hbHl0aWNzQnRuU2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSh7XHJcbiAgICAgICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXHJcbiAgICAgICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxyXG4gICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcclxuICAgICAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSwgY2xvc2VBbmltYXRpb246IG51bGwsXHJcbiAgICAgICAgICAgIHRhcmdldDogY2VsbC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fYW5hbHl0aWNzQnRuU2V0dGluZ3Muc2Nyb2xsU3RyYXRlZ3kgPSBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpO1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX2lkKTtcclxuICAgICAgICBpZiAoaW5mbykge1xyXG4gICAgICAgICAgICBpbmZvLnNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9hbmFseXRpY3NCdG5TZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb2xsYXBzZWQgPyB0aGlzLnNob3coKSA6IHRoaXMub3ZlcmxheVNlcnZpY2UucmVwb3NpdGlvbih0aGlzLl9pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGFwc2VkKSB7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lkID0gdGhpcy5faWQgPyB0aGlzLl9pZCA6XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKElneENvbnRleHRNZW51Q29tcG9uZW50LCB0aGlzLl9hbmFseXRpY3NCdG5TZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2lkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsb3NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb2xsYXBzZWQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5fY29sbGFwc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmhpZGUodGhpcy5faWQpO1xyXG4gICAgICAgIHRoaXMub25CdXR0b25DbG9zZS5lbWl0KCk7XHJcbiAgICAgICAgdGhpcy5faWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1dpdGhJblJhbmdlKHJJbmV4LCBjSW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gckluZXggPj0gdGhpcy5fcmFuZ2Uucm93U3RhcnQgJiYgckluZXggPD0gdGhpcy5fcmFuZ2Uucm93RW5kXHJcbiAgICAgICAgICAgICYmIGNJbmRleCA+PSB0aGlzLl9yYW5nZS5jb2x1bW5TdGFydCAmJiBjSW5kZXggPD0gdGhpcy5fcmFuZ2UuY29sdW1uRW5kO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,312 @@
1
+ import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
+ import { IgxAreaSeriesComponent, IgxBarSeriesComponent, IgxBubbleSeriesComponent, IgxColumnSeriesComponent, IgxDataChartComponent, IgxItemLegendComponent, IgxLegendComponent, IgxLineSeriesComponent, IgxPieChartComponent, IgxScatterLineSeriesComponent, IgxScatterSeriesComponent, IgxSizeScaleComponent, IgxStacked100AreaSeriesComponent, IgxStacked100BarSeriesComponent, IgxStacked100ColumnSeriesComponent, IgxStacked100LineSeriesComponent, IgxStackedAreaSeriesComponent, IgxStackedBarSeriesComponent, IgxStackedColumnSeriesComponent, IgxStackedLineSeriesComponent } from 'igniteui-angular-charts';
3
+ import { CHART_TYPE } from './chart-types';
4
+ import { IgxDataChartInitializer, IgxPieChartInitializer, IgxStackedDataChartInitializer } from './initializers';
5
+ import * as i0 from "@angular/core";
6
+ export class IgxChartIntegrationDirective {
7
+ get chartData() {
8
+ return this._chartData;
9
+ }
10
+ set chartData(selectedData) {
11
+ const charts = new Set(this._dataChartTypes);
12
+ const dataModel = selectedData.length ? selectedData[0] : {};
13
+ this._labelMemberPaths = Object.keys(dataModel).filter(key => typeof dataModel[key] === 'string');
14
+ this._valueMemberPaths = Object.keys(dataModel).filter(key => typeof dataModel[key] === 'number');
15
+ this._chartData = selectedData.map((dataRecord, index) => this.addIndexMemberPath(dataRecord, index + 1));
16
+ const args = {
17
+ chartsAvailabilty: new Map(),
18
+ chartsForCreation: []
19
+ };
20
+ if (selectedData.length === 0 || this._valueMemberPaths.length === 0) {
21
+ this.onChartTypesDetermined.emit(args);
22
+ return;
23
+ }
24
+ if (selectedData.length === 1) {
25
+ charts.forEach((chart, _, set) => {
26
+ const isColumnChart = chart.indexOf('Column') !== -1;
27
+ const isBarChart = chart.indexOf('Bar') !== -1;
28
+ const isPieChart = chart.indexOf('Pie') !== -1;
29
+ if (!(isColumnChart || isBarChart || isPieChart)) {
30
+ set.delete(chart);
31
+ }
32
+ });
33
+ }
34
+ // Config pie chart
35
+ const cannotCreatePieChart = selectedData.some(record => record[this._valueMemberPaths[0]] <= 0);
36
+ if (cannotCreatePieChart) {
37
+ charts.delete(CHART_TYPE.PIE);
38
+ }
39
+ // Config scatter chart member paths
40
+ const canCreateScatterChart = this._valueMemberPaths.length >= 2;
41
+ const canCreateBubbleChart = this._valueMemberPaths.length >= 3;
42
+ if (!canCreateScatterChart) {
43
+ charts.delete(CHART_TYPE.SCATTER_BUBBLE);
44
+ charts.delete(CHART_TYPE.SCATTER_LINE);
45
+ charts.delete(CHART_TYPE.SCATTER_POINT);
46
+ }
47
+ if (!canCreateBubbleChart) {
48
+ charts.delete(CHART_TYPE.SCATTER_BUBBLE);
49
+ }
50
+ args.chartsAvailabilty = this.chartTypesAvailability;
51
+ args.chartsForCreation = [...charts];
52
+ this.onChartTypesDetermined.emit(args);
53
+ }
54
+ set scatterChartYAxisValueMemberPath(path) {
55
+ this._scatterChartYAxisValueMemberPath = path;
56
+ }
57
+ get scatterChartYAxisValueMemberPath() {
58
+ return this._scatterChartYAxisValueMemberPath &&
59
+ this._valueMemberPaths.indexOf(this._scatterChartYAxisValueMemberPath) !== -1 ?
60
+ this._scatterChartYAxisValueMemberPath : this._valueMemberPaths[0];
61
+ }
62
+ set bubbleChartRadiusMemberPath(path) {
63
+ this._bubbleChartRadiusMemberPath = path;
64
+ }
65
+ get bubbleChartRadiusMemberPath() {
66
+ return this._bubbleChartRadiusMemberPath &&
67
+ this._valueMemberPaths.indexOf(this._bubbleChartRadiusMemberPath) !== -1 ?
68
+ this._bubbleChartRadiusMemberPath : this._valueMemberPaths[1];
69
+ }
70
+ get _labelMemberPath() {
71
+ return this.defaultLabelMemberPath && this._chartData.some(r => r[this.defaultLabelMemberPath] !== undefined) ?
72
+ this.defaultLabelMemberPath : this._labelMemberPaths.length > 0 ? this._labelMemberPaths[0] : 'Index';
73
+ }
74
+ get pieChartOptions() {
75
+ return {
76
+ width: '85%',
77
+ height: '75%',
78
+ dataSource: this.chartData,
79
+ valueMemberPath: this._valueMemberPaths[0],
80
+ legendLabelMemberPath: this._labelMemberPath,
81
+ labelMemberPath: this._labelMemberPath,
82
+ };
83
+ }
84
+ get dataChartOptions() {
85
+ return {
86
+ width: '100%',
87
+ height: '85%',
88
+ autoMarginWidth: 50,
89
+ isVerticalZoomEnabled: true,
90
+ isHorizontalZoomEnabled: true,
91
+ dataSource: this.chartData
92
+ };
93
+ }
94
+ constructor(factoryResolver) {
95
+ this.factoryResolver = factoryResolver;
96
+ this.onChartTypesDetermined = new EventEmitter();
97
+ this.onChartCreationDone = new EventEmitter();
98
+ this.useLegend = true;
99
+ this.defaultLabelMemberPath = undefined;
100
+ this.chartTypesAvailability = new Map();
101
+ this.customChartComponentOptions = new Map();
102
+ this.dataCharts = new Map();
103
+ this._scatterChartYAxisValueMemberPath = undefined;
104
+ this._bubbleChartRadiusMemberPath = undefined;
105
+ this._valueMemberPaths = [];
106
+ this._labelMemberPaths = [];
107
+ this._sizeScale = new IgxSizeScaleComponent();
108
+ this._dataChartTypes = new Set();
109
+ this.dataChartSeriesOptionsModel = {
110
+ isHighlightingEnabled: true,
111
+ areaFillOpacity: .4,
112
+ markerType: 3,
113
+ showDefaultTooltip: true
114
+ };
115
+ this.scatterChartSeriesOptionsModel = {
116
+ markerType: 3,
117
+ showDefaultTooltip: true
118
+ };
119
+ this.bubbleChartSeriesOptionsModel = {
120
+ radiusScale: this._sizeScale
121
+ };
122
+ this.dataCharts.set(CHART_TYPE.COLUMN_GROUPED, IgxColumnSeriesComponent);
123
+ this.dataCharts.set(CHART_TYPE.AREA_GROUPED, IgxAreaSeriesComponent);
124
+ this.dataCharts.set(CHART_TYPE.LINE_GROUPED, IgxLineSeriesComponent);
125
+ this.dataCharts.set(CHART_TYPE.BAR_GROUPED, IgxBarSeriesComponent);
126
+ this.dataCharts.set(CHART_TYPE.COLUMN_STACKED, IgxStackedColumnSeriesComponent);
127
+ this.dataCharts.set(CHART_TYPE.AREA_STACKED, IgxStackedAreaSeriesComponent);
128
+ this.dataCharts.set(CHART_TYPE.LINE_STACKED, IgxStackedLineSeriesComponent);
129
+ this.dataCharts.set(CHART_TYPE.BAR_STACKED, IgxStackedBarSeriesComponent);
130
+ this.dataCharts.set(CHART_TYPE.COLUMN_100_STACKED, IgxStacked100ColumnSeriesComponent);
131
+ this.dataCharts.set(CHART_TYPE.AREA_100_STACKED, IgxStacked100AreaSeriesComponent);
132
+ this.dataCharts.set(CHART_TYPE.LINE_100_STACKED, IgxStacked100LineSeriesComponent);
133
+ this.dataCharts.set(CHART_TYPE.BAR_100_STACKED, IgxStacked100BarSeriesComponent);
134
+ this.dataCharts.set(CHART_TYPE.SCATTER_POINT, IgxScatterSeriesComponent);
135
+ this.dataCharts.set(CHART_TYPE.SCATTER_BUBBLE, IgxBubbleSeriesComponent);
136
+ this.dataCharts.set(CHART_TYPE.SCATTER_LINE, IgxScatterLineSeriesComponent);
137
+ this.dataCharts.set(CHART_TYPE.PIE, IgxPieChartComponent);
138
+ const iterable = this.dataCharts.keys();
139
+ for (let head = iterable.next().value; head !== undefined; head = iterable.next().value) {
140
+ this._dataChartTypes.add(head);
141
+ this.chartTypesAvailability.set(head, true);
142
+ this.customChartComponentOptions.set(head, {});
143
+ }
144
+ }
145
+ getAvailableCharts() {
146
+ const res = [];
147
+ this.chartTypesAvailability.forEach((isAvailable, chartType) => {
148
+ if (isAvailable) {
149
+ res.push(chartType);
150
+ }
151
+ });
152
+ return res;
153
+ }
154
+ disableCharts(types) {
155
+ types.forEach(type => {
156
+ if (this.chartTypesAvailability.get(type)) {
157
+ this.chartTypesAvailability.set(type, false);
158
+ }
159
+ });
160
+ }
161
+ enableCharts(types) {
162
+ types.forEach(type => {
163
+ if (!this.chartTypesAvailability.get(type)) {
164
+ this.chartTypesAvailability.set(type, true);
165
+ }
166
+ });
167
+ }
168
+ chartFactory(type, viewContainerRef) {
169
+ if (!this.chartTypesAvailability.get(type)) {
170
+ return;
171
+ }
172
+ let componentFactory;
173
+ let componentRef;
174
+ this._sizeScale.maximumValue = 60;
175
+ this._sizeScale.minimumValue = 10;
176
+ const chartType = this.dataCharts.get(type);
177
+ if (type === CHART_TYPE.PIE) {
178
+ componentFactory = this.factoryResolver.resolveComponentFactory(IgxPieChartComponent);
179
+ componentRef = viewContainerRef.createComponent(componentFactory);
180
+ }
181
+ else {
182
+ componentFactory = this.factoryResolver.resolveComponentFactory(IgxDataChartComponent);
183
+ componentRef = viewContainerRef.createComponent(componentFactory);
184
+ }
185
+ const options = this.getChartOptions(type);
186
+ const initializer = this.getInitializer(type, chartType);
187
+ if (this.useLegend) {
188
+ const legendType = type === CHART_TYPE.PIE ? IgxItemLegendComponent : IgxLegendComponent;
189
+ const legendFactory = this.factoryResolver.resolveComponentFactory(legendType);
190
+ const legendComponentRef = viewContainerRef.createComponent(legendFactory);
191
+ options.chartOptions['legend'] = legendComponentRef.instance;
192
+ }
193
+ const chart = initializer.initChart(componentRef.instance, options);
194
+ this.onChartCreationDone.emit(chart);
195
+ }
196
+ getInitializer(chartType, componentClassRef) {
197
+ if (chartType.includes('Pie')) {
198
+ return new IgxPieChartInitializer();
199
+ }
200
+ else if (chartType.includes('Stacked')) {
201
+ return new IgxStackedDataChartInitializer(componentClassRef);
202
+ }
203
+ else {
204
+ return new IgxDataChartInitializer(componentClassRef);
205
+ }
206
+ }
207
+ getChartOptions(type) {
208
+ const chartComponentOptions = {};
209
+ return type === CHART_TYPE.PIE ? this.addPieChartDataOptions(chartComponentOptions) :
210
+ this.addDataChartDataOptions(type, chartComponentOptions, type.includes('Stacked'));
211
+ }
212
+ addPieChartDataOptions(chartComponentOptions) {
213
+ // tslint:disable-next-line: max-line-length
214
+ chartComponentOptions.chartOptions = Object.assign(this.pieChartOptions, this.customChartComponentOptions.get(CHART_TYPE.PIE).chartOptions);
215
+ return chartComponentOptions;
216
+ }
217
+ addDataChartDataOptions(type, chartComponentOptions, stacked) {
218
+ chartComponentOptions.chartOptions = Object.assign(this.dataChartOptions, this.customChartComponentOptions.get(type));
219
+ if (type.indexOf('Scatter') !== -1) {
220
+ this.addScatterChartDataOptions(type, chartComponentOptions);
221
+ }
222
+ else {
223
+ // tslint:disable-next-line: max-line-length
224
+ chartComponentOptions.seriesModel = Object.assign(this.dataChartSeriesOptionsModel, this.customChartComponentOptions.get(type).seriesModel);
225
+ this.setAxisLabelOption(type, chartComponentOptions);
226
+ const options = [];
227
+ this._valueMemberPaths.forEach(valueMemberPath => {
228
+ const dataOptions = {
229
+ title: valueMemberPath,
230
+ valueMemberPath
231
+ };
232
+ if (stacked) {
233
+ options.push({ ...dataOptions });
234
+ }
235
+ else {
236
+ options.push({ ...dataOptions, ...chartComponentOptions.seriesModel });
237
+ }
238
+ });
239
+ stacked ? chartComponentOptions.stackedFragmentOptions = options :
240
+ chartComponentOptions.seriesOptions = options;
241
+ }
242
+ return chartComponentOptions;
243
+ }
244
+ addScatterChartDataOptions(scatterChart, chartComponentOptions) {
245
+ // tslint:disable-next-line: max-line-length
246
+ chartComponentOptions.seriesModel = Object.assign(this.scatterChartSeriesOptionsModel, this.customChartComponentOptions.get(scatterChart).seriesModel);
247
+ chartComponentOptions.seriesModel['yMemberPath'] = this.scatterChartYAxisValueMemberPath;
248
+ if (scatterChart === CHART_TYPE.SCATTER_BUBBLE) {
249
+ chartComponentOptions.seriesModel = Object.assign(chartComponentOptions.seriesModel, this.bubbleChartSeriesOptionsModel);
250
+ chartComponentOptions.seriesModel['radiusMemberPath'] = this.bubbleChartRadiusMemberPath;
251
+ }
252
+ const model = chartComponentOptions.seriesModel;
253
+ const seriesOptions = [];
254
+ this._valueMemberPaths.filter(v => !(v === model['yMemberPath'] ||
255
+ v === model['radiusMemberPath'])).forEach(valueMemberPath => {
256
+ const dataOptions = {
257
+ title: `${model['yMemberPath']} vs ${valueMemberPath}`,
258
+ xMemberPath: valueMemberPath,
259
+ labelMemberPath: this._labelMemberPath
260
+ };
261
+ seriesOptions.push({ ...dataOptions, ...model });
262
+ });
263
+ chartComponentOptions.seriesOptions = seriesOptions;
264
+ }
265
+ addIndexMemberPath(dataRecord, index) {
266
+ dataRecord = { ...{ [this._labelMemberPath]: index }, ...dataRecord };
267
+ return dataRecord;
268
+ }
269
+ setAxisLabelOption(type, options) {
270
+ if (type.indexOf('Bar') !== -1) {
271
+ options.yAxisOptions = Object.assign({
272
+ label: this._labelMemberPath
273
+ }, this.customChartComponentOptions.get(type).yAxisOptions);
274
+ }
275
+ else {
276
+ options.xAxisOptions = Object.assign({
277
+ label: this._labelMemberPath
278
+ }, this.customChartComponentOptions.get(type).xAxisOptions);
279
+ }
280
+ }
281
+ setChartComponentOptions(chart, optionsType, options) {
282
+ if (!this.customChartComponentOptions.get(chart)[optionsType]) {
283
+ this.customChartComponentOptions.get(chart)[optionsType] = {};
284
+ }
285
+ Object.keys(options).forEach(property => {
286
+ this.customChartComponentOptions.get(chart)[optionsType][property] = options[property];
287
+ });
288
+ }
289
+ }
290
+ IgxChartIntegrationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: IgxChartIntegrationDirective, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive });
291
+ IgxChartIntegrationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.3", type: IgxChartIntegrationDirective, selector: "[igxChartIntegration]", inputs: { chartData: "chartData", useLegend: "useLegend", defaultLabelMemberPath: "defaultLabelMemberPath", scatterChartYAxisValueMemberPath: "scatterChartYAxisValueMemberPath", bubbleChartRadiusMemberPath: "bubbleChartRadiusMemberPath" }, outputs: { onChartTypesDetermined: "onChartTypesDetermined", onChartCreationDone: "onChartCreationDone" }, ngImport: i0 });
292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: IgxChartIntegrationDirective, decorators: [{
293
+ type: Directive,
294
+ args: [{
295
+ selector: '[igxChartIntegration]'
296
+ }]
297
+ }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }]; }, propDecorators: { chartData: [{
298
+ type: Input
299
+ }], onChartTypesDetermined: [{
300
+ type: Output
301
+ }], onChartCreationDone: [{
302
+ type: Output
303
+ }], useLegend: [{
304
+ type: Input
305
+ }], defaultLabelMemberPath: [{
306
+ type: Input
307
+ }], scatterChartYAxisValueMemberPath: [{
308
+ type: Input
309
+ }], bubbleChartRadiusMemberPath: [{
310
+ type: Input
311
+ }] } });
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaW50ZWdyYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci1leHRyYXMvc3JjL2xpYi9kaXJlY3RpdmVzL2NoYXJ0LWludGVncmF0aW9uL2NoYXJ0LWludGVncmF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRELFNBQVMsRUFDeEUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFDSCxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFDakcscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQy9HLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLGdDQUFnQyxFQUNqSCwrQkFBK0IsRUFBRSxrQ0FBa0MsRUFBRSxnQ0FBZ0MsRUFDckcsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsK0JBQStCLEVBQzVGLDZCQUE2QixFQUNoQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBNEMsdUJBQXVCLEVBQ3RFLHNCQUFzQixFQUFFLDhCQUE4QixFQUFZLE1BQU0sZ0JBQWdCLENBQUM7O0FBVTdGLE1BQU0sT0FBTyw0QkFBNEI7SUFDckMsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsWUFBbUI7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMs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LENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7eUhBOVRRLDRCQUE0Qjs2R0FBNUIsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtpQkFDcEM7K0dBR2MsU0FBUztzQkFEbkIsS0FBSztnQkFxREMsc0JBQXNCO3NCQUQ1QixNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFJQSxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsc0JBQXNCO3NCQUQ1QixLQUFLO2dCQUlLLGdDQUFnQztzQkFEMUMsS0FBSztnQkFZSywyQkFBMkI7c0JBRHJDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLFxyXG4gICAgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hCYXJTZXJpZXNDb21wb25lbnQsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4RGF0YUNoYXJ0Q29tcG9uZW50LCBJZ3hJdGVtTGVnZW5kQ29tcG9uZW50LCBJZ3hMZWdlbmRDb21wb25lbnQsIElneExpbmVTZXJpZXNDb21wb25lbnQsIElneFBpZUNoYXJ0Q29tcG9uZW50LFxyXG4gICAgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQsIElneFNjYXR0ZXJTZXJpZXNDb21wb25lbnQsIElneFNpemVTY2FsZUNvbXBvbmVudCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQsXHJcbiAgICBJZ3hTdGFja2VkMTAwQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCxcclxuICAgIElneFN0YWNrZWRBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQ29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4U3RhY2tlZExpbmVTZXJpZXNDb21wb25lbnRcclxufSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IENIQVJUX1RZUEUsIE9QVElPTlNfVFlQRSB9IGZyb20gJy4vY2hhcnQtdHlwZXMnO1xyXG5pbXBvcnQgeyBDaGFydEluaXRpYWxpemVyLCBJQ2hhcnRDb21wb25lbnRPcHRpb25zLCBJZ3hEYXRhQ2hhcnRJbml0aWFsaXplcixcclxuICAgIElneFBpZUNoYXJ0SW5pdGlhbGl6ZXIsIElneFN0YWNrZWREYXRhQ2hhcnRJbml0aWFsaXplciwgSU9wdGlvbnMgfSBmcm9tICcuL2luaXRpYWxpemVycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXRlcm1pbmVkQ2hhcnRUeXBlc0FyZ3Mge1xyXG4gICAgY2hhcnRzQXZhaWxhYmlsdHk6IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPjtcclxuICAgIGNoYXJ0c0ZvckNyZWF0aW9uOiBDSEFSVF9UWVBFW107XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbaWd4Q2hhcnRJbnRlZ3JhdGlvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZ3hDaGFydEludGVncmF0aW9uRGlyZWN0aXZlIHtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNoYXJ0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgY2hhcnREYXRhKHNlbGVjdGVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCBjaGFydHMgPSBuZXcgU2V0KHRoaXMuX2RhdGFDaGFydFR5cGVzKTtcclxuICAgICAgICBjb25zdCBkYXRhTW9kZWwgPSBzZWxlY3RlZERhdGEubGVuZ3RoID8gc2VsZWN0ZWREYXRhWzBdIDoge307XHJcbiAgICAgICAgdGhpcy5fbGFiZWxNZW1iZXJQYXRocyA9IE9iamVjdC5rZXlzKGRhdGFNb2RlbCkuZmlsdGVyKGtleSA9PiB0eXBlb2YgZGF0YU1vZGVsW2tleV0gPT09ICdzdHJpbmcnKTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzID0gT2JqZWN0LmtleXMoZGF0YU1vZGVsKS5maWx0ZXIoa2V5ID0+IHR5cGVvZiBkYXRhTW9kZWxba2V5XSA9PT0gJ251bWJlcicpO1xyXG4gICAgICAgIHRoaXMuX2NoYXJ0RGF0YSA9IHNlbGVjdGVkRGF0YS5tYXAoKGRhdGFSZWNvcmQsIGluZGV4KSA9PiB0aGlzLmFkZEluZGV4TWVtYmVyUGF0aChkYXRhUmVjb3JkLCBpbmRleCArIDEpKTtcclxuICAgICAgICBjb25zdCBhcmdzOiBJRGV0ZXJtaW5lZENoYXJ0VHlwZXNBcmdzID0ge1xyXG4gICAgICAgICAgICBjaGFydHNBdmFpbGFiaWx0eTogbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpLFxyXG4gICAgICAgICAgICBjaGFydHNGb3JDcmVhdGlvbjogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhcnRUeXBlc0RldGVybWluZWQuZW1pdChhcmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjaGFydHMuZm9yRWFjaCgoY2hhcnQsIF8sIHNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2x1bW5DaGFydCA9IGNoYXJ0LmluZGV4T2YoJ0NvbHVtbicpICE9PSAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQmFyQ2hhcnQgPSBjaGFydC5pbmRleE9mKCdCYXInKSAhPT0gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1BpZUNoYXJ0ID0gY2hhcnQuaW5kZXhPZignUGllJykgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaXNDb2x1bW5DaGFydCB8fCBpc0JhckNoYXJ0IHx8IGlzUGllQ2hhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjaGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb25maWcgcGllIGNoYXJ0XHJcbiAgICAgICAgY29uc3QgY2Fubm90Q3JlYXRlUGllQ2hhcnQgPSBzZWxlY3RlZERhdGEuc29tZShyZWNvcmQgPT4gcmVjb3JkW3RoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMF1dIDw9IDApO1xyXG4gICAgICAgIGlmIChjYW5ub3RDcmVhdGVQaWVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuUElFKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29uZmlnIHNjYXR0ZXIgY2hhcnQgbWVtYmVyIHBhdGhzXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlU2NhdHRlckNoYXJ0ID0gdGhpcy5fdmFsdWVNZW1iZXJQYXRocy5sZW5ndGggPj0gMjtcclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVCdWJibGVDaGFydCA9IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMubGVuZ3RoID49IDM7XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVTY2F0dGVyQ2hhcnQpIHtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKTtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfTElORSk7XHJcbiAgICAgICAgICAgIGNoYXJ0cy5kZWxldGUoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5UKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVCdWJibGVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5jaGFydHNBdmFpbGFiaWx0eSA9IHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eTtcclxuICAgICAgICBhcmdzLmNoYXJ0c0ZvckNyZWF0aW9uID0gWy4uLmNoYXJ0c107XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0VHlwZXNEZXRlcm1pbmVkLmVtaXQoYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgb25DaGFydFR5cGVzRGV0ZXJtaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SURldGVybWluZWRDaGFydFR5cGVzQXJncz4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvbkNoYXJ0Q3JlYXRpb25Eb25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB1c2VMZWdlbmQgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdExhYmVsTWVtYmVyUGF0aDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmluZGV4T2YodGhpcy5fc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoIDogdGhpcy5fdmFsdWVNZW1iZXJQYXRoc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBidWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMuaW5kZXhPZih0aGlzLl9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCA6IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFydFR5cGVzQXZhaWxhYmlsaXR5ID0gbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpO1xyXG4gICAgcHJpdmF0ZSBjdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMgPSBuZXcgTWFwPENIQVJUX1RZUEUsIElDaGFydENvbXBvbmVudE9wdGlvbnM+KCk7XHJcbiAgICBwcml2YXRlIGRhdGFDaGFydHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZTxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF92YWx1ZU1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9sYWJlbE1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9jaGFydERhdGE6IGFueVtdO1xyXG4gICAgcHJpdmF0ZSBfc2l6ZVNjYWxlID0gbmV3IElneFNpemVTY2FsZUNvbXBvbmVudCgpO1xyXG4gICAgcHJpdmF0ZSBfZGF0YUNoYXJ0VHlwZXMgPSBuZXcgU2V0PENIQVJUX1RZUEU+KCk7XHJcbiAgICBwcml2YXRlIGdldCBfbGFiZWxNZW1iZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCAmJiB0aGlzLl9jaGFydERhdGEuc29tZShyID0+IHJbdGhpcy5kZWZhdWx0TGFiZWxNZW1iZXJQYXRoXSAhPT0gdW5kZWZpbmVkKSA/XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCA6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHMubGVuZ3RoID4gMCA/IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHNbMF0gOiAnSW5kZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHBpZUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICc4NSUnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICc3NSUnLFxyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmNoYXJ0RGF0YSxcclxuICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoOiB0aGlzLl92YWx1ZU1lbWJlclBhdGhzWzBdLFxyXG4gICAgICAgICAgICBsZWdlbmRMYWJlbE1lbWJlclBhdGg6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aCxcclxuICAgICAgICAgICAgbGFiZWxNZW1iZXJQYXRoOiB0aGlzLl9sYWJlbE1lbWJlclBhdGgsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbDogSU9wdGlvbnMgPSB7XHJcbiAgICAgICAgaXNIaWdobGlnaHRpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFyZWFGaWxsT3BhY2l0eTogLjQsXHJcbiAgICAgICAgbWFya2VyVHlwZTogMyxcclxuICAgICAgICBzaG93RGVmYXVsdFRvb2x0aXA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzY2F0dGVyQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIG1hcmtlclR5cGU6IDMsXHJcbiAgICAgICAgc2hvd0RlZmF1bHRUb29sdGlwOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgYnViYmxlQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLl9zaXplU2NhbGVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgZGF0YUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnODUlJyxcclxuICAgICAgICAgICAgYXV0b01hcmdpbldpZHRoOiA1MCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbFpvb21FbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0hvcml6b250YWxab29tRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5jaGFydERhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fR1JPVVBFRCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV9HUk9VUEVELCBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuTElORV9HUk9VUEVELCBJZ3hMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX0dST1VQRUQsIElneEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fU1RBQ0tFRCwgSWd4U3RhY2tlZENvbHVtblNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkFSRUFfU1RBQ0tFRCwgSWd4U3RhY2tlZEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FX1NUQUNLRUQsIElneFN0YWNrZWRMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX1NUQUNLRUQsIElneFN0YWNrZWRCYXJTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQ09MVU1OXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkJBUl8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5ULCBJZ3hTY2F0dGVyU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLlNDQVRURVJfTElORSwgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuUElFLCBJZ3hQaWVDaGFydENvbXBvbmVudCk7XHJcbiAgICAgICAgY29uc3QgaXRlcmFibGUgPSB0aGlzLmRhdGFDaGFydHMua2V5cygpO1xyXG4gICAgICAgIGZvciAobGV0IGhlYWQgPSBpdGVyYWJsZS5uZXh0KCkudmFsdWU7IGhlYWQgIT09IHVuZGVmaW5lZDsgaGVhZCA9IGl0ZXJhYmxlLm5leHQoKS52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhcnRUeXBlcy5hZGQoaGVhZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQoaGVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLnNldChoZWFkLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBdmFpbGFibGVDaGFydHMoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gW107XHJcbiAgICAgICAgdGhpcy5jaGFydFR5cGVzQXZhaWxhYmlsaXR5LmZvckVhY2goKGlzQXZhaWxhYmxlLCBjaGFydFR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChjaGFydFR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5nZXQodHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQodHlwZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuc2V0KHR5cGUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYXJ0RmFjdG9yeSh0eXBlOiBDSEFSVF9UWVBFLCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcclxuICAgICAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuICAgICAgICB0aGlzLl9zaXplU2NhbGUubWF4aW11bVZhbHVlID0gNjA7XHJcbiAgICAgICAgdGhpcy5fc2l6ZVNjYWxlLm1pbmltdW1WYWx1ZSA9IDEwO1xyXG4gICAgICAgIGNvbnN0IGNoYXJ0VHlwZSA9IHRoaXMuZGF0YUNoYXJ0cy5nZXQodHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBDSEFSVF9UWVBFLlBJRSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4UGllQ2hhcnRDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4RGF0YUNoYXJ0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMgPSB0aGlzLmdldENoYXJ0T3B0aW9ucyh0eXBlKTtcclxuICAgICAgICBjb25zdCBpbml0aWFsaXplcjogQ2hhcnRJbml0aWFsaXplciA9IHRoaXMuZ2V0SW5pdGlhbGl6ZXIodHlwZSwgY2hhcnRUeXBlKTtcclxuICAgICAgICBpZiAodGhpcy51c2VMZWdlbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kVHlwZSA9IHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gSWd4SXRlbUxlZ2VuZENvbXBvbmVudCA6IElneExlZ2VuZENvbXBvbmVudDtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kRmFjdG9yeSA9IHRoaXMuZmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGxlZ2VuZFR5cGUgYXMgYW55KTtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGxlZ2VuZEZhY3RvcnkpO1xyXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJ0T3B0aW9uc1snbGVnZW5kJ10gPSBsZWdlbmRDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gaW5pdGlhbGl6ZXIuaW5pdENoYXJ0KGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0Q3JlYXRpb25Eb25lLmVtaXQoY2hhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbGl6ZXIoY2hhcnRUeXBlOiBDSEFSVF9UWVBFLCBjb21wb25lbnRDbGFzc1JlZik6IENoYXJ0SW5pdGlhbGl6ZXIge1xyXG4gICAgICAgIGlmIChjaGFydFR5cGUuaW5jbHVkZXMoJ1BpZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4UGllQ2hhcnRJbml0aWFsaXplcigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcnRUeXBlLmluY2x1ZGVzKCdTdGFja2VkJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hTdGFja2VkRGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4RGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFKTogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucyB7XHJcbiAgICAgICAgY29uc3QgY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zID0ge307XHJcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gdGhpcy5hZGRQaWVDaGFydERhdGFPcHRpb25zKGNoYXJ0Q29tcG9uZW50T3B0aW9ucykgOlxyXG4gICAgICAgICAgICB0aGlzLmFkZERhdGFDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucywgdHlwZS5pbmNsdWRlcygnU3RhY2tlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBpZUNoYXJ0RGF0YU9wdGlvbnMoY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLnBpZUNoYXJ0T3B0aW9ucywgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KENIQVJUX1RZUEUuUElFKS5jaGFydE9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGREYXRhQ2hhcnREYXRhT3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFLCBjaGFydENvbXBvbmVudE9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMsIHN0YWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydE9wdGlvbnMsIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldCh0eXBlKSk7XHJcbiAgICAgICAgaWYgKHR5cGUuaW5kZXhPZignU2NhdHRlcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNjYXR0ZXJDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbCwgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KHR5cGUpLnNlcmllc01vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBeGlzTGFiZWxPcHRpb24odHlwZSwgY2hhcnRDb21wb25lbnRPcHRpb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSU9wdGlvbnNbXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZU1lbWJlclBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goeyAuLi5kYXRhT3B0aW9ucyB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLmNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YWNrZWQgPyBjaGFydENvbXBvbmVudE9wdGlvbnMuc3RhY2tlZEZyYWdtZW50T3B0aW9ucyA9IG9wdGlvbnMgOlxyXG4gICAgICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTY2F0dGVyQ2hhcnREYXRhT3B0aW9ucyhzY2F0dGVyQ2hhcnQ6IENIQVJUX1RZUEUsIGNoYXJ0Q29tcG9uZW50T3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzTW9kZWwgPSBPYmplY3QuYXNzaWduKHRoaXMuc2NhdHRlckNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsLCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQoc2NhdHRlckNoYXJ0KS5zZXJpZXNNb2RlbCk7XHJcbiAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWyd5TWVtYmVyUGF0aCddID0gdGhpcy5zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aDtcclxuICAgICAgICBpZiAoc2NhdHRlckNoYXJ0ID09PSBDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKSB7XHJcbiAgICAgICAgICAgIGNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCA9IE9iamVjdC5hc3NpZ24oY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsLCB0aGlzLmJ1YmJsZUNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsKTtcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWydyYWRpdXNNZW1iZXJQYXRoJ10gPSB0aGlzLmJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsO1xyXG4gICAgICAgIGNvbnN0IHNlcmllc09wdGlvbnM6IElPcHRpb25zW10gPSBbXTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZpbHRlcih2ID0+ICEodiA9PT0gbW9kZWxbJ3lNZW1iZXJQYXRoJ10gfHxcclxuICAgICAgICAgICAgdiA9PT0gbW9kZWxbJ3JhZGl1c01lbWJlclBhdGgnXSkpLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHttb2RlbFsneU1lbWJlclBhdGgnXX0gdnMgJHt2YWx1ZU1lbWJlclBhdGh9YCxcclxuICAgICAgICAgICAgICAgICAgICB4TWVtYmVyUGF0aDogdmFsdWVNZW1iZXJQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsTWVtYmVyUGF0aDogdGhpcy5fbGFiZWxNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzT3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLm1vZGVsIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IHNlcmllc09wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRJbmRleE1lbWJlclBhdGgoZGF0YVJlY29yZCwgaW5kZXgpIHtcclxuICAgICAgICBkYXRhUmVjb3JkID0geyAuLi57IFt0aGlzLl9sYWJlbE1lbWJlclBhdGhdOiBpbmRleCB9LCAuLi5kYXRhUmVjb3JkIH07XHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZWNvcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRBeGlzTGFiZWxPcHRpb24odHlwZTogQ0hBUlRfVFlQRSwgb3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoJ0JhcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnlBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueUF4aXNPcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLnhBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueEF4aXNPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENoYXJ0Q29tcG9uZW50T3B0aW9ucyhjaGFydDogQ0hBUlRfVFlQRSwgb3B0aW9uc1R5cGU6IE9QVElPTlNfVFlQRSwgb3B0aW9uczogSU9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KGNoYXJ0KVtvcHRpb25zVHlwZV1bcHJvcGVydHldID0gb3B0aW9uc1twcm9wZXJ0eV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,28 @@
1
+ export var CHART_TYPE;
2
+ (function (CHART_TYPE) {
3
+ CHART_TYPE["PIE"] = "Pie";
4
+ CHART_TYPE["COLUMN_GROUPED"] = "ColumnGrouped";
5
+ CHART_TYPE["AREA_GROUPED"] = "AreaGrouped";
6
+ CHART_TYPE["LINE_GROUPED"] = "LineGrouped";
7
+ CHART_TYPE["BAR_GROUPED"] = "BarGrouped";
8
+ CHART_TYPE["COLUMN_STACKED"] = "ColumnStacked";
9
+ CHART_TYPE["AREA_STACKED"] = "AreaStacked";
10
+ CHART_TYPE["LINE_STACKED"] = "LineStacked";
11
+ CHART_TYPE["BAR_STACKED"] = "BarStacked";
12
+ CHART_TYPE["COLUMN_100_STACKED"] = "Column100Stacked";
13
+ CHART_TYPE["AREA_100_STACKED"] = "Area100Stacked";
14
+ CHART_TYPE["LINE_100_STACKED"] = "Line100Stacked";
15
+ CHART_TYPE["BAR_100_STACKED"] = "Bar100Stacked";
16
+ CHART_TYPE["SCATTER_POINT"] = "ScatterPoint";
17
+ CHART_TYPE["SCATTER_BUBBLE"] = "ScatterBubble";
18
+ CHART_TYPE["SCATTER_LINE"] = "ScatterLine";
19
+ })(CHART_TYPE || (CHART_TYPE = {}));
20
+ export var OPTIONS_TYPE;
21
+ (function (OPTIONS_TYPE) {
22
+ OPTIONS_TYPE["CHART"] = "chartOptions";
23
+ OPTIONS_TYPE["SERIES"] = "seriesModel";
24
+ OPTIONS_TYPE["X_AXIS"] = "xAxisOptions";
25
+ OPTIONS_TYPE["Y_AXIS"] = "yAxisOptions";
26
+ OPTIONS_TYPE["STACKED_SERIES"] = "stackedFragmentOptions";
27
+ })(OPTIONS_TYPE || (OPTIONS_TYPE = {}));
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyLWV4dHJhcy9zcmMvbGliL2RpcmVjdGl2ZXMvY2hhcnQtaW50ZWdyYXRpb24vY2hhcnQtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksVUFpQlg7QUFqQkQsV0FBWSxVQUFVO0lBQ2xCLHlCQUFVLENBQUE7SUFDViw4Q0FBZ0MsQ0FBQTtJQUNoQywwQ0FBNEIsQ0FBQTtJQUM1QiwwQ0FBNEIsQ0FBQTtJQUM1Qix3Q0FBMEIsQ0FBQTtJQUMxQiw4Q0FBZ0MsQ0FBQTtJQUNoQywwQ0FBNEIsQ0FBQTtJQUM1QiwwQ0FBNEIsQ0FBQTtJQUM1Qix3Q0FBMEIsQ0FBQTtJQUMxQixxREFBdUMsQ0FBQTtJQUN2QyxpREFBbUMsQ0FBQTtJQUNuQyxpREFBbUMsQ0FBQTtJQUNuQywrQ0FBaUMsQ0FBQTtJQUNqQyw0Q0FBOEIsQ0FBQTtJQUM5Qiw4Q0FBZ0MsQ0FBQTtJQUNoQywwQ0FBNEIsQ0FBQTtBQUNoQyxDQUFDLEVBakJXLFVBQVUsS0FBVixVQUFVLFFBaUJyQjtBQUVELE1BQU0sQ0FBTixJQUFZLFlBTVg7QUFORCxXQUFZLFlBQVk7SUFDcEIsc0NBQXNCLENBQUE7SUFDdEIsc0NBQXNCLENBQUE7SUFDdEIsdUNBQXVCLENBQUE7SUFDdkIsdUNBQXVCLENBQUE7SUFDdkIseURBQXlDLENBQUE7QUFDN0MsQ0FBQyxFQU5XLFlBQVksS0FBWixZQUFZLFFBTXZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gQ0hBUlRfVFlQRSB7XHJcbiAgICBQSUU9ICdQaWUnLFxyXG4gICAgQ09MVU1OX0dST1VQRUQgPSAnQ29sdW1uR3JvdXBlZCcsXHJcbiAgICBBUkVBX0dST1VQRUQgPSAnQXJlYUdyb3VwZWQnLFxyXG4gICAgTElORV9HUk9VUEVEID0gJ0xpbmVHcm91cGVkJyxcclxuICAgIEJBUl9HUk9VUEVEID0gJ0Jhckdyb3VwZWQnLFxyXG4gICAgQ09MVU1OX1NUQUNLRUQgPSAnQ29sdW1uU3RhY2tlZCcsXHJcbiAgICBBUkVBX1NUQUNLRUQgPSAnQXJlYVN0YWNrZWQnLFxyXG4gICAgTElORV9TVEFDS0VEID0gJ0xpbmVTdGFja2VkJyxcclxuICAgIEJBUl9TVEFDS0VEID0gJ0JhclN0YWNrZWQnLFxyXG4gICAgQ09MVU1OXzEwMF9TVEFDS0VEID0gJ0NvbHVtbjEwMFN0YWNrZWQnLFxyXG4gICAgQVJFQV8xMDBfU1RBQ0tFRCA9ICdBcmVhMTAwU3RhY2tlZCcsXHJcbiAgICBMSU5FXzEwMF9TVEFDS0VEID0gJ0xpbmUxMDBTdGFja2VkJyxcclxuICAgIEJBUl8xMDBfU1RBQ0tFRCA9ICdCYXIxMDBTdGFja2VkJyxcclxuICAgIFNDQVRURVJfUE9JTlQgPSAnU2NhdHRlclBvaW50JyxcclxuICAgIFNDQVRURVJfQlVCQkxFID0gJ1NjYXR0ZXJCdWJibGUnLFxyXG4gICAgU0NBVFRFUl9MSU5FID0gJ1NjYXR0ZXJMaW5lJ1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBPUFRJT05TX1RZUEUge1xyXG4gICAgQ0hBUlQgPSAnY2hhcnRPcHRpb25zJyxcclxuICAgIFNFUklFUyA9ICdzZXJpZXNNb2RlbCcsXHJcbiAgICBYX0FYSVMgPSAneEF4aXNPcHRpb25zJyxcclxuICAgIFlfQVhJUyA9ICd5QXhpc09wdGlvbnMnLFxyXG4gICAgU1RBQ0tFRF9TRVJJRVMgPSAnc3RhY2tlZEZyYWdtZW50T3B0aW9ucydcclxufVxyXG4iXX0=