@rafaelaalmeidaa/primordash 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/components/card/card.component.mjs +69 -0
  3. package/esm2020/lib/components/charts/bar-line/bar-line.component.mjs +245 -0
  4. package/esm2020/lib/components/charts/bubble/bubble.component.mjs +147 -0
  5. package/esm2020/lib/components/charts/pie/pie.component.mjs +161 -0
  6. package/esm2020/lib/components/charts/simple-card/simple-card.component.mjs +31 -0
  7. package/esm2020/lib/components/charts/table/table.component.mjs +26 -0
  8. package/esm2020/lib/components/dashboard/dashboard.component.mjs +251 -0
  9. package/esm2020/lib/components/modal-edit/modal-edit.component.mjs +133 -0
  10. package/esm2020/lib/components/modal-edit-chart/modal-edit-chart.component.mjs +56 -0
  11. package/esm2020/lib/models/dashboard.model.mjs +46 -0
  12. package/esm2020/lib/primordash.component.mjs +75 -0
  13. package/esm2020/lib/primordash.module.mjs +92 -0
  14. package/esm2020/lib/primordash.service.mjs +14 -0
  15. package/esm2020/lib/services/generic.mjs +50 -0
  16. package/esm2020/public-api.mjs +8 -0
  17. package/esm2020/rafaAlmeida-primordash.mjs +5 -0
  18. package/esm2020/rafaelaalmeidaa-primordash.mjs +5 -0
  19. package/fesm2015/rafaAlmeida-primordash.mjs +1374 -0
  20. package/fesm2015/rafaAlmeida-primordash.mjs.map +1 -0
  21. package/fesm2015/rafaelaalmeidaa-primordash.mjs +1374 -0
  22. package/fesm2015/rafaelaalmeidaa-primordash.mjs.map +1 -0
  23. package/fesm2020/rafaAlmeida-primordash.mjs +1349 -0
  24. package/fesm2020/rafaAlmeida-primordash.mjs.map +1 -0
  25. package/fesm2020/rafaelaalmeidaa-primordash.mjs +1349 -0
  26. package/fesm2020/rafaelaalmeidaa-primordash.mjs.map +1 -0
  27. package/index.d.ts +5 -0
  28. package/lib/components/card/card.component.d.ts +21 -0
  29. package/lib/components/charts/bar-line/bar-line.component.d.ts +32 -0
  30. package/lib/components/charts/bubble/bubble.component.d.ts +27 -0
  31. package/lib/components/charts/pie/pie.component.d.ts +28 -0
  32. package/lib/components/charts/simple-card/simple-card.component.d.ts +15 -0
  33. package/lib/components/charts/table/table.component.d.ts +13 -0
  34. package/lib/components/dashboard/dashboard.component.d.ts +58 -0
  35. package/lib/components/modal-edit/modal-edit.component.d.ts +32 -0
  36. package/lib/components/modal-edit-chart/modal-edit-chart.component.d.ts +16 -0
  37. package/lib/models/dashboard.model.d.ts +118 -0
  38. package/lib/primordash.component.d.ts +16 -0
  39. package/lib/primordash.module.d.ts +26 -0
  40. package/lib/primordash.service.d.ts +6 -0
  41. package/lib/services/generic.d.ts +3 -0
  42. package/package.json +40 -0
  43. package/public-api.d.ts +4 -0
  44. package/src/lib/assets/fonts/google_icons_outlined.ttf +0 -0
  45. package/src/lib/assets/fonts/google_icons_rounded.ttf +0 -0
  46. package/src/lib/assets/fonts/google_icons_sharp.ttf +0 -0
  47. package/src/lib/assets/images/bar.png +0 -0
  48. package/src/lib/assets/images/doughnut.png +0 -0
  49. package/src/lib/assets/images/halfDoughnut.png +0 -0
  50. package/src/lib/assets/images/lineBar.png +0 -0
  51. package/src/lib/assets/images/multiPie.png +0 -0
  52. package/src/lib/assets/images/pie.png +0 -0
  53. package/src/lib/assets/images/polarArea.png +0 -0
  54. package/src/lib/assets/images/verticalBar.png +0 -0
  55. package/src/lib/assets/images/verticalStackedBar.png +0 -0
  56. package/src/lib/assets/style.scss +5 -0
  57. package/src/lib/assets/styles/_colors.scss +11 -0
  58. package/src/lib/assets/styles/_fonts.scss +30 -0
  59. package/src/lib/assets/styles/_modal.scss +36 -0
  60. package/src/lib/assets/styles/_ng-select.scss +128 -0
