@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
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # Primordash
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project primordash` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project primordash`.
8
+ > Note: Don't forget to add `--project primordash` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build primordash` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build primordash`, go to the dist folder `cd dist/primordash` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test primordash` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,69 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { DASHBOARD_BAR_LINE_TYPES, } from '../../models/dashboard.model';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/platform-browser";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "../charts/bar-line/bar-line.component";
7
+ import * as i4 from "../charts/bubble/bubble.component";
8
+ import * as i5 from "../charts/pie/pie.component";
9
+ import * as i6 from "../charts/simple-card/simple-card.component";
10
+ import * as i7 from "../charts/table/table.component";
11
+ export class CardComponent {
12
+ constructor(sanitizer) {
13
+ this.sanitizer = sanitizer;
14
+ this.barItems = DASHBOARD_BAR_LINE_TYPES;
15
+ this.data = {};
16
+ this.isDark = false;
17
+ }
18
+ ngOnInit() {
19
+ if (this.data.innerHtml) {
20
+ this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(this.data.innerHtml);
21
+ }
22
+ }
23
+ includeBarType(data) {
24
+ return data.type ? this.barItems.includes(data.type) : false;
25
+ }
26
+ get barLineType() {
27
+ if (this.includeBarType(this.data)) {
28
+ return this.data.type ?? 'bar';
29
+ }
30
+ return 'bar';
31
+ }
32
+ get pieType() {
33
+ if (this.data?.type === 'pie' || this.data?.type === 'doughnut' ||
34
+ this.data?.type === 'polarArea' || this.data?.type === 'halfDoughnut' ||
35
+ this.data?.type === 'multiPie') {
36
+ return this.data.type;
37
+ }
38
+ return 'pie';
39
+ }
40
+ get bubbleType() {
41
+ if (this.data?.type === 'bubble') {
42
+ return this.data.type;
43
+ }
44
+ return 'bubble';
45
+ }
46
+ get cardType() {
47
+ if (this.data?.type === 'simpleCard') {
48
+ return this.data.type;
49
+ }
50
+ return 'simpleCard';
51
+ }
52
+ get tableType() {
53
+ if (this.data?.type === 'table') {
54
+ return this.data.type;
55
+ }
56
+ return 'table';
57
+ }
58
+ }
59
+ CardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
60
+ CardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardComponent, selector: "lib-card", inputs: { data: "data", isDark: "isDark" }, ngImport: i0, template: "<section class=\"card-section\">\r\n {{data.title}}\r\n <div class=\"card-chart\">\r\n <lib-bar-line *ngIf=\"this.includeBarType(this.data)\" \r\n [card]=\"data\" [type]=\"barLineType\" [isDark]=\"isDark\"></lib-bar-line>\r\n\r\n <lib-pie *ngIf=\"['pie', 'doughnut', 'polarArea', 'halfDoughnut', 'multiPie'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"pieType\" [isDark]=\"isDark\"></lib-pie>\r\n\r\n <lib-bubble *ngIf=\"['bubble'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"bubbleType\" [isDark]=\"isDark\"></lib-bubble>\r\n\r\n <lib-simple-card *ngIf=\"['simpleCard'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"cardType\" [isDark]=\"isDark\"></lib-simple-card>\r\n\r\n <lib-table *ngIf=\"['table'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"tableType\" [isDark]=\"isDark\"></lib-table>\r\n\r\n <div class=\"card-html\" *ngIf=\"data.type == 'html'\" [innerHtml]=\"safeHtml\">\r\n </div>\r\n </div>\r\n</section>", styles: [".card-section{display:flex;flex-direction:column;height:100%}.card-section .card-chart{flex-grow:1;min-height:0}.card-section .card-chart .card-html{height:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.BarLineComponent, selector: "lib-bar-line", inputs: ["type", "isDark", "card"] }, { kind: "component", type: i4.BubbleComponent, selector: "lib-bubble", inputs: ["type", "isDark", "card"] }, { kind: "component", type: i5.PieComponent, selector: "lib-pie", inputs: ["type", "isDark", "card"] }, { kind: "component", type: i6.SimpleCardComponent, selector: "lib-simple-card", inputs: ["type", "isDark", "card"] }, { kind: "component", type: i7.TableComponent, selector: "lib-table", inputs: ["type", "isDark", "card"] }] });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardComponent, decorators: [{
62
+ type: Component,
63
+ args: [{ selector: 'lib-card', template: "<section class=\"card-section\">\r\n {{data.title}}\r\n <div class=\"card-chart\">\r\n <lib-bar-line *ngIf=\"this.includeBarType(this.data)\" \r\n [card]=\"data\" [type]=\"barLineType\" [isDark]=\"isDark\"></lib-bar-line>\r\n\r\n <lib-pie *ngIf=\"['pie', 'doughnut', 'polarArea', 'halfDoughnut', 'multiPie'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"pieType\" [isDark]=\"isDark\"></lib-pie>\r\n\r\n <lib-bubble *ngIf=\"['bubble'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"bubbleType\" [isDark]=\"isDark\"></lib-bubble>\r\n\r\n <lib-simple-card *ngIf=\"['simpleCard'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"cardType\" [isDark]=\"isDark\"></lib-simple-card>\r\n\r\n <lib-table *ngIf=\"['table'].includes(data.type ?? '')\" \r\n [card]=\"data\" [type]=\"tableType\" [isDark]=\"isDark\"></lib-table>\r\n\r\n <div class=\"card-html\" *ngIf=\"data.type == 'html'\" [innerHtml]=\"safeHtml\">\r\n </div>\r\n </div>\r\n</section>", styles: [".card-section{display:flex;flex-direction:column;height:100%}.card-section .card-chart{flex-grow:1;min-height:0}.card-section .card-chart .card-html{height:100%}\n"] }]
64
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
65
+ type: Input
66
+ }], isDark: [{
67
+ type: Input
68
+ }] } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltb3JkYXNoL3NyYy9saWIvY29tcG9uZW50cy9jYXJkL2NhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbW9yZGFzaC9zcmMvbGliL2NvbXBvbmVudHMvY2FyZC9jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBUSx3QkFBd0IsR0FBMEIsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7O0FBUXRHLE1BQU0sT0FBTyxhQUFhO0lBT3hCLFlBQ1UsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQU5qQyxhQUFRLEdBQTJCLHdCQUF3QixDQUFDO1FBQ25ELFNBQUksR0FBUSxFQUFVLENBQUM7UUFDdkIsV0FBTSxHQUFXLEtBQUssQ0FBQztJQUs1QixDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDN0U7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVM7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztTQUNoQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksT0FBTztRQUNULElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLFVBQVU7WUFDM0QsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLGNBQWM7WUFDckUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdkI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssWUFBWSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdkI7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN2QjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OzJHQXhEVSxhQUFhOytGQUFiLGFBQWEsNEZDVDFCLDgvQkFxQlU7NEZEWkcsYUFBYTtrQkFMekIsU0FBUzsrQkFDRSxVQUFVO21HQU9YLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FyZCwgREFTSEJPQVJEX0JBUl9MSU5FX1RZUEVTLCBEYXNoYm9hcmRCYXJMaW5lVHlwZSwgIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Rhc2hib2FyZC5tb2RlbCc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNhcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYXJkLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBiYXJJdGVtczogRGFzaGJvYXJkQmFyTGluZVR5cGVbXSA9IERBU0hCT0FSRF9CQVJfTElORV9UWVBFUztcclxuICBASW5wdXQoKSBkYXRhOkNhcmQgPSB7fSBhcyBDYXJkO1xyXG4gIEBJbnB1dCgpIGlzRGFyazpib29sZWFuID0gZmFsc2U7XHJcbiAgc2FmZUh0bWwhOlNhZmVIdG1sO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmKHRoaXMuZGF0YS5pbm5lckh0bWwpe1xyXG4gICAgICB0aGlzLnNhZmVIdG1sID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5kYXRhLmlubmVySHRtbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbmNsdWRlQmFyVHlwZShkYXRhOkNhcmQpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gZGF0YS50eXBlPyB0aGlzLmJhckl0ZW1zLmluY2x1ZGVzKGRhdGEudHlwZSk6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhckxpbmVUeXBlKCk6IERhc2hib2FyZEJhckxpbmVUeXBlIHtcclxuICAgIGlmICh0aGlzLmluY2x1ZGVCYXJUeXBlKHRoaXMuZGF0YSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS50eXBlID8/ICdiYXInO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdiYXInO1xyXG4gIH1cclxuICBcclxuICBnZXQgcGllVHlwZSgpOiAncGllJyB8ICdkb3VnaG51dCcgfCAncG9sYXJBcmVhJyB8ICdoYWxmRG91Z2hudXQnIHwgJ211bHRpUGllJyB7XHJcbiAgICBpZiAodGhpcy5kYXRhPy50eXBlID09PSAncGllJyB8fCB0aGlzLmRhdGE/LnR5cGUgPT09ICdkb3VnaG51dCcgfHwgXHJcbiAgICAgICAgdGhpcy5kYXRhPy50eXBlID09PSAncG9sYXJBcmVhJyB8fCB0aGlzLmRhdGE/LnR5cGUgPT09ICdoYWxmRG91Z2hudXQnIHx8IFxyXG4gICAgICAgIHRoaXMuZGF0YT8udHlwZSA9PT0gJ211bHRpUGllJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhLnR5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ3BpZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgYnViYmxlVHlwZSgpOiAnYnViYmxlJ3tcclxuICAgIGlmICh0aGlzLmRhdGE/LnR5cGUgPT09ICdidWJibGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGEudHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiAnYnViYmxlJztcclxuICB9XHJcblxyXG4gIGdldCBjYXJkVHlwZSgpOiAnc2ltcGxlQ2FyZCd7XHJcbiAgICBpZiAodGhpcy5kYXRhPy50eXBlID09PSAnc2ltcGxlQ2FyZCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS50eXBlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdzaW1wbGVDYXJkJztcclxuICB9XHJcblxyXG4gIGdldCB0YWJsZVR5cGUoKTogJ3RhYmxlJ3tcclxuICAgIGlmICh0aGlzLmRhdGE/LnR5cGUgPT09ICd0YWJsZScpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS50eXBlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICd0YWJsZSc7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwiY2FyZC1zZWN0aW9uXCI+XHJcbiAge3tkYXRhLnRpdGxlfX1cclxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jaGFydFwiPlxyXG4gICAgPGxpYi1iYXItbGluZSAqbmdJZj1cInRoaXMuaW5jbHVkZUJhclR5cGUodGhpcy5kYXRhKVwiIFxyXG4gICAgICBbY2FyZF09XCJkYXRhXCIgW3R5cGVdPVwiYmFyTGluZVR5cGVcIiBbaXNEYXJrXT1cImlzRGFya1wiPjwvbGliLWJhci1saW5lPlxyXG5cclxuICAgIDxsaWItcGllICpuZ0lmPVwiWydwaWUnLCAnZG91Z2hudXQnLCAncG9sYXJBcmVhJywgJ2hhbGZEb3VnaG51dCcsICdtdWx0aVBpZSddLmluY2x1ZGVzKGRhdGEudHlwZSA/PyAnJylcIiBcclxuICAgICAgW2NhcmRdPVwiZGF0YVwiIFt0eXBlXT1cInBpZVR5cGVcIiBbaXNEYXJrXT1cImlzRGFya1wiPjwvbGliLXBpZT5cclxuXHJcbiAgICA8bGliLWJ1YmJsZSAqbmdJZj1cIlsnYnViYmxlJ10uaW5jbHVkZXMoZGF0YS50eXBlID8/ICcnKVwiIFxyXG4gICAgICBbY2FyZF09XCJkYXRhXCIgW3R5cGVdPVwiYnViYmxlVHlwZVwiIFtpc0RhcmtdPVwiaXNEYXJrXCI+PC9saWItYnViYmxlPlxyXG5cclxuICAgIDxsaWItc2ltcGxlLWNhcmQgKm5nSWY9XCJbJ3NpbXBsZUNhcmQnXS5pbmNsdWRlcyhkYXRhLnR5cGUgPz8gJycpXCIgXHJcbiAgICAgIFtjYXJkXT1cImRhdGFcIiBbdHlwZV09XCJjYXJkVHlwZVwiIFtpc0RhcmtdPVwiaXNEYXJrXCI+PC9saWItc2ltcGxlLWNhcmQ+XHJcblxyXG4gICAgPGxpYi10YWJsZSAqbmdJZj1cIlsndGFibGUnXS5pbmNsdWRlcyhkYXRhLnR5cGUgPz8gJycpXCIgXHJcbiAgICAgIFtjYXJkXT1cImRhdGFcIiBbdHlwZV09XCJ0YWJsZVR5cGVcIiBbaXNEYXJrXT1cImlzRGFya1wiPjwvbGliLXRhYmxlPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWh0bWxcIiAqbmdJZj1cImRhdGEudHlwZSA9PSAnaHRtbCdcIiBbaW5uZXJIdG1sXT1cInNhZmVIdG1sXCI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPiJdfQ==
@@ -0,0 +1,245 @@
1
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
2
+ import { BaseChartDirective } from 'ng2-charts';
3
+ import { getContrastColor, randomColor } from '../../../services/generic';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ng2-charts";
6
+ export class BarLineComponent {
7
+ constructor() {
8
+ this.type = 'bar';
9
+ this.isDark = false;
10
+ this.card = {};
11
+ this.description = '';
12
+ this.loading = true;
13
+ this.canvasHeight = 0;
14
+ this.canvasWidth = 0;
15
+ this.config = {
16
+ type: 'bar',
17
+ data: {
18
+ labels: [],
19
+ datasets: []
20
+ },
21
+ options: {}
22
+ };
23
+ this.options = {
24
+ responsive: true,
25
+ maintainAspectRatio: false,
26
+ plugins: {
27
+ legend: {
28
+ position: 'top',
29
+ color: this.isDark ? '#FFF' : '#333'
30
+ },
31
+ datalabels: {
32
+ display: false
33
+ }
34
+ }
35
+ };
36
+ }
37
+ ngOnInit() {
38
+ if (['stackedBar', 'verticalBar', 'verticalStackedBar', 'progressBar', 'verticalProgressBar'].includes(this.type)) {
39
+ this.config.type = 'bar';
40
+ }
41
+ else if (['line', 'curveLine', 'lineBar', 'lineBarStacked'].includes(this.type)) {
42
+ this.config.type = 'line';
43
+ }
44
+ else if (['radar'].includes(this.type)) {
45
+ this.config.type = 'radar';
46
+ }
47
+ this.options.indexAxis = ['verticalBar', 'verticalStackedBar', 'verticalProgressBar'].includes(this.type) ? 'y' : 'x';
48
+ if (['stackedBar', 'verticalStackedBar', 'lineBarStacked', 'progressBar', 'verticalProgressBar'].includes(this.type)) {
49
+ this.options.scales = { x: { stacked: true }, y: { stacked: true } };
50
+ }
51
+ if (['progressBar', 'verticalProgressBar'].includes(this.type) || this.card.showPorcent) {
52
+ this.options.plugins.tooltip = {
53
+ callbacks: {
54
+ label: function (context) {
55
+ return context.raw + '%';
56
+ }
57
+ }
58
+ };
59
+ }
60
+ if (this.card.showLabel) {
61
+ this.options.plugins.datalabels = {
62
+ anchor: 'center',
63
+ align: 'center',
64
+ formatter: (value) => this.card.showPorcent ? value + '%' : value,
65
+ color: (context) => {
66
+ if (this.card.fontColor)
67
+ return this.card.fontColor;
68
+ const bg = context.dataset.backgroundColor;
69
+ return getContrastColor(bg);
70
+ },
71
+ font: {
72
+ weight: 'bold'
73
+ }
74
+ };
75
+ }
76
+ this.config.options = this.options;
77
+ this.config.data.datasets = this.formatDataset();
78
+ this.description = this.describeBar(this.config);
79
+ }
80
+ ngAfterViewInit() {
81
+ this.resizeObserver = new ResizeObserver(() => {
82
+ if (this.chart) {
83
+ setTimeout(() => {
84
+ this.triggerResize();
85
+ }, 0);
86
+ }
87
+ });
88
+ this.resizeObserver.observe(this.container.nativeElement);
89
+ setTimeout(() => {
90
+ this.chart?.chart?.resize();
91
+ }, 50);
92
+ this.loading = false;
93
+ }
94
+ ngOnDestroy() {
95
+ if (this.resizeObserver) {
96
+ this.resizeObserver.disconnect();
97
+ }
98
+ }
99
+ ngOnChanges(changes) {
100
+ if (changes['isDark']) {
101
+ this.applyTheme();
102
+ }
103
+ }
104
+ applyTheme() {
105
+ if (this.chart) {
106
+ this.chart.update();
107
+ }
108
+ }
109
+ triggerResize() {
110
+ if (this.chart?.chart) {
111
+ this.chart.chart.resize();
112
+ this.chart.update();
113
+ }
114
+ }
115
+ formatDataset() {
116
+ if (!this.card?.data?.length)
117
+ return [];
118
+ if (!this.card.axisX?.key)
119
+ return [];
120
+ const labels = this.card.data.map(row => row[this.card.axisX?.key ?? '']);
121
+ this.config.data.labels = labels;
122
+ var sumData = [];
123
+ const datasets = this.card.keys?.map(item => {
124
+ const data = this.card.data?.map(row => {
125
+ const value = row[item.key];
126
+ return typeof value === 'string'
127
+ ? Number(value)
128
+ : value ?? 0;
129
+ }) ?? [];
130
+ if (['progressBar', 'verticalProgressBar'].includes(this.type)) {
131
+ sumData.push(...data);
132
+ }
133
+ if (!item.color) {
134
+ item.color = randomColor();
135
+ }
136
+ var result = {
137
+ label: item.label,
138
+ data,
139
+ backgroundColor: item.color,
140
+ borderColor: item.color,
141
+ fill: item.fill ?? false,
142
+ };
143
+ if (this.card.stacked && item.stackKey) {
144
+ result['stack'] = item.stackKey;
145
+ }
146
+ if (item.type) {
147
+ result['type'] = item.type;
148
+ }
149
+ if (this.type == 'curveLine') {
150
+ result = {
151
+ ...result,
152
+ tension: 0.4
153
+ };
154
+ }
155
+ return result;
156
+ }) ?? [];
157
+ if (['progressBar', 'verticalProgressBar'].includes(this.type)) {
158
+ const remaining = sumData.map(s => 100 - s);
159
+ datasets.push({
160
+ label: '',
161
+ data: remaining,
162
+ backgroundColor: '#e0e0e05e',
163
+ borderWidth: 0
164
+ });
165
+ }
166
+ return datasets;
167
+ }
168
+ describeBar(config) {
169
+ const { data } = config;
170
+ const labels = data?.labels || [];
171
+ const datasets = data?.datasets || [];
172
+ const axisLabel = this.card?.axisX?.label || 'categoria';
173
+ const barDatasets = datasets.filter((ds) => !ds.type || ds.type === 'bar');
174
+ const lineDatasets = datasets.filter((ds) => ds.type === 'line');
175
+ const seriesNames = barDatasets.map((ds) => ds.label || 'Série');
176
+ const lineNames = lineDatasets.map((ds) => ds.label || 'Linha');
177
+ let type = 'barras';
178
+ if (['curveLine', 'lineBar', 'lineBarStacked'].includes(this.type)) {
179
+ type = 'linhas';
180
+ }
181
+ let orientation = '';
182
+ if (['verticalBar', 'verticalStackedBar', 'verticalProgressBar'].includes(this.type)) {
183
+ orientation = 'vertical ';
184
+ }
185
+ let format = 'agrupadas';
186
+ if (['stackedBar', 'verticalStackedBar', 'lineBarStacked'].includes(this.type)) {
187
+ format = 'empilhadas';
188
+ }
189
+ let extra = '';
190
+ if (['progressBar', 'verticalProgressBar'].includes(this.type)) {
191
+ extra = ' demonstrando as porcentagens';
192
+ }
193
+ let description = this.card.title +
194
+ ` - Gráfico de ${type} ${orientation}${format} por ${axisLabel}${extra}, comparando ${seriesNames.join(' e ')}`;
195
+ if (lineDatasets.length) {
196
+ description += `, com linha representando ${lineNames.join(' e ')}`;
197
+ }
198
+ description += '. ';
199
+ labels.forEach((label, index) => {
200
+ const barValues = barDatasets.map((ds) => {
201
+ const value = ds.data?.[index] ?? 'sem valor';
202
+ return `${ds.label}: ${value}`;
203
+ });
204
+ let lineValueText = '';
205
+ if (lineDatasets.length) {
206
+ const lineValues = lineDatasets.map((ds) => {
207
+ const value = ds.data?.[index] ?? 'sem valor';
208
+ return `${ds.label}: ${value}`;
209
+ });
210
+ lineValueText = `. Linha: ${lineValues.join(', ')}`;
211
+ }
212
+ description += `\nEm ${label}: ${barValues.join(', ')}${lineValueText}.`;
213
+ });
214
+ return description.trim();
215
+ }
216
+ describeStackedBar(labels, datasets) {
217
+ return this.card.title + ` - Gráfico de barras empilhadas com ${datasets.length} séries: ` +
218
+ datasets.map(ds => ds.label).join(', ');
219
+ }
220
+ onresize() {
221
+ this.triggerResize();
222
+ }
223
+ }
224
+ BarLineComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BarLineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
225
+ BarLineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: BarLineComponent, selector: "lib-bar-line", 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 }], usesOnChanges: true, ngImport: i0, template: "\r\n<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 [title]=\"description\"\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"] }] });
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BarLineComponent, decorators: [{
227
+ type: Component,
228
+ args: [{ selector: 'lib-bar-line', template: "\r\n<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 [title]=\"description\"\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"] }]
229
+ }], ctorParameters: function () { return []; }, propDecorators: { type: [{
230
+ type: Input
231
+ }], isDark: [{
232
+ type: Input
233
+ }], card: [{
234
+ type: Input
235
+ }], container: [{
236
+ type: ViewChild,
237
+ args: ['container']
238
+ }], chart: [{
239
+ type: ViewChild,
240
+ args: [BaseChartDirective]
241
+ }], onresize: [{
242
+ type: HostListener,
243
+ args: ['window:resize']
244
+ }] } });
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWxpbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbW9yZGFzaC9zcmMvbGliL2NvbXBvbmVudHMvY2hhcnRzL2Jhci1saW5lL2Jhci1saW5lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy9iYXItbGluZS9iYXItbGluZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQXlCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc1RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFPMUUsTUFBTSxPQUFPLGdCQUFnQjtJQXVDM0I7UUFyQ1MsU0FBSSxHQUF3QixLQUFLLENBQUM7UUFDbEMsV0FBTSxHQUFXLEtBQUssQ0FBQztRQUN2QixTQUFJLEdBQVEsRUFBVSxDQUFDO1FBRWhDLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFDeEIsaUJBQVksR0FBVSxDQUFDLENBQUM7UUFDeEIsZ0JBQVcsR0FBVSxDQUFDLENBQUM7UUFPdkIsV0FBTSxHQUFpRDtZQUNyRCxJQUFJLEVBQUUsS0FBSztZQUNYLElBQUksRUFBRTtnQkFDSixNQUFNLEVBQUUsRUFBRTtnQkFDVixRQUFRLEVBQUUsRUFBRTthQUNiO1lBQ0QsT0FBTyxFQUFDLEVBQTRDO1NBQ3JELENBQUM7UUFFRixZQUFPLEdBQTBDO1lBQy9DLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsT0FBTyxFQUFFO2dCQUNQLE1B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LENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OzhHQS9QVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixzU0FZaEIsa0JBQWtCLHFFQ3ZCL0IsbVNBWU07NEZERE8sZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGNBQWM7MEVBTWYsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBT2tCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDUyxLQUFLO3NCQUFuQyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFpUDdCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENoYXJ0LCBDaGFydENvbmZpZ3VyYXRpb24sIENoYXJ0RGF0YSwgQ2hhcnREYXRhc2V0LCBDaGFydE9wdGlvbnMsIENoYXJ0VHlwZSB9IGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgQ2FyZCwgQ2hhdENvbmZpZywgRGFzaGJvYXJkQmFyTGluZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGFzaGJvYXJkLm1vZGVsJztcclxuaW1wb3J0IHsgQmFzZUNoYXJ0RGlyZWN0aXZlIH0gZnJvbSAnbmcyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IGdldENvbnRyYXN0Q29sb3IsIHJhbmRvbUNvbG9yIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2VuZXJpYyc7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICdjaGFydGpzLXBsdWdpbi1kYXRhbGFiZWxzJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYmFyLWxpbmUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItbGluZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYmFyLWxpbmUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFyTGluZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIHR5cGU6RGFzaGJvYXJkQmFyTGluZVR5cGUgPSAnYmFyJztcclxuICBASW5wdXQoKSBpc0Rhcms6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhcmQ6Q2FyZCA9IHt9IGFzIENhcmQ7XHJcblxyXG4gIGRlc2NyaXB0aW9uOnN0cmluZyA9ICcnO1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGNhbnZhc0hlaWdodDpudW1iZXIgPSAwO1xyXG4gIGNhbnZhc1dpZHRoOm51bWJlciA9IDA7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoQmFzZUNoYXJ0RGlyZWN0aXZlKSBjaGFydD86IEJhc2VDaGFydERpcmVjdGl2ZTtcclxuICBcclxuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyITogUmVzaXplT2JzZXJ2ZXI7XHJcblxyXG4gIGNvbmZpZzogQ2hhcnRDb25maWd1cmF0aW9uPCdiYXInIHwgJ2xpbmUnIHwgJ3JhZGFyJz4gPSB7XHJcbiAgICB0eXBlOiAnYmFyJyxcclxuICAgIGRhdGE6IHtcclxuICAgICAgbGFiZWxzOiBbXSxcclxuICAgICAgZGF0YXNldHM6IFtdXHJcbiAgICB9LFxyXG4gICAgb3B0aW9uczp7fSBhcyBDaGFydE9wdGlvbnM8J2JhcicgfCAnbGluZScgfCAncmFkYXInPlxyXG4gIH07XHJcblxyXG4gIG9wdGlvbnM6Q2hhcnRPcHRpb25zPCdiYXInIHwgJ2xpbmUnIHwgJ3JhZGFyJz4gPSB7XHJcbiAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgICBjb2xvcjogdGhpcy5pc0RhcmsgPyAnI0ZGRicgOiAnIzMzMydcclxuICAgICAgfSxcclxuICAgICAgZGF0YWxhYmVsczoge1xyXG4gICAgICAgIGRpc3BsYXk6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGFzIENoYXJ0T3B0aW9uczwnYmFyJyB8ICdsaW5lJyB8ICdyYWRhcic+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmKFsnc3RhY2tlZEJhcicsJ3ZlcnRpY2FsQmFyJywndmVydGljYWxTdGFja2VkQmFyJywncHJvZ3Jlc3NCYXInLCd2ZXJ0aWNhbFByb2dyZXNzQmFyJ10uaW5jbHVkZXModGhpcy50eXBlKSApe1xyXG4gICAgICB0aGlzLmNvbmZpZy50eXBlID0gJ2Jhcic7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKFsnbGluZScsICdjdXJ2ZUxpbmUnLCdsaW5lQmFyJywnbGluZUJhclN0YWNrZWQnXS5pbmNsdWRlcyh0aGlzLnR5cGUpKXtcclxuICAgICAgdGhpcy5jb25maWcudHlwZSA9ICdsaW5lJztcclxuICAgIH1cclxuICAgIGVsc2UgaWYoWydyYWRhciddLmluY2x1ZGVzKHRoaXMudHlwZSkpe1xyXG4gICAgICB0aGlzLmNvbmZpZy50eXBlID0gJ3JhZGFyJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMhLmluZGV4QXhpcyA9IFsndmVydGljYWxCYXInLCd2ZXJ0aWNhbFN0YWNrZWRCYXInLCd2ZXJ0aWNhbFByb2dyZXNzQmFyJ10uaW5jbHVkZXModGhpcy50eXBlKT8gJ3knOid4JztcclxuICAgIFxyXG4gICAgaWYoWydzdGFja2VkQmFyJywndmVydGljYWxTdGFja2VkQmFyJywnbGluZUJhclN0YWNrZWQnLCAncHJvZ3Jlc3NCYXInLCd2ZXJ0aWNhbFByb2dyZXNzQmFyJ10uaW5jbHVkZXModGhpcy50eXBlKSApe1xyXG4gICAgICB0aGlzLm9wdGlvbnMuc2NhbGVzID0gIHsgeDogeyBzdGFja2VkOiB0cnVlIH0sIHk6IHsgc3RhY2tlZDogdHJ1ZSB9IH07XHJcbiAgICB9XHJcbiAgICBpZihbJ3Byb2dyZXNzQmFyJywndmVydGljYWxQcm9ncmVzc0JhciddLmluY2x1ZGVzKHRoaXMudHlwZSkgfHwgdGhpcy5jYXJkLnNob3dQb3JjZW50KXtcclxuICAgICAgdGhpcy5vcHRpb25zIS5wbHVnaW5zIS50b29sdGlwID0ge1xyXG4gICAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgICAgbGFiZWw6IGZ1bmN0aW9uKGNvbnRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmF3ICsgJyUnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodGhpcy5jYXJkLnNob3dMYWJlbCl7XHJcbiAgICAgIHRoaXMub3B0aW9ucyEucGx1Z2lucyEuZGF0YWxhYmVscyA9IHtcclxuICAgICAgICBhbmNob3I6ICdjZW50ZXInLFxyXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICBmb3JtYXR0ZXI6ICh2YWx1ZTogbnVtYmVyKSA9PiB0aGlzLmNhcmQuc2hvd1BvcmNlbnQ/IHZhbHVlICsgJyUnOiB2YWx1ZSxcclxuICAgICAgICBjb2xvcjogKGNvbnRleHQ6IENvbnRleHQpID0+IHtcclxuICAgICAgICAgIGlmKHRoaXMuY2FyZC5mb250Q29sb3IpIHJldHVybiB0aGlzLmNhcmQuZm9udENvbG9yXHJcbiAgICAgICAgICBjb25zdCBiZyA9IGNvbnRleHQuZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRyYXN0Q29sb3IoYmcpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZm9udDoge1xyXG4gICAgICAgICAgd2VpZ2h0OiAnYm9sZCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY29uZmlnLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhLmRhdGFzZXRzID0gdGhpcy5mb3JtYXREYXRhc2V0KCk7XHJcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gIHRoaXMuZGVzY3JpYmVCYXIodGhpcy5jb25maWcpXHJcbiAgICBcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jaGFydCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cmlnZ2VyUmVzaXplKCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jaGFydD8uY2hhcnQ/LnJlc2l6ZSgpO1xyXG4gICAgfSwgNTApO1xyXG5cclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydpc0RhcmsnXSkge1xyXG4gICAgICB0aGlzLmFwcGx5VGhlbWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlUaGVtZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyaWdnZXJSZXNpemUoKSB7XHJcbiAgICBpZiAodGhpcy5jaGFydD8uY2hhcnQpIHtcclxuICAgICAgdGhpcy5jaGFydC5jaGFydC5yZXNpemUoKTtcclxuICAgICAgdGhpcy5jaGFydC51cGRhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdERhdGFzZXQoKTogQ2hhcnREYXRhc2V0PCdiYXInIHwgJ2xpbmUnIHwgJ3JhZGFyJz5bXSB7XHJcbiAgICBpZiAoIXRoaXMuY2FyZD8uZGF0YT8ubGVuZ3RoICkgcmV0dXJuIFtdO1xyXG4gICAgaWYgKCF0aGlzLmNhcmQuYXhpc1g/LmtleSkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5jYXJkLmRhdGEubWFwKHJvdyA9PiByb3dbdGhpcy5jYXJkLmF4aXNYPy5rZXkgPz8gJyddKTtcclxuICAgIHRoaXMuY29uZmlnLmRhdGEubGFiZWxzID0gbGFiZWxzO1xyXG4gICAgdmFyIHN1bURhdGE6IG51bWJlcltdID0gW11cclxuICAgIGNvbnN0IGRhdGFzZXRzOiBDaGFydERhdGFzZXQ8J2JhcicgfCAnbGluZScgfCAncmFkYXInPltdID0gdGhpcy5jYXJkLmtleXM/Lm1hcChpdGVtID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2FyZC5kYXRhPy5tYXAocm93ID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd1tpdGVtLmtleV07XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcclxuICAgICAgICAgID8gTnVtYmVyKHZhbHVlKVxyXG4gICAgICAgICAgOiB2YWx1ZSA/PyAwO1xyXG4gICAgICB9KSA/PyBbXTtcclxuICAgICAgaWYoWydwcm9ncmVzc0JhcicsJ3ZlcnRpY2FsUHJvZ3Jlc3NCYXInXS5pbmNsdWRlcyh0aGlzLnR5cGUpKXtcclxuICAgICAgICBzdW1EYXRhLnB1c2goLi4uZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoIWl0ZW0uY29sb3Ipe1xyXG4gICAgICAgIGl0ZW0uY29sb3IgPSByYW5kb21Db2xvcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGl0ZW0uY29sb3IsXHJcbiAgICAgICAgYm9yZGVyQ29sb3I6IGl0ZW0uY29sb3IsXHJcbiAgICAgICAgZmlsbDogaXRlbS5maWxsID8/IGZhbHNlLFxyXG4gICAgICB9IGFzIENoYXJ0RGF0YXNldDwnYmFyJyB8ICdsaW5lJyB8ICdyYWRhcic+O1xyXG4gICAgICBpZiggdGhpcy5jYXJkLnN0YWNrZWQgJiYgaXRlbS5zdGFja0tleSl7XHJcbiAgICAgICAgcmVzdWx0WydzdGFjayddID0gaXRlbS5zdGFja0tleTtcclxuICAgICAgfVxyXG4gICAgICBpZihpdGVtLnR5cGUpe1xyXG4gICAgICAgIHJlc3VsdFsndHlwZSddID0gaXRlbS50eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRoaXMudHlwZSA9PSAnY3VydmVMaW5lJyl7XHJcbiAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgICAgdGVuc2lvbjogMC40XHJcbiAgICAgICAgfSBhcyBDaGFydERhdGFzZXQ8J2xpbmUnPlxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9KSA/PyBbXTtcclxuICAgIGlmIChbJ3Byb2dyZXNzQmFyJywndmVydGljYWxQcm9ncmVzc0JhciddLmluY2x1ZGVzKHRoaXMudHlwZSkpIHtcclxuICAgICAgY29uc3QgcmVtYWluaW5nID0gc3VtRGF0YS5tYXAocyA9PiAxMDAgLSBzKTtcclxuICAgICAgZGF0YXNldHMucHVzaCh7XHJcbiAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgIGRhdGE6IHJlbWFpbmluZyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZTBlMGUwNWUnLFxyXG4gICAgICAgIGJvcmRlcldpZHRoOiAwXHJcbiAgICAgIH0gYXMgQ2hhcnREYXRhc2V0PCdiYXInPik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YXNldHM7XHJcbiAgfVxyXG4gIFxyXG4gIGRlc2NyaWJlQmFyKGNvbmZpZzogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHsgZGF0YSB9ID0gY29uZmlnO1xyXG5cclxuICAgIGNvbnN0IGxhYmVscyA9IGRhdGE/LmxhYmVscyB8fCBbXTtcclxuICAgIGNvbnN0IGRhdGFzZXRzID0gZGF0YT8uZGF0YXNldHMgfHwgW107XHJcblxyXG4gICAgY29uc3QgYXhpc0xhYmVsID0gdGhpcy5jYXJkPy5heGlzWD8ubGFiZWwgfHwgJ2NhdGVnb3JpYSc7XHJcblxyXG4gICAgY29uc3QgYmFyRGF0YXNldHMgPSBkYXRhc2V0cy5maWx0ZXIoKGRzOiBhbnkpID0+ICFkcy50eXBlIHx8IGRzLnR5cGUgPT09ICdiYXInKTtcclxuICAgIGNvbnN0IGxpbmVEYXRhc2V0cyA9IGRhdGFzZXRzLmZpbHRlcigoZHM6IGFueSkgPT4gZHMudHlwZSA9PT0gJ2xpbmUnKTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXNOYW1lcyA9IGJhckRhdGFzZXRzLm1hcCgoZHM6IGFueSkgPT4gZHMubGFiZWwgfHwgJ1PDqXJpZScpO1xyXG4gICAgY29uc3QgbGluZU5hbWVzID0gbGluZURhdGFzZXRzLm1hcCgoZHM6IGFueSkgPT4gZHMubGFiZWwgfHwgJ0xpbmhhJyk7XHJcbiAgICBsZXQgdHlwZSA9ICdiYXJyYXMnO1xyXG4gICAgaWYgKFsnY3VydmVMaW5lJywnbGluZUJhcicsJ2xpbmVCYXJTdGFja2VkJ10uaW5jbHVkZXModGhpcy50eXBlKSkge1xyXG4gICAgICB0eXBlID0gJ2xpbmhhcyc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9yaWVudGF0aW9uID0gJyc7XHJcbiAgICBpZiAoWyd2ZXJ0aWNhbEJhcicsICd2ZXJ0aWNhbFN0YWNrZWRCYXInLCAndmVydGljYWxQcm9ncmVzc0JhciddLmluY2x1ZGVzKHRoaXMudHlwZSkpIHtcclxuICAgICAgb3JpZW50YXRpb24gPSAndmVydGljYWwgJztcclxuICAgIH1cclxuICAgIGxldCBmb3JtYXQgPSAnYWdydXBhZGFzJztcclxuICAgIGlmIChbJ3N0YWNrZWRCYXInLCAndmVydGljYWxTdGFja2VkQmFyJywgJ2xpbmVCYXJTdGFja2VkJ10uaW5jbHVkZXModGhpcy50eXBlKSkge1xyXG4gICAgICBmb3JtYXQgPSAnZW1waWxoYWRhcyc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGV4dHJhID0gJyc7XHJcbiAgICBpZiAoWydwcm9ncmVzc0JhcicsICd2ZXJ0aWNhbFByb2dyZXNzQmFyJ10uaW5jbHVkZXModGhpcy50eXBlKSkge1xyXG4gICAgICBleHRyYSA9ICcgZGVtb25zdHJhbmRvIGFzIHBvcmNlbnRhZ2Vucyc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRlc2NyaXB0aW9uID1cclxuICAgICAgdGhpcy5jYXJkLnRpdGxlICtcclxuICAgICAgYCAtIEdyw6FmaWNvIGRlICR7dHlwZX0gJHtvcmllbnRhdGlvbn0ke2Zvcm1hdH0gcG9yICR7YXhpc0xhYmVsfSR7ZXh0cmF9LCBjb21wYXJhbmRvICR7c2VyaWVzTmFtZXMuam9pbignIGUgJyl9YDtcclxuXHJcbiAgICBpZiAobGluZURhdGFzZXRzLmxlbmd0aCkge1xyXG4gICAgICBkZXNjcmlwdGlvbiArPSBgLCBjb20gbGluaGEgcmVwcmVzZW50YW5kbyAke2xpbmVOYW1lcy5qb2luKCcgZSAnKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc2NyaXB0aW9uICs9ICcuICc7XHJcblxyXG4gICAgbGFiZWxzLmZvckVhY2goKGxhYmVsOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgYmFyVmFsdWVzID0gYmFyRGF0YXNldHMubWFwKChkczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkcy5kYXRhPy5baW5kZXhdID8/ICdzZW0gdmFsb3InO1xyXG4gICAgICAgIHJldHVybiBgJHtkcy5sYWJlbH06ICR7dmFsdWV9YDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgbGluZVZhbHVlVGV4dCA9ICcnO1xyXG5cclxuICAgICAgaWYgKGxpbmVEYXRhc2V0cy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBsaW5lVmFsdWVzID0gbGluZURhdGFzZXRzLm1hcCgoZHM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkcy5kYXRhPy5baW5kZXhdID8/ICdzZW0gdmFsb3InO1xyXG4gICAgICAgICAgcmV0dXJuIGAke2RzLmxhYmVsfTogJHt2YWx1ZX1gO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsaW5lVmFsdWVUZXh0ID0gYC4gTGluaGE6ICR7bGluZVZhbHVlcy5qb2luKCcsICcpfWA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlc2NyaXB0aW9uICs9IGBcXG5FbSAke2xhYmVsfTogJHtiYXJWYWx1ZXMuam9pbignLCAnKX0ke2xpbmVWYWx1ZVRleHR9LmA7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZGVzY3JpcHRpb24udHJpbSgpO1xyXG4gIH1cclxuXHJcbiAgZGVzY3JpYmVTdGFja2VkQmFyKGxhYmVsczogYW55W10sIGRhdGFzZXRzOiBhbnlbXSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jYXJkLnRpdGxlICsgYCAtIEdyw6FmaWNvIGRlIGJhcnJhcyBlbXBpbGhhZGFzIGNvbSAke2RhdGFzZXRzLmxlbmd0aH0gc8OpcmllczogYCArXHJcbiAgICAgIGRhdGFzZXRzLm1hcChkcyA9PiBkcy5sYWJlbCkuam9pbignLCAnKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gIG9ucmVzaXplKCkge1xyXG4gICAgdGhpcy50cmlnZ2VyUmVzaXplKCk7XHJcbiAgfVxyXG59XHJcblxyXG4iLCJcclxuPGRpdiBjbGFzcz1cImNoYXJ0LWRpdlwiICNjb250YWluZXI+XHJcbiAgPGNhbnZhc1xyXG4gICAgI2NoYXJ0XHJcbiAgICBiYXNlQ2hhcnRcclxuICAgIGNsYXNzPVwiY2hhcnQgY2hhcnQtYmFyIGNoYXJ0LWl0ZW1cIlxyXG4gICAgW2RhdGFdPVwiY29uZmlnLmRhdGFcIlxyXG4gICAgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNcIlxyXG4gICAgW3R5cGVdPVwiY29uZmlnLnR5cGVcIlxyXG4gICAgW3RpdGxlXT1cImRlc2NyaXB0aW9uXCJcclxuICAgID5cclxuICA8L2NhbnZhcz5cclxuPC9kaXY+Il19
@@ -0,0 +1,147 @@
1
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
2
+ import { BaseChartDirective } from 'ng2-charts';
3
+ import { randomColor } from '../../../services/generic';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ng2-charts";
6
+ export class BubbleComponent {
7
+ constructor() {
8
+ this.type = 'bubble';
9
+ this.isDark = false;
10
+ this.card = {};
11
+ this.loading = true;
12
+ this.canvasHeight = 0;
13
+ this.canvasWidth = 0;
14
+ this.config = {
15
+ type: this.type,
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.options.indexAxis = this.card.axisOrientation ?? 'x';
38
+ if (this.card.stacked) {
39
+ this.options.scales = { x: { stacked: true }, y: { stacked: true } };
40
+ }
41
+ if (this.card.showPorcent) {
42
+ this.options.plugins.tooltip = {
43
+ callbacks: {
44
+ label: function (context) {
45
+ return context.raw + '%';
46
+ }
47
+ }
48
+ };
49
+ }
50
+ if (this.card.showLabel) {
51
+ this.options.plugins.datalabels = {
52
+ anchor: 'center',
53
+ align: 'center',
54
+ formatter: (value) => this.card.showPorcent ? value + '%' : value,
55
+ color: '#fff',
56
+ font: {
57
+ weight: 'bold'
58
+ }
59
+ };
60
+ }
61
+ this.config.type = this.type;
62
+ this.config.options = this.options;
63
+ this.config.data.datasets = this.formatDataset();
64
+ }
65
+ ngAfterViewInit() {
66
+ this.resizeObserver = new ResizeObserver(() => {
67
+ if (this.chart) {
68
+ setTimeout(() => {
69
+ this.triggerResize();
70
+ }, 0);
71
+ }
72
+ });
73
+ this.resizeObserver.observe(this.container.nativeElement);
74
+ setTimeout(() => {
75
+ this.chart?.chart?.resize();
76
+ }, 50);
77
+ this.loading = false;
78
+ }
79
+ ngOnDestroy() {
80
+ if (this.resizeObserver) {
81
+ this.resizeObserver.disconnect();
82
+ }
83
+ }
84
+ triggerResize() {
85
+ if (this.chart?.chart) {
86
+ this.chart.chart.resize();
87
+ this.chart.update();
88
+ }
89
+ }
90
+ formatDataset() {
91
+ if (!this.card?.data?.length)
92
+ return [];
93
+ if (!this.card.axisX?.key)
94
+ return [];
95
+ const labels = this.card.data.map(row => row[this.card.axisX?.key ?? '']);
96
+ this.config.data.labels = labels;
97
+ const datasets = this.card.keys?.map(item => {
98
+ const data = this.card.data?.map(row => {
99
+ const value = {
100
+ x: row[item.keyX ?? ''],
101
+ y: row[item.keyY ?? ''],
102
+ r: row[item.keyR ?? '']
103
+ };
104
+ return value;
105
+ }) ?? [];
106
+ if (!item.color) {
107
+ item.color = randomColor();
108
+ }
109
+ var result = {
110
+ label: item.label,
111
+ data,
112
+ backgroundColor: item.color,
113
+ fill: item.fill ?? false,
114
+ };
115
+ if (this.card.stacked && item.stackKey) {
116
+ result['stack'] = item.stackKey;
117
+ }
118
+ return result;
119
+ }) ?? [];
120
+ return datasets;
121
+ }
122
+ onresize() {
123
+ this.triggerResize();
124
+ }
125
+ }
126
+ BubbleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BubbleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
127
+ BubbleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: BubbleComponent, selector: "lib-bubble", 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"] }] });
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BubbleComponent, decorators: [{
129
+ type: Component,
130
+ args: [{ selector: 'lib-bubble', 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"] }]
131
+ }], ctorParameters: function () { return []; }, propDecorators: { type: [{
132
+ type: Input
133
+ }], isDark: [{
134
+ type: Input
135
+ }], card: [{
136
+ type: Input
137
+ }], container: [{
138
+ type: ViewChild,
139
+ args: ['container']
140
+ }], chart: [{
141
+ type: ViewChild,
142
+ args: [BaseChartDirective]
143
+ }], onresize: [{
144
+ type: HostListener,
145
+ args: ['window:resize']
146
+ }] } });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnViYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy9idWJibGUvYnViYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaW1vcmRhc2gvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0cy9idWJibGUvYnViYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBTXhELE1BQU0sT0FBTyxlQUFlO0lBc0MxQjtRQXBDUyxTQUFJLEdBQVksUUFBUSxDQUFDO1FBQ3pCLFdBQU0sR0FBVyxLQUFLLENBQUM7UUFDdkIsU0FBSSxHQUFRLEVBQVUsQ0FBQztRQUVoQyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBQ3hCLGlCQUFZLEdBQVUsQ0FBQyxDQUFDO1FBQ3hCLGdCQUFXLEdBQVUsQ0FBQyxDQUFDO1FBT3ZCLFdBQU0sR0FBaUM7WUFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxFQUFFO2FBQ2I7WUFDRCxPQUFPLEVBQUMsRUFBNEI7U0FDckMsQ0FBQztRQUVGLFlBQU8sR0FBMEI7WUFDL0IsVUFBVSxFQUFFLElBQUk7WUFDaEIsbUJBQW1CLEVBQUUsS0FBSztZQUMxQixPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFO29CQUNOLFFBQVEsRUFBRSxLQUFLO29CQUNmLEtBQUssRUFB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QUNqQixJQUFJO2dCQUNKLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSzthQUNDLENBQUM7WUFFNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFDO2dCQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNqQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OzZHQWhKVSxlQUFlO2lHQUFmLGVBQWUsb1NBV2Ysa0JBQWtCLGdEQ3JCL0IsZ1FBVU07NEZEQU8sZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxZQUFZOzBFQU1iLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQU1rQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1MsS0FBSztzQkFBbkMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBbUk3QixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFydCwgQ2hhcnRDb25maWd1cmF0aW9uLCBDaGFydERhdGEsIENoYXJ0RGF0YXNldCwgQ2hhcnRPcHRpb25zLCBDaGFydFR5cGUgfSBmcm9tICdjaGFydC5qcyc7XHJcbmltcG9ydCB7IENhcmQsIENoYXRDb25maWcgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGFzaGJvYXJkLm1vZGVsJztcclxuaW1wb3J0IHsgQmFzZUNoYXJ0RGlyZWN0aXZlIH0gZnJvbSAnbmcyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IHJhbmRvbUNvbG9yIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2VuZXJpYyc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJ1YmJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2J1YmJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYnViYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJ1YmJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIHR5cGU6J2J1YmJsZScgPSAnYnViYmxlJztcclxuICBASW5wdXQoKSBpc0Rhcms6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhcmQ6Q2FyZCA9IHt9IGFzIENhcmQ7XHJcblxyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGNhbnZhc0hlaWdodDpudW1iZXIgPSAwO1xyXG4gIGNhbnZhc1dpZHRoOm51bWJlciA9IDA7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoQmFzZUNoYXJ0RGlyZWN0aXZlKSBjaGFydD86IEJhc2VDaGFydERpcmVjdGl2ZTtcclxuXHJcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlciE6IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuICBjb25maWc6IENoYXJ0Q29uZmlndXJhdGlvbjwnYnViYmxlJz4gPSB7XHJcbiAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICBkYXRhOiB7XHJcbiAgICAgIGxhYmVsczogW10sXHJcbiAgICAgIGRhdGFzZXRzOiBbXVxyXG4gICAgfSxcclxuICAgIG9wdGlvbnM6e30gYXMgQ2hhcnRPcHRpb25zPCdidWJibGUnPlxyXG4gIH07XHJcblxyXG4gIG9wdGlvbnM6Q2hhcnRPcHRpb25zPCdidWJibGUnPiA9IHtcclxuICAgIHJlc3BvbnNpdmU6IHRydWUsXHJcbiAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcclxuICAgIHBsdWdpbnM6IHtcclxuICAgICAgbGVnZW5kOiB7XHJcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICAgIGNvbG9yOiB0aGlzLmlzRGFyayA/ICcjRkZGJyA6ICcjMzMzJyxcclxuICAgICAgfSxcclxuICAgICAgZGF0YWxhYmVsczoge1xyXG4gICAgICAgIGRpc3BsYXk6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGFzIENoYXJ0T3B0aW9uczwnYnViYmxlJz47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zIS5pbmRleEF4aXMgPSB0aGlzLmNhcmQuYXhpc09yaWVudGF0aW9uID8/ICd4JztcclxuXHJcbiAgICBpZih0aGlzLmNhcmQuc3RhY2tlZCl7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zY2FsZXMgPSAgeyB4OiB7IHN0YWNrZWQ6IHRydWUgfSwgeTogeyBzdGFja2VkOiB0cnVlIH0gfTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmNhcmQuc2hvd1BvcmNlbnQpe1xyXG4gICAgICB0aGlzLm9wdGlvbnMhLnBsdWdpbnMhLnRvb2x0aXAgPSB7XHJcbiAgICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgICBsYWJlbDogZnVuY3Rpb24oY29udGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5yYXcgKyAnJSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5jYXJkLnNob3dMYWJlbCl7XHJcbiAgICAgIHRoaXMub3B0aW9ucyEucGx1Z2lucyEuZGF0YWxhYmVscyA9IHtcclxuICAgICAgICBhbmNob3I6ICdjZW50ZXInLFxyXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICBmb3JtYXR0ZXI6ICh2YWx1ZTogbnVtYmVyKSA9PiB0aGlzLmNhcmQuc2hvd1BvcmNlbnQ/IHZhbHVlICsgJyUnOiB2YWx1ZSxcclxuICAgICAgICBjb2xvcjogJyNmZmYnLFxyXG4gICAgICAgIGZvbnQ6IHtcclxuICAgICAgICAgIHdlaWdodDogJ2JvbGQnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb25maWcudHlwZSA9IHRoaXMudHlwZTtcclxuICAgIHRoaXMuY29uZmlnLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhLmRhdGFzZXRzID0gdGhpcy5mb3JtYXREYXRhc2V0KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudHJpZ2dlclJlc2l6ZSgpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hhcnQ/LmNoYXJ0Py5yZXNpemUoKTtcclxuICAgIH0sIDUwKTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgdHJpZ2dlclJlc2l6ZSgpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Py5jaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0LmNoYXJ0LnJlc2l6ZSgpO1xyXG4gICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0YXNldCgpOiBDaGFydERhdGFzZXQ8J2J1YmJsZSc+W10ge1xyXG4gICAgaWYgKCF0aGlzLmNhcmQ/LmRhdGE/Lmxlbmd0aCApIHJldHVybiBbXTtcclxuICAgIGlmICghdGhpcy5jYXJkLmF4aXNYPy5rZXkpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmNhcmQuZGF0YS5tYXAocm93ID0+IHJvd1t0aGlzLmNhcmQuYXhpc1g/LmtleSA/PyAnJ10pO1xyXG4gICAgdGhpcy5jb25maWcuZGF0YS5sYWJlbHMgPSBsYWJlbHM7XHJcblxyXG4gICAgY29uc3QgZGF0YXNldHM6IENoYXJ0RGF0YXNldDwnYnViYmxlJz5bXSA9IHRoaXMuY2FyZC5rZXlzPy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNhcmQuZGF0YT8ubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB7XHJcbiAgICAgICAgICB4OiByb3dbaXRlbS5rZXlYID8/ICcnXSxcclxuICAgICAgICAgIHk6IHJvd1tpdGVtLmtleVkgPz8gJyddLFxyXG4gICAgICAgICAgcjogcm93W2l0ZW0ua2V5UiA/PyAnJ11cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgfSkgPz8gW107XHJcblxyXG4gICAgICBpZighaXRlbS5jb2xvcil7XHJcbiAgICAgICAgaXRlbS5jb2xvciA9IHJhbmRvbUNvbG9yKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGl0ZW0uY29sb3IsXHJcbiAgICAgICAgZmlsbDogaXRlbS5maWxsID8/IGZhbHNlLFxyXG4gICAgICB9IGFzIENoYXJ0RGF0YXNldDwnYnViYmxlJz47XHJcbiAgICAgIFxyXG4gICAgICBpZiggdGhpcy5jYXJkLnN0YWNrZWQgJiYgaXRlbS5zdGFja0tleSl7XHJcbiAgICAgICAgcmVzdWx0WydzdGFjayddID0gaXRlbS5zdGFja0tleTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSkgPz8gW107XHJcbiAgICByZXR1cm4gZGF0YXNldHM7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBvbnJlc2l6ZSgpIHtcclxuICAgIHRoaXMudHJpZ2dlclJlc2l6ZSgpO1xyXG4gIH1cclxufVxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImNoYXJ0LWRpdlwiICNjb250YWluZXI+XHJcbiAgPGNhbnZhc1xyXG4gICAgI2NoYXJ0XHJcbiAgICBiYXNlQ2hhcnRcclxuICAgIGNsYXNzPVwiY2hhcnQgY2hhcnQtYmFyIGNoYXJ0LWl0ZW1cIlxyXG4gICAgW2RhdGFdPVwiY29uZmlnLmRhdGFcIlxyXG4gICAgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNcIlxyXG4gICAgW3R5cGVdPVwiY29uZmlnLnR5cGVcIlxyXG4gICAgPlxyXG4gIDwvY2FudmFzPlxyXG48L2Rpdj4iXX0=