@ogidor/dashboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@ogidor/dashboard" />
5
+ export * from './public-api';
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@ogidor/dashboard",
3
+ "version": "1.0.0",
4
+ "description": "An Angular drag-and-drop financial dashboard with ApexCharts widgets, fully themeable.",
5
+ "author": "",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": ""
10
+ },
11
+ "keywords": [
12
+ "angular",
13
+ "dashboard",
14
+ "apexcharts",
15
+ "gridster",
16
+ "charts",
17
+ "financial",
18
+ "widgets"
19
+ ],
20
+ "peerDependencies": {
21
+ "@angular/common": ">=15.0.0",
22
+ "@angular/core": ">=15.0.0",
23
+ "@angular/forms": ">=15.0.0",
24
+ "@angular/platform-browser": ">=15.0.0",
25
+ "angular-gridster2": ">=15.0.0",
26
+ "apexcharts": ">=3.0.0",
27
+ "ng-apexcharts": ">=1.0.0",
28
+ "rxjs": ">=7.0.0"
29
+ },
30
+ "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
+ "uuid": "^9.0.0",
48
+ "zone.js": "~0.12.0"
49
+ },
50
+ "module": "fesm2015/ogidor-dashboard.mjs",
51
+ "es2020": "fesm2020/ogidor-dashboard.mjs",
52
+ "esm2020": "esm2020/ogidor-dashboard.mjs",
53
+ "fesm2020": "fesm2020/ogidor-dashboard.mjs",
54
+ "fesm2015": "fesm2015/ogidor-dashboard.mjs",
55
+ "typings": "index.d.ts",
56
+ "exports": {
57
+ "./package.json": {
58
+ "default": "./package.json"
59
+ },
60
+ ".": {
61
+ "types": "./index.d.ts",
62
+ "esm2020": "./esm2020/ogidor-dashboard.mjs",
63
+ "es2020": "./fesm2020/ogidor-dashboard.mjs",
64
+ "es2015": "./fesm2015/ogidor-dashboard.mjs",
65
+ "node": "./fesm2015/ogidor-dashboard.mjs",
66
+ "default": "./fesm2020/ogidor-dashboard.mjs"
67
+ }
68
+ },
69
+ "sideEffects": false
70
+ }
@@ -0,0 +1,5 @@
1
+ export * from './app/dashboard.component';
2
+ export * from './app/widget-renderer.component';
3
+ export * from './app/app.module';
4
+ export * from './app/models';
5
+ export * from './app/dashboard-state.service';