@@ -0,0 +1,161 @@
1
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
2
+ import { BaseChartDirective } from 'ng2-charts';
3
+ import { getOpacityColors, randomColor } from '../../../services/generic';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ng2-charts";
6
+ export class PieComponent {
7
+ constructor() {
8
+ this.type = 'pie';
9
+ this.isDark = false;
10
+ this.card = {};
11
+ this.loading = true;
12
+ this.canvasHeight = 0;
13
+ this.canvasWidth = 0;
14
+ this.config = {
15
+ type: 'pie',
16
+ data: {
17
+ labels: [],
18
+ datasets: []
19
+ },
20
+ options: {}
21
+ };
22
+ this.options = {
23
+ responsive: true,
24
+ maintainAspectRatio: false,
25
+ plugins: {
26
+ legend: {
27
+ position: 'top',
28
+ color: this.isDark ? '#FFF' : '#333',
29
+ },
30
+ datalabels: {
31
+ display: false
32
+ }
33
+ }
34
+ };
35
+ }
36
+ ngOnInit() {
37
+ this.config.type = this.type == 'halfDoughnut' ? 'doughnut' : (this.type == 'multiPie' ? 'pie' : this.type);
38
+ this.formatOption();
39
+ this.config.options = this.options;
40
+ this.config.data.datasets = this.formatDataset();
41
+ }
42
+ ngAfterViewInit() {
43
+ this.resizeObserver = new ResizeObserver(() => {
44
+ if (this.chart) {
45
+ setTimeout(() => {
46
+ this.triggerResize();
47
+ }, 0);
48
+ }
49
+ });
50
+ this.resizeObserver.observe(this.container.nativeElement);
51
+ setTimeout(() => {
52
+ this.chart?.chart?.resize();
53
+ }, 50);
54
+ this.loading = false;
55
+ }
56
+ ngOnDestroy() {
57
+ if (this.resizeObserver) {
58
+ this.resizeObserver.disconnect();
59
+ }
60
+ }
61
+ triggerResize() {
62
+ if (this.chart?.chart) {
63
+ this.chart.chart.resize();
64
+ this.chart.update();
65
+ }
66
+ }
67
+ formatOption() {
68
+ if (this.type == 'halfDoughnut') {
69
+ this.options = {
70
+ ...this.options,
71
+ rotation: -90,
72
+ circumference: 180
73
+ };
74
+ }
75
+ if (this.card.showPorcent) {
76
+ this.options.plugins.tooltip = {
77
+ callbacks: {
78
+ label: function (context) {
79
+ return context.raw + '%';
80
+ }
81
+ }
82
+ };
83
+ }
84
+ if (this.card.showLabel) {
85
+ this.options.plugins.datalabels = {
86
+ anchor: 'center',
87
+ align: 'center',
88
+ formatter: (value) => this.card.showPorcent ? value + '%' : value,
89
+ color: '#fff',
90
+ font: {
91
+ weight: 'bold'
92
+ }
93
+ };
94
+ }
95
+ if (this.type == 'multiPie') {
96
+ this.options.plugins.tooltip = {
97
+ callbacks: {
98
+ title: (context) => {
99
+ const datasetLabel = context[0].dataset.label;
100
+ const sliceLabel = context[0].label;
101
+ return `${datasetLabel} - ${sliceLabel}`;
102
+ },
103
+ label: (context) => {
104
+ return context.raw + '%';
105
+ }
106
+ }
107
+ };
108
+ }
109
+ }
110
+ formatDataset() {
111
+ if (!this.card?.data?.length)
112
+ return [];
113
+ if (!this.card.axisX?.key)
114
+ return [];
115
+ const labels = this.card.data.map(row => row[this.card.axisX?.key ?? '']);
116
+ const colors = this.card.data.map(row => row[this.card.axisX?.keyColor ?? ''] ?? randomColor());
117
+ this.config.data.labels = labels;
118
+ const datasets = this.card.keys?.map((item, index) => {
119
+ const data = this.card.data?.map(row => {
120
+ const value = row[item.key];
121
+ return typeof value === 'string'
122
+ ? Number(value)
123
+ : value ?? 0;
124
+ }) ?? [];
125
+ var result = {
126
+ label: item.label,
127
+ data,
128
+ backgroundColor: getOpacityColors(colors, index),
129
+ borderColor: 'white',
130
+ fill: item.fill ?? false,
131
+ };
132
+ return result;
133
+ }) ?? [];
134
+ return datasets;
135
+ }
136
+ onresize() {
137
+ this.triggerResize();
138
+ }
139
+ }
140
+ PieComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PieComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
141
+ PieComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PieComponent, selector: "lib-pie", inputs: { type: "type", isDark: "isDark", card: "card" }, host: { listeners: { "window:resize": "onresize()" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }], ngImport: i0, template: "<div class=\"chart-div\" #container>\r\n <canvas\r\n #chart\r\n baseChart\r\n class=\"chart chart-bar chart-item\"\r\n [data]=\"config.data\"\r\n [options]=\"config.options\"\r\n [type]=\"config.type\"\r\n >\r\n </canvas>\r\n</div>", styles: [".chart-div{width:100%;height:100%}.chart-bar{max-height:100%}.chart{width:100%!important;height:100%!important;position:relative}\n"], dependencies: [{ kind: "directive", type: i1.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["type", "legend", "data", "options", "plugins", "labels", "datasets"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }] });
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PieComponent, decorators: [{
143
+ type: Component,
144
+ args: [{ selector: 'lib-pie', template: "<div class=\"chart-div\" #container>\r\n <canvas\r\n #chart\r\n baseChart\r\n class=\"chart chart-bar chart-item\"\r\n [data]=\"config.data\"\r\n [options]=\"config.options\"\r\n [type]=\"config.type\"\r\n >\r\n </canvas>\r\n</div>", styles: [".chart-div{width:100%;height:100%}.chart-bar{max-height:100%}.chart{width:100%!important;height:100%!important;position:relative}\n"] }]
145
+ }], ctorParameters: function () { return []; }, propDecorators: { type: [{
146
+ type: Input
147
+ }], isDark: [{
148
+ type: Input
149
+ }], card: [{
150
+ type: Input
151
+ }], container: [{
152
+ type: ViewChild,
153
+ args: ['container']
154
+ }], chart: [{
155
+ type: ViewChild,
156
+ args: [BaseChartDirective]
157
+ }], onresize: [{
158
+ type: HostListener,
159
+ args: ['window:resize']
160
+ }] } });
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy9waWUvcGllLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy9waWUvcGllLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBTTFFLE1BQU0sT0FBTyxZQUFZO0lBc0N2QjtRQXBDUyxTQUFJLEdBQWtFLEtBQUssQ0FBQztRQUM1RSxXQUFNLEdBQVcsS0FBSyxDQUFDO1FBQ3ZCLFNBQUksR0FBUSxFQUFVLENBQUM7UUFFaEMsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixpQkFBWSxHQUFVLENBQUMsQ0FBQztRQUN4QixnQkFBVyxHQUFVLENBQUMsQ0FBQztRQU92QixXQUFNLEdBQXlEO1lBQzdELElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxFQUFFO2FBQ2I7WUFDRCxPQUFPLEVBQUMsRUFBb0Q7U0FDN0QsQ0FBQztRQUVGLFlBQU8sR0FBa0Q7WUFDdkQsVUFBVSxFQUFFLElBQUk7WUFDaEIsbUJBQW1CLEVBQUUsS0FBSztZQUMxQixPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFO29CQUNOLFFBQVEsRUFBRSxLQUFLO29CQUNmLEtBQUssRUFBRSxJQUFJLENBQUMs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SUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBTWtCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDUyxLQUFLO3NCQUFuQyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFpSjdCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENoYXJ0LCBDaGFydENvbmZpZ3VyYXRpb24sIENoYXJ0RGF0YSwgQ2hhcnREYXRhc2V0LCBDaGFydE9wdGlvbnMsIENoYXJ0VHlwZSB9IGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgQ2FyZCwgQ2hhdENvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXNoYm9hcmQubW9kZWwnO1xyXG5pbXBvcnQgeyBCYXNlQ2hhcnREaXJlY3RpdmUgfSBmcm9tICduZzItY2hhcnRzJztcclxuaW1wb3J0IHsgZ2V0T3BhY2l0eUNvbG9ycywgcmFuZG9tQ29sb3IgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9nZW5lcmljJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItcGllJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGllLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9waWUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGllQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgdHlwZToncGllJyB8ICdkb3VnaG51dCcgfCAncG9sYXJBcmVhJyB8ICdoYWxmRG91Z2hudXQnIHwgJ211bHRpUGllJyA9ICdwaWUnO1xyXG4gIEBJbnB1dCgpIGlzRGFyazpib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2FyZDpDYXJkID0ge30gYXMgQ2FyZDtcclxuXHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgY2FudmFzSGVpZ2h0Om51bWJlciA9IDA7XHJcbiAgY2FudmFzV2lkdGg6bnVtYmVyID0gMDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChCYXNlQ2hhcnREaXJlY3RpdmUpIGNoYXJ0PzogQmFzZUNoYXJ0RGlyZWN0aXZlO1xyXG5cclxuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyITogUmVzaXplT2JzZXJ2ZXI7XHJcblxyXG4gIGNvbmZpZzogQ2hhcnRDb25maWd1cmF0aW9uPCdwaWUnIHwgJ2RvdWdobnV0JyB8ICdwb2xhckFyZWEnPiA9IHtcclxuICAgIHR5cGU6ICdwaWUnLFxyXG4gICAgZGF0YToge1xyXG4gICAgICBsYWJlbHM6IFtdLFxyXG4gICAgICBkYXRhc2V0czogW11cclxuICAgIH0sXHJcbiAgICBvcHRpb25zOnt9IGFzIENoYXJ0T3B0aW9uczwncGllJyB8ICdkb3VnaG51dCcgfCAncG9sYXJBcmVhJz5cclxuICB9O1xyXG5cclxuICBvcHRpb25zOkNoYXJ0T3B0aW9uczwncGllJyB8ICdkb3VnaG51dCcgfCAncG9sYXJBcmVhJz4gPSB7XHJcbiAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgICBjb2xvcjogdGhpcy5pc0RhcmsgPyAnI0ZGRicgOiAnIzMzMycsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGFsYWJlbHM6IHtcclxuICAgICAgICBkaXNwbGF5OiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBhcyBDaGFydE9wdGlvbnM8J3BpZScgfCAnZG91Z2hudXQnIHwgJ3BvbGFyQXJlYSc+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29uZmlnLnR5cGUgPSB0aGlzLnR5cGUgPT0gJ2hhbGZEb3VnaG51dCc/ICdkb3VnaG51dCc6ICh0aGlzLnR5cGUgPT0gJ211bHRpUGllJz8gJ3BpZScgOiB0aGlzLnR5cGUpO1xyXG4gICAgdGhpcy5mb3JtYXRPcHRpb24oKTtcclxuICAgIHRoaXMuY29uZmlnLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhLmRhdGFzZXRzID0gdGhpcy5mb3JtYXREYXRhc2V0KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudHJpZ2dlclJlc2l6ZSgpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hhcnQ/LmNoYXJ0Py5yZXNpemUoKTtcclxuICAgIH0sIDUwKTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgdHJpZ2dlclJlc2l6ZSgpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Py5jaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0LmNoYXJ0LnJlc2l6ZSgpO1xyXG4gICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0T3B0aW9uKCl7XHJcbiAgICBpZih0aGlzLnR5cGUgPT0gJ2hhbGZEb3VnaG51dCcpe1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxyXG4gICAgICAgIHJvdGF0aW9uOiAtOTAsXHJcbiAgICAgICAgY2lyY3VtZmVyZW5jZTogMTgwXHJcbiAgICAgIH0gYXMgQ2hhcnRPcHRpb25zPCdkb3VnaG51dCc+XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5jYXJkLnNob3dQb3JjZW50KXtcclxuICAgICAgdGhpcy5vcHRpb25zIS5wbHVnaW5zIS50b29sdGlwID0ge1xyXG4gICAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgICAgbGFiZWw6IGZ1bmN0aW9uKGNvbnRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmF3ICsgJyUnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuY2FyZC5zaG93TGFiZWwpe1xyXG4gICAgICB0aGlzLm9wdGlvbnMhLnBsdWdpbnMhLmRhdGFsYWJlbHMgPSB7XHJcbiAgICAgICAgYW5jaG9yOiAnY2VudGVyJyxcclxuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgZm9ybWF0dGVyOiAodmFsdWU6IG51bWJlcikgPT4gdGhpcy5jYXJkLnNob3dQb3JjZW50PyB2YWx1ZSArICclJzogdmFsdWUsXHJcbiAgICAgICAgY29sb3I6ICcjZmZmJyxcclxuICAgICAgICBmb250OiB7XHJcbiAgICAgICAgICB3ZWlnaHQ6ICdib2xkJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZih0aGlzLnR5cGUgPT0gJ211bHRpUGllJyl7XHJcbiAgICAgIHRoaXMub3B0aW9ucyEucGx1Z2lucyEudG9vbHRpcCA9IHtcclxuICAgICAgICBjYWxsYmFja3M6IHtcclxuICAgICAgICAgIHRpdGxlOiAoY29udGV4dCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0TGFiZWwgPSBjb250ZXh0WzBdLmRhdGFzZXQubGFiZWw7XHJcbiAgICAgICAgICAgIGNvbnN0IHNsaWNlTGFiZWwgPSBjb250ZXh0WzBdLmxhYmVsO1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF0YXNldExhYmVsfSAtICR7c2xpY2VMYWJlbH1gO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiAoY29udGV4dCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5yYXcgKyAnJSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0YXNldCgpOiBDaGFydERhdGFzZXQ8J3BpZScgfCAnZG91Z2hudXQnIHwgJ3BvbGFyQXJlYSc+W10ge1xyXG4gICAgaWYgKCF0aGlzLmNhcmQ/LmRhdGE/Lmxlbmd0aCApIHJldHVybiBbXTtcclxuICAgIGlmICghdGhpcy5jYXJkLmF4aXNYPy5rZXkpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmNhcmQuZGF0YS5tYXAocm93ID0+IHJvd1t0aGlzLmNhcmQuYXhpc1g/LmtleSA/PyAnJ10pO1xyXG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5jYXJkLmRhdGEubWFwKHJvdyA9PiByb3dbdGhpcy5jYXJkLmF4aXNYPy5rZXlDb2xvciA/PyAnJ10gPz8gcmFuZG9tQ29sb3IoKSk7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhLmxhYmVscyA9IGxhYmVscztcclxuICAgIFxyXG4gICAgY29uc3QgZGF0YXNldHM6IENoYXJ0RGF0YXNldDwncGllJyB8ICdkb3VnaG51dCcgfCAncG9sYXJBcmVhJz5bXSA9IHRoaXMuY2FyZC5rZXlzPy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNhcmQuZGF0YT8ubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbaXRlbS5rZXldO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICA/IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgIDogdmFsdWUgPz8gMDtcclxuICAgICAgfSkgPz8gW107XHJcblxyXG4gICAgICB2YXIgcmVzdWx0ID0ge1xyXG4gICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBnZXRPcGFjaXR5Q29sb3JzKGNvbG9ycywgaW5kZXgpLFxyXG4gICAgICAgIGJvcmRlckNvbG9yOiAnd2hpdGUnLFxyXG4gICAgICAgIGZpbGw6IGl0ZW0uZmlsbCA/PyBmYWxzZSxcclxuICAgICAgfSBhcyBDaGFydERhdGFzZXQ8J3BpZScgfCAnZG91Z2hudXQnIHwgJ3BvbGFyQXJlYSc+O1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0pID8/IFtdO1xyXG5cclxuICAgIHJldHVybiBkYXRhc2V0cztcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gIG9ucmVzaXplKCkge1xyXG4gICAgdGhpcy50cmlnZ2VyUmVzaXplKCk7XHJcbiAgfVxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwiY2hhcnQtZGl2XCIgI2NvbnRhaW5lcj5cclxuICA8Y2FudmFzXHJcbiAgICAjY2hhcnRcclxuICAgIGJhc2VDaGFydFxyXG4gICAgY2xhc3M9XCJjaGFydCBjaGFydC1iYXIgY2hhcnQtaXRlbVwiXHJcbiAgICBbZGF0YV09XCJjb25maWcuZGF0YVwiXHJcbiAgICBbb3B0aW9uc109XCJjb25maWcub3B0aW9uc1wiXHJcbiAgICBbdHlwZV09XCJjb25maWcudHlwZVwiXHJcbiAgICA+XHJcbiAgPC9jYW52YXM+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { randomColor } from '../../../services/generic';
3
+ import * as i0 from "@angular/core";
4
+ export class SimpleCardComponent {
5
+ constructor() {
6
+ this.type = 'simpleCard';
7
+ this.isDark = false;
8
+ this.card = {};
9
+ this.loading = true;
10
+ this.currentData = {};
11
+ this.currentKey = {};
12
+ }
13
+ ngOnInit() {
14
+ this.currentData = this.card.data?.[0] ?? {};
15
+ this.currentKey = this.card.keys?.[0] ?? {};
16
+ this.currentKey.color = this.currentKey.color ?? randomColor();
17
+ }
18
+ }
19
+ SimpleCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SimpleCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
+ SimpleCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SimpleCardComponent, selector: "lib-simple-card", inputs: { type: "type", isDark: "isDark", card: "card" }, ngImport: i0, template: "<div class=\"chart-div\" #container>\r\n <b class=\"chart-number\">{{currentData[currentKey.key]}}</b>\r\n <b class=\"chart-label\">{{currentKey.label}}</b>\r\n</div>", styles: [".chart-div{width:100%;height:100%;display:flex;flex-direction:column}.chart-number{font-size:90pt;line-height:normal;width:100%;display:flex;flex-direction:column;justify-content:center;flex-grow:1}@media (max-width: 768px){::ng-deep .dashboard:not(.responsive) .chart-number{font-size:45pt}}\n"] });
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SimpleCardComponent, decorators: [{
22
+ type: Component,
23
+ args: [{ selector: 'lib-simple-card', template: "<div class=\"chart-div\" #container>\r\n <b class=\"chart-number\">{{currentData[currentKey.key]}}</b>\r\n <b class=\"chart-label\">{{currentKey.label}}</b>\r\n</div>", styles: [".chart-div{width:100%;height:100%;display:flex;flex-direction:column}.chart-number{font-size:90pt;line-height:normal;width:100%;display:flex;flex-direction:column;justify-content:center;flex-grow:1}@media (max-width: 768px){::ng-deep .dashboard:not(.responsive) .chart-number{font-size:45pt}}\n"] }]
24
+ }], ctorParameters: function () { return []; }, propDecorators: { type: [{
25
+ type: Input
26
+ }], isDark: [{
27
+ type: Input
28
+ }], card: [{
29
+ type: Input
30
+ }] } });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbW9yZGFzaC9zcmMvbGliL2NvbXBvbmVudHMvY2hhcnRzL3NpbXBsZS1jYXJkL3NpbXBsZS1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy9zaW1wbGUtY2FyZC9zaW1wbGUtY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBT3hELE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFQUyxTQUFJLEdBQWdCLFlBQVksQ0FBQztRQUNqQyxXQUFNLEdBQVcsS0FBSyxDQUFDO1FBQ3ZCLFNBQUksR0FBUSxFQUFVLENBQUM7UUFDaEMsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixnQkFBVyxHQUF1QixFQUFFLENBQUM7UUFDckMsZUFBVSxHQUFRLEVBQVUsQ0FBQztJQUViLENBQUM7SUFFakIsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQVUsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQTtJQUNoRSxDQUFDOztpSEFmVSxtQkFBbUI7cUdBQW5CLG1CQUFtQixpSENUaEMsMEtBR007NEZETU8sbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjswRUFNbEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FyZCwgSXRlbSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXNoYm9hcmQubW9kZWwnO1xyXG5pbXBvcnQgeyByYW5kb21Db2xvciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dlbmVyaWMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc2ltcGxlLWNhcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW1wbGUtY2FyZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2ltcGxlLWNhcmQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2ltcGxlQ2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIHR5cGU6J3NpbXBsZUNhcmQnID0gJ3NpbXBsZUNhcmQnO1xyXG4gIEBJbnB1dCgpIGlzRGFyazpib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2FyZDpDYXJkID0ge30gYXMgQ2FyZDtcclxuICBsb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBjdXJyZW50RGF0YTpSZWNvcmQ8c3RyaW5nLG51bGw+ID0ge307XHJcbiAgY3VycmVudEtleTpJdGVtID0ge30gYXMgSXRlbTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnREYXRhID0gdGhpcy5jYXJkLmRhdGE/LlswXSA/PyB7fTtcclxuICAgIHRoaXMuY3VycmVudEtleSA9IHRoaXMuY2FyZC5rZXlzPy5bMF0gPz8ge30gYXMgSXRlbTtcclxuICAgIHRoaXMuY3VycmVudEtleS5jb2xvciA9IHRoaXMuY3VycmVudEtleS5jb2xvciA/PyByYW5kb21Db2xvcigpXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2hhcnQtZGl2XCIgI2NvbnRhaW5lcj5cclxuICA8YiBjbGFzcz1cImNoYXJ0LW51bWJlclwiPnt7Y3VycmVudERhdGFbY3VycmVudEtleS5rZXldfX08L2I+XHJcbiAgPGIgY2xhc3M9XCJjaGFydC1sYWJlbFwiPnt7Y3VycmVudEtleS5sYWJlbH19PC9iPlxyXG48L2Rpdj4iXX0=
@@ -0,0 +1,26 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class TableComponent {
5
+ constructor() {
6
+ this.type = 'table';
7
+ this.isDark = false;
8
+ this.card = {};
9
+ this.loading = true;
10
+ }
11
+ ngOnInit() {
12
+ }
13
+ }
14
+ TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "lib-table", inputs: { type: "type", isDark: "isDark", card: "card" }, ngImport: i0, template: "<div class=\"chart-div pt-2\" #container>\r\n <table class=\"table table-striped\" [class.table-dark]=\"isDark\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let key of card.keys\">{{key.label}}</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"table-group-divider\">\r\n <tr *ngFor=\"let data of card.data\">\r\n <td *ngFor=\"let key of card.keys\">{{data[key.key]}}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
17
+ type: Component,
18
+ args: [{ selector: 'lib-table', template: "<div class=\"chart-div pt-2\" #container>\r\n <table class=\"table table-striped\" [class.table-dark]=\"isDark\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let key of card.keys\">{{key.label}}</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"table-group-divider\">\r\n <tr *ngFor=\"let data of card.data\">\r\n <td *ngFor=\"let key of card.keys\">{{data[key.key]}}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>" }]
19
+ }], ctorParameters: function () { return []; }, propDecorators: { type: [{
20
+ type: Input
21
+ }], isDark: [{
22
+ type: Input
23
+ }], card: [{
24
+ type: Input
25
+ }] } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbW9yZGFzaC9zcmMvbGliL2NvbXBvbmVudHMvY2hhcnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7O0FBUXpELE1BQU0sT0FBTyxjQUFjO0lBT3pCO1FBTFMsU0FBSSxHQUFXLE9BQU8sQ0FBQztRQUN2QixXQUFNLEdBQVcsS0FBSyxDQUFDO1FBQ3ZCLFNBQUksR0FBUSxFQUFVLENBQUM7UUFDaEMsWUFBTyxHQUFZLElBQUksQ0FBQztJQUVSLENBQUM7SUFFakIsUUFBUTtJQUNSLENBQUM7OzRHQVZVLGNBQWM7Z0dBQWQsY0FBYywyR0NSM0IsMmNBYU07NEZETE8sY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxXQUFXOzBFQU1aLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGFzaGJvYXJkLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgdHlwZTondGFibGUnID0gJ3RhYmxlJztcclxuICBASW5wdXQoKSBpc0Rhcms6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhcmQ6Q2FyZCA9IHt9IGFzIENhcmQ7XHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNoYXJ0LWRpdiBwdC0yXCIgI2NvbnRhaW5lcj5cclxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCIgW2NsYXNzLnRhYmxlLWRhcmtdPVwiaXNEYXJrXCI+XHJcbiAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGggKm5nRm9yPVwibGV0IGtleSBvZiBjYXJkLmtleXNcIj57e2tleS5sYWJlbH19PC90aD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGhlYWQ+XHJcbiAgICA8dGJvZHkgY2xhc3M9XCJ0YWJsZS1ncm91cC1kaXZpZGVyXCI+XHJcbiAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBjYXJkLmRhdGFcIj5cclxuICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGtleSBvZiBjYXJkLmtleXNcIj57e2RhdGFba2V5LmtleV19fTwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3Rib2R5PlxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,251 @@
1
+ import { Component, HostListener, Input, ViewChild, ViewChildren } from '@angular/core';
2
+ import { CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "ngx-bootstrap/modal";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/cdk/drag-drop";
7
+ import * as i4 from "@angular/material/grid-list";
8
+ import * as i5 from "@angular/material/menu";
9
+ import * as i6 from "../card/card.component";
10
+ import * as i7 from "../modal-edit/modal-edit.component";
11
+ import * as i8 from "../modal-edit-chart/modal-edit-chart.component";
12
+ export class DashboardComponent {
13
+ constructor(modalService, cd) {
14
+ this.modalService = modalService;
15
+ this.cd = cd;
16
+ this.emptyCard = {
17
+ type: 'html',
18
+ innerHtml: '<button class="btn empty-card font-icon" >dashboard_customize</button>'
19
+ };
20
+ this.copyComplete = false;
21
+ this.isDark = false;
22
+ this.isResponsive = true;
23
+ this.canEdit = false;
24
+ this.cols = 4;
25
+ this.options = [
26
+ { title: '1x1', cols: 1, rows: 1 },
27
+ { title: '2x1', cols: 2, rows: 1 },
28
+ { title: '3x1', cols: 3, rows: 1 },
29
+ { title: '1x2', cols: 1, rows: 2 },
30
+ { title: '2x2', cols: 2, rows: 2 },
31
+ ];
32
+ this.cards = [];
33
+ this.groupType = [];
34
+ this.modalData = [];
35
+ this.debug = false;
36
+ this.drops = [];
37
+ }
38
+ ngOnInit() {
39
+ this.cards = [...this.cards].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
40
+ if (this.isResponsive) {
41
+ this.recalcCols();
42
+ }
43
+ }
44
+ ngAfterViewInit() {
45
+ this.dropsQuery.changes.subscribe(() => {
46
+ this.drops = this.dropsQuery.toArray();
47
+ });
48
+ Promise.resolve().then(() => {
49
+ this.drops = this.dropsQuery.toArray();
50
+ });
51
+ }
52
+ entered($event) {
53
+ moveItemInArray(this.cards, $event.item.data, $event.container.data);
54
+ }
55
+ get orderOptions() {
56
+ return [...this.options].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
57
+ }
58
+ recalcCols() {
59
+ this.cols = Math.max(1, Math.floor(window.innerWidth / 300));
60
+ }
61
+ openModalChart(card) {
62
+ this.currentCard = card;
63
+ this.modalChartRef = this.modalService.show(this.modalChart, {
64
+ class: 'modal-xl modal-top',
65
+ });
66
+ }
67
+ closeModalChart() {
68
+ this.modalChartRef?.hide();
69
+ }
70
+ openModalData(card) {
71
+ this.currentCard = card;
72
+ this.currentOption = card.type ?? null;
73
+ this.modalRef = this.modalService.show(this.modal, {
74
+ class: 'modal-xl modal-top',
75
+ });
76
+ }
77
+ closeModalData() {
78
+ this.modalRef?.hide();
79
+ }
80
+ get jsonData() {
81
+ return JSON.stringify(this.currentCard);
82
+ }
83
+ openModalCode(card) {
84
+ this.currentCard = card;
85
+ this.currentOption = card.type ?? null;
86
+ this.modalCodeRef = this.modalService.show(this.modalCode, {
87
+ class: 'modal-xl modal-top',
88
+ });
89
+ }
90
+ closeModalCode() {
91
+ this.modalCodeRef?.hide();
92
+ }
93
+ copyCode() {
94
+ const texto = JSON.stringify(this.currentCard, null, 2);
95
+ navigator.clipboard.writeText(texto)
96
+ .then(() => {
97
+ this.copyComplete = true;
98
+ setTimeout(() => this.copyComplete = false, 1500);
99
+ })
100
+ .catch(err => {
101
+ console.error('Erro ao copiar:', err);
102
+ });
103
+ }
104
+ saveData(payload) {
105
+ const rows = payload.rows;
106
+ const rowsType = payload.rowsType;
107
+ const currentType = rowsType == 'simple' ? rowsType : 'group';
108
+ if (!rows?.length)
109
+ return;
110
+ this.cards = this.cards.map(card => {
111
+ if (card.id !== this.currentCard.id)
112
+ return card;
113
+ const baseData = this.data[currentType];
114
+ if (!baseData)
115
+ return card;
116
+ const keys = rows.map((row, index) => {
117
+ const id = row.finalValue[row.finalValue.length - 1];
118
+ const last = row.selectedPath.find(r => r.id == id);
119
+ return {
120
+ key: last?.id || `key_${index}`,
121
+ label: last?.label || `Item ${index + 1}`,
122
+ fill: true,
123
+ color: row.finalBackgroudColor,
124
+ fontColor: row.finalFontColor
125
+ };
126
+ });
127
+ const typeLabel = this.groupType.find(t => t.id == rowsType)?.label ?? '';
128
+ var data = this.formatData(rowsType, rows[0]?.selectedPath, rows[0]?.finalValue);
129
+ return {
130
+ ...card,
131
+ axisX: { key: rowsType, label: typeLabel },
132
+ keys: [...keys],
133
+ data: data
134
+ };
135
+ });
136
+ this.modalRef?.hide();
137
+ }
138
+ formatData(type, selectedPath, finalValue) {
139
+ const currentType = type == 'simple' ? type : 'group';
140
+ const baseData = this.data[currentType];
141
+ let data = [];
142
+ if (currentType === 'simple') {
143
+ var finalData = baseData;
144
+ finalValue?.slice(0, -1)?.forEach(r => {
145
+ finalData = finalData[r];
146
+ });
147
+ data = finalData;
148
+ }
149
+ else if (currentType === 'group') {
150
+ var finalData = baseData;
151
+ finalValue?.slice(0, -1)?.forEach(r => {
152
+ finalData = finalData[r];
153
+ });
154
+ data = finalData[type];
155
+ }
156
+ return data;
157
+ }
158
+ randomValueFromPath(row) {
159
+ const base = row.selectedPath.length * 10;
160
+ return Math.floor(Math.random() * 20) + base;
161
+ }
162
+ saveChartData(data) {
163
+ alert('TODO'); //proxima versao
164
+ this.modalRef?.hide();
165
+ }
166
+ addNewCard() {
167
+ const newItem = { title: 'Novo', order: 99, cols: 1, rows: 1 };
168
+ this.cards.push(newItem);
169
+ this.cd.detectChanges();
170
+ }
171
+ downloadImage(id) {
172
+ const canvases = document.querySelectorAll(`#card_${id} canvas`);
173
+ canvases.forEach((canvas, index) => {
174
+ const scale = 3;
175
+ const tempCanvas = document.createElement('canvas');
176
+ tempCanvas.width = canvas.width * scale;
177
+ tempCanvas.height = canvas.height * scale;
178
+ const ctx = tempCanvas.getContext('2d');
179
+ if (ctx) {
180
+ ctx.fillStyle = '#ffffff';
181
+ ctx.fillRect(0, 0, tempCanvas.width, tempCanvas.height);
182
+ ctx.scale(scale, scale);
183
+ ctx.drawImage(canvas, 0, 0);
184
+ }
185
+ const link = document.createElement('a');
186
+ link.download = `canvas_${index + 1}.png`;
187
+ link.href = tempCanvas.toDataURL('image/png', 1.0);
188
+ link.click();
189
+ });
190
+ }
191
+ openChart(card, id) {
192
+ this.currentCard = card;
193
+ this.currentOption = card.type ?? null;
194
+ this.modalViewRef = this.modalService.show(this.modalView, {
195
+ class: 'modal-xl modal-top',
196
+ });
197
+ }
198
+ closeModalView() {
199
+ this.modalViewRef?.hide();
200
+ }
201
+ onresize() {
202
+ if (this.isResponsive) {
203
+ this.recalcCols();
204
+ }
205
+ }
206
+ }
207
+ DashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.BsModalService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
208
+ DashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DashboardComponent, selector: "lib-dashboard", inputs: { isDark: "isDark", isResponsive: "isResponsive", canEdit: "canEdit", cols: "cols", options: "options", cards: "cards", groupType: "groupType", modalData: "modalData", data: "data", debug: "debug" }, host: { listeners: { "window:resize": "onresize()" } }, viewQueries: [{ propertyName: "modalChart", first: true, predicate: ["modalChart"], descendants: true }, { propertyName: "modal", first: true, predicate: ["modal"], descendants: true }, { propertyName: "modalView", first: true, predicate: ["modalView"], descendants: true }, { propertyName: "modalCode", first: true, predicate: ["modalCode"], descendants: true }, { propertyName: "dropsQuery", predicate: CdkDropList, descendants: true }], ngImport: i0, template: "<main class=\"dashboard\" [class.responsive]=\"isResponsive\" [class.dark-class]=\"isDark\">\r\n <mat-grid-list [cols]=\"cols\" rowHeight=\"300px\" gutterSize=\"10px\">\r\n <mat-grid-tile\r\n *ngFor=\"let card of cards; let i = index\"\r\n [colspan]=\"card.cols > cols? cols : card.cols\"\r\n [rowspan]=\"card.rows\"\r\n [class.dark-class]=\"isDark\"\r\n class=\"card\"\r\n >\r\n <div cdkDropList [cdkDropListConnectedTo]=\"drops\" [cdkDropListData]=\"i\">\r\n <div\r\n [id]=\"'card_' + i\"\r\n cdkDrag\r\n (cdkDragEntered)=\"entered($event)\"\r\n [cdkDragData]=\"i\"\r\n class=\"card-body\"\r\n [cdkDragDisabled]=\"!canEdit\"\r\n [class.dark-class]=\"isDark\"\r\n [class.has-color]=\"card.backgroundColor\"\r\n [style.background-color]=\"card.backgroundColor\"\r\n [style.color]=\"card.fontColor\"\r\n >\r\n <nav class=\"nav-hover\">\r\n <button *ngIf=\"!canEdit\" class=\"btn font-icon\" title=\"Ampliar gr\u00E1fico\" (click)=\"openChart(card, i)\">search</button>\r\n <button *ngIf=\"!canEdit\" class=\"btn font-icon\" title=\"Baixar imagem\" (click)=\"downloadImage(i)\">download</button>\r\n </nav>\r\n <nav class=\"card-nav\" *ngIf=\"canEdit\">\r\n <div class=\"card-handle font-icon\" title=\"Mover\" cdkDragHandle>\r\n drag_pan\r\n </div>\r\n <button class=\"btn card-options font-icon\" title=\"Modificar tamanho\" mat-button [matMenuTriggerFor]=\"menu\">\r\n resize\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <ng-container *ngFor=\"let opt of orderOptions\">\r\n <button mat-menu-item (click)=\"card.cols = opt.cols; card.rows = opt.rows\" >{{opt.title}}</button>\r\n </ng-container>\r\n </mat-menu>\r\n <button class=\"btn font-icon\" title=\"Editar Tipo do Gr\u00E1fico\" (click)=\"openModalChart(card)\">{{'landscape_2_edit'}}</button>\r\n <button class=\"btn font-icon\" title=\"Editar fonte de dados\" (click)=\"openModalData(card)\">edit_note</button>\r\n <button class=\"btn font-icon\" *ngIf=\"debug\" title=\"Exibir c\u00F3digo de configura\u00E7\u00E3o\" (click)=\"openModalCode(card)\">code_blocks</button>\r\n </nav>\r\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\r\n <lib-card [data]=\"card\" [ngClass]=\"{'canEdit': canEdit}\" [isDark]=\"isDark\"></lib-card>\r\n </div>\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile class=\"card\" [colspan]=\"1\" [rowspan]=\"1\" [class.dark-class]=\"isDark\" *ngIf=\"canEdit\">\r\n <lib-card [data]=\"emptyCard\" [ngClass]=\"{'canEdit': canEdit, cardEmpty:true}\" [isDark]=\"isDark\"\r\n (click)=\"addNewCard()\"\r\n ></lib-card>\r\n </mat-grid-tile>\r\n </mat-grid-list>\r\n</main>\r\n<ng-template #modal>\r\n <lib-modal-edit (closeModal)=\"closeModalData()\" (saveData)=\"saveData($event)\" [data]=\"modalData\" [groupType]=\"groupType\"></lib-modal-edit>\r\n</ng-template>\r\n<ng-template #modalView>\r\n <header class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left mb-0\">{{currentCard.title}}</h4>\r\n <button type=\"button\" class=\"btn-close close pull-right\" aria-label=\"Close\" (click)=\"closeModalView()\">\r\n <span aria-hidden=\"true\" class=\"visually-hidden\">&times;</span>\r\n </button>\r\n </header>\r\n <body id=\"modalViewBody\" class=\"modal-body py-2 overflow-auto\">\r\n <lib-card [data]=\"currentCard\" [ngClass]=\"{'canEdit': canEdit}\" [isDark]=\"isDark\"></lib-card>\r\n </body>\r\n</ng-template>\r\n<ng-template #modalCode>\r\n <header class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left mb-0\">{{currentCard.title}}</h4>\r\n <button type=\"button\" class=\"btn-close close pull-right\" aria-label=\"Close\" (click)=\"closeModalCode()\">\r\n <span aria-hidden=\"true\" class=\"visually-hidden\">&times;</span>\r\n </button>\r\n </header>\r\n <body id=\"modalCodeBody\" class=\"modal-body py-2 overflow-auto\">\r\n <pre class=\"code-area\">{{ currentCard | json }}</pre>\r\n <button class=\"font-icon code-copy\" title=\"Copiar json\" (click)=\"copyCode()\">content_copy</button>\r\n <span *ngIf=\"copyComplete\" class=\"copy-message\">Copiado!</span>\r\n </body>\r\n</ng-template>\r\n<ng-template #modalChart>\r\n <lib-modal-edit-chart (closeModal)=\"closeModalChart()\" [currentOption]=\"currentOption\" (saveData)=\"saveChartData($event)\"></lib-modal-edit-chart>\r\n</ng-template>", styles: [".dashboard{padding:5px;background-color:#e4e4e4}.copy-message{position:absolute;bottom:10px;left:45%;right:auto;color:#fff;padding:5px 25px;border-radius:20px;background:#1b1b1b}.code-area{background:black;color:#fff;padding:10px;line-height:1;border-radius:10px}.code-copy{top:15px;position:absolute;color:#fff;background:#3f3f3f;right:25px;display:hidden;display:none;border-radius:25px;padding:8px;border:none}.modal-body:hover .code-copy{display:inline}.card{box-sizing:border-box;color:#000000de;background:#fff;border-radius:4px;z-index:1;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:box-shadow .2s cubic-bezier(0,0,.2,1)}.card-body{border:solid 1px #ccc;height:100%}.card-body:active{border:solid 1px #ccc;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.card-body .card-nav{width:100%;height:30px;display:flex;border-bottom:1px solid gray}.card-body .card-nav .card-handle{cursor:move;width:24px;height:24px}.card-body .card-nav .card-options{border:none;display:flex;padding:0}.card-body .card-nav button,.card-body .card-nav .card-handle{font-size:18pt;display:flex;color:#898989;padding:0;margin-left:5px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.more-button{float:right;font-size:2em}.cdk-drop-list{height:100%;width:100%}.cdk-drag-animating{transition:unset}.cdk-drag-placeholder{display:none}.mat-grid-tile{overflow:visible!important}.mat-grid-tile-content{height:100%!important;display:flex!important}.nav-hover{display:flex;right:10px;position:absolute;top:10px;display:none}::ng-deep .mat-grid-tile:hover .nav-hover{display:inherit}::ng-deep .dark-class:not(.has-color){background-color:#000!important;color:#fff!important}::ng-deep .dark-class.card-body:not(.has-color){background-color:#1a1a1a!important;color:#fff!important}::ng-deep .mat-grid-tile-content:has(lib-card.cardEmpty .empty-card:active){background-color:#c6c6c6}::ng-deep lib-card.cardEmpty{width:100%}::ng-deep lib-card.cardEmpty .empty-card{width:100%;height:100%;text-align:center;padding:auto;font-size:28pt}::ng-deep lib-card.cardEmpty .empty-card:active{border:none}::ng-deep lib-card.canEdit{display:block;height:calc(100% - 30px)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.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: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i4.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { kind: "component", type: i4.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i6.CardComponent, selector: "lib-card", inputs: ["data", "isDark"] }, { kind: "component", type: i7.ModalEditComponent, selector: "lib-modal-edit", inputs: ["data", "groupType"], outputs: ["closeModal", "saveData"] }, { kind: "component", type: i8.ModalEditChartComponent, selector: "lib-modal-edit-chart", inputs: ["currentOption"], outputs: ["closeModal", "saveData"] }, { kind: "pipe", type: i2.JsonPipe, name: "json" }] });
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardComponent, decorators: [{
210
+ type: Component,
211
+ args: [{ selector: 'lib-dashboard', template: "<main class=\"dashboard\" [class.responsive]=\"isResponsive\" [class.dark-class]=\"isDark\">\r\n <mat-grid-list [cols]=\"cols\" rowHeight=\"300px\" gutterSize=\"10px\">\r\n <mat-grid-tile\r\n *ngFor=\"let card of cards; let i = index\"\r\n [colspan]=\"card.cols > cols? cols : card.cols\"\r\n [rowspan]=\"card.rows\"\r\n [class.dark-class]=\"isDark\"\r\n class=\"card\"\r\n >\r\n <div cdkDropList [cdkDropListConnectedTo]=\"drops\" [cdkDropListData]=\"i\">\r\n <div\r\n [id]=\"'card_' + i\"\r\n cdkDrag\r\n (cdkDragEntered)=\"entered($event)\"\r\n [cdkDragData]=\"i\"\r\n class=\"card-body\"\r\n [cdkDragDisabled]=\"!canEdit\"\r\n [class.dark-class]=\"isDark\"\r\n [class.has-color]=\"card.backgroundColor\"\r\n [style.background-color]=\"card.backgroundColor\"\r\n [style.color]=\"card.fontColor\"\r\n >\r\n <nav class=\"nav-hover\">\r\n <button *ngIf=\"!canEdit\" class=\"btn font-icon\" title=\"Ampliar gr\u00E1fico\" (click)=\"openChart(card, i)\">search</button>\r\n <button *ngIf=\"!canEdit\" class=\"btn font-icon\" title=\"Baixar imagem\" (click)=\"downloadImage(i)\">download</button>\r\n </nav>\r\n <nav class=\"card-nav\" *ngIf=\"canEdit\">\r\n <div class=\"card-handle font-icon\" title=\"Mover\" cdkDragHandle>\r\n drag_pan\r\n </div>\r\n <button class=\"btn card-options font-icon\" title=\"Modificar tamanho\" mat-button [matMenuTriggerFor]=\"menu\">\r\n resize\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <ng-container *ngFor=\"let opt of orderOptions\">\r\n <button mat-menu-item (click)=\"card.cols = opt.cols; card.rows = opt.rows\" >{{opt.title}}</button>\r\n </ng-container>\r\n </mat-menu>\r\n <button class=\"btn font-icon\" title=\"Editar Tipo do Gr\u00E1fico\" (click)=\"openModalChart(card)\">{{'landscape_2_edit'}}</button>\r\n <button class=\"btn font-icon\" title=\"Editar fonte de dados\" (click)=\"openModalData(card)\">edit_note</button>\r\n <button class=\"btn font-icon\" *ngIf=\"debug\" title=\"Exibir c\u00F3digo de configura\u00E7\u00E3o\" (click)=\"openModalCode(card)\">code_blocks</button>\r\n </nav>\r\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\r\n <lib-card [data]=\"card\" [ngClass]=\"{'canEdit': canEdit}\" [isDark]=\"isDark\"></lib-card>\r\n </div>\r\n </div>\r\n </mat-grid-tile>\r\n <mat-grid-tile class=\"card\" [colspan]=\"1\" [rowspan]=\"1\" [class.dark-class]=\"isDark\" *ngIf=\"canEdit\">\r\n <lib-card [data]=\"emptyCard\" [ngClass]=\"{'canEdit': canEdit, cardEmpty:true}\" [isDark]=\"isDark\"\r\n (click)=\"addNewCard()\"\r\n ></lib-card>\r\n </mat-grid-tile>\r\n </mat-grid-list>\r\n</main>\r\n<ng-template #modal>\r\n <lib-modal-edit (closeModal)=\"closeModalData()\" (saveData)=\"saveData($event)\" [data]=\"modalData\" [groupType]=\"groupType\"></lib-modal-edit>\r\n</ng-template>\r\n<ng-template #modalView>\r\n <header class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left mb-0\">{{currentCard.title}}</h4>\r\n <button type=\"button\" class=\"btn-close close pull-right\" aria-label=\"Close\" (click)=\"closeModalView()\">\r\n <span aria-hidden=\"true\" class=\"visually-hidden\">&times;</span>\r\n </button>\r\n </header>\r\n <body id=\"modalViewBody\" class=\"modal-body py-2 overflow-auto\">\r\n <lib-card [data]=\"currentCard\" [ngClass]=\"{'canEdit': canEdit}\" [isDark]=\"isDark\"></lib-card>\r\n </body>\r\n</ng-template>\r\n<ng-template #modalCode>\r\n <header class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left mb-0\">{{currentCard.title}}</h4>\r\n <button type=\"button\" class=\"btn-close close pull-right\" aria-label=\"Close\" (click)=\"closeModalCode()\">\r\n <span aria-hidden=\"true\" class=\"visually-hidden\">&times;</span>\r\n </button>\r\n </header>\r\n <body id=\"modalCodeBody\" class=\"modal-body py-2 overflow-auto\">\r\n <pre class=\"code-area\">{{ currentCard | json }}</pre>\r\n <button class=\"font-icon code-copy\" title=\"Copiar json\" (click)=\"copyCode()\">content_copy</button>\r\n <span *ngIf=\"copyComplete\" class=\"copy-message\">Copiado!</span>\r\n </body>\r\n</ng-template>\r\n<ng-template #modalChart>\r\n <lib-modal-edit-chart (closeModal)=\"closeModalChart()\" [currentOption]=\"currentOption\" (saveData)=\"saveChartData($event)\"></lib-modal-edit-chart>\r\n</ng-template>", styles: [".dashboard{padding:5px;background-color:#e4e4e4}.copy-message{position:absolute;bottom:10px;left:45%;right:auto;color:#fff;padding:5px 25px;border-radius:20px;background:#1b1b1b}.code-area{background:black;color:#fff;padding:10px;line-height:1;border-radius:10px}.code-copy{top:15px;position:absolute;color:#fff;background:#3f3f3f;right:25px;display:hidden;display:none;border-radius:25px;padding:8px;border:none}.modal-body:hover .code-copy{display:inline}.card{box-sizing:border-box;color:#000000de;background:#fff;border-radius:4px;z-index:1;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:box-shadow .2s cubic-bezier(0,0,.2,1)}.card-body{border:solid 1px #ccc;height:100%}.card-body:active{border:solid 1px #ccc;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.card-body .card-nav{width:100%;height:30px;display:flex;border-bottom:1px solid gray}.card-body .card-nav .card-handle{cursor:move;width:24px;height:24px}.card-body .card-nav .card-options{border:none;display:flex;padding:0}.card-body .card-nav button,.card-body .card-nav .card-handle{font-size:18pt;display:flex;color:#898989;padding:0;margin-left:5px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.more-button{float:right;font-size:2em}.cdk-drop-list{height:100%;width:100%}.cdk-drag-animating{transition:unset}.cdk-drag-placeholder{display:none}.mat-grid-tile{overflow:visible!important}.mat-grid-tile-content{height:100%!important;display:flex!important}.nav-hover{display:flex;right:10px;position:absolute;top:10px;display:none}::ng-deep .mat-grid-tile:hover .nav-hover{display:inherit}::ng-deep .dark-class:not(.has-color){background-color:#000!important;color:#fff!important}::ng-deep .dark-class.card-body:not(.has-color){background-color:#1a1a1a!important;color:#fff!important}::ng-deep .mat-grid-tile-content:has(lib-card.cardEmpty .empty-card:active){background-color:#c6c6c6}::ng-deep lib-card.cardEmpty{width:100%}::ng-deep lib-card.cardEmpty .empty-card{width:100%;height:100%;text-align:center;padding:auto;font-size:28pt}::ng-deep lib-card.cardEmpty .empty-card:active{border:none}::ng-deep lib-card.canEdit{display:block;height:calc(100% - 30px)}\n"] }]
212
+ }], ctorParameters: function () { return [{ type: i1.BsModalService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { isDark: [{
213
+ type: Input
214
+ }], isResponsive: [{
215
+ type: Input
216
+ }], canEdit: [{
217
+ type: Input
218
+ }], cols: [{
219
+ type: Input
220
+ }], options: [{
221
+ type: Input
222
+ }], cards: [{
223
+ type: Input
224
+ }], groupType: [{
225
+ type: Input
226
+ }], modalData: [{
227
+ type: Input
228
+ }], data: [{
229
+ type: Input
230
+ }], debug: [{
231
+ type: Input
232
+ }], dropsQuery: [{
233
+ type: ViewChildren,
234
+ args: [CdkDropList]
235
+ }], modalChart: [{
236
+ type: ViewChild,
237
+ args: ['modalChart']
238
+ }], modal: [{
239
+ type: ViewChild,
240
+ args: ['modal']
241
+ }], modalView: [{
242
+ type: ViewChild,
243
+ args: ['modalView']
244
+ }], modalCode: [{
245
+ type: ViewChild,
246
+ args: ['modalCode']
247
+ }], onresize: [{
248
+ type: HostListener,
249
+ args: ['window:resize']
250
+ }] } });
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbW9yZGFzaC9zcmMvbGliL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFrQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7QUFXckUsTUFBTSxPQUFPLGtCQUFrQjtJQXdDN0IsWUFDVSxZQUE0QixFQUM1QixFQUFxQjtRQURyQixpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDNUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUF4Qy9CLGNBQVMsR0FBUTtZQUNmLElBQUksRUFBQyxNQUFNO1lBQ1gsU0FBUyxFQUFFLHdFQUF3RTtTQUM1RSxDQUFDO1FBR1YsaUJBQVksR0FBUyxLQUFLLENBQUM7UUFFbEIsV0FBTSxHQUFXLEtBQUssQ0FBQztRQUN2QixpQkFBWSxHQUFXLElBQUksQ0FBQztRQUM1QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFNBQUksR0FBVyxDQUFDLENBQUM7UUFDakIsWUFBTyxHQUFZO1lBQzFCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDbEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUNsQyxF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U0FBUzt1QkFBQyxXQUFXO2dCQXlNdEIsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka0Ryb3BMaXN0LCBtb3ZlSXRlbUluQXJyYXl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBDYXJkLCBEYXNoYm9hcmRDaGFydFR5cGUsIE1vZGFsSXRlbSwgT3B0aW9uLCBTZWxlY3QsIFNlbGVjdFJvdyB9IGZyb20gJy4uLy4uL21vZGVscy9kYXNoYm9hcmQubW9kZWwnO1xyXG5pbXBvcnQgeyBDaGFydCB9IGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgQnNNb2RhbFJlZiwgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcclxuaW1wb3J0IHsgSXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXNoYm9hcmQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZGFzaGJvYXJkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgZW1wdHlDYXJkOkNhcmQgPSB7XHJcbiAgICB0eXBlOidodG1sJyxcclxuICAgIGlubmVySHRtbDogJzxidXR0b24gY2xhc3M9XCJidG4gZW1wdHktY2FyZCBmb250LWljb25cIiA+ZGFzaGJvYXJkX2N1c3RvbWl6ZTwvYnV0dG9uPidcclxuICB9IGFzIENhcmQ7XHJcbiAgY3VycmVudE9wdGlvbiE6RGFzaGJvYXJkQ2hhcnRUeXBlfG51bGw7XHJcbiAgY3VycmVudENhcmQhOiBDYXJkO1xyXG4gIGNvcHlDb21wbGV0ZTpib29sZWFuPWZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBpc0Rhcms6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzUmVzcG9uc2l2ZTpib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjYW5FZGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY29sczogbnVtYmVyID0gNDtcclxuICBASW5wdXQoKSBvcHRpb25zOk9wdGlvbltdID0gW1xyXG4gICAgeyB0aXRsZTogJzF4MScsIGNvbHM6IDEsIHJvd3M6IDEgfSxcclxuICAgIHsgdGl0bGU6ICcyeDEnLCBjb2xzOiAyLCByb3dzOiAxIH0sXHJcbiAgICB7IHRpdGxlOiAnM3gxJywgY29sczogMywgcm93czogMSB9LFxyXG4gICAgeyB0aXRsZTogJzF4MicsIGNvbHM6IDEsIHJvd3M6IDIgfSxcclxuICAgIHsgdGl0bGU6ICcyeDInLCBjb2xzOiAyLCByb3dzOiAyIH0sXHJcbiAgXVxyXG4gIEBJbnB1dCgpIGNhcmRzOiBDYXJkW10gPSBbXTtcclxuICBASW5wdXQoKSBncm91cFR5cGU6U2VsZWN0W10gPSBbXTtcclxuICBASW5wdXQoKSBtb2RhbERhdGE6TW9kYWxJdGVtW10gPSBbXTtcclxuICBASW5wdXQoKSBkYXRhITphbnk7XHJcbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZHJvcHM6IENka0Ryb3BMaXN0W10gPSBbXTtcclxuXHJcbiAgbW9kYWxSZWY/OiBCc01vZGFsUmVmO1xyXG4gIG1vZGFsQ2hhcnRSZWY/OiBCc01vZGFsUmVmO1xyXG4gIG1vZGFsVmlld1JlZj86IEJzTW9kYWxSZWY7XHJcbiAgbW9kYWxDb2RlUmVmPzogQnNNb2RhbFJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihDZGtEcm9wTGlzdCkgZHJvcHNRdWVyeSE6IFF1ZXJ5TGlzdDxDZGtEcm9wTGlzdD47XHJcbiAgQFZpZXdDaGlsZCgnbW9kYWxDaGFydCcpIG1vZGFsQ2hhcnQhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ21vZGFsJykgbW9kYWwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ21vZGFsVmlldycpIG1vZGFsVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnbW9kYWxDb2RlJykgbW9kYWxDb2RlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jYXJkcyA9IFsuLi50aGlzLmNhcmRzXS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcclxuICAgIGlmKHRoaXMuaXNSZXNwb25zaXZlKXtcclxuICAgICAgdGhpcy5yZWNhbGNDb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmRyb3BzUXVlcnkuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmRyb3BzID0gdGhpcy5kcm9wc1F1ZXJ5LnRvQXJyYXkoKTtcclxuICAgIH0pO1xyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuZHJvcHMgPSB0aGlzLmRyb3BzUXVlcnkudG9BcnJheSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBlbnRlcmVkKCRldmVudDogYW55KTp2b2lkIHtcclxuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmNhcmRzLCAkZXZlbnQuaXRlbS5kYXRhLCAkZXZlbnQuY29udGFpbmVyLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9yZGVyT3B0aW9ucygpOiBPcHRpb25bXXtcclxuICAgIHJldHVybiBbLi4udGhpcy5vcHRpb25zXS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcclxuICB9XHJcblxyXG4gIHJlY2FsY0NvbHMoKTp2b2lke1xyXG4gICAgdGhpcy5jb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3cuaW5uZXJXaWR0aCAvIDMwMCkpO1xyXG4gIH1cclxuXHJcbiAgb3Blbk1vZGFsQ2hhcnQoY2FyZDpDYXJkKTp2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudENhcmQgPSBjYXJkO1xyXG4gICAgdGhpcy5tb2RhbENoYXJ0UmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh0aGlzLm1vZGFsQ2hhcnQsIHtcclxuICAgICAgY2xhc3M6ICdtb2RhbC14bCBtb2RhbC10b3AnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vZGFsQ2hhcnQoKTp2b2lkIHtcclxuICAgIHRoaXMubW9kYWxDaGFydFJlZj8uaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgb3Blbk1vZGFsRGF0YShjYXJkOkNhcmQpOnZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50Q2FyZCA9IGNhcmQ7XHJcbiAgICB0aGlzLmN1cnJlbnRPcHRpb24gPSBjYXJkLnR5cGUgPz8gbnVsbDtcclxuICAgIHRoaXMubW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRoaXMubW9kYWwsIHtcclxuICAgICAgY2xhc3M6ICdtb2RhbC14bCBtb2RhbC10b3AnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vZGFsRGF0YSgpOnZvaWQge1xyXG4gICAgdGhpcy5tb2RhbFJlZj8uaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGpzb25EYXRhKCk6c3RyaW5ne1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudENhcmQpO1xyXG4gIH1cclxuICBvcGVuTW9kYWxDb2RlKGNhcmQ6Q2FyZCk6dm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRDYXJkID0gY2FyZDtcclxuICAgIHRoaXMuY3VycmVudE9wdGlvbiA9IGNhcmQudHlwZSA/PyBudWxsO1xyXG4gICAgdGhpcy5tb2RhbENvZGVSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRoaXMubW9kYWxDb2RlLCB7XHJcbiAgICAgIGNsYXNzOiAnbW9kYWwteGwgbW9kYWwtdG9wJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbENvZGUoKTp2b2lkIHtcclxuICAgIHRoaXMubW9kYWxDb2RlUmVmPy5oaWRlKCk7XHJcbiAgfVxyXG4gIGNvcHlDb2RlKCkge1xyXG4gICAgY29uc3QgdGV4dG8gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRDYXJkLCBudWxsLCAyKTtcclxuXHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0bylcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29weUNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29weUNvbXBsZXRlID0gZmFsc2UsIDE1MDApO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvIGFvIGNvcGlhcjonLCBlcnIpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVEYXRhKHBheWxvYWQ6IGFueSk6dm9pZCB7XHJcbiAgICBjb25zdCByb3dzOiBTZWxlY3RSb3dbXSA9IHBheWxvYWQucm93cztcclxuICAgIGNvbnN0IHJvd3NUeXBlOiBzdHJpbmcgPSBwYXlsb2FkLnJvd3NUeXBlO1xyXG4gICAgY29uc3QgY3VycmVudFR5cGU6IHN0cmluZyA9IHJvd3NUeXBlID09ICdzaW1wbGUnPyByb3dzVHlwZSA6J2dyb3VwJztcclxuXHJcbiAgICBpZiAoIXJvd3M/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuY2FyZHMgPSB0aGlzLmNhcmRzLm1hcChjYXJkID0+IHtcclxuICAgICAgaWYgKGNhcmQuaWQgIT09IHRoaXMuY3VycmVudENhcmQuaWQpIHJldHVybiBjYXJkO1xyXG5cclxuICAgICAgY29uc3QgYmFzZURhdGEgPSB0aGlzLmRhdGFbY3VycmVudFR5cGVdO1xyXG4gICAgICBpZiAoIWJhc2VEYXRhKSByZXR1cm4gY2FyZDtcclxuXHJcbiAgICAgIGNvbnN0IGtleXM6IEl0ZW1bXSA9IHJvd3MubWFwKChyb3csIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaWQgPSByb3cuZmluYWxWYWx1ZVtyb3cuZmluYWxWYWx1ZS5sZW5ndGggLSAxXTtcclxuICAgICAgICBjb25zdCBsYXN0ID0gcm93LnNlbGVjdGVkUGF0aC5maW5kKHIgPT4gci5pZCA9PSBpZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBrZXk6IGxhc3Q/LmlkIHx8IGBrZXlfJHtpbmRleH1gLFxyXG4gICAgICAgICAgbGFiZWw6IGxhc3Q/LmxhYmVsIHx8IGBJdGVtICR7aW5kZXggKyAxfWAsXHJcbiAgICAgICAgICBmaWxsOiB0cnVlLFxyXG4gICAgICAgICAgY29sb3I6IHJvdy5maW5hbEJhY2tncm91ZENvbG9yLFxyXG4gICAgICAgICAgZm9udENvbG9yOiByb3cuZmluYWxGb250Q29sb3JcclxuICAgICAgICB9O1xyXG4gICAgICB9KSBhcyBJdGVtW107XHJcblxyXG4gICAgICBjb25zdCB0eXBlTGFiZWwgPSB0aGlzLmdyb3VwVHlwZS5maW5kKHQgPT4gdC5pZCA9PSByb3dzVHlwZSk/LmxhYmVsID8/ICcnOyBcclxuICAgICAgdmFyIGRhdGEgPSB0aGlzLmZvcm1hdERhdGEocm93c1R5cGUsIHJvd3NbMF0/LnNlbGVjdGVkUGF0aCwgcm93c1swXT8uZmluYWxWYWx1ZSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uY2FyZCxcclxuICAgICAgICBheGlzWDogeyBrZXk6IHJvd3NUeXBlLCBsYWJlbDogdHlwZUxhYmVsIH0sXHJcbiAgICAgICAga2V5czogWy4uLmtleXNdLFxyXG4gICAgICAgIGRhdGE6IGRhdGFcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb2RhbFJlZj8uaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0YSh0eXBlOnN0cmluZywgc2VsZWN0ZWRQYXRoOiBhbnksIGZpbmFsVmFsdWU6IHN0cmluZ1tdKTphbnlbXXtcclxuICAgIGNvbnN0IGN1cnJlbnRUeXBlOiBzdHJpbmcgPSB0eXBlID09ICdzaW1wbGUnPyB0eXBlIDonZ3JvdXAnO1xyXG4gICAgY29uc3QgYmFzZURhdGEgPSB0aGlzLmRhdGFbY3VycmVudFR5cGVdO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGlmIChjdXJyZW50VHlwZSA9PT0gJ3NpbXBsZScpIHtcclxuICAgICAgdmFyIGZpbmFsRGF0YSA9IGJhc2VEYXRhO1xyXG4gICAgICBmaW5hbFZhbHVlPy5zbGljZSgwLCAtMSk/LmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgZmluYWxEYXRhID0gZmluYWxEYXRhW3JdO1xyXG4gICAgICB9KTtcclxuICAgICAgZGF0YSA9IGZpbmFsRGF0YTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRUeXBlID09PSAnZ3JvdXAnKSB7XHJcbiAgICAgIHZhciBmaW5hbERhdGEgPSBiYXNlRGF0YTtcclxuICAgICAgZmluYWxWYWx1ZT8uc2xpY2UoMCwgLTEpPy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgIGZpbmFsRGF0YSA9IGZpbmFsRGF0YVtyXTtcclxuICAgICAgfSk7XHJcbiAgICAgIGRhdGEgPSBmaW5hbERhdGFbdHlwZV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHJhbmRvbVZhbHVlRnJvbVBhdGgocm93OiBTZWxlY3RSb3cpOiBudW1iZXIge1xyXG4gICAgY29uc3QgYmFzZSA9IHJvdy5zZWxlY3RlZFBhdGgubGVuZ3RoICogMTA7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjApICsgYmFzZTtcclxuICB9XHJcblxyXG4gIHNhdmVDaGFydERhdGEoZGF0YTphbnkpOnZvaWQge1xyXG4gICAgYWxlcnQoJ1RPRE8nKSAvL3Byb3hpbWEgdmVyc2FvXHJcbiAgICB0aGlzLm1vZGFsUmVmPy5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBhZGROZXdDYXJkKCk6dm9pZHtcclxuICAgIGNvbnN0IG5ld0l0ZW06Q2FyZCA9IHsgdGl0bGU6ICdOb3ZvJywgb3JkZXI6OTksIGNvbHM6IDEsIHJvd3M6IDEgfSBhcyBDYXJkO1xyXG4gICAgdGhpcy5jYXJkcy5wdXNoKG5ld0l0ZW0pO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEltYWdlKGlkOiBudW1iZXIpOnZvaWQge1xyXG4gICAgY29uc3QgY2FudmFzZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjY2FyZF8ke2lkfSBjYW52YXNgKTtcclxuXHJcbiAgICBjYW52YXNlcy5mb3JFYWNoKChjYW52YXM6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgY29uc3Qgc2NhbGUgPSAzO1xyXG4gICAgICBjb25zdCB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgIHRlbXBDYW52YXMud2lkdGggPSBjYW52YXMud2lkdGggKiBzY2FsZTtcclxuICAgICAgdGVtcENhbnZhcy5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0ICogc2NhbGU7XHJcblxyXG4gICAgICBjb25zdCBjdHggPSB0ZW1wQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICBpZiAoY3R4KSB7XHJcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcclxuICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgdGVtcENhbnZhcy53aWR0aCwgdGVtcENhbnZhcy5oZWlnaHQpO1xyXG4gICAgICAgIGN0eC5zY2FsZShzY2FsZSwgc2NhbGUpO1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgbGluay5kb3dubG9hZCA9IGBjYW52YXNfJHtpbmRleCArIDF9LnBuZ2A7XHJcbiAgICAgIGxpbmsuaHJlZiA9IHRlbXBDYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnLCAxLjApO1xyXG4gICAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5DaGFydChjYXJkOiBDYXJkLCBpZDpudW1iZXIpOnZvaWR7XHJcbiAgICB0aGlzLmN1cnJlbnRDYXJkID0gY2FyZDtcclxuICAgIHRoaXMuY3VycmVudE9wdGlvbiA9IGNhcmQudHlwZSA/PyBudWxsO1xyXG4gICAgdGhpcy5tb2RhbFZpZXdSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRoaXMubW9kYWxWaWV3LCB7XHJcbiAgICAgIGNsYXNzOiAnbW9kYWwteGwgbW9kYWwtdG9wJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbFZpZXcoKTp2b2lke1xyXG4gICAgdGhpcy5tb2RhbFZpZXdSZWY/LmhpZGUoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gIG9ucmVzaXplKCkge1xyXG4gICAgaWYodGhpcy5pc1Jlc3BvbnNpdmUpe1xyXG4gICAgICB0aGlzLnJlY2FsY0NvbHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiIsIjxtYWluIGNsYXNzPVwiZGFzaGJvYXJkXCIgW2NsYXNzLnJlc3BvbnNpdmVdPVwiaXNSZXNwb25zaXZlXCIgW2NsYXNzLmRhcmstY2xhc3NdPVwiaXNEYXJrXCI+XHJcbiAgPG1hdC1ncmlkLWxpc3QgW2NvbHNdPVwiY29sc1wiIHJvd0hlaWdodD1cIjMwMHB4XCIgZ3V0dGVyU2l6ZT1cIjEwcHhcIj5cclxuICAgIDxtYXQtZ3JpZC10aWxlXHJcbiAgICAgICpuZ0Zvcj1cImxldCBjYXJkIG9mIGNhcmRzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgW2NvbHNwYW5dPVwiY2FyZC5jb2xzID4gY29scz8gY29scyA6IGNhcmQuY29sc1wiXHJcbiAgICAgIFtyb3dzcGFuXT1cImNhcmQucm93c1wiXHJcbiAgICAgIFtjbGFzcy5kYXJrLWNsYXNzXT1cImlzRGFya1wiXHJcbiAgICAgIGNsYXNzPVwiY2FyZFwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2RrRHJvcExpc3QgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiZHJvcHNcIiBbY2RrRHJvcExpc3REYXRhXT1cImlcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBbaWRdPVwiJ2NhcmRfJyArIGlcIlxyXG4gICAgICAgICAgY2RrRHJhZ1xyXG4gICAgICAgICAgKGNka0RyYWdFbnRlcmVkKT1cImVudGVyZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiaVwiXHJcbiAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keVwiXHJcbiAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIiFjYW5FZGl0XCJcclxuICAgICAgICAgIFtjbGFzcy5kYXJrLWNsYXNzXT1cImlzRGFya1wiXHJcbiAgICAgICAgICBbY2xhc3MuaGFzLWNvbG9yXT1cImNhcmQuYmFja2dyb3VuZENvbG9yXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNhcmQuYmFja2dyb3VuZENvbG9yXCJcclxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJjYXJkLmZvbnRDb2xvclwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdi1ob3ZlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWNhbkVkaXRcIiBjbGFzcz1cImJ0biBmb250LWljb25cIiB0aXRsZT1cIkFtcGxpYXIgZ3LDoWZpY29cIiAoY2xpY2spPVwib3BlbkNoYXJ0KGNhcmQsIGkpXCI+c2VhcmNoPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhY2FuRWRpdFwiIGNsYXNzPVwiYnRuIGZvbnQtaWNvblwiIHRpdGxlPVwiQmFpeGFyIGltYWdlbVwiIChjbGljayk9XCJkb3dubG9hZEltYWdlKGkpXCI+ZG93bmxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmF2PlxyXG4gICAgICAgICAgPG5hdiBjbGFzcz1cImNhcmQtbmF2XCIgKm5nSWY9XCJjYW5FZGl0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhhbmRsZSBmb250LWljb25cIiB0aXRsZT1cIk1vdmVyXCIgY2RrRHJhZ0hhbmRsZT5cclxuICAgICAgICAgICAgICBkcmFnX3BhblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBjYXJkLW9wdGlvbnMgZm9udC1pY29uXCIgdGl0bGU9XCJNb2RpZmljYXIgdGFtYW5ob1wiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cclxuICAgICAgICAgICAgICByZXNpemVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHQgb2Ygb3JkZXJPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNhcmQuY29scyA9IG9wdC5jb2xzOyBjYXJkLnJvd3MgPSBvcHQucm93c1wiID57e29wdC50aXRsZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZm9udC1pY29uXCIgdGl0bGU9XCJFZGl0YXIgVGlwbyBkbyBHcsOhZmljb1wiIChjbGljayk9XCJvcGVuTW9kYWxDaGFydChjYXJkKVwiPnt7J2xhbmRzY2FwZV8yX2VkaXQnfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBmb250LWljb25cIiB0aXRsZT1cIkVkaXRhciBmb250ZSBkZSBkYWRvc1wiIChjbGljayk9XCJvcGVuTW9kYWxEYXRhKGNhcmQpXCI+ZWRpdF9ub3RlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZm9udC1pY29uXCIgKm5nSWY9XCJkZWJ1Z1wiIHRpdGxlPVwiRXhpYmlyIGPDs2RpZ28gZGUgY29uZmlndXJhw6fDo29cIiAoY2xpY2spPVwib3Blbk1vZGFsQ29kZShjYXJkKVwiPmNvZGVfYmxvY2tzPC9idXR0b24+XHJcbiAgICAgICAgICA8L25hdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tcGxhY2Vob2xkZXJcIiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxyXG4gICAgICAgICAgPGxpYi1jYXJkIFtkYXRhXT1cImNhcmRcIiBbbmdDbGFzc109XCJ7J2NhbkVkaXQnOiBjYW5FZGl0fVwiIFtpc0RhcmtdPVwiaXNEYXJrXCI+PC9saWItY2FyZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1ncmlkLXRpbGU+XHJcbiAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImNhcmRcIiBbY29sc3Bhbl09XCIxXCIgW3Jvd3NwYW5dPVwiMVwiIFtjbGFzcy5kYXJrLWNsYXNzXT1cImlzRGFya1wiICpuZ0lmPVwiY2FuRWRpdFwiPlxyXG4gICAgICA8bGliLWNhcmQgW2RhdGFdPVwiZW1wdHlDYXJkXCIgW25nQ2xhc3NdPVwieydjYW5FZGl0JzogY2FuRWRpdCwgY2FyZEVtcHR5OnRydWV9XCIgW2lzRGFya109XCJpc0RhcmtcIlxyXG4gICAgICAgIChjbGljayk9XCJhZGROZXdDYXJkKClcIlxyXG4gICAgICA+PC9saWItY2FyZD5cclxuICAgIDwvbWF0LWdyaWQtdGlsZT5cclxuICA8L21hdC1ncmlkLWxpc3Q+XHJcbjwvbWFpbj5cclxuPG5nLXRlbXBsYXRlICNtb2RhbD5cclxuICA8bGliLW1vZGFsLWVkaXQgKGNsb3NlTW9kYWwpPVwiY2xvc2VNb2RhbERhdGEoKVwiICAoc2F2ZURhdGEpPVwic2F2ZURhdGEoJGV2ZW50KVwiIFtkYXRhXT1cIm1vZGFsRGF0YVwiIFtncm91cFR5cGVdPVwiZ3JvdXBUeXBlXCI+PC9saWItbW9kYWwtZWRpdD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNtb2RhbFZpZXc+XHJcbiAgPGhlYWRlciBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGUgcHVsbC1sZWZ0IG1iLTBcIj57e2N1cnJlbnRDYXJkLnRpdGxlfX08L2g0PlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJjbG9zZU1vZGFsVmlldygpXCI+XHJcbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvaGVhZGVyPlxyXG4gIDxib2R5IGlkPVwibW9kYWxWaWV3Qm9keVwiIGNsYXNzPVwibW9kYWwtYm9keSBweS0yIG92ZXJmbG93LWF1dG9cIj5cclxuICAgIDxsaWItY2FyZCBbZGF0YV09XCJjdXJyZW50Q2FyZFwiIFtuZ0NsYXNzXT1cInsnY2FuRWRpdCc6IGNhbkVkaXR9XCIgW2lzRGFya109XCJpc0RhcmtcIj48L2xpYi1jYXJkPlxyXG4gIDwvYm9keT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNtb2RhbENvZGU+XHJcbiAgPGhlYWRlciBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGUgcHVsbC1sZWZ0IG1iLTBcIj57e2N1cnJlbnRDYXJkLnRpdGxlfX08L2g0PlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJjbG9zZU1vZGFsQ29kZSgpXCI+XHJcbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvaGVhZGVyPlxyXG4gIDxib2R5IGlkPVwibW9kYWxDb2RlQm9keVwiIGNsYXNzPVwibW9kYWwtYm9keSBweS0yIG92ZXJmbG93LWF1dG9cIj5cclxuICAgIDxwcmUgY2xhc3M9XCJjb2RlLWFyZWFcIj57eyBjdXJyZW50Q2FyZCB8IGpzb24gfX08L3ByZT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJmb250LWljb24gY29kZS1jb3B5XCIgdGl0bGU9XCJDb3BpYXIganNvblwiIChjbGljayk9XCJjb3B5Q29kZSgpXCI+Y29udGVudF9jb3B5PC9idXR0b24+XHJcbiAgICA8c3BhbiAqbmdJZj1cImNvcHlDb21wbGV0ZVwiIGNsYXNzPVwiY29weS1tZXNzYWdlXCI+Q29waWFkbyE8L3NwYW4+XHJcbiAgPC9ib2R5PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI21vZGFsQ2hhcnQ+XHJcbiAgPGxpYi1tb2RhbC1lZGl0LWNoYXJ0IChjbG9zZU1vZGFsKT1cImNsb3NlTW9kYWxDaGFydCgpXCIgW2N1cnJlbnRPcHRpb25dPVwiY3VycmVudE9wdGlvblwiIChzYXZlRGF0YSk9XCJzYXZlQ2hhcnREYXRhKCRldmVudClcIj48L2xpYi1tb2RhbC1lZGl0LWNoYXJ0PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==