@ogidor/dashboard 1.0.0 → 1.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.
@@ -1,4 +1,4 @@
1
- import { NgModule } from '@angular/core';
1
+ import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
2
2
  import { BrowserModule } from '@angular/platform-browser';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import { FormsModule } from '@angular/forms';
@@ -38,7 +38,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
38
38
  exports: [
39
39
  DashboardComponent,
40
40
  WidgetRendererComponent
41
- ]
41
+ ],
42
+ schemas: [NO_ERRORS_SCHEMA]
42
43
  }]
43
44
  }] });
44
45
  /**
@@ -61,4 +62,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
61
62
  bootstrap: [DashboardComponent]
62
63
  }]
63
64
  }] });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBbUJsRSxNQUFNLE9BQU8sZUFBZTs7NkdBQWYsZUFBZTs4R0FBZixlQUFlLGlCQWZ4QixrQkFBa0I7UUFDbEIsdUJBQXVCLGFBR3ZCLFlBQVk7UUFDWixXQUFXO1FBQ1gsY0FBYztRQUNkLGtCQUFrQixhQUlsQixrQkFBa0I7UUFDbEIsdUJBQXVCOzhHQUdkLGVBQWUsYUFOZixDQUFDLHFCQUFxQixDQUFDLFlBTGhDLFlBQVk7UUFDWixXQUFXO1FBQ1gsY0FBYztRQUNkLGtCQUFrQjs0RkFRVCxlQUFlO2tCQWpCM0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osa0JBQWtCO3dCQUNsQix1QkFBdUI7cUJBQ3hCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxrQkFBa0I7cUJBQ25CO29CQUNELFNBQVMsRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNsQyxPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCO3dCQUNsQix1QkFBdUI7cUJBQ3hCO2lCQUNGOztBQUdEOzs7R0FHRztBQVFILE1BQU0sT0FBTyxTQUFTOzt1R0FBVCxTQUFTO3dHQUFULFNBQVMsY0FGUixrQkFBa0IsYUFINUIsYUFBYSxFQVJKLGVBQWU7d0dBYWYsU0FBUyxZQUxsQixhQUFhO1FBQ2IsZUFBZTs0RkFJTixTQUFTO2tCQVByQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxhQUFhO3dCQUNiLGVBQWU7cUJBQ2hCO29CQUNELFNBQVMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBHcmlkc3Rlck1vZHVsZSB9IGZyb20gJ2FuZ3VsYXItZ3JpZHN0ZXIyJztcbmltcG9ydCB7IE5nQXBleGNoYXJ0c01vZHVsZSB9IGZyb20gJ25nLWFwZXhjaGFydHMnO1xuXG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgV2lkZ2V0UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL3dpZGdldC1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9kYXNoYm9hcmQtc3RhdGUuc2VydmljZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIERhc2hib2FyZENvbXBvbmVudCxcbiAgICBXaWRnZXRSZW5kZXJlckNvbXBvbmVudFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEdyaWRzdGVyTW9kdWxlLFxuICAgIE5nQXBleGNoYXJ0c01vZHVsZVxuICBdLFxuICBwcm92aWRlcnM6IFtEYXNoYm9hcmRTdGF0ZVNlcnZpY2VdLFxuICBleHBvcnRzOiBbXG4gICAgRGFzaGJvYXJkQ29tcG9uZW50LFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTW9kdWxlIHsgfVxuXG4vKipcbiAqIFJvb3QgbW9kdWxlIGZvciBsb2NhbCBkZW1vIC8gdGVzdGluZyBwdXJwb3Nlcy5cbiAqIEluIHRoZSBmaW5hbCBOUE0gcGFja2FnZSwgdXNlcnMgd291bGQgb25seSBpbXBvcnQgdGhlIGBEYXNoYm9hcmRNb2R1bGVgLlxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQnJvd3Nlck1vZHVsZSxcbiAgICBEYXNoYm9hcmRNb2R1bGVcbiAgXSxcbiAgYm9vdHN0cmFwOiBbRGFzaGJvYXJkQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyB9XG4iXX0=
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBb0JsRSxNQUFNLE9BQU8sZUFBZTs7NkdBQWYsZUFBZTs4R0FBZixlQUFlLGlCQWhCeEIsa0JBQWtCO1FBQ2xCLHVCQUF1QixhQUd2QixZQUFZO1FBQ1osV0FBVztRQUNYLGNBQWM7UUFDZCxrQkFBa0IsYUFJbEIsa0JBQWtCO1FBQ2xCLHVCQUF1Qjs4R0FJZCxlQUFlLGFBUGYsQ0FBQyxxQkFBcUIsQ0FBQyxZQUxoQyxZQUFZO1FBQ1osV0FBVztRQUNYLGNBQWM7UUFDZCxrQkFBa0I7NEZBU1QsZUFBZTtrQkFsQjNCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGNBQWM7d0JBQ2Qsa0JBQWtCO3FCQUNuQjtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDNUI7O0FBR0Q7OztHQUdHO0FBUUgsTUFBTSxPQUFPLFNBQVM7O3VHQUFULFNBQVM7d0dBQVQsU0FBUyxjQUZSLGtCQUFrQixhQUg1QixhQUFhLEVBUkosZUFBZTt3R0FhZixTQUFTLFlBTGxCLGFBQWE7UUFDYixlQUFlOzRGQUlOLFNBQVM7a0JBUHJCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLGFBQWE7d0JBQ2IsZUFBZTtxQkFDaEI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE5PX0VSUk9SU19TQ0hFTUEgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEdyaWRzdGVyTW9kdWxlIH0gZnJvbSAnYW5ndWxhci1ncmlkc3RlcjInO1xuaW1wb3J0IHsgTmdBcGV4Y2hhcnRzTW9kdWxlIH0gZnJvbSAnbmctYXBleGNoYXJ0cyc7XG5cbmltcG9ydCB7IERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJy4vZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaWRnZXRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vd2lkZ2V0LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2Rhc2hib2FyZC1zdGF0ZS5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRGFzaGJvYXJkQ29tcG9uZW50LFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgR3JpZHN0ZXJNb2R1bGUsXG4gICAgTmdBcGV4Y2hhcnRzTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW0Rhc2hib2FyZFN0YXRlU2VydmljZV0sXG4gIGV4cG9ydHM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgV2lkZ2V0UmVuZGVyZXJDb21wb25lbnRcbiAgXSxcbiAgc2NoZW1hczogW05PX0VSUk9SU19TQ0hFTUFdXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZE1vZHVsZSB7IH1cblxuLyoqXG4gKiBSb290IG1vZHVsZSBmb3IgbG9jYWwgZGVtbyAvIHRlc3RpbmcgcHVycG9zZXMuXG4gKiBJbiB0aGUgZmluYWwgTlBNIHBhY2thZ2UsIHVzZXJzIHdvdWxkIG9ubHkgaW1wb3J0IHRoZSBgRGFzaGJvYXJkTW9kdWxlYC5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIEJyb3dzZXJNb2R1bGUsXG4gICAgRGFzaGJvYXJkTW9kdWxlXG4gIF0sXG4gIGJvb3RzdHJhcDogW0Rhc2hib2FyZENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQXBwTW9kdWxlIHsgfVxuIl19
@@ -115,7 +115,7 @@ WidgetRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
115
115
  ></apx-chart>
116
116
  </div>
117
117
  </div>
118
- `, isInline: true, styles: [".widget-container{height:100%;width:100%;display:flex;flex-direction:column;border-radius:30px;overflow:hidden;box-shadow:0 8px 24px #00000040;border:1px solid rgba(255,255,255,.08);transition:box-shadow .2s ease;box-sizing:border-box;background:var(--dash-card-bg)}.widget-container:hover{box-shadow:0 12px 32px #00000059}.widget-header{padding:14px 16px 4px;display:flex;justify-content:space-between;align-items:center;cursor:move;flex-shrink:0}.widget-title{color:#fff;font-size:15px;font-weight:600;letter-spacing:.3px}.header-actions{display:flex;gap:6px;align-items:center}.btn-icon{background:rgba(255,255,255,.08);border:none;color:var(--dash-fore-color);cursor:pointer;font-size:12px;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.btn-edit:hover{background:rgba(10,132,255,.25);color:var(--dash-accent-color)}.btn-close-widget:hover{background:rgba(255,69,58,.25);color:var(--dash-danger-color)}.widget-body{flex:1;min-height:0;padding:4px 12px 12px;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ChartComponent, selector: "apx-chart", inputs: ["chart", "annotations", "colors", "dataLabels", "series", "stroke", "labels", "legend", "markers", "noData", "fill", "tooltip", "plotOptions", "responsive", "xaxis", "yaxis", "forecastDataPoints", "grid", "states", "title", "subtitle", "theme", "autoUpdateSeries"] }] });
118
+ `, isInline: true, styles: [".widget-container{height:100%;width:100%;display:flex;flex-direction:column;border-radius:30px;overflow:hidden;box-shadow:0 8px 24px #00000040;border:1px solid rgba(255,255,255,.08);transition:box-shadow .2s ease;box-sizing:border-box;background:var(--dash-card-bg)}.widget-container:hover{box-shadow:0 12px 32px #00000059}.widget-header{padding:14px 16px 4px;display:flex;justify-content:space-between;align-items:center;cursor:move;flex-shrink:0}.widget-title{color:#fff;font-size:15px;font-weight:600;letter-spacing:.3px}.header-actions{display:flex;gap:6px;align-items:center}.btn-icon{background:rgba(255,255,255,.08);border:none;color:var(--dash-fore-color);cursor:pointer;font-size:12px;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.btn-edit:hover{background:rgba(10,132,255,.25);color:var(--dash-accent-color)}.btn-close-widget:hover{background:rgba(255,69,58,.25);color:var(--dash-danger-color)}.widget-body{flex:1;min-height:0;padding:4px 12px 12px;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ChartComponent, selector: "apx-chart", outputs: ["chartReady"] }] });
119
119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WidgetRendererComponent, decorators: [{
120
120
  type: Component,
121
121
  args: [{ selector: 'app-widget-renderer', template: `
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Component, Input, Output, NgModule } from '@angular/core';
2
+ import { Injectable, EventEmitter, Component, Input, Output, NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
3
3
  import { BehaviorSubject, Subject, Subscription } from 'rxjs';
4
4
  import * as i2 from '@angular/common';
5
5
  import { CommonModule } from '@angular/common';
@@ -340,7 +340,7 @@ WidgetRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
340
340
  ></apx-chart>
341
341
  </div>
342
342
  </div>
343
- `, isInline: true, styles: [".widget-container{height:100%;width:100%;display:flex;flex-direction:column;border-radius:30px;overflow:hidden;box-shadow:0 8px 24px #00000040;border:1px solid rgba(255,255,255,.08);transition:box-shadow .2s ease;box-sizing:border-box;background:var(--dash-card-bg)}.widget-container:hover{box-shadow:0 12px 32px #00000059}.widget-header{padding:14px 16px 4px;display:flex;justify-content:space-between;align-items:center;cursor:move;flex-shrink:0}.widget-title{color:#fff;font-size:15px;font-weight:600;letter-spacing:.3px}.header-actions{display:flex;gap:6px;align-items:center}.btn-icon{background:rgba(255,255,255,.08);border:none;color:var(--dash-fore-color);cursor:pointer;font-size:12px;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.btn-edit:hover{background:rgba(10,132,255,.25);color:var(--dash-accent-color)}.btn-close-widget:hover{background:rgba(255,69,58,.25);color:var(--dash-danger-color)}.widget-body{flex:1;min-height:0;padding:4px 12px 12px;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ChartComponent, selector: "apx-chart", inputs: ["chart", "annotations", "colors", "dataLabels", "series", "stroke", "labels", "legend", "markers", "noData", "fill", "tooltip", "plotOptions", "responsive", "xaxis", "yaxis", "forecastDataPoints", "grid", "states", "title", "subtitle", "theme", "autoUpdateSeries"] }] });
343
+ `, isInline: true, styles: [".widget-container{height:100%;width:100%;display:flex;flex-direction:column;border-radius:30px;overflow:hidden;box-shadow:0 8px 24px #00000040;border:1px solid rgba(255,255,255,.08);transition:box-shadow .2s ease;box-sizing:border-box;background:var(--dash-card-bg)}.widget-container:hover{box-shadow:0 12px 32px #00000059}.widget-header{padding:14px 16px 4px;display:flex;justify-content:space-between;align-items:center;cursor:move;flex-shrink:0}.widget-title{color:#fff;font-size:15px;font-weight:600;letter-spacing:.3px}.header-actions{display:flex;gap:6px;align-items:center}.btn-icon{background:rgba(255,255,255,.08);border:none;color:var(--dash-fore-color);cursor:pointer;font-size:12px;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.btn-edit:hover{background:rgba(10,132,255,.25);color:var(--dash-accent-color)}.btn-close-widget:hover{background:rgba(255,69,58,.25);color:var(--dash-danger-color)}.widget-body{flex:1;min-height:0;padding:4px 12px 12px;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ChartComponent, selector: "apx-chart", outputs: ["chartReady"] }] });
344
344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WidgetRendererComponent, decorators: [{
345
345
  type: Component,
346
346
  args: [{ selector: 'app-widget-renderer', template: `
@@ -1117,7 +1117,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1117
1117
  exports: [
1118
1118
  DashboardComponent,
1119
1119
  WidgetRendererComponent
1120
- ]
1120
+ ],
1121
+ schemas: [NO_ERRORS_SCHEMA]
1121
1122
  }]
1122
1123
  }] });
1123
1124
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/dashboard-state.service.ts","../../src/app/widget-renderer.component.ts","../../src/app/dashboard.component.ts","../../src/app/app.module.ts","../../src/public-api.ts","../../src/ogidor-dashboard.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Page, Widget, DashboardConfig, WidgetType, LineBarData, DonutData } from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardStateService {\n private readonly STORAGE_KEY = 'xtb_dashboard_layout';\n \n private initialPages: Page[] = [\n {\n id: 'page-1',\n name: 'Default Workspace',\n widgets: [\n {\n id: 'w-1',\n type: 'LINE',\n x: 0,\n y: 0,\n cols: 4,\n rows: 4,\n title: 'Market Trend',\n data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }\n },\n {\n id: 'w-2',\n type: 'DONUT',\n x: 4,\n y: 0,\n cols: 2,\n rows: 4,\n title: 'Asset Allocation',\n data: { series: [44, 55, 41, 17, 15] }\n }\n ]\n }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n /**\n * Emits whenever a widget's data is updated programmatically.\n * Key = widget id, value = new data payload.\n */\n private widgetDataSubject = new Subject<{ widgetId: string; data: LineBarData | DonutData }>();\n widgetData$ = this.widgetDataSubject.asObservable();\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor() {\n const saved = localStorage.getItem(this.STORAGE_KEY);\n if (saved) {\n try {\n this.loadLayout(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to load saved layout', e);\n }\n }\n }\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) {\n this.activePageIdSubject.next(id);\n }\n\n addPage(name: string) {\n const newPage: Page = {\n id: `page-${Date.now()}`,\n name,\n widgets: []\n };\n const updatedPages = [...this.pagesSubject.value, newPage];\n this.pagesSubject.next(updatedPages);\n this.activePageIdSubject.next(newPage.id);\n this.saveToLocalStorage();\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n\n const updatedPages = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updatedPages);\n \n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updatedPages[0].id);\n }\n this.saveToLocalStorage();\n }\n\n addWidget(type: WidgetType) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 2 : 4,\n rows: 4,\n title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,\n data: this.getDefaultDataForType(type)\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n addWidgetWithData(type: WidgetType, title: string, data: LineBarData | DonutData) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 3 : 6,\n rows: 4,\n title,\n data\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n private getDefaultDataForType(type: WidgetType) {\n if (type === 'DONUT') {\n return { series: [30, 20, 50] };\n }\n return {\n series: [{\n name: 'Sample Data',\n data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))\n }]\n };\n }\n\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const page = pages.find(p => p.id === pageId);\n if (page) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x;\n widget.y = y;\n widget.cols = cols;\n widget.rows = rows;\n this.updatePages(pages);\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (activePage) {\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.updatePages(this.pagesSubject.value);\n }\n }\n\n /**\n * Push new data into a widget by its id.\n * The widget's chart will re-render immediately.\n *\n * @param widgetId The `id` of the target widget.\n * @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.\n */\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.data = data;\n this.widgetDataSubject.next({ widgetId, data });\n this.updatePages(pages);\n return;\n }\n }\n console.warn(`[Dashboard] updateWidgetData: widget \"${widgetId}\" not found.`);\n }\n\n updateWidgetMeta(widgetId: string, meta: { title?: string; colors?: string[]; cardColor?: string; data?: LineBarData | DonutData }) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n if (meta.title !== undefined) widget.title = meta.title;\n if (meta.colors !== undefined) widget.colors = meta.colors;\n if (meta.cardColor !== undefined) widget.cardColor = meta.cardColor;\n if (meta.data !== undefined) {\n widget.data = meta.data;\n this.widgetDataSubject.next({ widgetId, data: meta.data });\n }\n this.updatePages(pages);\n return;\n }\n }\n }\n\n private updatePages(pages: Page[]) {\n this.pagesSubject.next([...pages]);\n this.saveToLocalStorage();\n }\n\n serializeLayout(): string {\n const config: DashboardConfig = {\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value\n };\n return JSON.stringify(config);\n }\n\n loadLayout(config: any) {\n if (config && config.pages) {\n this.pagesSubject.next(config.pages);\n if (config.activePageId) {\n this.activePageIdSubject.next(config.activePageId);\n }\n }\n }\n\n private saveToLocalStorage() {\n localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Widget, DashboardTheme } from './models';\nimport { DashboardStateService } from './dashboard-state.service';\nimport {\n ApexAxisChartSeries, ApexChart, ApexXAxis, ApexDataLabels,\n ApexStroke, ApexYAxis, ApexTitleSubtitle, ApexLegend,\n ApexPlotOptions, ApexTooltip, ApexTheme\n} from 'ng-apexcharts';\n\nexport type ChartOptions = {\n series: ApexAxisChartSeries | number[];\n chart: ApexChart; xaxis: ApexXAxis; stroke: ApexStroke;\n dataLabels: ApexDataLabels; yaxis: ApexYAxis; title: ApexTitleSubtitle;\n labels: string[]; legend: ApexLegend; plotOptions: ApexPlotOptions;\n tooltip: ApexTooltip; theme: ApexTheme; colors: string[];\n};\n\nconst DEFAULT_CHART_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\nconst DEFAULT_FORECOLOR = '#8e8e93';\nconst DEFAULT_CARD_BG = '#2c2c2e';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-container\" [ngStyle]=\"cardStyles\">\n <div class=\"widget-header\">\n <span class=\"widget-title\">{{ widget.title }}</span>\n <div class=\"header-actions\">\n <button class=\"btn-icon btn-edit\" (click)=\"editRequested.emit(widget)\" title=\"Edit widget\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-close-widget\" (click)=\"onRemove()\" title=\"Remove widget\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"widget-body\">\n <apx-chart\n *ngIf=\"chartOptions.chart\"\n style=\"display:block;width:100%;height:100%;\"\n [series]=\"chartOptions.series!\"\n [chart]=\"chartOptions.chart!\"\n [xaxis]=\"chartOptions.xaxis!\"\n [stroke]=\"chartOptions.stroke!\"\n [dataLabels]=\"chartOptions.dataLabels!\"\n [plotOptions]=\"chartOptions.plotOptions!\"\n [yaxis]=\"chartOptions.yaxis!\"\n [labels]=\"chartOptions.labels!\"\n [legend]=\"chartOptions.legend!\"\n [colors]=\"chartOptions.colors!\"\n [theme]=\"chartOptions.theme!\"\n [tooltip]=\"chartOptions.tooltip!\"\n ></apx-chart>\n </div>\n </div>\n `,\n styles: [`\n .widget-container {\n height: 100%; width: 100%;\n display: flex; flex-direction: column;\n border-radius: 30px; overflow: hidden;\n box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid rgba(255,255,255,0.08);\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg);\n }\n .widget-container:hover { box-shadow: 0 12px 32px rgba(0,0,0,0.35); }\n .widget-header {\n padding: 14px 16px 4px;\n display: flex; justify-content: space-between; align-items: center;\n cursor: move; flex-shrink: 0;\n }\n .widget-title { color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 0.3px; }\n .header-actions { display: flex; gap: 6px; align-items: center; }\n .btn-icon {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n cursor: pointer; font-size: 12px; width: 26px; height: 26px;\n border-radius: 50%; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.25); color: var(--dash-accent-color); }\n .btn-close-widget:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .widget-body {\n flex: 1; min-height: 0; padding: 4px 12px 12px;\n display: flex; flex-direction: column;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnInit, OnChanges, OnDestroy {\n @Input() widget!: Widget;\n @Input() onRemoveWidget!: (id: string) => void;\n @Input() theme?: Required<DashboardTheme>;\n @Output() editRequested = new EventEmitter<Widget>();\n\n chartOptions!: Partial<ChartOptions>;\n cardStyles: Record<string, string> = {};\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnInit() {\n this.applyStyles();\n this.initChart();\n this.subs.add(\n this.stateService.widgetData$.subscribe(({ widgetId, data }) => {\n if (widgetId === this.widget.id) {\n this.widget = { ...this.widget, data };\n this.initChart();\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme']) { this.applyStyles(); this.initChart(); }\n if (changes['widget'] && !changes['widget'].firstChange) { this.applyStyles(); this.initChart(); }\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyStyles() {\n this.cardStyles = {\n background: this.widget.cardColor ?? 'var(--dash-card-bg)'\n };\n }\n\n private resolvedColors(): string[] {\n return this.widget.colors ?? this.theme?.chartColors ?? DEFAULT_CHART_COLORS;\n }\n\n private initChart() {\n const isDonut = this.widget.type === 'DONUT';\n const colors = this.resolvedColors();\n const foreColor = this.theme?.chartForeColor ?? DEFAULT_FORECOLOR;\n const lineBarData = !isDonut ? (this.widget.data as any) : null;\n const donutData = isDonut ? (this.widget.data as any) : null;\n const categories: string[] = lineBarData?.categories ?? [];\n const donutLabels: string[] = donutData?.labels ?? ['A','B','C','D','E'];\n\n this.chartOptions = {\n series: this.widget.data.series as any,\n chart: {\n width: '100%', height: '100%',\n type: this.widget.type.toLowerCase() as any,\n toolbar: { show: false },\n animations: { enabled: true, speed: 400 },\n background: 'transparent', foreColor,\n parentHeightOffset: 0, sparkline: { enabled: false },\n },\n theme: { mode: 'dark' },\n colors,\n stroke: { curve: 'smooth', width: isDonut ? 0 : 3 },\n dataLabels: { enabled: false },\n legend: { position: 'bottom', labels: { colors: foreColor } },\n tooltip: { theme: 'dark' },\n plotOptions: {\n pie: { donut: { size: '70%', labels: { show: true, total: { show: true, label: 'Total', color: '#fff' } } } },\n bar: { borderRadius: 8, columnWidth: '50%' }\n },\n xaxis: {\n categories: categories.length ? categories : undefined,\n labels: { style: { colors: foreColor } },\n axisBorder: { show: false }, axisTicks: { show: false }\n },\n yaxis: { labels: { style: { colors: foreColor } } },\n labels: isDonut ? donutLabels : undefined,\n };\n }\n\n onRemove() { this.onRemoveWidget(this.widget.id); }\n}\n","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { GridsterConfig } from 'angular-gridster2';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, WidgetType, DashboardTheme, LineBarData, DonutData } from './models';\nimport { Subscription } from 'rxjs';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n widgetCardColor: '#2c2c2e',\n chartForeColor: '#8e8e93',\n accentColor: '#0a84ff',\n dangerColor: '#ff453a',\n chartColors: ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'],\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <!-- ── Header ── -->\n <header class=\"dashboard-header\">\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div\n *ngFor=\"let page of pages\"\n class=\"tab\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSelectPage(page.id)\"\n >\n <span class=\"tab-name\">{{ page.name }}</span>\n <button class=\"tab-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <!-- Add Widget button -->\n <button class=\"btn-add-widget\" (click)=\"openDialog()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n </header>\n\n <!-- ── Grid ── -->\n <div class=\"grid-container\">\n <gridster [options]=\"options\">\n <gridster-item [item]=\"widget\" *ngFor=\"let widget of activePage?.widgets\">\n <app-widget-renderer\n [widget]=\"widget\"\n [onRemoveWidget]=\"removeWidgetHandler\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"openEditDialog($event)\"\n ></app-widget-renderer>\n </gridster-item>\n </gridster>\n </div>\n </main>\n </div>\n\n <!-- ── Add Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"dialogOpen\" (click)=\"closeDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"dialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Add Widget</span>\n <button class=\"dialog-close\" (click)=\"closeDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Chart type picker -->\n <div class=\"field-group\">\n <label class=\"field-label\">Chart type</label>\n <div class=\"type-picker\">\n <button\n *ngFor=\"let t of widgetTypes\"\n class=\"type-btn\"\n [class.selected]=\"dialogType === t.value\"\n (click)=\"dialogType = t.value\"\n >\n <i [class]=\"'la ' + t.icon\"></i>\n <span>{{ t.label }}</span>\n </button>\n </div>\n </div>\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"dialogTitle\" placeholder=\"My Chart\" />\n </div>\n\n <!-- Series (LINE / BAR) -->\n <ng-container *ngIf=\"dialogType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series</label>\n <button class=\"btn-link\" (click)=\"addSeries()\"><i class=\"la la-plus\"></i> Add series</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of dialogSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Series name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\"\n placeholder=\"Comma-separated values, e.g. 10,25,40\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSeries.length > 1\" (click)=\"removeSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"dialogCategories\" placeholder=\"Jan,Feb,Mar,Apr\" />\n </div>\n </ng-container>\n\n <!-- Slices (DONUT) -->\n <ng-container *ngIf=\"dialogType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addSlice()\"><i class=\"la la-plus\"></i> Add slice</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of dialogSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSlices.length > 1\" (click)=\"removeSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmAddWidget()\" [disabled]=\"!dialogTitle.trim()\">\n <i class=\"la la-check\"></i> Add Widget\n </button>\n </div>\n </div>\n <!-- ── Edit Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"editDialogOpen\" (click)=\"closeEditDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"editDialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Edit Widget</span>\n <button class=\"dialog-close\" (click)=\"closeEditDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"editTitle\" placeholder=\"Chart title\" />\n </div>\n\n <!-- Card background -->\n <div class=\"field-group\">\n <label class=\"field-label\">Card color</label>\n <div class=\"color-row\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editCardColor\" />\n <input class=\"field-input\" [(ngModel)]=\"editCardColor\" placeholder=\"#2c2c2e\" />\n </div>\n </div>\n\n <!-- Series colors -->\n <div class=\"field-group\">\n <label class=\"field-label\">Series colors</label>\n <div class=\"color-list\">\n <div class=\"color-item\" *ngFor=\"let c of editColors; let i = index\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editColors[i]\" />\n <input class=\"field-input color-hex\" [(ngModel)]=\"editColors[i]\" placeholder=\"#0a84ff\" />\n <span class=\"color-label\">{{ getEditSeriesLabel(i) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Data: LINE / BAR -->\n <ng-container *ngIf=\"editWidgetType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series data</label>\n <button class=\"btn-link\" (click)=\"addEditSeries()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of editSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\" placeholder=\"10,20,30\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSeries.length > 1\" (click)=\"removeEditSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"editCategories\" placeholder=\"Jan,Feb,Mar\" />\n </div>\n </ng-container>\n\n <!-- Data: DONUT -->\n <ng-container *ngIf=\"editWidgetType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addEditSlice()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of editSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSlices.length > 1\" (click)=\"removeEditSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeEditDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmEditWidget()\">\n <i class=\"la la-check\"></i> Save\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n --dash-bg: #000000;\n --dash-panel-bg: #1c1c1e;\n --dash-card-bg: #2c2c2e;\n --dash-fore-color: #8e8e93;\n --dash-accent-color: #0a84ff;\n --dash-danger-color: #ff453a;\n --dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n\n /* ── Layout ── */\n .dashboard-wrapper {\n display: flex;\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n }\n .tabs-container {\n display: flex;\n align-items: center;\n gap: 8px;\n background: rgba(44,44,46,0.6);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n }\n .tab {\n display: flex;\n align-items: center;\n padding: 8px 20px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--dash-fore-color);\n transition: all 0.3s cubic-bezier(0.25,0.8,0.25,1);\n }\n .tab.active {\n background: #3a3a3c;\n color: #ffffff;\n box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n }\n .tab:hover:not(.active) {\n color: #e5e5ea;\n background: rgba(255,255,255,0.05);\n }\n .tab-name { margin-right: 8px; }\n .tab-close {\n background: transparent; border: none; color: var(--dash-fore-color); padding: 2px;\n font-size: 12px; cursor: pointer; opacity: 0; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; transition: all 0.2s;\n }\n .tab-close:hover { color: var(--dash-danger-color); background: rgba(255, 69, 58, 0.2); }\n .tab:hover .tab-close { opacity: 1; }\n .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 16px; cursor: pointer; border-radius: 20px; transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10, 132, 255, 0.1); }\n\n /* Add Widget button */\n .btn-add-widget {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--dash-accent-color);\n border: none;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n padding: 10px 20px;\n border-radius: 22px;\n cursor: pointer;\n white-space: nowrap;\n transition: opacity 0.2s, transform 0.15s;\n box-shadow: 0 4px 14px rgba(10,132,255,0.4);\n }\n .btn-add-widget:hover { opacity: 0.9; transform: translateY(-1px); }\n .btn-add-widget:active { transform: translateY(0); }\n\n /* ── Grid ── */\n .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n gridster { background: transparent; height: 100% !important; }\n\n /* ── Dialog ── */\n .dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(6px);\n z-index: 900;\n }\n .dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 901;\n width: min(520px, calc(100vw - 32px));\n max-height: calc(100vh - 64px);\n display: flex;\n flex-direction: column;\n background: var(--dash-panel-bg);\n border-radius: 28px;\n border: 1px solid rgba(255,255,255,0.1);\n box-shadow: 0 24px 60px rgba(0,0,0,0.7);\n overflow: hidden;\n }\n .dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 22px 24px 16px;\n border-bottom: 1px solid rgba(255,255,255,0.07);\n }\n .dialog-title { font-size: 17px; font-weight: 700; color: #ffffff; }\n .dialog-close {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n width: 30px; height: 30px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; font-size: 14px; transition: all 0.2s;\n }\n .dialog-close:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .dialog-body { flex: 1; overflow-y: auto; padding: 20px 24px; display: flex; flex-direction: column; gap: 20px; }\n .field-group { display: flex; flex-direction: column; gap: 8px; }\n .field-label { font-size: 13px; font-weight: 600; color: var(--dash-fore-color); text-transform: uppercase; letter-spacing: 0.5px; }\n .field-input {\n background: var(--dash-card-bg);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n padding: 10px 14px;\n color: #ffffff;\n font-size: 14px;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n }\n .field-input:focus { border-color: var(--dash-accent-color); }\n .type-picker { display: flex; gap: 10px; }\n .type-btn {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 10px;\n background: var(--dash-card-bg); border: 2px solid transparent; border-radius: 16px;\n color: var(--dash-fore-color); font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s;\n }\n .type-btn.selected { border-color: var(--dash-accent-color); color: var(--dash-accent-color); background: rgba(10,132,255,0.12); }\n .btn-link { background: transparent; border: none; color: var(--dash-accent-color); font-size: 13px; font-weight: 600; cursor: pointer; }\n .dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding: 16px 24px 22px; border-top: 1px solid rgba(255,255,255,0.07); }\n .btn-cancel { background: transparent; border: 1px solid rgba(255,255,255,0.12); color: var(--dash-fore-color); padding: 10px 20px; border-radius: 20px; cursor: pointer; }\n .btn-confirm { background: var(--dash-accent-color); border: none; color: #ffffff; padding: 10px 22px; border-radius: 20px; font-weight: 600; cursor: pointer; }\n .btn-confirm:disabled { opacity: 0.4; cursor: not-allowed; }\n `]\n})\nexport class DashboardComponent implements OnInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n options!: GridsterConfig;\n pages: Page[] = [];\n activePageId: string = '';\n activePage?: Page;\n\n // ── Dialog state ──\n dialogOpen = false;\n dialogType: WidgetType = 'LINE';\n dialogTitle = '';\n dialogCategories = '';\n dialogSeries: { name: string; dataRaw: string }[] = [{ name: 'Series 1', dataRaw: '' }];\n dialogSlices: { label: string; value: number | null }[] = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n\n readonly widgetTypes: { value: WidgetType; label: string; icon: string }[] = [\n { value: 'LINE', label: 'Line', icon: 'la-chart-area' },\n { value: 'BAR', label: 'Bar', icon: 'la-chart-bar' },\n { value: 'DONUT',label: 'Donut', icon: 'la-chart-pie' },\n ];\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme'] || changes['initialLayout']) this.applyTheme();\n }\n\n ngOnInit() {\n this.applyTheme();\n\n if (this.initialLayout) {\n try { this.stateService.loadLayout(JSON.parse(this.initialLayout)); }\n catch (e) { console.error('[Dashboard] Failed to parse initialLayout', e); }\n }\n\n this.options = {\n gridType: 'fit',\n displayGrid: 'none',\n pushItems: true,\n draggable: { enabled: true },\n resizable: { enabled: true },\n minCols: 12, maxCols: 12,\n minRows: 12, maxRows: 50,\n margin: 20, outerMargin: true,\n itemChangeCallback: (item: any) => {\n this.stateService.updateWidgetPosition(\n this.activePageId, item.id, item.x, item.y, item.cols, item.rows\n );\n }\n };\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\n this.updateActivePage();\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n this.wrapperStyles = {\n '--dash-bg': this.resolvedTheme.backgroundColor,\n '--dash-panel-bg': this.resolvedTheme.panelColor,\n '--dash-card-bg': this.resolvedTheme.widgetCardColor,\n '--dash-fore-color': this.resolvedTheme.chartForeColor,\n '--dash-accent-color': this.resolvedTheme.accentColor,\n '--dash-danger-color': this.resolvedTheme.dangerColor,\n '--dash-font-family': this.resolvedTheme.fontFamily,\n };\n }\n\n private updateActivePage() {\n this.activePage = this.pages.find(p => p.id === this.activePageId);\n }\n\n\n // ── Page actions ──\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Enter workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n onRemovePage(event: Event, id: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) this.stateService.removePage(id);\n }\n\n // ── Dialog ──\n openDialog() {\n this.dialogType = 'LINE';\n this.dialogTitle = '';\n this.dialogCategories = '';\n this.dialogSeries = [{ name: 'Series 1', dataRaw: '' }];\n this.dialogSlices = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n this.dialogOpen = true;\n }\n\n closeDialog() { this.dialogOpen = false; }\n\n addSeries() { this.dialogSeries.push({ name: `Series ${this.dialogSeries.length + 1}`, dataRaw: '' }); }\n removeSeries(i: number) { this.dialogSeries.splice(i, 1); }\n\n addSlice() { this.dialogSlices.push({ label: `Slice ${this.dialogSlices.length + 1}`, value: null }); }\n removeSlice(i: number) { this.dialogSlices.splice(i, 1); }\n\n confirmAddWidget() {\n const title = this.dialogTitle.trim();\n if (!title) return;\n\n let data: LineBarData | DonutData;\n\n if (this.dialogType === 'DONUT') {\n const validSlices = this.dialogSlices.filter(s => s.value !== null && s.label.trim());\n data = {\n series: validSlices.length\n ? validSlices.map(s => Number(s.value))\n : [30, 20, 50],\n labels: validSlices.length\n ? validSlices.map(s => s.label)\n : ['A', 'B', 'C'],\n } as DonutData;\n } else {\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n data = {\n series: this.dialogSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim()\n ? parseNums(s.dataRaw)\n : Array.from({ length: 8 }, () => Math.floor(Math.random() * 100)),\n })),\n categories: this.dialogCategories.trim()\n ? this.dialogCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.addWidgetWithData(this.dialogType, title, data);\n this.closeDialog();\n }\n\n // ── Edit dialog state ──\n editDialogOpen = false;\n editingWidget?: Widget;\n editWidgetType: WidgetType = 'LINE';\n editTitle = '';\n editCardColor = '';\n editColors: string[] = [];\n editSeries: { name: string; dataRaw: string }[] = [];\n editCategories = '';\n editSlices: { label: string; value: number | null }[] = [];\n\n private readonly DEFAULT_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\n\n openEditDialog(widget: Widget) {\n this.editingWidget = widget;\n this.editWidgetType = widget.type;\n this.editTitle = widget.title;\n this.editCardColor = widget.cardColor ?? this.resolvedTheme.widgetCardColor;\n this.editColors = widget.colors?.length\n ? [...widget.colors]\n : [...this.resolvedTheme.chartColors];\n\n if (widget.type === 'DONUT') {\n const d = widget.data as any;\n this.editSlices = (d.series as number[]).map((v: number, i: number) => ({\n label: d.labels?.[i] ?? `Slice ${i + 1}`,\n value: v,\n }));\n this.editColors = this.editColors.slice(0, this.editSlices.length);\n while (this.editColors.length < this.editSlices.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n } else {\n const d = widget.data as any;\n this.editSeries = (d.series as any[]).map((s: any) => ({ name: s.name, dataRaw: s.data.join(',') }));\n this.editCategories = d.categories?.join(',') ?? '';\n this.editColors = this.editColors.slice(0, this.editSeries.length);\n while (this.editColors.length < this.editSeries.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n }\n\n this.editDialogOpen = true;\n }\n\n closeEditDialog() { this.editDialogOpen = false; this.editingWidget = undefined; }\n\n getEditSeriesLabel(i: number): string {\n if (this.editWidgetType === 'DONUT') return this.editSlices[i]?.label || `Slice ${i + 1}`;\n return this.editSeries[i]?.name || `Series ${i + 1}`;\n }\n\n addEditSeries() {\n this.editSeries.push({ name: `Series ${this.editSeries.length + 1}`, dataRaw: '' });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSeries(i: number) { this.editSeries.splice(i, 1); this.editColors.splice(i, 1); }\n\n addEditSlice() {\n this.editSlices.push({ label: `Slice ${this.editSlices.length + 1}`, value: null });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSlice(i: number) { this.editSlices.splice(i, 1); this.editColors.splice(i, 1); }\n\n confirmEditWidget() {\n if (!this.editingWidget) return;\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n let data: LineBarData | DonutData;\n if (this.editWidgetType === 'DONUT') {\n data = {\n series: this.editSlices.map(s => Number(s.value) || 0),\n labels: this.editSlices.map(s => s.label),\n } as DonutData;\n } else {\n data = {\n series: this.editSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim() ? parseNums(s.dataRaw) : [],\n })),\n categories: this.editCategories.trim()\n ? this.editCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.updateWidgetMeta(this.editingWidget.id, {\n title: this.editTitle.trim() || this.editingWidget.title,\n colors: [...this.editColors],\n cardColor: this.editCardColor,\n data,\n });\n this.closeEditDialog();\n }\n\n // ── Widget actions ──\n onAddWidget(type: WidgetType) { this.stateService.addWidget(type); }\n\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n this.stateService.updateWidgetData(widgetId, data);\n }\n\n removeWidgetHandler = (id: string) => { this.stateService.removeWidget(id); };\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n}\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridsterModule } from 'angular-gridster2';\nimport { NgApexchartsModule } from 'ng-apexcharts';\n\nimport { DashboardComponent } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n GridsterModule,\n NgApexchartsModule\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n WidgetRendererComponent\n ]\n})\nexport class DashboardModule { }\n\n/**\n * Root module for local demo / testing purposes.\n * In the final NPM package, users would only import the `DashboardModule`.\n */\n@NgModule({\n imports: [\n BrowserModule,\n DashboardModule\n ],\n bootstrap: [DashboardComponent]\n})\nexport class AppModule { }\n","/*\n * Public API Surface of the dashboard library\n */\n\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/app.module'; // This is the DashboardModule\nexport * from './app/models';\nexport * from './app/dashboard-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DashboardStateService","i3","i5.WidgetRendererComponent"],"mappings":"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"}
1
+ {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/dashboard-state.service.ts","../../src/app/widget-renderer.component.ts","../../src/app/dashboard.component.ts","../../src/app/app.module.ts","../../src/public-api.ts","../../src/ogidor-dashboard.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Page, Widget, DashboardConfig, WidgetType, LineBarData, DonutData } from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardStateService {\n private readonly STORAGE_KEY = 'xtb_dashboard_layout';\n \n private initialPages: Page[] = [\n {\n id: 'page-1',\n name: 'Default Workspace',\n widgets: [\n {\n id: 'w-1',\n type: 'LINE',\n x: 0,\n y: 0,\n cols: 4,\n rows: 4,\n title: 'Market Trend',\n data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }\n },\n {\n id: 'w-2',\n type: 'DONUT',\n x: 4,\n y: 0,\n cols: 2,\n rows: 4,\n title: 'Asset Allocation',\n data: { series: [44, 55, 41, 17, 15] }\n }\n ]\n }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n /**\n * Emits whenever a widget's data is updated programmatically.\n * Key = widget id, value = new data payload.\n */\n private widgetDataSubject = new Subject<{ widgetId: string; data: LineBarData | DonutData }>();\n widgetData$ = this.widgetDataSubject.asObservable();\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor() {\n const saved = localStorage.getItem(this.STORAGE_KEY);\n if (saved) {\n try {\n this.loadLayout(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to load saved layout', e);\n }\n }\n }\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) {\n this.activePageIdSubject.next(id);\n }\n\n addPage(name: string) {\n const newPage: Page = {\n id: `page-${Date.now()}`,\n name,\n widgets: []\n };\n const updatedPages = [...this.pagesSubject.value, newPage];\n this.pagesSubject.next(updatedPages);\n this.activePageIdSubject.next(newPage.id);\n this.saveToLocalStorage();\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n\n const updatedPages = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updatedPages);\n \n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updatedPages[0].id);\n }\n this.saveToLocalStorage();\n }\n\n addWidget(type: WidgetType) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 2 : 4,\n rows: 4,\n title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,\n data: this.getDefaultDataForType(type)\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n addWidgetWithData(type: WidgetType, title: string, data: LineBarData | DonutData) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 3 : 6,\n rows: 4,\n title,\n data\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n private getDefaultDataForType(type: WidgetType) {\n if (type === 'DONUT') {\n return { series: [30, 20, 50] };\n }\n return {\n series: [{\n name: 'Sample Data',\n data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))\n }]\n };\n }\n\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const page = pages.find(p => p.id === pageId);\n if (page) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x;\n widget.y = y;\n widget.cols = cols;\n widget.rows = rows;\n this.updatePages(pages);\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (activePage) {\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.updatePages(this.pagesSubject.value);\n }\n }\n\n /**\n * Push new data into a widget by its id.\n * The widget's chart will re-render immediately.\n *\n * @param widgetId The `id` of the target widget.\n * @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.\n */\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.data = data;\n this.widgetDataSubject.next({ widgetId, data });\n this.updatePages(pages);\n return;\n }\n }\n console.warn(`[Dashboard] updateWidgetData: widget \"${widgetId}\" not found.`);\n }\n\n updateWidgetMeta(widgetId: string, meta: { title?: string; colors?: string[]; cardColor?: string; data?: LineBarData | DonutData }) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n if (meta.title !== undefined) widget.title = meta.title;\n if (meta.colors !== undefined) widget.colors = meta.colors;\n if (meta.cardColor !== undefined) widget.cardColor = meta.cardColor;\n if (meta.data !== undefined) {\n widget.data = meta.data;\n this.widgetDataSubject.next({ widgetId, data: meta.data });\n }\n this.updatePages(pages);\n return;\n }\n }\n }\n\n private updatePages(pages: Page[]) {\n this.pagesSubject.next([...pages]);\n this.saveToLocalStorage();\n }\n\n serializeLayout(): string {\n const config: DashboardConfig = {\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value\n };\n return JSON.stringify(config);\n }\n\n loadLayout(config: any) {\n if (config && config.pages) {\n this.pagesSubject.next(config.pages);\n if (config.activePageId) {\n this.activePageIdSubject.next(config.activePageId);\n }\n }\n }\n\n private saveToLocalStorage() {\n localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Widget, DashboardTheme } from './models';\nimport { DashboardStateService } from './dashboard-state.service';\nimport {\n ApexAxisChartSeries, ApexChart, ApexXAxis, ApexDataLabels,\n ApexStroke, ApexYAxis, ApexTitleSubtitle, ApexLegend,\n ApexPlotOptions, ApexTooltip, ApexTheme\n} from 'ng-apexcharts';\n\nexport type ChartOptions = {\n series: ApexAxisChartSeries | number[];\n chart: ApexChart; xaxis: ApexXAxis; stroke: ApexStroke;\n dataLabels: ApexDataLabels; yaxis: ApexYAxis; title: ApexTitleSubtitle;\n labels: string[]; legend: ApexLegend; plotOptions: ApexPlotOptions;\n tooltip: ApexTooltip; theme: ApexTheme; colors: string[];\n};\n\nconst DEFAULT_CHART_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\nconst DEFAULT_FORECOLOR = '#8e8e93';\nconst DEFAULT_CARD_BG = '#2c2c2e';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-container\" [ngStyle]=\"cardStyles\">\n <div class=\"widget-header\">\n <span class=\"widget-title\">{{ widget.title }}</span>\n <div class=\"header-actions\">\n <button class=\"btn-icon btn-edit\" (click)=\"editRequested.emit(widget)\" title=\"Edit widget\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-close-widget\" (click)=\"onRemove()\" title=\"Remove widget\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"widget-body\">\n <apx-chart\n *ngIf=\"chartOptions.chart\"\n style=\"display:block;width:100%;height:100%;\"\n [series]=\"chartOptions.series!\"\n [chart]=\"chartOptions.chart!\"\n [xaxis]=\"chartOptions.xaxis!\"\n [stroke]=\"chartOptions.stroke!\"\n [dataLabels]=\"chartOptions.dataLabels!\"\n [plotOptions]=\"chartOptions.plotOptions!\"\n [yaxis]=\"chartOptions.yaxis!\"\n [labels]=\"chartOptions.labels!\"\n [legend]=\"chartOptions.legend!\"\n [colors]=\"chartOptions.colors!\"\n [theme]=\"chartOptions.theme!\"\n [tooltip]=\"chartOptions.tooltip!\"\n ></apx-chart>\n </div>\n </div>\n `,\n styles: [`\n .widget-container {\n height: 100%; width: 100%;\n display: flex; flex-direction: column;\n border-radius: 30px; overflow: hidden;\n box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid rgba(255,255,255,0.08);\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg);\n }\n .widget-container:hover { box-shadow: 0 12px 32px rgba(0,0,0,0.35); }\n .widget-header {\n padding: 14px 16px 4px;\n display: flex; justify-content: space-between; align-items: center;\n cursor: move; flex-shrink: 0;\n }\n .widget-title { color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 0.3px; }\n .header-actions { display: flex; gap: 6px; align-items: center; }\n .btn-icon {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n cursor: pointer; font-size: 12px; width: 26px; height: 26px;\n border-radius: 50%; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.25); color: var(--dash-accent-color); }\n .btn-close-widget:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .widget-body {\n flex: 1; min-height: 0; padding: 4px 12px 12px;\n display: flex; flex-direction: column;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnInit, OnChanges, OnDestroy {\n @Input() widget!: Widget;\n @Input() onRemoveWidget!: (id: string) => void;\n @Input() theme?: Required<DashboardTheme>;\n @Output() editRequested = new EventEmitter<Widget>();\n\n chartOptions!: Partial<ChartOptions>;\n cardStyles: Record<string, string> = {};\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnInit() {\n this.applyStyles();\n this.initChart();\n this.subs.add(\n this.stateService.widgetData$.subscribe(({ widgetId, data }) => {\n if (widgetId === this.widget.id) {\n this.widget = { ...this.widget, data };\n this.initChart();\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme']) { this.applyStyles(); this.initChart(); }\n if (changes['widget'] && !changes['widget'].firstChange) { this.applyStyles(); this.initChart(); }\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyStyles() {\n this.cardStyles = {\n background: this.widget.cardColor ?? 'var(--dash-card-bg)'\n };\n }\n\n private resolvedColors(): string[] {\n return this.widget.colors ?? this.theme?.chartColors ?? DEFAULT_CHART_COLORS;\n }\n\n private initChart() {\n const isDonut = this.widget.type === 'DONUT';\n const colors = this.resolvedColors();\n const foreColor = this.theme?.chartForeColor ?? DEFAULT_FORECOLOR;\n const lineBarData = !isDonut ? (this.widget.data as any) : null;\n const donutData = isDonut ? (this.widget.data as any) : null;\n const categories: string[] = lineBarData?.categories ?? [];\n const donutLabels: string[] = donutData?.labels ?? ['A','B','C','D','E'];\n\n this.chartOptions = {\n series: this.widget.data.series as any,\n chart: {\n width: '100%', height: '100%',\n type: this.widget.type.toLowerCase() as any,\n toolbar: { show: false },\n animations: { enabled: true, speed: 400 },\n background: 'transparent', foreColor,\n parentHeightOffset: 0, sparkline: { enabled: false },\n },\n theme: { mode: 'dark' },\n colors,\n stroke: { curve: 'smooth', width: isDonut ? 0 : 3 },\n dataLabels: { enabled: false },\n legend: { position: 'bottom', labels: { colors: foreColor } },\n tooltip: { theme: 'dark' },\n plotOptions: {\n pie: { donut: { size: '70%', labels: { show: true, total: { show: true, label: 'Total', color: '#fff' } } } },\n bar: { borderRadius: 8, columnWidth: '50%' }\n },\n xaxis: {\n categories: categories.length ? categories : undefined,\n labels: { style: { colors: foreColor } },\n axisBorder: { show: false }, axisTicks: { show: false }\n },\n yaxis: { labels: { style: { colors: foreColor } } },\n labels: isDonut ? donutLabels : undefined,\n };\n }\n\n onRemove() { this.onRemoveWidget(this.widget.id); }\n}\n","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { GridsterConfig } from 'angular-gridster2';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, WidgetType, DashboardTheme, LineBarData, DonutData } from './models';\nimport { Subscription } from 'rxjs';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n widgetCardColor: '#2c2c2e',\n chartForeColor: '#8e8e93',\n accentColor: '#0a84ff',\n dangerColor: '#ff453a',\n chartColors: ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'],\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <!-- ── Header ── -->\n <header class=\"dashboard-header\">\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div\n *ngFor=\"let page of pages\"\n class=\"tab\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSelectPage(page.id)\"\n >\n <span class=\"tab-name\">{{ page.name }}</span>\n <button class=\"tab-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <!-- Add Widget button -->\n <button class=\"btn-add-widget\" (click)=\"openDialog()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n </header>\n\n <!-- ── Grid ── -->\n <div class=\"grid-container\">\n <gridster [options]=\"options\">\n <gridster-item [item]=\"widget\" *ngFor=\"let widget of activePage?.widgets\">\n <app-widget-renderer\n [widget]=\"widget\"\n [onRemoveWidget]=\"removeWidgetHandler\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"openEditDialog($event)\"\n ></app-widget-renderer>\n </gridster-item>\n </gridster>\n </div>\n </main>\n </div>\n\n <!-- ── Add Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"dialogOpen\" (click)=\"closeDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"dialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Add Widget</span>\n <button class=\"dialog-close\" (click)=\"closeDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Chart type picker -->\n <div class=\"field-group\">\n <label class=\"field-label\">Chart type</label>\n <div class=\"type-picker\">\n <button\n *ngFor=\"let t of widgetTypes\"\n class=\"type-btn\"\n [class.selected]=\"dialogType === t.value\"\n (click)=\"dialogType = t.value\"\n >\n <i [class]=\"'la ' + t.icon\"></i>\n <span>{{ t.label }}</span>\n </button>\n </div>\n </div>\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"dialogTitle\" placeholder=\"My Chart\" />\n </div>\n\n <!-- Series (LINE / BAR) -->\n <ng-container *ngIf=\"dialogType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series</label>\n <button class=\"btn-link\" (click)=\"addSeries()\"><i class=\"la la-plus\"></i> Add series</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of dialogSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Series name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\"\n placeholder=\"Comma-separated values, e.g. 10,25,40\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSeries.length > 1\" (click)=\"removeSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"dialogCategories\" placeholder=\"Jan,Feb,Mar,Apr\" />\n </div>\n </ng-container>\n\n <!-- Slices (DONUT) -->\n <ng-container *ngIf=\"dialogType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addSlice()\"><i class=\"la la-plus\"></i> Add slice</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of dialogSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSlices.length > 1\" (click)=\"removeSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmAddWidget()\" [disabled]=\"!dialogTitle.trim()\">\n <i class=\"la la-check\"></i> Add Widget\n </button>\n </div>\n </div>\n <!-- ── Edit Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"editDialogOpen\" (click)=\"closeEditDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"editDialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Edit Widget</span>\n <button class=\"dialog-close\" (click)=\"closeEditDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"editTitle\" placeholder=\"Chart title\" />\n </div>\n\n <!-- Card background -->\n <div class=\"field-group\">\n <label class=\"field-label\">Card color</label>\n <div class=\"color-row\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editCardColor\" />\n <input class=\"field-input\" [(ngModel)]=\"editCardColor\" placeholder=\"#2c2c2e\" />\n </div>\n </div>\n\n <!-- Series colors -->\n <div class=\"field-group\">\n <label class=\"field-label\">Series colors</label>\n <div class=\"color-list\">\n <div class=\"color-item\" *ngFor=\"let c of editColors; let i = index\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editColors[i]\" />\n <input class=\"field-input color-hex\" [(ngModel)]=\"editColors[i]\" placeholder=\"#0a84ff\" />\n <span class=\"color-label\">{{ getEditSeriesLabel(i) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Data: LINE / BAR -->\n <ng-container *ngIf=\"editWidgetType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series data</label>\n <button class=\"btn-link\" (click)=\"addEditSeries()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of editSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\" placeholder=\"10,20,30\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSeries.length > 1\" (click)=\"removeEditSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"editCategories\" placeholder=\"Jan,Feb,Mar\" />\n </div>\n </ng-container>\n\n <!-- Data: DONUT -->\n <ng-container *ngIf=\"editWidgetType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addEditSlice()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of editSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSlices.length > 1\" (click)=\"removeEditSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeEditDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmEditWidget()\">\n <i class=\"la la-check\"></i> Save\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n --dash-bg: #000000;\n --dash-panel-bg: #1c1c1e;\n --dash-card-bg: #2c2c2e;\n --dash-fore-color: #8e8e93;\n --dash-accent-color: #0a84ff;\n --dash-danger-color: #ff453a;\n --dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n\n /* ── Layout ── */\n .dashboard-wrapper {\n display: flex;\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n }\n .tabs-container {\n display: flex;\n align-items: center;\n gap: 8px;\n background: rgba(44,44,46,0.6);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n }\n .tab {\n display: flex;\n align-items: center;\n padding: 8px 20px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--dash-fore-color);\n transition: all 0.3s cubic-bezier(0.25,0.8,0.25,1);\n }\n .tab.active {\n background: #3a3a3c;\n color: #ffffff;\n box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n }\n .tab:hover:not(.active) {\n color: #e5e5ea;\n background: rgba(255,255,255,0.05);\n }\n .tab-name { margin-right: 8px; }\n .tab-close {\n background: transparent; border: none; color: var(--dash-fore-color); padding: 2px;\n font-size: 12px; cursor: pointer; opacity: 0; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; transition: all 0.2s;\n }\n .tab-close:hover { color: var(--dash-danger-color); background: rgba(255, 69, 58, 0.2); }\n .tab:hover .tab-close { opacity: 1; }\n .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 16px; cursor: pointer; border-radius: 20px; transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10, 132, 255, 0.1); }\n\n /* Add Widget button */\n .btn-add-widget {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--dash-accent-color);\n border: none;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n padding: 10px 20px;\n border-radius: 22px;\n cursor: pointer;\n white-space: nowrap;\n transition: opacity 0.2s, transform 0.15s;\n box-shadow: 0 4px 14px rgba(10,132,255,0.4);\n }\n .btn-add-widget:hover { opacity: 0.9; transform: translateY(-1px); }\n .btn-add-widget:active { transform: translateY(0); }\n\n /* ── Grid ── */\n .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n gridster { background: transparent; height: 100% !important; }\n\n /* ── Dialog ── */\n .dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(6px);\n z-index: 900;\n }\n .dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 901;\n width: min(520px, calc(100vw - 32px));\n max-height: calc(100vh - 64px);\n display: flex;\n flex-direction: column;\n background: var(--dash-panel-bg);\n border-radius: 28px;\n border: 1px solid rgba(255,255,255,0.1);\n box-shadow: 0 24px 60px rgba(0,0,0,0.7);\n overflow: hidden;\n }\n .dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 22px 24px 16px;\n border-bottom: 1px solid rgba(255,255,255,0.07);\n }\n .dialog-title { font-size: 17px; font-weight: 700; color: #ffffff; }\n .dialog-close {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n width: 30px; height: 30px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; font-size: 14px; transition: all 0.2s;\n }\n .dialog-close:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .dialog-body { flex: 1; overflow-y: auto; padding: 20px 24px; display: flex; flex-direction: column; gap: 20px; }\n .field-group { display: flex; flex-direction: column; gap: 8px; }\n .field-label { font-size: 13px; font-weight: 600; color: var(--dash-fore-color); text-transform: uppercase; letter-spacing: 0.5px; }\n .field-input {\n background: var(--dash-card-bg);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n padding: 10px 14px;\n color: #ffffff;\n font-size: 14px;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n }\n .field-input:focus { border-color: var(--dash-accent-color); }\n .type-picker { display: flex; gap: 10px; }\n .type-btn {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 10px;\n background: var(--dash-card-bg); border: 2px solid transparent; border-radius: 16px;\n color: var(--dash-fore-color); font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s;\n }\n .type-btn.selected { border-color: var(--dash-accent-color); color: var(--dash-accent-color); background: rgba(10,132,255,0.12); }\n .btn-link { background: transparent; border: none; color: var(--dash-accent-color); font-size: 13px; font-weight: 600; cursor: pointer; }\n .dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding: 16px 24px 22px; border-top: 1px solid rgba(255,255,255,0.07); }\n .btn-cancel { background: transparent; border: 1px solid rgba(255,255,255,0.12); color: var(--dash-fore-color); padding: 10px 20px; border-radius: 20px; cursor: pointer; }\n .btn-confirm { background: var(--dash-accent-color); border: none; color: #ffffff; padding: 10px 22px; border-radius: 20px; font-weight: 600; cursor: pointer; }\n .btn-confirm:disabled { opacity: 0.4; cursor: not-allowed; }\n `]\n})\nexport class DashboardComponent implements OnInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n options!: GridsterConfig;\n pages: Page[] = [];\n activePageId: string = '';\n activePage?: Page;\n\n // ── Dialog state ──\n dialogOpen = false;\n dialogType: WidgetType = 'LINE';\n dialogTitle = '';\n dialogCategories = '';\n dialogSeries: { name: string; dataRaw: string }[] = [{ name: 'Series 1', dataRaw: '' }];\n dialogSlices: { label: string; value: number | null }[] = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n\n readonly widgetTypes: { value: WidgetType; label: string; icon: string }[] = [\n { value: 'LINE', label: 'Line', icon: 'la-chart-area' },\n { value: 'BAR', label: 'Bar', icon: 'la-chart-bar' },\n { value: 'DONUT',label: 'Donut', icon: 'la-chart-pie' },\n ];\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme'] || changes['initialLayout']) this.applyTheme();\n }\n\n ngOnInit() {\n this.applyTheme();\n\n if (this.initialLayout) {\n try { this.stateService.loadLayout(JSON.parse(this.initialLayout)); }\n catch (e) { console.error('[Dashboard] Failed to parse initialLayout', e); }\n }\n\n this.options = {\n gridType: 'fit',\n displayGrid: 'none',\n pushItems: true,\n draggable: { enabled: true },\n resizable: { enabled: true },\n minCols: 12, maxCols: 12,\n minRows: 12, maxRows: 50,\n margin: 20, outerMargin: true,\n itemChangeCallback: (item: any) => {\n this.stateService.updateWidgetPosition(\n this.activePageId, item.id, item.x, item.y, item.cols, item.rows\n );\n }\n };\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\n this.updateActivePage();\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n this.wrapperStyles = {\n '--dash-bg': this.resolvedTheme.backgroundColor,\n '--dash-panel-bg': this.resolvedTheme.panelColor,\n '--dash-card-bg': this.resolvedTheme.widgetCardColor,\n '--dash-fore-color': this.resolvedTheme.chartForeColor,\n '--dash-accent-color': this.resolvedTheme.accentColor,\n '--dash-danger-color': this.resolvedTheme.dangerColor,\n '--dash-font-family': this.resolvedTheme.fontFamily,\n };\n }\n\n private updateActivePage() {\n this.activePage = this.pages.find(p => p.id === this.activePageId);\n }\n\n\n // ── Page actions ──\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Enter workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n onRemovePage(event: Event, id: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) this.stateService.removePage(id);\n }\n\n // ── Dialog ──\n openDialog() {\n this.dialogType = 'LINE';\n this.dialogTitle = '';\n this.dialogCategories = '';\n this.dialogSeries = [{ name: 'Series 1', dataRaw: '' }];\n this.dialogSlices = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n this.dialogOpen = true;\n }\n\n closeDialog() { this.dialogOpen = false; }\n\n addSeries() { this.dialogSeries.push({ name: `Series ${this.dialogSeries.length + 1}`, dataRaw: '' }); }\n removeSeries(i: number) { this.dialogSeries.splice(i, 1); }\n\n addSlice() { this.dialogSlices.push({ label: `Slice ${this.dialogSlices.length + 1}`, value: null }); }\n removeSlice(i: number) { this.dialogSlices.splice(i, 1); }\n\n confirmAddWidget() {\n const title = this.dialogTitle.trim();\n if (!title) return;\n\n let data: LineBarData | DonutData;\n\n if (this.dialogType === 'DONUT') {\n const validSlices = this.dialogSlices.filter(s => s.value !== null && s.label.trim());\n data = {\n series: validSlices.length\n ? validSlices.map(s => Number(s.value))\n : [30, 20, 50],\n labels: validSlices.length\n ? validSlices.map(s => s.label)\n : ['A', 'B', 'C'],\n } as DonutData;\n } else {\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n data = {\n series: this.dialogSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim()\n ? parseNums(s.dataRaw)\n : Array.from({ length: 8 }, () => Math.floor(Math.random() * 100)),\n })),\n categories: this.dialogCategories.trim()\n ? this.dialogCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.addWidgetWithData(this.dialogType, title, data);\n this.closeDialog();\n }\n\n // ── Edit dialog state ──\n editDialogOpen = false;\n editingWidget?: Widget;\n editWidgetType: WidgetType = 'LINE';\n editTitle = '';\n editCardColor = '';\n editColors: string[] = [];\n editSeries: { name: string; dataRaw: string }[] = [];\n editCategories = '';\n editSlices: { label: string; value: number | null }[] = [];\n\n private readonly DEFAULT_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\n\n openEditDialog(widget: Widget) {\n this.editingWidget = widget;\n this.editWidgetType = widget.type;\n this.editTitle = widget.title;\n this.editCardColor = widget.cardColor ?? this.resolvedTheme.widgetCardColor;\n this.editColors = widget.colors?.length\n ? [...widget.colors]\n : [...this.resolvedTheme.chartColors];\n\n if (widget.type === 'DONUT') {\n const d = widget.data as any;\n this.editSlices = (d.series as number[]).map((v: number, i: number) => ({\n label: d.labels?.[i] ?? `Slice ${i + 1}`,\n value: v,\n }));\n this.editColors = this.editColors.slice(0, this.editSlices.length);\n while (this.editColors.length < this.editSlices.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n } else {\n const d = widget.data as any;\n this.editSeries = (d.series as any[]).map((s: any) => ({ name: s.name, dataRaw: s.data.join(',') }));\n this.editCategories = d.categories?.join(',') ?? '';\n this.editColors = this.editColors.slice(0, this.editSeries.length);\n while (this.editColors.length < this.editSeries.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n }\n\n this.editDialogOpen = true;\n }\n\n closeEditDialog() { this.editDialogOpen = false; this.editingWidget = undefined; }\n\n getEditSeriesLabel(i: number): string {\n if (this.editWidgetType === 'DONUT') return this.editSlices[i]?.label || `Slice ${i + 1}`;\n return this.editSeries[i]?.name || `Series ${i + 1}`;\n }\n\n addEditSeries() {\n this.editSeries.push({ name: `Series ${this.editSeries.length + 1}`, dataRaw: '' });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSeries(i: number) { this.editSeries.splice(i, 1); this.editColors.splice(i, 1); }\n\n addEditSlice() {\n this.editSlices.push({ label: `Slice ${this.editSlices.length + 1}`, value: null });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSlice(i: number) { this.editSlices.splice(i, 1); this.editColors.splice(i, 1); }\n\n confirmEditWidget() {\n if (!this.editingWidget) return;\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n let data: LineBarData | DonutData;\n if (this.editWidgetType === 'DONUT') {\n data = {\n series: this.editSlices.map(s => Number(s.value) || 0),\n labels: this.editSlices.map(s => s.label),\n } as DonutData;\n } else {\n data = {\n series: this.editSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim() ? parseNums(s.dataRaw) : [],\n })),\n categories: this.editCategories.trim()\n ? this.editCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.updateWidgetMeta(this.editingWidget.id, {\n title: this.editTitle.trim() || this.editingWidget.title,\n colors: [...this.editColors],\n cardColor: this.editCardColor,\n data,\n });\n this.closeEditDialog();\n }\n\n // ── Widget actions ──\n onAddWidget(type: WidgetType) { this.stateService.addWidget(type); }\n\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n this.stateService.updateWidgetData(widgetId, data);\n }\n\n removeWidgetHandler = (id: string) => { this.stateService.removeWidget(id); };\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridsterModule } from 'angular-gridster2';\nimport { NgApexchartsModule } from 'ng-apexcharts';\n\nimport { DashboardComponent } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n GridsterModule,\n NgApexchartsModule\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class DashboardModule { }\n\n/**\n * Root module for local demo / testing purposes.\n * In the final NPM package, users would only import the `DashboardModule`.\n */\n@NgModule({\n imports: [\n BrowserModule,\n DashboardModule\n ],\n bootstrap: [DashboardComponent]\n})\nexport class AppModule { }\n","/*\n * Public API Surface of the dashboard library\n */\n\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/app.module'; // This is the DashboardModule\nexport * from './app/models';\nexport * from './app/dashboard-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DashboardStateService","i3","i5.WidgetRendererComponent"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Component, Input, Output, NgModule } from '@angular/core';
2
+ import { Injectable, EventEmitter, Component, Input, Output, NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
3
3
  import { BehaviorSubject, Subject, Subscription } from 'rxjs';
4
4
  import * as i2 from '@angular/common';
5
5
  import { CommonModule } from '@angular/common';
@@ -337,7 +337,7 @@ WidgetRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
337
337
  ></apx-chart>
338
338
  </div>
339
339
  </div>
340
- `, isInline: true, styles: [".widget-container{height:100%;width:100%;display:flex;flex-direction:column;border-radius:30px;overflow:hidden;box-shadow:0 8px 24px #00000040;border:1px solid rgba(255,255,255,.08);transition:box-shadow .2s ease;box-sizing:border-box;background:var(--dash-card-bg)}.widget-container:hover{box-shadow:0 12px 32px #00000059}.widget-header{padding:14px 16px 4px;display:flex;justify-content:space-between;align-items:center;cursor:move;flex-shrink:0}.widget-title{color:#fff;font-size:15px;font-weight:600;letter-spacing:.3px}.header-actions{display:flex;gap:6px;align-items:center}.btn-icon{background:rgba(255,255,255,.08);border:none;color:var(--dash-fore-color);cursor:pointer;font-size:12px;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.btn-edit:hover{background:rgba(10,132,255,.25);color:var(--dash-accent-color)}.btn-close-widget:hover{background:rgba(255,69,58,.25);color:var(--dash-danger-color)}.widget-body{flex:1;min-height:0;padding:4px 12px 12px;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ChartComponent, selector: "apx-chart", inputs: ["chart", "annotations", "colors", "dataLabels", "series", "stroke", "labels", "legend", "markers", "noData", "fill", "tooltip", "plotOptions", "responsive", "xaxis", "yaxis", "forecastDataPoints", "grid", "states", "title", "subtitle", "theme", "autoUpdateSeries"] }] });
340
+ `, isInline: true, styles: [".widget-container{height:100%;width:100%;display:flex;flex-direction:column;border-radius:30px;overflow:hidden;box-shadow:0 8px 24px #00000040;border:1px solid rgba(255,255,255,.08);transition:box-shadow .2s ease;box-sizing:border-box;background:var(--dash-card-bg)}.widget-container:hover{box-shadow:0 12px 32px #00000059}.widget-header{padding:14px 16px 4px;display:flex;justify-content:space-between;align-items:center;cursor:move;flex-shrink:0}.widget-title{color:#fff;font-size:15px;font-weight:600;letter-spacing:.3px}.header-actions{display:flex;gap:6px;align-items:center}.btn-icon{background:rgba(255,255,255,.08);border:none;color:var(--dash-fore-color);cursor:pointer;font-size:12px;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s;flex-shrink:0}.btn-edit:hover{background:rgba(10,132,255,.25);color:var(--dash-accent-color)}.btn-close-widget:hover{background:rgba(255,69,58,.25);color:var(--dash-danger-color)}.widget-body{flex:1;min-height:0;padding:4px 12px 12px;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ChartComponent, selector: "apx-chart", outputs: ["chartReady"] }] });
341
341
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WidgetRendererComponent, decorators: [{
342
342
  type: Component,
343
343
  args: [{ selector: 'app-widget-renderer', template: `
@@ -1108,7 +1108,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1108
1108
  exports: [
1109
1109
  DashboardComponent,
1110
1110
  WidgetRendererComponent
1111
- ]
1111
+ ],
1112
+ schemas: [NO_ERRORS_SCHEMA]
1112
1113
  }]
1113
1114
  }] });
1114
1115
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/dashboard-state.service.ts","../../src/app/widget-renderer.component.ts","../../src/app/dashboard.component.ts","../../src/app/app.module.ts","../../src/public-api.ts","../../src/ogidor-dashboard.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Page, Widget, DashboardConfig, WidgetType, LineBarData, DonutData } from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardStateService {\n private readonly STORAGE_KEY = 'xtb_dashboard_layout';\n \n private initialPages: Page[] = [\n {\n id: 'page-1',\n name: 'Default Workspace',\n widgets: [\n {\n id: 'w-1',\n type: 'LINE',\n x: 0,\n y: 0,\n cols: 4,\n rows: 4,\n title: 'Market Trend',\n data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }\n },\n {\n id: 'w-2',\n type: 'DONUT',\n x: 4,\n y: 0,\n cols: 2,\n rows: 4,\n title: 'Asset Allocation',\n data: { series: [44, 55, 41, 17, 15] }\n }\n ]\n }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n /**\n * Emits whenever a widget's data is updated programmatically.\n * Key = widget id, value = new data payload.\n */\n private widgetDataSubject = new Subject<{ widgetId: string; data: LineBarData | DonutData }>();\n widgetData$ = this.widgetDataSubject.asObservable();\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor() {\n const saved = localStorage.getItem(this.STORAGE_KEY);\n if (saved) {\n try {\n this.loadLayout(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to load saved layout', e);\n }\n }\n }\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) {\n this.activePageIdSubject.next(id);\n }\n\n addPage(name: string) {\n const newPage: Page = {\n id: `page-${Date.now()}`,\n name,\n widgets: []\n };\n const updatedPages = [...this.pagesSubject.value, newPage];\n this.pagesSubject.next(updatedPages);\n this.activePageIdSubject.next(newPage.id);\n this.saveToLocalStorage();\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n\n const updatedPages = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updatedPages);\n \n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updatedPages[0].id);\n }\n this.saveToLocalStorage();\n }\n\n addWidget(type: WidgetType) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 2 : 4,\n rows: 4,\n title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,\n data: this.getDefaultDataForType(type)\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n addWidgetWithData(type: WidgetType, title: string, data: LineBarData | DonutData) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 3 : 6,\n rows: 4,\n title,\n data\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n private getDefaultDataForType(type: WidgetType) {\n if (type === 'DONUT') {\n return { series: [30, 20, 50] };\n }\n return {\n series: [{\n name: 'Sample Data',\n data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))\n }]\n };\n }\n\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const page = pages.find(p => p.id === pageId);\n if (page) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x;\n widget.y = y;\n widget.cols = cols;\n widget.rows = rows;\n this.updatePages(pages);\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (activePage) {\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.updatePages(this.pagesSubject.value);\n }\n }\n\n /**\n * Push new data into a widget by its id.\n * The widget's chart will re-render immediately.\n *\n * @param widgetId The `id` of the target widget.\n * @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.\n */\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.data = data;\n this.widgetDataSubject.next({ widgetId, data });\n this.updatePages(pages);\n return;\n }\n }\n console.warn(`[Dashboard] updateWidgetData: widget \"${widgetId}\" not found.`);\n }\n\n updateWidgetMeta(widgetId: string, meta: { title?: string; colors?: string[]; cardColor?: string; data?: LineBarData | DonutData }) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n if (meta.title !== undefined) widget.title = meta.title;\n if (meta.colors !== undefined) widget.colors = meta.colors;\n if (meta.cardColor !== undefined) widget.cardColor = meta.cardColor;\n if (meta.data !== undefined) {\n widget.data = meta.data;\n this.widgetDataSubject.next({ widgetId, data: meta.data });\n }\n this.updatePages(pages);\n return;\n }\n }\n }\n\n private updatePages(pages: Page[]) {\n this.pagesSubject.next([...pages]);\n this.saveToLocalStorage();\n }\n\n serializeLayout(): string {\n const config: DashboardConfig = {\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value\n };\n return JSON.stringify(config);\n }\n\n loadLayout(config: any) {\n if (config && config.pages) {\n this.pagesSubject.next(config.pages);\n if (config.activePageId) {\n this.activePageIdSubject.next(config.activePageId);\n }\n }\n }\n\n private saveToLocalStorage() {\n localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Widget, DashboardTheme } from './models';\nimport { DashboardStateService } from './dashboard-state.service';\nimport {\n ApexAxisChartSeries, ApexChart, ApexXAxis, ApexDataLabels,\n ApexStroke, ApexYAxis, ApexTitleSubtitle, ApexLegend,\n ApexPlotOptions, ApexTooltip, ApexTheme\n} from 'ng-apexcharts';\n\nexport type ChartOptions = {\n series: ApexAxisChartSeries | number[];\n chart: ApexChart; xaxis: ApexXAxis; stroke: ApexStroke;\n dataLabels: ApexDataLabels; yaxis: ApexYAxis; title: ApexTitleSubtitle;\n labels: string[]; legend: ApexLegend; plotOptions: ApexPlotOptions;\n tooltip: ApexTooltip; theme: ApexTheme; colors: string[];\n};\n\nconst DEFAULT_CHART_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\nconst DEFAULT_FORECOLOR = '#8e8e93';\nconst DEFAULT_CARD_BG = '#2c2c2e';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-container\" [ngStyle]=\"cardStyles\">\n <div class=\"widget-header\">\n <span class=\"widget-title\">{{ widget.title }}</span>\n <div class=\"header-actions\">\n <button class=\"btn-icon btn-edit\" (click)=\"editRequested.emit(widget)\" title=\"Edit widget\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-close-widget\" (click)=\"onRemove()\" title=\"Remove widget\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"widget-body\">\n <apx-chart\n *ngIf=\"chartOptions.chart\"\n style=\"display:block;width:100%;height:100%;\"\n [series]=\"chartOptions.series!\"\n [chart]=\"chartOptions.chart!\"\n [xaxis]=\"chartOptions.xaxis!\"\n [stroke]=\"chartOptions.stroke!\"\n [dataLabels]=\"chartOptions.dataLabels!\"\n [plotOptions]=\"chartOptions.plotOptions!\"\n [yaxis]=\"chartOptions.yaxis!\"\n [labels]=\"chartOptions.labels!\"\n [legend]=\"chartOptions.legend!\"\n [colors]=\"chartOptions.colors!\"\n [theme]=\"chartOptions.theme!\"\n [tooltip]=\"chartOptions.tooltip!\"\n ></apx-chart>\n </div>\n </div>\n `,\n styles: [`\n .widget-container {\n height: 100%; width: 100%;\n display: flex; flex-direction: column;\n border-radius: 30px; overflow: hidden;\n box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid rgba(255,255,255,0.08);\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg);\n }\n .widget-container:hover { box-shadow: 0 12px 32px rgba(0,0,0,0.35); }\n .widget-header {\n padding: 14px 16px 4px;\n display: flex; justify-content: space-between; align-items: center;\n cursor: move; flex-shrink: 0;\n }\n .widget-title { color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 0.3px; }\n .header-actions { display: flex; gap: 6px; align-items: center; }\n .btn-icon {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n cursor: pointer; font-size: 12px; width: 26px; height: 26px;\n border-radius: 50%; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.25); color: var(--dash-accent-color); }\n .btn-close-widget:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .widget-body {\n flex: 1; min-height: 0; padding: 4px 12px 12px;\n display: flex; flex-direction: column;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnInit, OnChanges, OnDestroy {\n @Input() widget!: Widget;\n @Input() onRemoveWidget!: (id: string) => void;\n @Input() theme?: Required<DashboardTheme>;\n @Output() editRequested = new EventEmitter<Widget>();\n\n chartOptions!: Partial<ChartOptions>;\n cardStyles: Record<string, string> = {};\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnInit() {\n this.applyStyles();\n this.initChart();\n this.subs.add(\n this.stateService.widgetData$.subscribe(({ widgetId, data }) => {\n if (widgetId === this.widget.id) {\n this.widget = { ...this.widget, data };\n this.initChart();\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme']) { this.applyStyles(); this.initChart(); }\n if (changes['widget'] && !changes['widget'].firstChange) { this.applyStyles(); this.initChart(); }\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyStyles() {\n this.cardStyles = {\n background: this.widget.cardColor ?? 'var(--dash-card-bg)'\n };\n }\n\n private resolvedColors(): string[] {\n return this.widget.colors ?? this.theme?.chartColors ?? DEFAULT_CHART_COLORS;\n }\n\n private initChart() {\n const isDonut = this.widget.type === 'DONUT';\n const colors = this.resolvedColors();\n const foreColor = this.theme?.chartForeColor ?? DEFAULT_FORECOLOR;\n const lineBarData = !isDonut ? (this.widget.data as any) : null;\n const donutData = isDonut ? (this.widget.data as any) : null;\n const categories: string[] = lineBarData?.categories ?? [];\n const donutLabels: string[] = donutData?.labels ?? ['A','B','C','D','E'];\n\n this.chartOptions = {\n series: this.widget.data.series as any,\n chart: {\n width: '100%', height: '100%',\n type: this.widget.type.toLowerCase() as any,\n toolbar: { show: false },\n animations: { enabled: true, speed: 400 },\n background: 'transparent', foreColor,\n parentHeightOffset: 0, sparkline: { enabled: false },\n },\n theme: { mode: 'dark' },\n colors,\n stroke: { curve: 'smooth', width: isDonut ? 0 : 3 },\n dataLabels: { enabled: false },\n legend: { position: 'bottom', labels: { colors: foreColor } },\n tooltip: { theme: 'dark' },\n plotOptions: {\n pie: { donut: { size: '70%', labels: { show: true, total: { show: true, label: 'Total', color: '#fff' } } } },\n bar: { borderRadius: 8, columnWidth: '50%' }\n },\n xaxis: {\n categories: categories.length ? categories : undefined,\n labels: { style: { colors: foreColor } },\n axisBorder: { show: false }, axisTicks: { show: false }\n },\n yaxis: { labels: { style: { colors: foreColor } } },\n labels: isDonut ? donutLabels : undefined,\n };\n }\n\n onRemove() { this.onRemoveWidget(this.widget.id); }\n}\n","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { GridsterConfig } from 'angular-gridster2';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, WidgetType, DashboardTheme, LineBarData, DonutData } from './models';\nimport { Subscription } from 'rxjs';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n widgetCardColor: '#2c2c2e',\n chartForeColor: '#8e8e93',\n accentColor: '#0a84ff',\n dangerColor: '#ff453a',\n chartColors: ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'],\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <!-- ── Header ── -->\n <header class=\"dashboard-header\">\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div\n *ngFor=\"let page of pages\"\n class=\"tab\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSelectPage(page.id)\"\n >\n <span class=\"tab-name\">{{ page.name }}</span>\n <button class=\"tab-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <!-- Add Widget button -->\n <button class=\"btn-add-widget\" (click)=\"openDialog()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n </header>\n\n <!-- ── Grid ── -->\n <div class=\"grid-container\">\n <gridster [options]=\"options\">\n <gridster-item [item]=\"widget\" *ngFor=\"let widget of activePage?.widgets\">\n <app-widget-renderer\n [widget]=\"widget\"\n [onRemoveWidget]=\"removeWidgetHandler\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"openEditDialog($event)\"\n ></app-widget-renderer>\n </gridster-item>\n </gridster>\n </div>\n </main>\n </div>\n\n <!-- ── Add Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"dialogOpen\" (click)=\"closeDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"dialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Add Widget</span>\n <button class=\"dialog-close\" (click)=\"closeDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Chart type picker -->\n <div class=\"field-group\">\n <label class=\"field-label\">Chart type</label>\n <div class=\"type-picker\">\n <button\n *ngFor=\"let t of widgetTypes\"\n class=\"type-btn\"\n [class.selected]=\"dialogType === t.value\"\n (click)=\"dialogType = t.value\"\n >\n <i [class]=\"'la ' + t.icon\"></i>\n <span>{{ t.label }}</span>\n </button>\n </div>\n </div>\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"dialogTitle\" placeholder=\"My Chart\" />\n </div>\n\n <!-- Series (LINE / BAR) -->\n <ng-container *ngIf=\"dialogType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series</label>\n <button class=\"btn-link\" (click)=\"addSeries()\"><i class=\"la la-plus\"></i> Add series</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of dialogSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Series name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\"\n placeholder=\"Comma-separated values, e.g. 10,25,40\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSeries.length > 1\" (click)=\"removeSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"dialogCategories\" placeholder=\"Jan,Feb,Mar,Apr\" />\n </div>\n </ng-container>\n\n <!-- Slices (DONUT) -->\n <ng-container *ngIf=\"dialogType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addSlice()\"><i class=\"la la-plus\"></i> Add slice</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of dialogSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSlices.length > 1\" (click)=\"removeSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmAddWidget()\" [disabled]=\"!dialogTitle.trim()\">\n <i class=\"la la-check\"></i> Add Widget\n </button>\n </div>\n </div>\n <!-- ── Edit Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"editDialogOpen\" (click)=\"closeEditDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"editDialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Edit Widget</span>\n <button class=\"dialog-close\" (click)=\"closeEditDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"editTitle\" placeholder=\"Chart title\" />\n </div>\n\n <!-- Card background -->\n <div class=\"field-group\">\n <label class=\"field-label\">Card color</label>\n <div class=\"color-row\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editCardColor\" />\n <input class=\"field-input\" [(ngModel)]=\"editCardColor\" placeholder=\"#2c2c2e\" />\n </div>\n </div>\n\n <!-- Series colors -->\n <div class=\"field-group\">\n <label class=\"field-label\">Series colors</label>\n <div class=\"color-list\">\n <div class=\"color-item\" *ngFor=\"let c of editColors; let i = index\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editColors[i]\" />\n <input class=\"field-input color-hex\" [(ngModel)]=\"editColors[i]\" placeholder=\"#0a84ff\" />\n <span class=\"color-label\">{{ getEditSeriesLabel(i) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Data: LINE / BAR -->\n <ng-container *ngIf=\"editWidgetType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series data</label>\n <button class=\"btn-link\" (click)=\"addEditSeries()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of editSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\" placeholder=\"10,20,30\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSeries.length > 1\" (click)=\"removeEditSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"editCategories\" placeholder=\"Jan,Feb,Mar\" />\n </div>\n </ng-container>\n\n <!-- Data: DONUT -->\n <ng-container *ngIf=\"editWidgetType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addEditSlice()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of editSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSlices.length > 1\" (click)=\"removeEditSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeEditDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmEditWidget()\">\n <i class=\"la la-check\"></i> Save\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n --dash-bg: #000000;\n --dash-panel-bg: #1c1c1e;\n --dash-card-bg: #2c2c2e;\n --dash-fore-color: #8e8e93;\n --dash-accent-color: #0a84ff;\n --dash-danger-color: #ff453a;\n --dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n\n /* ── Layout ── */\n .dashboard-wrapper {\n display: flex;\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n }\n .tabs-container {\n display: flex;\n align-items: center;\n gap: 8px;\n background: rgba(44,44,46,0.6);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n }\n .tab {\n display: flex;\n align-items: center;\n padding: 8px 20px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--dash-fore-color);\n transition: all 0.3s cubic-bezier(0.25,0.8,0.25,1);\n }\n .tab.active {\n background: #3a3a3c;\n color: #ffffff;\n box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n }\n .tab:hover:not(.active) {\n color: #e5e5ea;\n background: rgba(255,255,255,0.05);\n }\n .tab-name { margin-right: 8px; }\n .tab-close {\n background: transparent; border: none; color: var(--dash-fore-color); padding: 2px;\n font-size: 12px; cursor: pointer; opacity: 0; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; transition: all 0.2s;\n }\n .tab-close:hover { color: var(--dash-danger-color); background: rgba(255, 69, 58, 0.2); }\n .tab:hover .tab-close { opacity: 1; }\n .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 16px; cursor: pointer; border-radius: 20px; transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10, 132, 255, 0.1); }\n\n /* Add Widget button */\n .btn-add-widget {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--dash-accent-color);\n border: none;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n padding: 10px 20px;\n border-radius: 22px;\n cursor: pointer;\n white-space: nowrap;\n transition: opacity 0.2s, transform 0.15s;\n box-shadow: 0 4px 14px rgba(10,132,255,0.4);\n }\n .btn-add-widget:hover { opacity: 0.9; transform: translateY(-1px); }\n .btn-add-widget:active { transform: translateY(0); }\n\n /* ── Grid ── */\n .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n gridster { background: transparent; height: 100% !important; }\n\n /* ── Dialog ── */\n .dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(6px);\n z-index: 900;\n }\n .dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 901;\n width: min(520px, calc(100vw - 32px));\n max-height: calc(100vh - 64px);\n display: flex;\n flex-direction: column;\n background: var(--dash-panel-bg);\n border-radius: 28px;\n border: 1px solid rgba(255,255,255,0.1);\n box-shadow: 0 24px 60px rgba(0,0,0,0.7);\n overflow: hidden;\n }\n .dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 22px 24px 16px;\n border-bottom: 1px solid rgba(255,255,255,0.07);\n }\n .dialog-title { font-size: 17px; font-weight: 700; color: #ffffff; }\n .dialog-close {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n width: 30px; height: 30px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; font-size: 14px; transition: all 0.2s;\n }\n .dialog-close:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .dialog-body { flex: 1; overflow-y: auto; padding: 20px 24px; display: flex; flex-direction: column; gap: 20px; }\n .field-group { display: flex; flex-direction: column; gap: 8px; }\n .field-label { font-size: 13px; font-weight: 600; color: var(--dash-fore-color); text-transform: uppercase; letter-spacing: 0.5px; }\n .field-input {\n background: var(--dash-card-bg);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n padding: 10px 14px;\n color: #ffffff;\n font-size: 14px;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n }\n .field-input:focus { border-color: var(--dash-accent-color); }\n .type-picker { display: flex; gap: 10px; }\n .type-btn {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 10px;\n background: var(--dash-card-bg); border: 2px solid transparent; border-radius: 16px;\n color: var(--dash-fore-color); font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s;\n }\n .type-btn.selected { border-color: var(--dash-accent-color); color: var(--dash-accent-color); background: rgba(10,132,255,0.12); }\n .btn-link { background: transparent; border: none; color: var(--dash-accent-color); font-size: 13px; font-weight: 600; cursor: pointer; }\n .dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding: 16px 24px 22px; border-top: 1px solid rgba(255,255,255,0.07); }\n .btn-cancel { background: transparent; border: 1px solid rgba(255,255,255,0.12); color: var(--dash-fore-color); padding: 10px 20px; border-radius: 20px; cursor: pointer; }\n .btn-confirm { background: var(--dash-accent-color); border: none; color: #ffffff; padding: 10px 22px; border-radius: 20px; font-weight: 600; cursor: pointer; }\n .btn-confirm:disabled { opacity: 0.4; cursor: not-allowed; }\n `]\n})\nexport class DashboardComponent implements OnInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n options!: GridsterConfig;\n pages: Page[] = [];\n activePageId: string = '';\n activePage?: Page;\n\n // ── Dialog state ──\n dialogOpen = false;\n dialogType: WidgetType = 'LINE';\n dialogTitle = '';\n dialogCategories = '';\n dialogSeries: { name: string; dataRaw: string }[] = [{ name: 'Series 1', dataRaw: '' }];\n dialogSlices: { label: string; value: number | null }[] = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n\n readonly widgetTypes: { value: WidgetType; label: string; icon: string }[] = [\n { value: 'LINE', label: 'Line', icon: 'la-chart-area' },\n { value: 'BAR', label: 'Bar', icon: 'la-chart-bar' },\n { value: 'DONUT',label: 'Donut', icon: 'la-chart-pie' },\n ];\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme'] || changes['initialLayout']) this.applyTheme();\n }\n\n ngOnInit() {\n this.applyTheme();\n\n if (this.initialLayout) {\n try { this.stateService.loadLayout(JSON.parse(this.initialLayout)); }\n catch (e) { console.error('[Dashboard] Failed to parse initialLayout', e); }\n }\n\n this.options = {\n gridType: 'fit',\n displayGrid: 'none',\n pushItems: true,\n draggable: { enabled: true },\n resizable: { enabled: true },\n minCols: 12, maxCols: 12,\n minRows: 12, maxRows: 50,\n margin: 20, outerMargin: true,\n itemChangeCallback: (item: any) => {\n this.stateService.updateWidgetPosition(\n this.activePageId, item.id, item.x, item.y, item.cols, item.rows\n );\n }\n };\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\n this.updateActivePage();\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n this.wrapperStyles = {\n '--dash-bg': this.resolvedTheme.backgroundColor,\n '--dash-panel-bg': this.resolvedTheme.panelColor,\n '--dash-card-bg': this.resolvedTheme.widgetCardColor,\n '--dash-fore-color': this.resolvedTheme.chartForeColor,\n '--dash-accent-color': this.resolvedTheme.accentColor,\n '--dash-danger-color': this.resolvedTheme.dangerColor,\n '--dash-font-family': this.resolvedTheme.fontFamily,\n };\n }\n\n private updateActivePage() {\n this.activePage = this.pages.find(p => p.id === this.activePageId);\n }\n\n\n // ── Page actions ──\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Enter workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n onRemovePage(event: Event, id: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) this.stateService.removePage(id);\n }\n\n // ── Dialog ──\n openDialog() {\n this.dialogType = 'LINE';\n this.dialogTitle = '';\n this.dialogCategories = '';\n this.dialogSeries = [{ name: 'Series 1', dataRaw: '' }];\n this.dialogSlices = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n this.dialogOpen = true;\n }\n\n closeDialog() { this.dialogOpen = false; }\n\n addSeries() { this.dialogSeries.push({ name: `Series ${this.dialogSeries.length + 1}`, dataRaw: '' }); }\n removeSeries(i: number) { this.dialogSeries.splice(i, 1); }\n\n addSlice() { this.dialogSlices.push({ label: `Slice ${this.dialogSlices.length + 1}`, value: null }); }\n removeSlice(i: number) { this.dialogSlices.splice(i, 1); }\n\n confirmAddWidget() {\n const title = this.dialogTitle.trim();\n if (!title) return;\n\n let data: LineBarData | DonutData;\n\n if (this.dialogType === 'DONUT') {\n const validSlices = this.dialogSlices.filter(s => s.value !== null && s.label.trim());\n data = {\n series: validSlices.length\n ? validSlices.map(s => Number(s.value))\n : [30, 20, 50],\n labels: validSlices.length\n ? validSlices.map(s => s.label)\n : ['A', 'B', 'C'],\n } as DonutData;\n } else {\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n data = {\n series: this.dialogSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim()\n ? parseNums(s.dataRaw)\n : Array.from({ length: 8 }, () => Math.floor(Math.random() * 100)),\n })),\n categories: this.dialogCategories.trim()\n ? this.dialogCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.addWidgetWithData(this.dialogType, title, data);\n this.closeDialog();\n }\n\n // ── Edit dialog state ──\n editDialogOpen = false;\n editingWidget?: Widget;\n editWidgetType: WidgetType = 'LINE';\n editTitle = '';\n editCardColor = '';\n editColors: string[] = [];\n editSeries: { name: string; dataRaw: string }[] = [];\n editCategories = '';\n editSlices: { label: string; value: number | null }[] = [];\n\n private readonly DEFAULT_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\n\n openEditDialog(widget: Widget) {\n this.editingWidget = widget;\n this.editWidgetType = widget.type;\n this.editTitle = widget.title;\n this.editCardColor = widget.cardColor ?? this.resolvedTheme.widgetCardColor;\n this.editColors = widget.colors?.length\n ? [...widget.colors]\n : [...this.resolvedTheme.chartColors];\n\n if (widget.type === 'DONUT') {\n const d = widget.data as any;\n this.editSlices = (d.series as number[]).map((v: number, i: number) => ({\n label: d.labels?.[i] ?? `Slice ${i + 1}`,\n value: v,\n }));\n this.editColors = this.editColors.slice(0, this.editSlices.length);\n while (this.editColors.length < this.editSlices.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n } else {\n const d = widget.data as any;\n this.editSeries = (d.series as any[]).map((s: any) => ({ name: s.name, dataRaw: s.data.join(',') }));\n this.editCategories = d.categories?.join(',') ?? '';\n this.editColors = this.editColors.slice(0, this.editSeries.length);\n while (this.editColors.length < this.editSeries.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n }\n\n this.editDialogOpen = true;\n }\n\n closeEditDialog() { this.editDialogOpen = false; this.editingWidget = undefined; }\n\n getEditSeriesLabel(i: number): string {\n if (this.editWidgetType === 'DONUT') return this.editSlices[i]?.label || `Slice ${i + 1}`;\n return this.editSeries[i]?.name || `Series ${i + 1}`;\n }\n\n addEditSeries() {\n this.editSeries.push({ name: `Series ${this.editSeries.length + 1}`, dataRaw: '' });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSeries(i: number) { this.editSeries.splice(i, 1); this.editColors.splice(i, 1); }\n\n addEditSlice() {\n this.editSlices.push({ label: `Slice ${this.editSlices.length + 1}`, value: null });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSlice(i: number) { this.editSlices.splice(i, 1); this.editColors.splice(i, 1); }\n\n confirmEditWidget() {\n if (!this.editingWidget) return;\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n let data: LineBarData | DonutData;\n if (this.editWidgetType === 'DONUT') {\n data = {\n series: this.editSlices.map(s => Number(s.value) || 0),\n labels: this.editSlices.map(s => s.label),\n } as DonutData;\n } else {\n data = {\n series: this.editSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim() ? parseNums(s.dataRaw) : [],\n })),\n categories: this.editCategories.trim()\n ? this.editCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.updateWidgetMeta(this.editingWidget.id, {\n title: this.editTitle.trim() || this.editingWidget.title,\n colors: [...this.editColors],\n cardColor: this.editCardColor,\n data,\n });\n this.closeEditDialog();\n }\n\n // ── Widget actions ──\n onAddWidget(type: WidgetType) { this.stateService.addWidget(type); }\n\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n this.stateService.updateWidgetData(widgetId, data);\n }\n\n removeWidgetHandler = (id: string) => { this.stateService.removeWidget(id); };\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n}\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridsterModule } from 'angular-gridster2';\nimport { NgApexchartsModule } from 'ng-apexcharts';\n\nimport { DashboardComponent } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n GridsterModule,\n NgApexchartsModule\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n WidgetRendererComponent\n ]\n})\nexport class DashboardModule { }\n\n/**\n * Root module for local demo / testing purposes.\n * In the final NPM package, users would only import the `DashboardModule`.\n */\n@NgModule({\n imports: [\n BrowserModule,\n DashboardModule\n ],\n bootstrap: [DashboardComponent]\n})\nexport class AppModule { }\n","/*\n * Public API Surface of the dashboard library\n */\n\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/app.module'; // This is the DashboardModule\nexport * from './app/models';\nexport * from './app/dashboard-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DashboardStateService","i3","i5.WidgetRendererComponent"],"mappings":"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"}
1
+ {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/dashboard-state.service.ts","../../src/app/widget-renderer.component.ts","../../src/app/dashboard.component.ts","../../src/app/app.module.ts","../../src/public-api.ts","../../src/ogidor-dashboard.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Page, Widget, DashboardConfig, WidgetType, LineBarData, DonutData } from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardStateService {\n private readonly STORAGE_KEY = 'xtb_dashboard_layout';\n \n private initialPages: Page[] = [\n {\n id: 'page-1',\n name: 'Default Workspace',\n widgets: [\n {\n id: 'w-1',\n type: 'LINE',\n x: 0,\n y: 0,\n cols: 4,\n rows: 4,\n title: 'Market Trend',\n data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }\n },\n {\n id: 'w-2',\n type: 'DONUT',\n x: 4,\n y: 0,\n cols: 2,\n rows: 4,\n title: 'Asset Allocation',\n data: { series: [44, 55, 41, 17, 15] }\n }\n ]\n }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n /**\n * Emits whenever a widget's data is updated programmatically.\n * Key = widget id, value = new data payload.\n */\n private widgetDataSubject = new Subject<{ widgetId: string; data: LineBarData | DonutData }>();\n widgetData$ = this.widgetDataSubject.asObservable();\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor() {\n const saved = localStorage.getItem(this.STORAGE_KEY);\n if (saved) {\n try {\n this.loadLayout(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to load saved layout', e);\n }\n }\n }\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) {\n this.activePageIdSubject.next(id);\n }\n\n addPage(name: string) {\n const newPage: Page = {\n id: `page-${Date.now()}`,\n name,\n widgets: []\n };\n const updatedPages = [...this.pagesSubject.value, newPage];\n this.pagesSubject.next(updatedPages);\n this.activePageIdSubject.next(newPage.id);\n this.saveToLocalStorage();\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n\n const updatedPages = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updatedPages);\n \n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updatedPages[0].id);\n }\n this.saveToLocalStorage();\n }\n\n addWidget(type: WidgetType) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 2 : 4,\n rows: 4,\n title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,\n data: this.getDefaultDataForType(type)\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n addWidgetWithData(type: WidgetType, title: string, data: LineBarData | DonutData) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 3 : 6,\n rows: 4,\n title,\n data\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n private getDefaultDataForType(type: WidgetType) {\n if (type === 'DONUT') {\n return { series: [30, 20, 50] };\n }\n return {\n series: [{\n name: 'Sample Data',\n data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))\n }]\n };\n }\n\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const page = pages.find(p => p.id === pageId);\n if (page) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x;\n widget.y = y;\n widget.cols = cols;\n widget.rows = rows;\n this.updatePages(pages);\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (activePage) {\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.updatePages(this.pagesSubject.value);\n }\n }\n\n /**\n * Push new data into a widget by its id.\n * The widget's chart will re-render immediately.\n *\n * @param widgetId The `id` of the target widget.\n * @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.\n */\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.data = data;\n this.widgetDataSubject.next({ widgetId, data });\n this.updatePages(pages);\n return;\n }\n }\n console.warn(`[Dashboard] updateWidgetData: widget \"${widgetId}\" not found.`);\n }\n\n updateWidgetMeta(widgetId: string, meta: { title?: string; colors?: string[]; cardColor?: string; data?: LineBarData | DonutData }) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n if (meta.title !== undefined) widget.title = meta.title;\n if (meta.colors !== undefined) widget.colors = meta.colors;\n if (meta.cardColor !== undefined) widget.cardColor = meta.cardColor;\n if (meta.data !== undefined) {\n widget.data = meta.data;\n this.widgetDataSubject.next({ widgetId, data: meta.data });\n }\n this.updatePages(pages);\n return;\n }\n }\n }\n\n private updatePages(pages: Page[]) {\n this.pagesSubject.next([...pages]);\n this.saveToLocalStorage();\n }\n\n serializeLayout(): string {\n const config: DashboardConfig = {\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value\n };\n return JSON.stringify(config);\n }\n\n loadLayout(config: any) {\n if (config && config.pages) {\n this.pagesSubject.next(config.pages);\n if (config.activePageId) {\n this.activePageIdSubject.next(config.activePageId);\n }\n }\n }\n\n private saveToLocalStorage() {\n localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Widget, DashboardTheme } from './models';\nimport { DashboardStateService } from './dashboard-state.service';\nimport {\n ApexAxisChartSeries, ApexChart, ApexXAxis, ApexDataLabels,\n ApexStroke, ApexYAxis, ApexTitleSubtitle, ApexLegend,\n ApexPlotOptions, ApexTooltip, ApexTheme\n} from 'ng-apexcharts';\n\nexport type ChartOptions = {\n series: ApexAxisChartSeries | number[];\n chart: ApexChart; xaxis: ApexXAxis; stroke: ApexStroke;\n dataLabels: ApexDataLabels; yaxis: ApexYAxis; title: ApexTitleSubtitle;\n labels: string[]; legend: ApexLegend; plotOptions: ApexPlotOptions;\n tooltip: ApexTooltip; theme: ApexTheme; colors: string[];\n};\n\nconst DEFAULT_CHART_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\nconst DEFAULT_FORECOLOR = '#8e8e93';\nconst DEFAULT_CARD_BG = '#2c2c2e';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-container\" [ngStyle]=\"cardStyles\">\n <div class=\"widget-header\">\n <span class=\"widget-title\">{{ widget.title }}</span>\n <div class=\"header-actions\">\n <button class=\"btn-icon btn-edit\" (click)=\"editRequested.emit(widget)\" title=\"Edit widget\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-close-widget\" (click)=\"onRemove()\" title=\"Remove widget\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"widget-body\">\n <apx-chart\n *ngIf=\"chartOptions.chart\"\n style=\"display:block;width:100%;height:100%;\"\n [series]=\"chartOptions.series!\"\n [chart]=\"chartOptions.chart!\"\n [xaxis]=\"chartOptions.xaxis!\"\n [stroke]=\"chartOptions.stroke!\"\n [dataLabels]=\"chartOptions.dataLabels!\"\n [plotOptions]=\"chartOptions.plotOptions!\"\n [yaxis]=\"chartOptions.yaxis!\"\n [labels]=\"chartOptions.labels!\"\n [legend]=\"chartOptions.legend!\"\n [colors]=\"chartOptions.colors!\"\n [theme]=\"chartOptions.theme!\"\n [tooltip]=\"chartOptions.tooltip!\"\n ></apx-chart>\n </div>\n </div>\n `,\n styles: [`\n .widget-container {\n height: 100%; width: 100%;\n display: flex; flex-direction: column;\n border-radius: 30px; overflow: hidden;\n box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid rgba(255,255,255,0.08);\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg);\n }\n .widget-container:hover { box-shadow: 0 12px 32px rgba(0,0,0,0.35); }\n .widget-header {\n padding: 14px 16px 4px;\n display: flex; justify-content: space-between; align-items: center;\n cursor: move; flex-shrink: 0;\n }\n .widget-title { color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 0.3px; }\n .header-actions { display: flex; gap: 6px; align-items: center; }\n .btn-icon {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n cursor: pointer; font-size: 12px; width: 26px; height: 26px;\n border-radius: 50%; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.25); color: var(--dash-accent-color); }\n .btn-close-widget:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .widget-body {\n flex: 1; min-height: 0; padding: 4px 12px 12px;\n display: flex; flex-direction: column;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnInit, OnChanges, OnDestroy {\n @Input() widget!: Widget;\n @Input() onRemoveWidget!: (id: string) => void;\n @Input() theme?: Required<DashboardTheme>;\n @Output() editRequested = new EventEmitter<Widget>();\n\n chartOptions!: Partial<ChartOptions>;\n cardStyles: Record<string, string> = {};\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnInit() {\n this.applyStyles();\n this.initChart();\n this.subs.add(\n this.stateService.widgetData$.subscribe(({ widgetId, data }) => {\n if (widgetId === this.widget.id) {\n this.widget = { ...this.widget, data };\n this.initChart();\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme']) { this.applyStyles(); this.initChart(); }\n if (changes['widget'] && !changes['widget'].firstChange) { this.applyStyles(); this.initChart(); }\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyStyles() {\n this.cardStyles = {\n background: this.widget.cardColor ?? 'var(--dash-card-bg)'\n };\n }\n\n private resolvedColors(): string[] {\n return this.widget.colors ?? this.theme?.chartColors ?? DEFAULT_CHART_COLORS;\n }\n\n private initChart() {\n const isDonut = this.widget.type === 'DONUT';\n const colors = this.resolvedColors();\n const foreColor = this.theme?.chartForeColor ?? DEFAULT_FORECOLOR;\n const lineBarData = !isDonut ? (this.widget.data as any) : null;\n const donutData = isDonut ? (this.widget.data as any) : null;\n const categories: string[] = lineBarData?.categories ?? [];\n const donutLabels: string[] = donutData?.labels ?? ['A','B','C','D','E'];\n\n this.chartOptions = {\n series: this.widget.data.series as any,\n chart: {\n width: '100%', height: '100%',\n type: this.widget.type.toLowerCase() as any,\n toolbar: { show: false },\n animations: { enabled: true, speed: 400 },\n background: 'transparent', foreColor,\n parentHeightOffset: 0, sparkline: { enabled: false },\n },\n theme: { mode: 'dark' },\n colors,\n stroke: { curve: 'smooth', width: isDonut ? 0 : 3 },\n dataLabels: { enabled: false },\n legend: { position: 'bottom', labels: { colors: foreColor } },\n tooltip: { theme: 'dark' },\n plotOptions: {\n pie: { donut: { size: '70%', labels: { show: true, total: { show: true, label: 'Total', color: '#fff' } } } },\n bar: { borderRadius: 8, columnWidth: '50%' }\n },\n xaxis: {\n categories: categories.length ? categories : undefined,\n labels: { style: { colors: foreColor } },\n axisBorder: { show: false }, axisTicks: { show: false }\n },\n yaxis: { labels: { style: { colors: foreColor } } },\n labels: isDonut ? donutLabels : undefined,\n };\n }\n\n onRemove() { this.onRemoveWidget(this.widget.id); }\n}\n","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { GridsterConfig } from 'angular-gridster2';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, WidgetType, DashboardTheme, LineBarData, DonutData } from './models';\nimport { Subscription } from 'rxjs';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n widgetCardColor: '#2c2c2e',\n chartForeColor: '#8e8e93',\n accentColor: '#0a84ff',\n dangerColor: '#ff453a',\n chartColors: ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'],\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <!-- ── Header ── -->\n <header class=\"dashboard-header\">\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div\n *ngFor=\"let page of pages\"\n class=\"tab\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSelectPage(page.id)\"\n >\n <span class=\"tab-name\">{{ page.name }}</span>\n <button class=\"tab-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <!-- Add Widget button -->\n <button class=\"btn-add-widget\" (click)=\"openDialog()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n </header>\n\n <!-- ── Grid ── -->\n <div class=\"grid-container\">\n <gridster [options]=\"options\">\n <gridster-item [item]=\"widget\" *ngFor=\"let widget of activePage?.widgets\">\n <app-widget-renderer\n [widget]=\"widget\"\n [onRemoveWidget]=\"removeWidgetHandler\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"openEditDialog($event)\"\n ></app-widget-renderer>\n </gridster-item>\n </gridster>\n </div>\n </main>\n </div>\n\n <!-- ── Add Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"dialogOpen\" (click)=\"closeDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"dialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Add Widget</span>\n <button class=\"dialog-close\" (click)=\"closeDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Chart type picker -->\n <div class=\"field-group\">\n <label class=\"field-label\">Chart type</label>\n <div class=\"type-picker\">\n <button\n *ngFor=\"let t of widgetTypes\"\n class=\"type-btn\"\n [class.selected]=\"dialogType === t.value\"\n (click)=\"dialogType = t.value\"\n >\n <i [class]=\"'la ' + t.icon\"></i>\n <span>{{ t.label }}</span>\n </button>\n </div>\n </div>\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"dialogTitle\" placeholder=\"My Chart\" />\n </div>\n\n <!-- Series (LINE / BAR) -->\n <ng-container *ngIf=\"dialogType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series</label>\n <button class=\"btn-link\" (click)=\"addSeries()\"><i class=\"la la-plus\"></i> Add series</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of dialogSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Series name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\"\n placeholder=\"Comma-separated values, e.g. 10,25,40\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSeries.length > 1\" (click)=\"removeSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"dialogCategories\" placeholder=\"Jan,Feb,Mar,Apr\" />\n </div>\n </ng-container>\n\n <!-- Slices (DONUT) -->\n <ng-container *ngIf=\"dialogType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addSlice()\"><i class=\"la la-plus\"></i> Add slice</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of dialogSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSlices.length > 1\" (click)=\"removeSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmAddWidget()\" [disabled]=\"!dialogTitle.trim()\">\n <i class=\"la la-check\"></i> Add Widget\n </button>\n </div>\n </div>\n <!-- ── Edit Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"editDialogOpen\" (click)=\"closeEditDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"editDialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Edit Widget</span>\n <button class=\"dialog-close\" (click)=\"closeEditDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"editTitle\" placeholder=\"Chart title\" />\n </div>\n\n <!-- Card background -->\n <div class=\"field-group\">\n <label class=\"field-label\">Card color</label>\n <div class=\"color-row\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editCardColor\" />\n <input class=\"field-input\" [(ngModel)]=\"editCardColor\" placeholder=\"#2c2c2e\" />\n </div>\n </div>\n\n <!-- Series colors -->\n <div class=\"field-group\">\n <label class=\"field-label\">Series colors</label>\n <div class=\"color-list\">\n <div class=\"color-item\" *ngFor=\"let c of editColors; let i = index\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editColors[i]\" />\n <input class=\"field-input color-hex\" [(ngModel)]=\"editColors[i]\" placeholder=\"#0a84ff\" />\n <span class=\"color-label\">{{ getEditSeriesLabel(i) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Data: LINE / BAR -->\n <ng-container *ngIf=\"editWidgetType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series data</label>\n <button class=\"btn-link\" (click)=\"addEditSeries()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of editSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\" placeholder=\"10,20,30\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSeries.length > 1\" (click)=\"removeEditSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"editCategories\" placeholder=\"Jan,Feb,Mar\" />\n </div>\n </ng-container>\n\n <!-- Data: DONUT -->\n <ng-container *ngIf=\"editWidgetType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addEditSlice()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of editSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSlices.length > 1\" (click)=\"removeEditSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeEditDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmEditWidget()\">\n <i class=\"la la-check\"></i> Save\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n --dash-bg: #000000;\n --dash-panel-bg: #1c1c1e;\n --dash-card-bg: #2c2c2e;\n --dash-fore-color: #8e8e93;\n --dash-accent-color: #0a84ff;\n --dash-danger-color: #ff453a;\n --dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n\n /* ── Layout ── */\n .dashboard-wrapper {\n display: flex;\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n }\n .tabs-container {\n display: flex;\n align-items: center;\n gap: 8px;\n background: rgba(44,44,46,0.6);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n }\n .tab {\n display: flex;\n align-items: center;\n padding: 8px 20px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--dash-fore-color);\n transition: all 0.3s cubic-bezier(0.25,0.8,0.25,1);\n }\n .tab.active {\n background: #3a3a3c;\n color: #ffffff;\n box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n }\n .tab:hover:not(.active) {\n color: #e5e5ea;\n background: rgba(255,255,255,0.05);\n }\n .tab-name { margin-right: 8px; }\n .tab-close {\n background: transparent; border: none; color: var(--dash-fore-color); padding: 2px;\n font-size: 12px; cursor: pointer; opacity: 0; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; transition: all 0.2s;\n }\n .tab-close:hover { color: var(--dash-danger-color); background: rgba(255, 69, 58, 0.2); }\n .tab:hover .tab-close { opacity: 1; }\n .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 16px; cursor: pointer; border-radius: 20px; transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10, 132, 255, 0.1); }\n\n /* Add Widget button */\n .btn-add-widget {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--dash-accent-color);\n border: none;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n padding: 10px 20px;\n border-radius: 22px;\n cursor: pointer;\n white-space: nowrap;\n transition: opacity 0.2s, transform 0.15s;\n box-shadow: 0 4px 14px rgba(10,132,255,0.4);\n }\n .btn-add-widget:hover { opacity: 0.9; transform: translateY(-1px); }\n .btn-add-widget:active { transform: translateY(0); }\n\n /* ── Grid ── */\n .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n gridster { background: transparent; height: 100% !important; }\n\n /* ── Dialog ── */\n .dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(6px);\n z-index: 900;\n }\n .dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 901;\n width: min(520px, calc(100vw - 32px));\n max-height: calc(100vh - 64px);\n display: flex;\n flex-direction: column;\n background: var(--dash-panel-bg);\n border-radius: 28px;\n border: 1px solid rgba(255,255,255,0.1);\n box-shadow: 0 24px 60px rgba(0,0,0,0.7);\n overflow: hidden;\n }\n .dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 22px 24px 16px;\n border-bottom: 1px solid rgba(255,255,255,0.07);\n }\n .dialog-title { font-size: 17px; font-weight: 700; color: #ffffff; }\n .dialog-close {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n width: 30px; height: 30px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; font-size: 14px; transition: all 0.2s;\n }\n .dialog-close:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .dialog-body { flex: 1; overflow-y: auto; padding: 20px 24px; display: flex; flex-direction: column; gap: 20px; }\n .field-group { display: flex; flex-direction: column; gap: 8px; }\n .field-label { font-size: 13px; font-weight: 600; color: var(--dash-fore-color); text-transform: uppercase; letter-spacing: 0.5px; }\n .field-input {\n background: var(--dash-card-bg);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n padding: 10px 14px;\n color: #ffffff;\n font-size: 14px;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n }\n .field-input:focus { border-color: var(--dash-accent-color); }\n .type-picker { display: flex; gap: 10px; }\n .type-btn {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 10px;\n background: var(--dash-card-bg); border: 2px solid transparent; border-radius: 16px;\n color: var(--dash-fore-color); font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s;\n }\n .type-btn.selected { border-color: var(--dash-accent-color); color: var(--dash-accent-color); background: rgba(10,132,255,0.12); }\n .btn-link { background: transparent; border: none; color: var(--dash-accent-color); font-size: 13px; font-weight: 600; cursor: pointer; }\n .dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding: 16px 24px 22px; border-top: 1px solid rgba(255,255,255,0.07); }\n .btn-cancel { background: transparent; border: 1px solid rgba(255,255,255,0.12); color: var(--dash-fore-color); padding: 10px 20px; border-radius: 20px; cursor: pointer; }\n .btn-confirm { background: var(--dash-accent-color); border: none; color: #ffffff; padding: 10px 22px; border-radius: 20px; font-weight: 600; cursor: pointer; }\n .btn-confirm:disabled { opacity: 0.4; cursor: not-allowed; }\n `]\n})\nexport class DashboardComponent implements OnInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n options!: GridsterConfig;\n pages: Page[] = [];\n activePageId: string = '';\n activePage?: Page;\n\n // ── Dialog state ──\n dialogOpen = false;\n dialogType: WidgetType = 'LINE';\n dialogTitle = '';\n dialogCategories = '';\n dialogSeries: { name: string; dataRaw: string }[] = [{ name: 'Series 1', dataRaw: '' }];\n dialogSlices: { label: string; value: number | null }[] = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n\n readonly widgetTypes: { value: WidgetType; label: string; icon: string }[] = [\n { value: 'LINE', label: 'Line', icon: 'la-chart-area' },\n { value: 'BAR', label: 'Bar', icon: 'la-chart-bar' },\n { value: 'DONUT',label: 'Donut', icon: 'la-chart-pie' },\n ];\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme'] || changes['initialLayout']) this.applyTheme();\n }\n\n ngOnInit() {\n this.applyTheme();\n\n if (this.initialLayout) {\n try { this.stateService.loadLayout(JSON.parse(this.initialLayout)); }\n catch (e) { console.error('[Dashboard] Failed to parse initialLayout', e); }\n }\n\n this.options = {\n gridType: 'fit',\n displayGrid: 'none',\n pushItems: true,\n draggable: { enabled: true },\n resizable: { enabled: true },\n minCols: 12, maxCols: 12,\n minRows: 12, maxRows: 50,\n margin: 20, outerMargin: true,\n itemChangeCallback: (item: any) => {\n this.stateService.updateWidgetPosition(\n this.activePageId, item.id, item.x, item.y, item.cols, item.rows\n );\n }\n };\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\n this.updateActivePage();\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n this.wrapperStyles = {\n '--dash-bg': this.resolvedTheme.backgroundColor,\n '--dash-panel-bg': this.resolvedTheme.panelColor,\n '--dash-card-bg': this.resolvedTheme.widgetCardColor,\n '--dash-fore-color': this.resolvedTheme.chartForeColor,\n '--dash-accent-color': this.resolvedTheme.accentColor,\n '--dash-danger-color': this.resolvedTheme.dangerColor,\n '--dash-font-family': this.resolvedTheme.fontFamily,\n };\n }\n\n private updateActivePage() {\n this.activePage = this.pages.find(p => p.id === this.activePageId);\n }\n\n\n // ── Page actions ──\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Enter workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n onRemovePage(event: Event, id: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) this.stateService.removePage(id);\n }\n\n // ── Dialog ──\n openDialog() {\n this.dialogType = 'LINE';\n this.dialogTitle = '';\n this.dialogCategories = '';\n this.dialogSeries = [{ name: 'Series 1', dataRaw: '' }];\n this.dialogSlices = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n this.dialogOpen = true;\n }\n\n closeDialog() { this.dialogOpen = false; }\n\n addSeries() { this.dialogSeries.push({ name: `Series ${this.dialogSeries.length + 1}`, dataRaw: '' }); }\n removeSeries(i: number) { this.dialogSeries.splice(i, 1); }\n\n addSlice() { this.dialogSlices.push({ label: `Slice ${this.dialogSlices.length + 1}`, value: null }); }\n removeSlice(i: number) { this.dialogSlices.splice(i, 1); }\n\n confirmAddWidget() {\n const title = this.dialogTitle.trim();\n if (!title) return;\n\n let data: LineBarData | DonutData;\n\n if (this.dialogType === 'DONUT') {\n const validSlices = this.dialogSlices.filter(s => s.value !== null && s.label.trim());\n data = {\n series: validSlices.length\n ? validSlices.map(s => Number(s.value))\n : [30, 20, 50],\n labels: validSlices.length\n ? validSlices.map(s => s.label)\n : ['A', 'B', 'C'],\n } as DonutData;\n } else {\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n data = {\n series: this.dialogSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim()\n ? parseNums(s.dataRaw)\n : Array.from({ length: 8 }, () => Math.floor(Math.random() * 100)),\n })),\n categories: this.dialogCategories.trim()\n ? this.dialogCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.addWidgetWithData(this.dialogType, title, data);\n this.closeDialog();\n }\n\n // ── Edit dialog state ──\n editDialogOpen = false;\n editingWidget?: Widget;\n editWidgetType: WidgetType = 'LINE';\n editTitle = '';\n editCardColor = '';\n editColors: string[] = [];\n editSeries: { name: string; dataRaw: string }[] = [];\n editCategories = '';\n editSlices: { label: string; value: number | null }[] = [];\n\n private readonly DEFAULT_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\n\n openEditDialog(widget: Widget) {\n this.editingWidget = widget;\n this.editWidgetType = widget.type;\n this.editTitle = widget.title;\n this.editCardColor = widget.cardColor ?? this.resolvedTheme.widgetCardColor;\n this.editColors = widget.colors?.length\n ? [...widget.colors]\n : [...this.resolvedTheme.chartColors];\n\n if (widget.type === 'DONUT') {\n const d = widget.data as any;\n this.editSlices = (d.series as number[]).map((v: number, i: number) => ({\n label: d.labels?.[i] ?? `Slice ${i + 1}`,\n value: v,\n }));\n this.editColors = this.editColors.slice(0, this.editSlices.length);\n while (this.editColors.length < this.editSlices.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n } else {\n const d = widget.data as any;\n this.editSeries = (d.series as any[]).map((s: any) => ({ name: s.name, dataRaw: s.data.join(',') }));\n this.editCategories = d.categories?.join(',') ?? '';\n this.editColors = this.editColors.slice(0, this.editSeries.length);\n while (this.editColors.length < this.editSeries.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n }\n\n this.editDialogOpen = true;\n }\n\n closeEditDialog() { this.editDialogOpen = false; this.editingWidget = undefined; }\n\n getEditSeriesLabel(i: number): string {\n if (this.editWidgetType === 'DONUT') return this.editSlices[i]?.label || `Slice ${i + 1}`;\n return this.editSeries[i]?.name || `Series ${i + 1}`;\n }\n\n addEditSeries() {\n this.editSeries.push({ name: `Series ${this.editSeries.length + 1}`, dataRaw: '' });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSeries(i: number) { this.editSeries.splice(i, 1); this.editColors.splice(i, 1); }\n\n addEditSlice() {\n this.editSlices.push({ label: `Slice ${this.editSlices.length + 1}`, value: null });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSlice(i: number) { this.editSlices.splice(i, 1); this.editColors.splice(i, 1); }\n\n confirmEditWidget() {\n if (!this.editingWidget) return;\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n let data: LineBarData | DonutData;\n if (this.editWidgetType === 'DONUT') {\n data = {\n series: this.editSlices.map(s => Number(s.value) || 0),\n labels: this.editSlices.map(s => s.label),\n } as DonutData;\n } else {\n data = {\n series: this.editSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim() ? parseNums(s.dataRaw) : [],\n })),\n categories: this.editCategories.trim()\n ? this.editCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.updateWidgetMeta(this.editingWidget.id, {\n title: this.editTitle.trim() || this.editingWidget.title,\n colors: [...this.editColors],\n cardColor: this.editCardColor,\n data,\n });\n this.closeEditDialog();\n }\n\n // ── Widget actions ──\n onAddWidget(type: WidgetType) { this.stateService.addWidget(type); }\n\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n this.stateService.updateWidgetData(widgetId, data);\n }\n\n removeWidgetHandler = (id: string) => { this.stateService.removeWidget(id); };\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridsterModule } from 'angular-gridster2';\nimport { NgApexchartsModule } from 'ng-apexcharts';\n\nimport { DashboardComponent } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n GridsterModule,\n NgApexchartsModule\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class DashboardModule { }\n\n/**\n * Root module for local demo / testing purposes.\n * In the final NPM package, users would only import the `DashboardModule`.\n */\n@NgModule({\n imports: [\n BrowserModule,\n DashboardModule\n ],\n bootstrap: [DashboardComponent]\n})\nexport class AppModule { }\n","/*\n * Public API Surface of the dashboard library\n */\n\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/app.module'; // This is the DashboardModule\nexport * from './app/models';\nexport * from './app/dashboard-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DashboardStateService","i3","i5.WidgetRendererComponent"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ogidor/dashboard",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "An Angular drag-and-drop financial dashboard with ApexCharts widgets, fully themeable.",
5
5
  "author": "",
6
6
  "license": "MIT",
@@ -18,34 +18,26 @@
18
18
  "widgets"
19
19
  ],
20
20
  "peerDependencies": {
21
+ "@angular/animations": ">=15.0.0",
21
22
  "@angular/common": ">=15.0.0",
23
+ "@angular/compiler": ">=15.0.0",
22
24
  "@angular/core": ">=15.0.0",
23
25
  "@angular/forms": ">=15.0.0",
24
26
  "@angular/platform-browser": ">=15.0.0",
27
+ "@angular/platform-browser-dynamic": ">=15.0.0",
28
+ "@angular/router": ">=15.0.0",
25
29
  "angular-gridster2": ">=15.0.0",
26
30
  "apexcharts": ">=3.0.0",
31
+ "bootstrap": ">=5.0.0",
32
+ "bootstrap-icons": ">=1.0.0",
33
+ "line-awesome": ">=1.0.0",
27
34
  "ng-apexcharts": ">=1.0.0",
28
- "rxjs": ">=7.0.0"
35
+ "rxjs": ">=6.6.0",
36
+ "zone.js": ">=0.11.0"
29
37
  },
30
38
  "dependencies": {
31
- "@angular/animations": "~15.2.0",
32
- "@angular/common": "~15.2.0",
33
- "@angular/compiler": "~15.2.0",
34
- "@angular/core": "~15.2.0",
35
- "@angular/forms": "~15.2.0",
36
- "@angular/platform-browser": "~15.2.0",
37
- "@angular/platform-browser-dynamic": "~15.2.0",
38
- "@angular/router": "~15.2.0",
39
- "angular-gridster2": "^15.0.0",
40
- "apexcharts": "^3.37.0",
41
- "bootstrap": "^5.2.3",
42
- "bootstrap-icons": "^1.10.3",
43
- "line-awesome": "^1.3.0",
44
- "ng-apexcharts": "^1.7.4",
45
- "rxjs": "~7.8.0",
46
- "tslib": "^2.3.0",
47
39
  "uuid": "^9.0.0",
48
- "zone.js": "~0.12.0"
40
+ "tslib": ">=2.0.0"
49
41
  },
50
42
  "module": "fesm2015/ogidor-dashboard.mjs",
51
43
  "es2020": "fesm2020/ogidor-dashboard.mjs",