yw-charts-library 0.0.2

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":"yw-charts-library.mjs","sources":["../../../projects/yw-charts-library/src/lib/yw-charts-library.service.ts","../../../projects/yw-charts-library/src/lib/yw-charts-library.component.ts","../../../projects/yw-charts-library/src/lib/providers/syncfusion-config.token.ts","../../../projects/yw-charts-library/src/lib/providers/env.config.ts","../../../projects/yw-charts-library/src/lib/providers/syncfusion-license.provider.ts","../../../projects/yw-charts-library/src/lib/models/config/dashboard/yw-dashboard-config.interface.ts","../../../projects/yw-charts-library/src/lib/models/config/dashboard/yw-dashboard-filter-config.interface.ts","../../../projects/yw-charts-library/src/lib/models/config/dashboard/yw-dashboard-widget-config.interface.ts","../../../projects/yw-charts-library/src/lib/components/dummy/test-chart/test-chart.component.ts","../../../projects/yw-charts-library/src/lib/components/dummy/test-chart/test-chart.component.html","../../../projects/yw-charts-library/src/lib/components/dummy/yw-empty-visual/yw-empty-visual.component.ts","../../../projects/yw-charts-library/src/lib/components/dummy/yw-empty-visual/yw-empty-visual.component.html","../../../projects/yw-charts-library/src/lib/adapters/charts/yw-base-chart.adapter.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/line-chart/yw-line-chart.adapter.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/line-chart/syncfusion/visual/yw-line-chart-syncfusion.component.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/line-chart/syncfusion/visual/yw-line-chart-syncfusion.component.html","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-line-chart/visual/yw-line-chart.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-line-chart/visual/yw-line-chart.component.html","../../../projects/yw-charts-library/src/lib/adapters/charts/bar-chart/yw-bar-chart.adapter.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/bar-chart/syncfusion/visual/yw-bar-chart-syncfusion.component.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/bar-chart/syncfusion/visual/yw-bar-chart-syncfusion.component.html","../../../projects/yw-charts-library/src/lib/adapters/charts/bar-chart/n2/yw-bar-chart-ng2.component.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/bar-chart/n2/yw-bar-chart-ng2.component.html","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-bar-chart/visual/yw-bar-chart.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-bar-chart/visual/yw-bar-chart.component.html","../../../projects/yw-charts-library/src/lib/adapters/charts/pie-chart/yw-pie-chart.adapter.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/pie-chart/syncfusion/visual/yw-pie-chart-syncfusion.component.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/pie-chart/syncfusion/visual/yw-pie-chart-syncfusion.component.html","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-pie-chart/visual/yw-pie-chart.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-pie-chart/visual/yw-pie-chart.component.html","../../../projects/yw-charts-library/src/lib/adapters/charts/gauge-chart/yw-gauge-chart.adapter.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/gauge-chart/syncfusion/visual/yw-gauge-chart-sycfusion.component.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/gauge-chart/syncfusion/visual/yw-gauge-chart-sycfusion.component.html","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-gauge-chart/visual/yw-gauge-chart.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-gauge-chart/visual/yw-gauge-chart.component.html","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard-widget/yw-dashboard-widget.component.ts","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard-widget/yw-dashboard-widget.component.html","../../../projects/yw-charts-library/src/lib/components/basic/filters/yw-base-slicer/yw-base-slicer.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/filters/yw-base-slicer/yw-base-slicer.component.html","../../../projects/yw-charts-library/src/lib/components/basic/filters/yw-button-slicer/yw-button-slicer.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/filters/yw-button-slicer/yw-button-slicer.component.html","../../../projects/yw-charts-library/src/lib/components/basic/filters/yw-list-slicer/yw-list-slicer.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/filters/yw-list-slicer/yw-list-slicer.component.html","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard-filter-widget/yw-dashboard-filter-widget.component.ts","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard-filter-widget/yw-dashboard-filter-widget.component.html","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard-filter/yw-dashboard-filter.component.ts","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard-filter/yw-dashboard-filter.component.html","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard/yw-dashboard.component.ts","../../../projects/yw-charts-library/src/lib/components/compounds/yw-dashboard/visual/yw-dashboard/yw-dashboard.component.html","../../../projects/yw-charts-library/src/lib/adapters/charts/bubble-chart/yw-bubble-adapter.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/bubble-chart/syncfusion/visual/yw-bubble-chart-sycfusion.component.ts","../../../projects/yw-charts-library/src/lib/adapters/charts/bubble-chart/syncfusion/visual/yw-bubble-chart-sycfusion.component.html","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-bubble-chart/visual/yw-bubble-chart.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/charts/yw-bubble-chart/visual/yw-bubble-chart.component.html","../../../projects/yw-charts-library/src/lib/models/config/chart/yw-pie-chart-config.interface.ts","../../../projects/yw-charts-library/src/lib/models/data/charts/yw-pie-chart-data.interface.ts","../../../projects/yw-charts-library/src/lib/components/basic/reusable/yw-table-relationship/yw-table-relationship.component.ts","../../../projects/yw-charts-library/src/lib/components/basic/reusable/yw-table-relationship/yw-table-relationship.component.html","../../../projects/yw-charts-library/src/public-api.ts","../../../projects/yw-charts-library/src/yw-charts-library.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class YwChartsLibraryService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-yw-charts-library',\r\n imports: [],\r\n template: `\r\n <p>\r\n yw-charts-library works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class YwChartsLibraryComponent {\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface SyncfusionConfig {\r\n licenseKey: string;\r\n}\r\n\r\nexport const SYNCFUSION_CONFIG = new InjectionToken<SyncfusionConfig>(\r\n 'SYNCFUSION_CONFIG'\r\n);","export const syncfusion = {\r\n licenseKey: 'Ngo9BigBOggjHTQxAR8/V1NMaF5cXmBCf1FpRmJGdld5fUVHYVZUTXxaS00DNHVRdkdmWXpec3VWQmNZUkRzWUtWYUE=' \r\n};\r\n\r\n","import {\r\n EnvironmentProviders,\r\n inject,\r\n makeEnvironmentProviders,\r\n provideAppInitializer,\r\n} from '@angular/core';\r\nimport { registerLicense } from '@syncfusion/ej2-base';\r\nimport { SYNCFUSION_CONFIG, SyncfusionConfig } from './syncfusion-config.token';\r\nimport { syncfusion } from './env.config';\r\n\r\n/**\r\n * Provee la inicialización de la licencia de Syncfusion.\r\n * El consumidor SOLO debe llamar a esta función desde su app.config.ts.\r\n */\r\nexport function provideSyncfusionLicense(\r\n config: SyncfusionConfig\r\n): EnvironmentProviders {\r\n if (config.licenseKey === 'LIBRARY' ) { config.licenseKey = syncfusion.licenseKey; }\r\n\r\n if (!config.licenseKey) {\r\n console.warn(\r\n '[libreriatest] Syncfusion licenseKey no proporcionada. ' +\r\n 'Se mostrará el banner de licencia inválida.'\r\n );\r\n }\r\n\r\n return makeEnvironmentProviders([\r\n { provide: SYNCFUSION_CONFIG, useValue: config },\r\n provideAppInitializer(() => {\r\n const cfg = inject(SYNCFUSION_CONFIG);\r\n if (cfg.licenseKey) {\r\n registerLicense(cfg.licenseKey);\r\n console.log('[libreriatest] Syncfusion license registered ✅');\r\n }\r\n }),\r\n ]);\r\n}","import { YwWidgetConfigInterface } from \"./yw-dashboard-widget-config.interface\";\r\n\r\nexport interface YwDashboardLayoutInterface {\r\n margin: number,\r\n cellHeight: number,\r\n columns: number,\r\n float?: boolean, // Evita que los divs floten automáticamente hacia arriba\r\n noOverlap?: boolean, // CLAVE: Bloquea el movimiento si colisiona con otro DIV \r\n resizable?: any // Permite redimensionar desde todos los bordes\r\n columnOpts?:{\r\n breakpointForWindow:boolean,\r\n breakpoints:YwGridStackbreakpoints[],\r\n layout:any\r\n }\r\n}\r\n\r\ninterface YwGridStackbreakpoints { w:number, c:number}\r\n\r\n\r\nexport interface YwDashboardConfigInterface {\r\n showConfigButtons:boolean,\r\n lockPositionWidgets:boolean,\r\n layoutConfig: YwDashboardLayoutInterface,\r\n controlListConfig: YwWidgetConfigInterface[] \r\n}\r\n\r\nexport interface YwDashboardDataInterface {\r\n tableName: string,\r\n tableData: any[] \r\n}\r\n\r\n\r\nexport interface YwDashboardStyleInterface {\r\n canvasBackgroundColor: string,\r\n widgetBackgroundColor: string,\r\n widgetBorderColor: string\r\n}\r\n\r\n\r\n\r\nexport const YwDashboardWidgetTypes:any[]=[\r\n { code:\"dummy\", description:\"Dummy table syncfuntionchart\"},\r\n { code:\"empty-visual\", description:\"Empty Visual\"},\r\n { code:\"chart-bar\", description:\"Chart Bar\"} , \r\n { code:\"chart-line\", description:\"Chart Bar\"} ,\r\n { code:\"chart-doughnut\", description:\"Chart Doughnut\"}, \r\n { code:\"chart-gauge\", description:\"Chart Gauge\"} \r\n ]","export const YwDashboardWidgetFilterTypes:any[]=[\r\n { code:\"empty-visual\", description:\"Empty Visual\"},\r\n { code:\"filter-slicer\", description:\"Filter Slicer\"} , \r\n { code:\"filter-button\", description:\"Filter Button\"} ,\r\n { code:\"filter-list\", description:\"Filter List\"}, \r\n ]\r\n\r\n\r\nexport interface YwDashboardFilterConfigInterface {\r\n showConfigButtons:boolean,\r\n lockPositionWidgets:boolean, \r\n controlListConfig: YwDashboardWidgetFilterConfigInterface[] \r\n}\r\n\r\n\r\n\r\n\r\n export interface YwDashboardWidgetFilterConfigInterface { \r\n widgetId: string, \r\n typeComponent: string ,\r\n \r\n label: string,\r\n clearTitleLabel?:string,\r\n showConfigButtons?:boolean, \r\n controlTable?: string,\r\n controlFilterData?:any,\r\n configComponent:YwBaseSlicerFilterConfig|YwButtonSlicerFilterConfig|YwListSlicerFilterConfig\r\n }\r\n\r\n\r\n\r\n\r\nexport interface YwWidgetFilterConfigInterface {\r\n widgetId: string, \r\n typeComponent: string ,\r\n \r\n label: string,\r\n clearTitleLabel?:string,\r\n showConfigButtons?:boolean,\r\n controlTable: string,\r\n //controlConfig:undefined|YwBaseSlicerFilterConfig|YwButtonSlicerFilterConfig|YwListSlicerFilterConfig,\r\n \r\n}\r\n\r\n\r\n\r\n\r\n\r\n \r\n export interface YwBaseSlicerFilterConfig {\r\n dataType:string,\r\n step?: any ,\r\n min?:any,\r\n max?:any,\r\n minCurrent?:any,\r\n maxCurrent?:any,\r\n filterField:string,\r\n }\r\n\r\n export interface YwButtonSlicerFilterConfig { \r\n dataType?:string, \r\n allowMultiple?: boolean ,\r\n options:any[],\r\n currentIds?:string[]|number[],\r\n filterField:string,\r\n filterFieldId:string,\r\n }\r\n\r\n export interface YwListSlicerFilterConfig {\r\n dataType:string,\r\n minDate?: any ,\r\n maxDate?: any ,\r\n dateHierarchyType?: | 'YEAR_TRIMESTER_MONTH' | 'YEAR_SEMESTER_MONTH' | 'SEMESTER_MONTH_WEEK',\r\n rawData?:any,\r\n currentSelectedId?:any,\r\n filterField:string,\r\n filterFieldN2?:string,\r\n filterFieldN3?:string,\r\n }","import { GridStackWidget } from 'gridstack';\r\n\r\nexport interface YwWidgetConfigInterface {\r\n widgetId: string, \r\n title: string,\r\n typeComponent: string ,\r\n showConfigButtons?:boolean, \r\n layoutConfig: YwWidgetLayoutInterface,\r\n widgetStyle?: YwWidgetStyleInterface,\r\n controlConfig: any\r\n controlTables: string[]\r\n}\r\n\r\n\r\n\r\nexport interface YwWidgetLayoutInterface extends GridStackWidget {\r\n id: string, \r\n autoPosition?:boolean,\r\n x?: number, \r\n y?: number, \r\n w: number, \r\n h: number, \r\n content: any \r\n}\r\n\r\n\r\nexport interface YwWidgetStyleInterface {\r\n widgetBackgroundColor?: string;\r\n widgetBorderColor?: string;\r\n}\r\n\r\nexport const DEFAULT_WIDGET_STYLE: YwWidgetStyleInterface = {\r\n widgetBackgroundColor: '#ffffff',\r\n widgetBorderColor: '#e2e8f0'\r\n};\r\n\r\n\r\n","import { Component,Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AccumulationChartModule,\r\n CategoryService,\r\n ChartModule,\r\n DataLabelService,\r\n LegendService,\r\n LineSeriesService,\r\n TooltipService,\r\n} from '@syncfusion/ej2-angular-charts';\r\n\r\n@Component({\r\n selector: 'lib-test-chart',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ChartModule,\r\n ],\r\n providers: [ \r\n LineSeriesService,\r\n CategoryService,\r\n LegendService,\r\n TooltipService,\r\n DataLabelService,\r\n ],\r\n templateUrl: './test-chart.component.html',\r\n styleUrl: './test-chart.component.scss'\r\n})\r\nexport class TestChartComponent {\r\n @Input() idComponent: string = '';\r\n\r\n public chartData: Array<{ month: string; sales: number; expenses: number }> = [\r\n { month: 'Ene', sales: 35, expenses: 28 },\r\n { month: 'Feb', sales: 28, expenses: 22 },\r\n { month: 'Mar', sales: 34, expenses: 25 },\r\n { month: 'Abr', sales: 32, expenses: 27 },\r\n { month: 'May', sales: 40, expenses: 30 },\r\n { month: 'Jun', sales: 32, expenses: 26 },\r\n { month: 'Jul', sales: 45, expenses: 32 },\r\n { month: 'Ago', sales: 38, expenses: 29 },\r\n { month: 'Sep', sales: 42, expenses: 31 },\r\n { month: 'Oct', sales: 48, expenses: 35 },\r\n { month: 'Nov', sales: 52, expenses: 38 },\r\n { month: 'Dic', sales: 58, expenses: 42 },\r\n ];\r\n\r\n public primaryXAxis = {\r\n valueType: 'Category',\r\n title: 'Mes',\r\n edgeLabelPlacement: 'Shift',\r\n majorGridLines: { width: 0 },\r\n };\r\n\r\n public primaryYAxis = {\r\n title: 'Monto (miles USD)',\r\n labelFormat: '{value}k',\r\n lineStyle: { width: 0 },\r\n majorTickLines: { width: 0 },\r\n minorTickLines: { width: 0 },\r\n };\r\n\r\n public title = 'Ventas vs Gastos - 2025';\r\n public tooltip = { enable: true, shared: true };\r\n public legendSettings = { visible: true };\r\n public marker = {\r\n visible: true,\r\n width: 8,\r\n height: 8,\r\n };\r\n\r\n}\r\n"," <div class=\"line-chart-demo\">\r\n <h3>Gráfico de líneas - Demo</h3>\r\n <ejs-chart\r\n [id]=\"idComponent\"\r\n [primaryXAxis]=\"primaryXAxis\"\r\n [primaryYAxis]=\"primaryYAxis\"\r\n [title]=\"title\"\r\n [tooltip]=\"tooltip\"\r\n [legendSettings]=\"legendSettings\"\r\n width=\"100%\">\r\n <e-series-collection>\r\n <e-series\r\n [dataSource]=\"chartData\"\r\n type=\"Line\"\r\n xName=\"month\"\r\n yName=\"sales\"\r\n name=\"Ventas 2025\"\r\n [marker]=\"marker\">\r\n </e-series>\r\n <e-series\r\n [dataSource]=\"chartData\"\r\n type=\"Line\"\r\n xName=\"month\"\r\n yName=\"expenses\"\r\n name=\"Gastos 2025\"\r\n [marker]=\"marker\">\r\n </e-series>\r\n </e-series-collection>\r\n </ejs-chart>\r\n </div>","import { Component , Input} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { YwEmptyVisualInterface } from '../../../models/config/dashboard/yw-empty-visual-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-empty-visual',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './yw-empty-visual.component.html',\r\n styleUrl: './yw-empty-visual.component.scss',\r\n})\r\nexport class YwEmptyVisualComponent {\r\n @Input() idComponent: string = '';\r\n @Input() config:YwEmptyVisualInterface= {\r\n title: 'Empty Visual',\r\n description: 'Please select a visual chart or filter for this section.'\r\n };\r\n\r\n\r\n}\r\n"," <div class=\"empty-visual-demo\">\r\n <h3>{{config.title}}</h3>\r\n <div [id]=\"idComponent\">\r\n {{config.description}}\r\n </div>\r\n </div>","import { ChartDataModel } from \"../../models/data/charts/yw-chart-data.interface\";\r\n\r\n// EXTRAEMOS LOS IDS PARA EL JOIN\r\nexport const extractJoinMetadata = (configJoins: any[]) => {\r\n if (!configJoins || !Array.isArray(configJoins)) {\r\n return { tablesInvolved: [], relations: [] };\r\n }\r\n\r\n const tablesSet = new Set<string>();\r\n const relations: Array<{\r\n leftTable: string;\r\n leftId: string;\r\n rightTable: string;\r\n rightId: string;\r\n }> = [];\r\n\r\n configJoins.forEach((item) => {\r\n const columnsStr = item.join;\r\n if (typeof columnsStr === 'string' && columnsStr.includes('=')) {\r\n const [leftPart, rightPart] = columnsStr.split('=').map((s) => s.trim());\r\n if (leftPart && rightPart) {\r\n const [leftTable, leftId] = leftPart.split('.').map((s) => s.trim());\r\n const [rightTable, rightId] = rightPart.split('.').map((s) => s.trim());\r\n\r\n if (leftTable && leftId && rightTable && rightId) {\r\n tablesSet.add(leftTable);\r\n tablesSet.add(rightTable);\r\n\r\n relations.push({\r\n leftTable,\r\n leftId,\r\n rightTable,\r\n rightId,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n return {\r\n tablesInvolved: Array.from(tablesSet),\r\n relations,\r\n };\r\n};\r\n\r\n// UNIENDO TABLAS CON VALIDACIONES\r\nexport const resolveJoinedTableData = (\r\n allTablesData: Record<string, any[]>,\r\n configJoins: any[],\r\n): any[] => {\r\n const { relations } = extractJoinMetadata(configJoins);\r\n if (!relations || relations.length === 0) {\r\n throw new Error(\r\n 'No se encontraron metadatos de relaciones válidos en configJoins.',\r\n );\r\n }\r\n\r\n const baseTable = relations[0].leftTable;\r\n if (!allTablesData[baseTable]) {\r\n throw new Error(\r\n `La tabla base \"${baseTable}\" no existe en los datos provistos.`,\r\n );\r\n }\r\n\r\n const baseData = allTablesData[baseTable] || [];\r\n if (baseData.length === 0) return [];\r\n\r\n const firstRel = relations[0];\r\n if (baseData[0][firstRel.leftId] === undefined) {\r\n throw new Error(\r\n `La columna \"${firstRel.leftId}\" especificada en el join no existe en la tabla base \"${baseTable}\".`,\r\n );\r\n }\r\n\r\n const prefixRow = (row: any, tableName: string) => {\r\n const out: any = {};\r\n Object.keys(row).forEach((k) => {\r\n out[`${tableName}.${k}`] = row[k];\r\n });\r\n return out;\r\n };\r\n\r\n let currentRows = baseData.map((r) => prefixRow(r, baseTable));\r\n\r\n relations.forEach((rel) => {\r\n const { leftTable, leftId, rightTable, rightId } = rel;\r\n\r\n if (!allTablesData[rightTable]) {\r\n throw new Error(\r\n `La tabla destino \"${rightTable}\" especificada en el join no existe en los datos.`,\r\n );\r\n }\r\n\r\n const targetData = allTablesData[rightTable] || [];\r\n if (targetData.length === 0) {\r\n throw new Error(`La tabla destino \"${rightTable}\" está vacía.`);\r\n }\r\n\r\n if (targetData[0][rightId] === undefined) {\r\n throw new Error(\r\n `La columna \"${rightId}\" no existe en la tabla destino \"${rightTable}\".`,\r\n );\r\n }\r\n\r\n const targetMap = new Map();\r\n targetData.forEach((row) => {\r\n if (row && row[rightId] !== undefined) {\r\n const prefRow = prefixRow(row, rightTable);\r\n targetMap.set(String(row[rightId]), prefRow);\r\n }\r\n });\r\n\r\n let matchCount = 0;\r\n\r\n currentRows = currentRows.map((row) => {\r\n // let foreignKeyVal = row[leftId];\r\n // if (foreignKeyVal === undefined) {\r\n // const foundKey = Object.keys(row).find(\r\n // (k) => k === leftId || k.endsWith(`.${leftId}`),\r\n // );\r\n // if (foundKey) foreignKeyVal = row[foundKey];\r\n // }\r\n\r\n // REVSISAR COMO ESTA FUNCIONADO EL PARCHE \r\n let foreignKeyVal = row[`${leftTable}.${leftId}`];\r\n\r\n if (foreignKeyVal === undefined) {\r\n // Si no está, aplicas tu respaldo anterior\r\n const foundKey = Object.keys(row).find(\r\n (k) => k === leftId || k.endsWith(`.${leftId}`),\r\n );\r\n if (foundKey) foreignKeyVal = row[foundKey];\r\n }\r\n\r\n if (foreignKeyVal !== undefined && targetMap.has(String(foreignKeyVal))) {\r\n matchCount++;\r\n const matchedRow = targetMap.get(String(foreignKeyVal));\r\n return { ...row, ...matchedRow };\r\n }\r\n\r\n return row;\r\n });\r\n\r\n if (matchCount === 0) {\r\n throw new Error(\r\n `Error de Join: No se encontraron coincidencias al intentar unir la tabla acumulada con \"${rightTable}\".`,\r\n );\r\n }\r\n });\r\n\r\n return currentRows;\r\n};\r\n\r\n// ACCESO A PROPIEDADES ANIDADAS (SOPORTA NOTACIÓN DE PUNTOS Y TOLERANCIA DE PREFIJOS)\r\nexport const getNestedValue = (obj: any, path?: string): any => {\r\n if (!obj || !path) return undefined;\r\n //Coincidencia directa exacta\r\n if (obj[path] !== undefined) return obj[path];\r\n\r\n //Navegación por puntos en propiedades anidadas (obj.a.b)\r\n const dotted = path.split('.').reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n if (dotted !== undefined) return dotted;\r\n\r\n // Tolerancia si path tiene prefijo de tabla (\"tabla.columna\") pero obj tiene clave plana (\"columna\")\r\n if (path.includes('.')) {\r\n const fieldOnly = path.split('.').pop()!;\r\n if (obj[fieldOnly] !== undefined) return obj[fieldOnly];\r\n }\r\n\r\n //Tolerancia si path no tiene prefijo (\"columna\") pero obj tiene clave con prefijo (\"tabla.columna\")\r\n if (!path.includes('.')) {\r\n const matchedKey = Object.keys(obj).find((k) => k.endsWith(`.${path}`));\r\n console.log(\"matchedKey:\",matchedKey)\r\n if (matchedKey && obj[matchedKey] !== undefined) return obj[matchedKey];\r\n }\r\n\r\n //Búsqueda insensible a mayúsculas/minúsculas\r\n const lowerPath = path.toLowerCase();\r\n const lowerField = path.includes('.') ? path.split('.').pop()!.toLowerCase() : lowerPath;\r\n const ciKey = Object.keys(obj).find((k) => {\r\n const kl = k.toLowerCase();\r\n return kl === lowerPath || kl === lowerField || kl.endsWith(`.${lowerField}`);\r\n });\r\n if (ciKey && obj[ciKey] !== undefined) return obj[ciKey];\r\n\r\n return undefined;\r\n};\r\n\r\n// NORMALIZACIÓN DE DATOS (ARRAY PLANO O DICCIONARIO MULTI-TABLA)\r\nexport const normalizeTablesDict = (rawData: any): Record<string, any[]> => {\r\n if (!rawData) return {};\r\n if (Array.isArray(rawData)) return { default: rawData };\r\n return typeof rawData === 'object' ? rawData : {};\r\n};\r\n\r\n// DESEMPAQUETAR ENVOLTORIOS DE RESPUESTA DE API ({ data: ... }, { result: ... }, etc.)\r\nexport const unwrapApiEnvelope = (rawData: any): any => {\r\n if (!rawData || typeof rawData !== 'object' || Array.isArray(rawData)) {\r\n return rawData;\r\n }\r\n if (rawData.data !== undefined) return rawData.data;\r\n if (rawData.result !== undefined) return rawData.result;\r\n if (rawData.items !== undefined && Array.isArray(rawData.items)) return rawData.items;\r\n if (rawData.rows !== undefined && Array.isArray(rawData.rows)) return rawData.rows;\r\n return rawData;\r\n};\r\n\r\n// RESOLUCIÓN UNIFICADA DE FILAS (SOPORTA ARREGLOS PLANOS, WRAPPERS Y DICCIONARIOS MULTI-TABLA CON JOINS)\r\nexport const resolveChartRows = (rawData: any, configData: any): any[] => {\r\n if (!rawData) return [];\r\n\r\n // 1. Desenvolver si viene dentro de un wrapper de API\r\n const effectiveData = unwrapApiEnvelope(rawData);\r\n if (!effectiveData) return [];\r\n\r\n // 2. Si ya es un arreglo plano de objetos:\r\n // Retorna las filas directamente. No se intenta hacer joins porque los datos ya vienen desnormalizados/planos.\r\n if (Array.isArray(effectiveData)) {\r\n return effectiveData;\r\n }\r\n\r\n // 3. Si es un diccionario / mapa de tablas (Record<string, any[]>):\r\n if (typeof effectiveData === 'object') {\r\n const cfg = configData?.configData || configData || {};\r\n const { joins, configJoins, table } = cfg;\r\n\r\n const tablesDict = normalizeTablesDict(effectiveData);\r\n\r\n // Si tiene joins configurados, intentar resolverlos\r\n if (joins === true && configJoins && Array.isArray(configJoins)) {\r\n try {\r\n const joined = resolveJoinedTableData(tablesDict, configJoins);\r\n if (joined && joined.length > 0) {\r\n return joined;\r\n }\r\n } catch (err) {\r\n console.warn('Advertencia en resolveChartRows: fallo resolviendo joins, intentando fallback:', err);\r\n }\r\n }\r\n\r\n // Fallback o joins desactivados: buscar en las tablas especificadas por 'table'\r\n let normalizedTables: string[] = [];\r\n if (Array.isArray(table)) {\r\n normalizedTables = table.map((t) => (typeof t === 'string' ? t : t?.name)).filter(Boolean);\r\n } else if (typeof table === 'string' && table.trim() !== '') {\r\n normalizedTables = [table];\r\n }\r\n\r\n const matchingTables = normalizedTables.filter((t) => tablesDict[t] && Array.isArray(tablesDict[t]));\r\n if (matchingTables.length > 0) {\r\n const rows: any[] = [];\r\n matchingTables.forEach((t) => rows.push(...tablesDict[t]));\r\n return rows;\r\n }\r\n\r\n // Si ninguna tabla especificada coincide, tomar la primera tabla del diccionario con filas\r\n for (const key of Object.keys(tablesDict)) {\r\n if (Array.isArray(tablesDict[key]) && tablesDict[key].length > 0) {\r\n return tablesDict[key];\r\n }\r\n }\r\n }\r\n\r\n return [];\r\n};\r\n\r\n// Agrupa filas con el mismo \"x\" (ej. un producto con varias ventas) sumando y/y2,\r\n// para dibujar una sola barra por categoría.\r\nexport const aggregateByX = (rows: ChartDataModel[]): ChartDataModel[] => {\r\n const map = new Map<string, any>();\r\n for (const r of rows as any[]) {\r\n const cur = map.get(r.x);\r\n if (cur) {\r\n cur.y += r.y;\r\n if (r.y2 !== undefined) cur.y2 = (cur.y2 ?? 0) + r.y2;\r\n } else {\r\n map.set(r.x, { ...r });\r\n }\r\n }\r\n return Array.from(map.values());\r\n};\r\n\r\n\r\n","\r\n// import { ChartBarSeriesModelConfig } from \"../../../../../../../dist/yw-charts-library\";\r\nimport { LineChartSeriesModelConfig } from \"../../../models/data/charts/yw-line-chart-data.interface\";\r\nimport { ChartDataModel } from \"../../../models/data/charts/yw-chart-data.interface\";\r\nimport { aggregateByX, getNestedValue, resolveJoinedTableData } from \"../yw-base-chart.adapter\";\r\n\r\n\r\nexport const parseSyncFusionData = (allTablesData: any, configData_: any) => {\r\n if (!allTablesData || !configData_) {\r\n return { series: [], labelData: {} };\r\n }\r\n\r\n // SI LO MANDAN COMO UN ARREGLO PLANO, LO ENVOLVEMOS AUTOMÁTICAMENTE\r\n if (Array.isArray(allTablesData)) {\r\n const defaultTableName = configData_?.configData?.table || 'default';\r\n allTablesData = { [defaultTableName]: allTablesData };\r\n }\r\n\r\n const {\r\n dashArray,\r\n width,\r\n widthLine,\r\n ruleColorPoint,\r\n configData,\r\n border,\r\n xLabelText,\r\n yLabelText,\r\n title,\r\n valueOrder,\r\n chartoColoredLine\r\n } = configData_;\r\n\r\n const cfg = configData || {};\r\n const { xAxis, yAxis, y2Axis, joins, configJoins, table, serie, tooltip,\r\n legends } = cfg;\r\n let series: LineChartSeriesModelConfig[] = [];\r\n\r\n // Función auxiliar robusta para obtener propiedades (soporta notación con puntos de los joins)\r\n // const getNestedValue = (obj: any, path: string) => {\r\n // if (!obj || !path) return undefined;\r\n // if (obj[path] !== undefined) return obj[path];\r\n // return path.split('.').reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n // };\r\n\r\n\r\n const sortByXAxis = (data: any[]): any[] => {\r\n if (!xAxis) return data;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = getNestedValue(a, xAxis);\r\n const bValue = getNestedValue(b, xAxis);\r\n\r\n if (aValue == null) return 1;\r\n if (bValue == null) return -1;\r\n\r\n return String(aValue).localeCompare(\r\n String(bValue),\r\n undefined,\r\n { numeric: true, sensitivity: 'base' }\r\n );\r\n });\r\n };\r\n\r\n\r\n\r\n if (joins === true) {\r\n if (!configJoins) {\r\n series = [];\r\n } else {\r\n const unifiedTable = resolveJoinedTableData(allTablesData, configJoins);\r\n console.log('unifiedTable', unifiedTable);\r\n\r\n if (unifiedTable && unifiedTable.length > 0) {\r\n // const validRawData = unifiedTable.filter(\r\n // (item: any) =>\r\n // item &&\r\n // xAxis &&\r\n // getNestedValue(item, xAxis) !== undefined &&\r\n // getNestedValue(item, xAxis) !== null,\r\n // );\r\n const validRawData = unifiedTable.filter(\r\n (item: any) =>\r\n item &&\r\n xAxis &&\r\n getNestedValue(item, xAxis) !== undefined &&\r\n getNestedValue(item, xAxis) !== null,\r\n );\r\n\r\n const orderedRawData = sortByXAxis(validRawData);\r\n\r\n\r\n if (orderedRawData.length > 0) {\r\n console.log(\"serie:\", serie);\r\n if (serie) {\r\n // 2. Agrupamos los datos por el valor de la serie (ej. sucursal o vendedor)\r\n const groupedBySerie = orderedRawData.reduce(\r\n (acc: Record<string, any[]>, item: any) => {\r\n const serieVal = getNestedValue(item, serie);\r\n const serieKey =\r\n serieVal !== undefined && serieVal !== null\r\n ? String(serieVal)\r\n : 'Desconocido';\r\n\r\n if (!acc[serieKey]) {\r\n acc[serieKey] = [];\r\n }\r\n\r\n acc[serieKey].push(item);\r\n return acc;\r\n },\r\n {}\r\n );\r\n\r\n\r\n series = Object.entries(groupedBySerie).map(\r\n ([serieName, groupItems]: [string, any[]]) => {\r\n\r\n const orderedGroupItems = [...groupItems].sort((a, b) => {\r\n const aValue = getNestedValue(a, xAxis);\r\n const bValue = getNestedValue(b, xAxis);\r\n\r\n return String(aValue).localeCompare(\r\n String(bValue),\r\n undefined,\r\n {\r\n numeric: true,\r\n sensitivity: 'base'\r\n }\r\n );\r\n });\r\n\r\n const dataSource: ChartDataModel[] = orderedGroupItems.map((item) => {\r\n const rawVal = getNestedValue(item, yAxis);\r\n\r\n const valorFinal =\r\n rawVal !== undefined\r\n ? typeof rawVal === 'number'\r\n ? rawVal\r\n : Number(rawVal) || 0\r\n : 0;\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n ...(chartoColoredLine\r\n ? { color: getRandomProfessionalHex() }\r\n : {})\r\n };\r\n });\r\n\r\n return {\r\n name: serieName === 'default' ? 'Serie 1' : serieName,\r\n dataSource:aggregateByX(dataSource),\r\n dashArray: dashArray !== undefined ? dashArray : undefined,\r\n width: width !== undefined ? width : undefined,\r\n widthLine: widthLine !== undefined ? widthLine : undefined,\r\n } as LineChartSeriesModelConfig;\r\n }\r\n );\r\n\r\n }\r\n else {\r\n const dataSource: ChartDataModel[] = orderedRawData.map((item: any) => {\r\n let valorFinal = 0;\r\n const shouldColorLine = chartoColoredLine;\r\n const rawVal = getNestedValue(item, yAxis);\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === 'number' ? rawVal : Number(rawVal) || 0;\r\n }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n ...(shouldColorLine ? { color: getRandomProfessionalHex() } : {})\r\n };\r\n });\r\n\r\n series = [\r\n {\r\n name: xAxis.split(\".\")[0] && xAxis !== 'default' ? xAxis.split(\".\")[0] : 'Serie Join',\r\n dataSource: aggregateByX(dataSource),\r\n dashArray: dashArray !== undefined ? dashArray : undefined,\r\n width: width !== undefined ? width : undefined,\r\n widthLine: widthLine !== undefined ? widthLine : undefined,\r\n } as LineChartSeriesModelConfig\r\n ];\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n let normalizedTables: string[] = [];\r\n\r\n if (Array.isArray(table)) {\r\n normalizedTables = table.filter((t): t is string => typeof t === 'string' && t.trim() !== '');\r\n } else if (typeof table === 'string' && table.trim() !== '') {\r\n normalizedTables = [table];\r\n } else {\r\n normalizedTables = Object.keys(allTablesData);\r\n }\r\n\r\n series = normalizedTables\r\n .map((tableName): LineChartSeriesModelConfig | null => {\r\n const rawData: any[] = (allTablesData && allTablesData[tableName]) ? allTablesData[tableName] : [];\r\n\r\n if (!rawData || rawData.length === 0) return null;\r\n\r\n const orderedRawData = rawData.filter(\r\n (item: any) => item && xAxis && getNestedValue(item, xAxis) !== undefined && getNestedValue(item, xAxis) !== null\r\n );\r\n if (orderedRawData.length === 0) return null;\r\n\r\n const dataSource: ChartDataModel[] = orderedRawData.map((item: any) => {\r\n let valorFinal = 0;\r\n const shouldColorLine = chartoColoredLine;\r\n const rawVal = getNestedValue(item, yAxis);\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === \"number\" ? rawVal : Number(rawVal) || 0;\r\n }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n ...(shouldColorLine ? { color: getRandomProfessionalHex() } : {})\r\n };\r\n });\r\n\r\n return {\r\n name: tableName === 'default' ? xAxis : tableName,\r\n dataSource: aggregateByX(dataSource),\r\n dashArray: dashArray !== undefined ? dashArray : undefined,\r\n width: width !== undefined ? width : undefined,\r\n widthLine: widthLine !== undefined ? widthLine : undefined,\r\n } as LineChartSeriesModelConfig;\r\n\r\n })\r\n .filter((item): item is LineChartSeriesModelConfig => item !== null);\r\n }\r\n\r\n const labelData = {\r\n title: title || \"\",\r\n titleStyle: {\r\n size: '16px',\r\n fontWeight: '600',\r\n color: '#2b2b2b',\r\n fontFamily: 'Inherit',\r\n textAlignment: 'Center'\r\n },\r\n\r\n axisX: {\r\n valueType: 'Category',\r\n // title: typeof xLabelText === 'string' ? xLabelText : 'Categoría',\r\n // labelIntersectAction: 'Rotate90',\r\n // labelIntersectAction: 'Rotate45',\r\n majorGridLines: { width: 0 },\r\n majorTickLines: { width: 0 },\r\n lineStyle: { width: 0 },\r\n labelStyle: { color: '#64748B', size: '12px', fontFamily: 'Inherit' }\r\n\r\n },\r\n axisY: {\r\n title: typeof yLabelText === 'string' ? yLabelText : 'Valor',\r\n\r\n minimum: 0,\r\n edgeLabelPlacement: 'Shift',\r\n lineStyle: { width: 0 },\r\n majorTickLines: { width: 0 },\r\n minorTickLines: { width: 0 },\r\n majorGridLines: { width: 0.5, color: '#E2E8F0', dashArray: '4,4' },\r\n labelStyle: { color: '#94A3B8', size: '12px', fontFamily: 'Inherit' },\r\n titleStyle: { size: '12px', color: '#64748B', fontFamily: 'Inherit' }\r\n\r\n },\r\n marker: {\r\n visible: true,\r\n // shape: 'Circle',\r\n width: 8,\r\n height: 8,\r\n // fill: '#FFFFFF',\r\n border: { width: 2, },\r\n dataLabel: {\r\n visible: true,\r\n position: 'Top',\r\n font: { fontWeight: '600', color: '#334155', size: '12px', fontFamily: 'Inherit' }\r\n }\r\n },\r\n palettes: ['#6366F1', '#22D3EE', '#F59E0B', '#10B981', '#F43F5E'],\r\n\r\n border: { width: 0 },\r\n chartArea: { border: { width: 0 }, margin: { bottom: 12 } },\r\n tooltip: {\r\n ...(tooltip?.enable !== undefined ? { enable: tooltip.enable } : {}),\r\n ...(tooltip?.format ? { format: tooltip.format } : {}),\r\n ...(tooltip?.header ? { header: tooltip.header } : {}),\r\n ...(tooltip?.shared !== undefined ? { shared: tooltip.shared } : {}),\r\n enableHighlight: true,\r\n },\r\n legendSettings: {\r\n visible: legends?.visible !== undefined ? legends.visible : undefined,\r\n position: legends?.position !== undefined ? legends.position : undefined\r\n },\r\n ruleColorPoint: ruleColorPoint !== undefined ? ruleColorPoint : undefined\r\n };\r\n\r\n return {\r\n series,\r\n labelData\r\n };\r\n};\r\n\r\n\r\n\r\n\r\n// Generador de colores corporativos aleatorios\r\nconst getRandomProfessionalHex = (): string => {\r\n const h = Math.floor(Math.random() * 360);\r\n const s = Math.floor(Math.random() * 30) + 50;\r\n const l = Math.floor(Math.random() * 15) + 45;\r\n\r\n const hslToHex = (hue: number, sat: number, light: number): string => {\r\n sat /= 100;\r\n light /= 100;\r\n const c = (1 - Math.abs(2 * light - 1)) * sat;\r\n const x = c * (1 - Math.abs((hue / 60) % 2 - 1));\r\n const m = light - c / 2;\r\n let r = 0, g = 0, b = 0;\r\n\r\n if (0 <= hue && hue < 60) { r = c; g = x; b = 0; }\r\n else if (60 <= hue && hue < 120) { r = x; g = c; b = 0; }\r\n else if (120 <= hue && hue < 180) { r = 0; g = c; b = x; }\r\n else if (180 <= hue && hue < 240) { r = 0; g = x; b = c; }\r\n else if (240 <= hue && hue < 300) { r = x; g = 0; b = c; }\r\n else if (300 <= hue && hue < 360) { r = c; g = 0; b = x; }\r\n\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return \"#\" + [r, g, b].map(val => {\r\n const hex = val.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n }).join('').toUpperCase();\r\n };\r\n\r\n return hslToHex(h, s, l);\r\n};\r\n","\r\nimport { Component, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport {\r\n ChartModule,\r\n LineSeriesService,\r\n CategoryService,\r\n TooltipService,\r\n LegendService,\r\n DateTimeService,\r\n MultiColoredLineSeriesService,\r\n ChartComponent,\r\n IPointRenderEventArgs,\r\n DataLabelService,\r\n} from '@syncfusion/ej2-angular-charts';\r\n\r\nimport { parseSyncFusionData } from '../../yw-line-chart.adapter';\r\nimport { PointRenderConfig } from '../../../../../models/config/chart/yw-line-chart-config.interface';\r\nimport { LineChartSeriesModelConfig } from '../../../../../models/data/charts/yw-line-chart-data.interface';\r\n@Component({\r\n selector: 'yw-line-chart-syncfusion',\r\n standalone: true,\r\n imports: [CommonModule, ChartModule],\r\n providers: [\r\n LineSeriesService,\r\n CategoryService,\r\n TooltipService,\r\n LegendService,\r\n DateTimeService,\r\n MultiColoredLineSeriesService,\r\n DataLabelService,\r\n \r\n \r\n \r\n ],\r\n templateUrl: './yw-line-chart-syncfusion.component.html',\r\n styleUrl: './yw-line-chart-syncfusion.component.scss',\r\n})\r\nexport class LineChartSyncfusionComponent implements OnInit, OnChanges, OnDestroy {\r\n @ViewChild('chart') public chartInstance?: ChartComponent;\r\n \r\n @Input('chartData') chartData: any;\r\n @Input('config') config!: any;\r\n @Input('idComponent') idComponent: string = '';\r\n\r\n dataChartParse: LineChartSeriesModelConfig[] = [];\r\n labelData: any; \r\n dataLabel: any;\r\n\r\n // Dimensiones dinámicas para el resize responsivo\r\n chartWidth: string = '100%';\r\n chartHeight: string = '300px';\r\npublic currentWidgetWidth: number = 0; // Valor inicial por defecto\r\n\r\n private _resizeObserver?: ResizeObserver;\r\n currentLabelSize: string = '';\r\n\r\n constructor(private elRef: ElementRef, private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n this.updateParsedData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData'] || changes['config']) {\r\n this.updateParsedData();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._startResizeObserver();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n updateParsedData(): void {\r\n if (this.chartData && this.config) {\r\n const rawParsed = parseSyncFusionData(this.chartData, this.config);\r\n this.dataChartParse = rawParsed.series;\r\n this.labelData = rawParsed.labelData; \r\n\r\n if (this.dataLabel && this.labelData) {\r\n this.labelData.dataLabel = this.dataLabel;\r\n }\r\n\r\n this.cdr.markForCheck();\r\n\r\n if (this.chartInstance) {\r\n setTimeout(() => {\r\n this.chartInstance?.refresh();\r\n });\r\n }\r\n }\r\n }\r\n\r\n public pointRender(args: IPointRenderEventArgs): void {\r\n\r\n\r\n // args.border = { width: 2, color: args.fill };\r\n // args.fill = '#FFFFFF'; \r\n if (args.series.type !== 'MultiColoredLine') return;\r\n\r\n\r\n\r\n const yValue = Number(args.point.y);\r\n const configPoint: PointRenderConfig = this.config.ruleColorPoint || null;\r\n\r\n if (!configPoint) return;\r\n\r\n let passesRule = false;\r\n\r\n switch (configPoint.rule) {\r\n case 'threshold':\r\n passesRule = yValue >= (configPoint.thresholdValue || 0);\r\n break;\r\n\r\n case 'pair':\r\n passesRule = yValue % 2 === 0;\r\n break;\r\n\r\n case 'range':\r\n const min = configPoint.minRange || 0;\r\n const max = configPoint.maxRange || 100;\r\n passesRule = yValue >= min && yValue <= max;\r\n break;\r\n\r\n default:\r\n passesRule = true;\r\n }\r\n\r\n args.fill = passesRule ? (configPoint.trueColor || '#10B981') : (configPoint.falseColor || '#EF4444');\r\n }\r\n\r\nprivate _startResizeObserver(): void {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n\r\n const hostEl: HTMLElement = this.elRef.nativeElement;\r\n\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n for (const entry of entries) {\r\n // const { width } = entry.contentRect;\r\n this.currentWidgetWidth = entry.contentRect.width;\r\n \r\n if (this.currentWidgetWidth > 0) {\r\n this._updateAdaptiveLabelSize(this.currentWidgetWidth);\r\n \r\n \r\n if (this.chartInstance) {\r\n // SI ACTIVAMSO EL REFRESH DA UN REBOTE AL REDIMENCIONAR\r\n this.chartInstance.refresh();\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this._resizeObserver.observe(hostEl);\r\n }\r\n \r\n private _updateAdaptiveLabelSize(width: number): void {\r\n if (this.config?.labelSize) {\r\n const parsedSize = typeof this.config.labelSize === 'number'\r\n ? this.config.labelSize\r\n : parseFloat(this.config.labelSize);\r\n\r\n if (!isNaN(parsedSize)) {\r\n if (width < 260) {\r\n const scale = Math.max(0.65, width / 260);\r\n this.currentLabelSize = `${Math.round(parsedSize * scale)}px`;\r\n } else {\r\n this.currentLabelSize = `${parsedSize}px`;\r\n }\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n }\r\n\r\n // Proporción estándar ideal (~7.5% del ancho del contenedor, acotado entre 13px y 26px)\r\n const base = Math.max(13, Math.min(26, Math.round(width * 0.075)));\r\n this.currentLabelSize = `${base}px`;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n\r\n public refresh(): void {\r\n this.updateParsedData();\r\n }\r\n\r\n\r\n\r\naxisLabelRender(args: any): void {\r\n const umbralWidget = 700; \r\n\r\n if (this.currentWidgetWidth > umbralWidget) {\r\n return; \r\n }\r\n\r\n // Si la tarjeta es estrecha, aplicamos el recorte de etiquetas\r\n if (args.text && typeof args.text === 'string') {\r\n const palabras = args.text.split(' '); \r\n\r\n if (palabras.length > 1) {\r\n const primeraPalabra = palabras[0];\r\n const inicialSegunda = palabras[1].charAt(0).toUpperCase();\r\n args.text = `${primeraPalabra} ${inicialSegunda}.`;\r\n } else {\r\n if (args.text.length > 10) {\r\n args.text = args.text.substring(0, 9) + '.';\r\n }\r\n }\r\n }}\r\n}","<div class=\"control-section\">\r\n <ejs-chart #chart [id]=\"idComponent\" [primaryXAxis]=\"labelData.axisX\" [primaryYAxis]=\"labelData.axisY\"\r\n [title]=\"labelData.title\" (pointRender)=\"pointRender($event)\" height=\"100%\"\r\n width=\"100%\"\r\n [legendSettings]=\"labelData.legendSettings\"\r\n background=\"transparent\"\r\n [titleStyle]=\"labelData.titleStyle\"\r\n\r\n [border]=\"labelData.border\"\r\n [chartArea]=\"labelData.chartArea\"\r\n (axisLabelRender)=\"axisLabelRender($event)\"\r\n [palettes]=\"labelData.palettes\"\r\n [tooltip]=\"labelData.tooltip\">\r\n\r\n <e-series-collection>\r\n @for (series of dataChartParse; track $index) {\r\n\r\n <e-series [dataSource]=\"series.dataSource\" type=\"MultiColoredLine\" xName=\"x\" yName=\"y\" pointColorMapping=\"color\"\r\n [dashArray]=\"series.dashArray\" [name]=\"series.name\" [width]=\"series.widthLine\" \r\n [marker]=\"labelData.marker\">\r\n </e-series>\r\n }\r\n </e-series-collection>\r\n\r\n </ejs-chart>\r\n\r\n</div>\r\n\r\n","import { Component, Input, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LineChartSyncfusionComponent } from '../../../../../adapters/charts/line-chart/syncfusion/visual/yw-line-chart-syncfusion.component';\r\nimport { YwLineMappingConfig } from '../../../../../models/config/chart/yw-line-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-line-chart',\r\n standalone: true,\r\n imports: [CommonModule, LineChartSyncfusionComponent],\r\n templateUrl: './yw-line-chart.component.html',\r\n styleUrl: './yw-line-chart.component.scss',\r\n})\r\nexport class LineChartComponent {\r\n \r\n @Input('chartData') chartData!: any;\r\n @Input('config') config!: YwLineMappingConfig;\r\n @Input('idComponent') idComponent: string=''\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData']) {\r\n console.log('change chartData:', changes['chartData'].currentValue);\r\n }\r\n if (changes['config']) {\r\n console.log('change config:', changes['config'].currentValue);\r\n }\r\n }\r\n}\r\n","@if(config.provider==='syncfusion'){\r\n <div style=\"position: relative; width: 100%; height: 100%;\">\r\n <yw-line-chart-syncfusion \r\n [idComponent]=\"idComponent\"\r\n [chartData]=\"chartData\" \r\n [config]=\"config\" style=\"display: block; width: 100%; height: 100%;\">\r\n </yw-line-chart-syncfusion>\r\n</div>\r\n}","import { ChartDataModel } from '../../../models/data/charts/yw-chart-data.interface';\r\nimport { ChartBarSeriesModelConfig } from '../../../models/data/charts/yw-bar-chart-data.interface';\r\nimport { aggregateByX, getNestedValue, resolveJoinedTableData } from '../yw-base-chart.adapter';\r\n\r\n\r\nexport const parseSyncFusionData = (allTablesData: any, configData_: any) => {\r\n if (!allTablesData || !configData_) {\r\n return { series: [], labelData: {} };\r\n }\r\n // SI LO MANDAN COMO UN ARREGLO PLANO, LO ENVOLVEMOS AUTOMÁTICAMENTE\r\n if (Array.isArray(allTablesData)) {\r\n const defaultTableName = configData_?.configData?.table || 'default';\r\n allTablesData = { [defaultTableName]: allTablesData };\r\n }\r\n const {\r\n\r\n configData,\r\n ruleColorBar,\r\n color,\r\n columnFacet,\r\n groupName,\r\n columnSpacing,\r\n variant,\r\n border,\r\n xLabelText,\r\n yLabelText,\r\n title,\r\n } = configData_;\r\n\r\n // console.log('la data que llega:', configData);\r\n\r\n const cfg = configData || {};\r\n const { xAxis, yAxis, y2Axis, joins, configJoins, table, serie, tooltip,\r\n legends } = cfg;\r\n\r\n let series: ChartBarSeriesModelConfig[] = [];\r\n\r\n\r\n // ==========================================\r\n // CASO 1: JOINS ES TRUE (Unimos tablas)\r\n // ==========================================\r\n\r\n if (joins === true) {\r\n if (!configJoins) {\r\n series = [];\r\n } else {\r\n const unifiedTable = resolveJoinedTableData(allTablesData, configJoins);\r\n console.log('unifiedTable', unifiedTable);\r\n\r\n if (unifiedTable && unifiedTable.length > 0) {\r\n const validRawData = unifiedTable.filter(\r\n (item: any) =>\r\n item &&\r\n xAxis &&\r\n getNestedValue(item, xAxis) !== undefined &&\r\n getNestedValue(item, xAxis) !== null,\r\n );\r\n // console.log(\"validRawData.:\",validRawData)\r\n if (validRawData.length > 0) {\r\n // =========================================================\r\n // LÓGICA DE AGRUPACIÓN POR SERIE (SI ESTÁ DEFINIDA)\r\n // =========================================================\r\n console.log(\"serie:\", serie)\r\n if (serie) {\r\n const groupedBySerie = validRawData.reduce((acc: Record<string, any[]>, item: any) => {\r\n const serieVal = getNestedValue(item, serie);\r\n const serieKey = serieVal !== undefined && serieVal !== null ? String(serieVal) : 'Desconocido';\r\n console.log(\"serieKey:\", serieKey)\r\n if (!acc[serieKey]) {\r\n acc[serieKey] = [];\r\n }\r\n acc[serieKey].push(item);\r\n return acc;\r\n }, {});\r\n\r\n // console.log(\"groupedBySerie:\",groupedBySerie)\r\n series = Object.entries(groupedBySerie).map(([serieName, groupItems]: [string, any[]]) => {\r\n const dataSource: ChartDataModel[] = groupItems.map((item: any) => {\r\n let valorFinal = 0;\r\n const rawVal = getNestedValue(item, yAxis);\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === 'number' ? rawVal : Number(rawVal) || 0;\r\n }\r\n\r\n let valorFinalObj = 0;\r\n if (y2Axis) {\r\n const rawValObj = getNestedValue(item, y2Axis);\r\n if (rawValObj !== undefined) {\r\n valorFinalObj = typeof rawValObj === 'number' ? rawValObj : Number(rawValObj) || 0;\r\n }\r\n }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n ...(y2Axis ? { y2: valorFinalObj } : {}),\r\n };\r\n });\r\n // console.log(\"dataSource:\",dataSource)\r\n return {\r\n name: serieName,\r\n dataSource: aggregateByX(dataSource),\r\n columnFacet: columnFacet !== undefined ? columnFacet : undefined,\r\n // groupName: groupName !== undefined ? groupName : undefined,\r\n ruleColorBar: ruleColorBar !== undefined ? ruleColorBar : undefined,\r\n color: color !== undefined ? color : undefined,\r\n columnSpacing: columnSpacing !== undefined ? columnSpacing : undefined,\r\n variant: variant !== undefined ? variant : undefined,\r\n border: border !== undefined ? border : undefined,\r\n } as ChartBarSeriesModelConfig;\r\n });\r\n\r\n } else {\r\n const dataSource: ChartDataModel[] = validRawData.map((item: any) => {\r\n let valorFinal = 0;\r\n const rawVal = getNestedValue(item, yAxis);\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === 'number' ? rawVal : Number(rawVal) || 0;\r\n }\r\n\r\n let valorFinalObj = 0;\r\n if (y2Axis) {\r\n const rawValObj = getNestedValue(item, y2Axis);\r\n if (rawValObj !== undefined) {\r\n valorFinalObj = typeof rawValObj === 'number' ? rawValObj : Number(rawValObj) || 0;\r\n }\r\n }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n ...(y2Axis ? { y2: valorFinalObj } : {}),\r\n };\r\n });\r\n\r\n series = [{\r\n name: xAxis.split(\".\")[0] && xAxis !== 'default' ? xAxis.split(\".\")[0] : 'Serie Join',\r\n dataSource: aggregateByX(dataSource),\r\n columnFacet: columnFacet !== undefined ? columnFacet : undefined,\r\n groupName: groupName !== undefined ? groupName : undefined,\r\n ruleColorBar: ruleColorBar !== undefined ? ruleColorBar : undefined,\r\n color: color !== undefined ? color : undefined,\r\n columnSpacing: columnSpacing !== undefined ? columnSpacing : undefined,\r\n variant: variant !== undefined ? variant : undefined,\r\n border: border !== undefined ? border : undefined,\r\n } as ChartBarSeriesModelConfig];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // ==========================================\r\n // CASO 2: JOINS ES FALSE\r\n // ==========================================\r\n else {\r\n let normalizedTables: string[] = [];\r\n\r\n if (Array.isArray(table)) {\r\n normalizedTables = table.filter((t): t is string => typeof t === 'string' && t.trim() !== '');\r\n } else if (typeof table === 'string' && table.trim() !== '') {\r\n normalizedTables = [table];\r\n } else {\r\n normalizedTables = Object.keys(allTablesData);\r\n }\r\n\r\n series = normalizedTables\r\n .map((tableName): ChartBarSeriesModelConfig | null => {\r\n const rawData: any[] = (allTablesData && allTablesData[tableName]) ? allTablesData[tableName] : [];\r\n\r\n if (!rawData || rawData.length === 0) return null;\r\n\r\n const validRawData = rawData.filter(\r\n (item: any) => item && xAxis && getNestedValue(item, xAxis) !== undefined && getNestedValue(item, xAxis) !== null\r\n );\r\n if (validRawData.length === 0) return null;\r\n\r\n const dataSource: ChartDataModel[] = validRawData.map((item: any) => {\r\n let valorFinal = 0;\r\n const rawVal = getNestedValue(item, yAxis);\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === \"number\" ? rawVal : Number(rawVal) || 0;\r\n }\r\n\r\n let valorFinalObj = 0;\r\n if (y2Axis) {\r\n const rawValObj = getNestedValue(item, y2Axis);\r\n if (rawValObj !== undefined) {\r\n valorFinalObj = typeof rawValObj === \"number\" ? rawValObj : Number(rawValObj) || 0;\r\n }\r\n }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n ...(y2Axis ? { y2: valorFinalObj } : {})\r\n };\r\n });\r\n\r\n return {\r\n name: tableName === 'default' ? xAxis : tableName,\r\n dataSource: aggregateByX(dataSource),\r\n columnFacet: columnFacet !== undefined ? columnFacet : undefined,\r\n groupName: groupName !== undefined ? groupName : undefined,\r\n ruleColorBar: ruleColorBar !== undefined ? ruleColorBar : undefined,\r\n color: color !== undefined ? color : undefined,\r\n columnSpacing: columnSpacing !== undefined ? columnSpacing : undefined,\r\n variant: variant !== undefined ? variant : undefined,\r\n border: border !== undefined ? border : undefined\r\n } as ChartBarSeriesModelConfig;\r\n })\r\n .filter((item): item is ChartBarSeriesModelConfig => item !== null);\r\n }\r\n\r\n const labelData = {\r\n title: title || '',\r\n\r\n\r\n titleStyle: {\r\n size: '16px',\r\n fontWeight: '600',\r\n color: '#2b2b2b',\r\n fontFamily: 'Inherit',\r\n textAlignment: 'Center'\r\n },\r\n\r\n chartArea: { border: { width: 0 }, margin: { bottom: 12 } },\r\n palettes: ['#6366F1', '#22D3EE', '#F59E0B', '#10B981', '#F43F5E'],\r\n marker: {\r\n dataLabel: {\r\n visible: true,\r\n position: 'Outer', // fuera de la barra, al final\r\n font: { fontWeight: '600', color: '#334155', size: '12px', fontFamily: 'Inherit' }\r\n }\r\n },\r\n\r\n axisX: {\r\n valueType: 'Category',\r\n majorGridLines: { width: 0 },\r\n majorTickLines: { width: 0 },\r\n lineStyle: { width: 0 },\r\n labelStyle: { color: '#64748B', size: '12px', fontFamily: 'Inherit' }\r\n },\r\n\r\n\r\n\r\n axisY: {\r\n title: typeof yLabelText === 'string' ? yLabelText : 'Valor',\r\n\r\n minimum: 0,\r\n edgeLabelPlacement: 'Shift',\r\n lineStyle: { width: 0 },\r\n majorTickLines: { width: 0 },\r\n minorTickLines: { width: 0 },\r\n majorGridLines: { width: 0.5, color: '#E2E8F0', dashArray: '4,4' },\r\n labelStyle: { color: '#94A3B8', size: '12px', fontFamily: 'Inherit' },\r\n titleStyle: { size: '12px', color: '#64748B', fontFamily: 'Inherit' }\r\n },\r\n\r\n tooltip: {\r\n ...(tooltip?.enable !== undefined ? { enable: tooltip.enable } : {}),\r\n ...(tooltip?.format ? { format: tooltip.format } : {}),\r\n ...(tooltip?.header ? { header: tooltip.header } : {}),\r\n ...(tooltip?.shared !== undefined ? { shared: tooltip.shared } : {}),\r\n enableHighlight: true,\r\n },\r\n legendSettings: {\r\n visible: legends?.visible !== undefined ? legends.visible : undefined,\r\n position: legends?.position !== undefined ? legends.position : undefined,\r\n },\r\n };\r\n\r\n return {\r\n series,\r\n labelData,\r\n };\r\n};\r\n\r\n\r\n\r\nexport function parseNg2Data(\r\n allTablesData: Record<string, any[]>,\r\n configData_: any\r\n): any {\r\n if (!allTablesData || !configData_) {\r\n return { barChartOptions: {}, labels: [], datasets: [] };\r\n }\r\n\r\n // SI LO MANDAN COMO UN ARREGLO PLANO, LO ENVOLVEMOS AUTOMÁTICAMENTE\r\n if (Array.isArray(allTablesData)) {\r\n const defaultTableName = configData_?.configData?.table || 'default';\r\n allTablesData = { [defaultTableName]: allTablesData };\r\n }\r\n\r\n const {\r\n dashArray,\r\n width,\r\n widthLine,\r\n ruleColorPoint,\r\n configData,\r\n border,\r\n xLabelText,\r\n yLabelText,\r\n title,\r\n chartoColoredLine,\r\n color\r\n } = configData_;\r\n\r\n const cfg = configData || {};\r\n const { xAxis, yAxis, y2Axis, joins, configJoins, table, serie, tooltip, legends } = cfg;\r\n\r\n // Función auxiliar robusta para propiedades anidadas (joins)\r\n // const getNestedValue = (obj: any, path: string) => {\r\n // if (!obj || !path) return undefined;\r\n // if (obj[path] !== undefined) return obj[path];\r\n // return path.split('.').reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n // };\r\n\r\n let validRawData: any[] = [];\r\n\r\n // ==========================================\r\n // CASO 1: JOINS ES TRUE (Unimos tablas)\r\n // ==========================================\r\n if (joins === true) {\r\n if (configJoins && Array.isArray(configJoins)) {\r\n const unifiedTable = resolveJoinedTableData(allTablesData, configJoins);\r\n if (unifiedTable && unifiedTable.length > 0) {\r\n validRawData = unifiedTable.filter(\r\n (item: any) =>\r\n item &&\r\n xAxis &&\r\n getNestedValue(item, xAxis) !== undefined &&\r\n getNestedValue(item, xAxis) !== null\r\n );\r\n }\r\n }\r\n }\r\n // ==========================================\r\n // CASO 2: JOINS ES FALSE (Tablas independientes)\r\n // ==========================================\r\n else {\r\n let normalizedTables: string[] = [];\r\n\r\n if (Array.isArray(table)) {\r\n normalizedTables = table.filter((t): t is string => typeof t === 'string' && t.trim() !== '');\r\n } else if (typeof table === 'string' && table.trim() !== '') {\r\n normalizedTables = [table];\r\n } else {\r\n normalizedTables = Object.keys(allTablesData);\r\n }\r\n\r\n normalizedTables.forEach((tableName) => {\r\n const rawData: any[] = (allTablesData && allTablesData[tableName]) ? allTablesData[tableName] : [];\r\n if (rawData && rawData.length > 0) {\r\n const filtered = rawData.filter(\r\n (item: any) => item && xAxis && getNestedValue(item, xAxis) !== undefined && getNestedValue(item, xAxis) !== null\r\n );\r\n // Marcamos o unimos la tabla de origen si es necesario para simular series si no hay serie explícita\r\n filtered.forEach(item => {\r\n // Si no hay serie explícita, podemos usar la tabla como serie implícita\r\n if (!item.__tableSource) item.__tableSource = tableName;\r\n });\r\n validRawData = validRawData.concat(filtered);\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n if (validRawData.length === 0) {\r\n return { barChartOptions: {}, labels: [], datasets: [] };\r\n }\r\n\r\n // Extraer todas las etiquetas únicas para el Eje X\r\n const labelsSet = new Set<string>();\r\n validRawData.forEach(item => {\r\n const xVal = getNestedValue(item, xAxis);\r\n if (xVal !== undefined && xVal !== null) {\r\n labelsSet.add(String(xVal));\r\n }\r\n });\r\n const labels = Array.from(labelsSet);\r\n\r\n // Agrupar la información por la \"serie\" (o por tabla si joins es false y no hay serie)\r\n const seriesMap = new Map<string, Map<string, { y: number; y2?: number }>>();\r\n\r\n validRawData.forEach(item => {\r\n const xVal = getNestedValue(item, xAxis) !== undefined ? String(getNestedValue(item, xAxis)) : 'Desconocido';\r\n\r\n // Valor principal (y)\r\n const rawVal = getNestedValue(item, yAxis);\r\n const yVal = rawVal !== undefined ? (typeof rawVal === 'number' ? rawVal : Number(rawVal) || 0) : 0;\r\n\r\n\r\n // Valor secundario / objetivo (y2)\r\n let y2Val: number | undefined = undefined;\r\n if (y2Axis) {\r\n const rawVal2 = getNestedValue(item, y2Axis);\r\n if (rawVal2 !== undefined) {\r\n y2Val = typeof rawVal2 === 'number' ? rawVal2 : Number(rawVal2) || 0;\r\n }\r\n }\r\n\r\n\r\n\r\n // Determinamos la clave de la serie\r\n let serieVal: string;\r\n if (serie) {\r\n const sVal = getNestedValue(item, serie);\r\n serieVal = sVal !== undefined && sVal !== null ? String(sVal) : 'Desconocido';\r\n } else if (joins !== true && item.__tableSource) {\r\n serieVal = item.__tableSource === 'default' ? xAxis : item.__tableSource;\r\n } else {\r\n serieVal = title || 'Dataset';\r\n }\r\n\r\n if (!seriesMap.has(serieVal)) {\r\n seriesMap.set(serieVal, new Map<string, { y: number; y2?: number }>());\r\n }\r\n\r\n const xMap = seriesMap.get(serieVal)!;\r\n const current = xMap.get(xVal) || { y: 0, y2: 0 };\r\n xMap.set(xVal, {\r\n y: current.y + yVal,\r\n y2: y2Val !== undefined ? (current.y2 || 0) + y2Val : current.y2\r\n });\r\n });\r\n\r\n // Construir los datasets para Chart.js\r\n\r\n // const datasets = Array.from(seriesMap.entries()).map(([serieName, xMap], index) => {\r\n // const data = labels.map(label => xMap.get(label) || 0);\r\n\r\n // // Colores por defecto si hay múltiples series\r\n // const defaultColors = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899'];\r\n // const assignedColor = color || defaultColors[index % defaultColors.length];\r\n\r\n // return {\r\n // label: serieName,\r\n // data: data,\r\n // backgroundColor: assignedColor,\r\n // borderWidth: border?.width || 0,\r\n // ...(dashArray ? { borderDash: dashArray.split(',').map(Number) } : {})\r\n // };\r\n // });\r\n const datasets: any[] = [];\r\n const defaultColors = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899'];\r\n let colorIndex = 0;\r\n\r\n Array.from(seriesMap.entries()).forEach(([serieName, xMap]) => {\r\n const assignedColor = color || defaultColors[colorIndex % defaultColors.length];\r\n colorIndex++;\r\n\r\n // 1. Dataset Principal (Eje Y)\r\n const dataY = labels.map(label => xMap.get(label)?.y || 0);\r\n datasets.push({\r\n label: serieName,\r\n data: dataY,\r\n backgroundColor: assignedColor,\r\n borderWidth: border?.width || 0,\r\n order: 2,\r\n ...(dashArray ? { borderDash: dashArray.split(',').map(Number) } : {})\r\n });\r\n\r\n // 2. Dataset Secundario / Objetivo (Eje Y2) si viene configurado\r\n const dataY2 = labels.map(label => xMap.get(label)?.y2);\r\n const hasY2Data = dataY2.some(val => val !== undefined && val !== null && val > 0);\r\n\r\n if (y2Axis && hasY2Data) {\r\n datasets.push({\r\n label: `${serieName} (Obj)`,\r\n data: dataY2,\r\n backgroundColor: '#E0E0E0', // Usamos el mismo color de la serie en vez de rojo fijo\r\n // borderColor: assignedColor, // Para que la línea coincida con su barra\r\n borderWidth: 1,\r\n type: 'bar',\r\n order: 1,\r\n yAxisID: 'y1', // Asegura que use el eje derecho si es una métrica diferente\r\n ...(dashArray ? { borderDash: dashArray.split(',').map(Number) } : {})\r\n });\r\n }\r\n });\r\n\r\n // Configuración de las opciones del gráfico\r\n const barChartOptions = {\r\n responsive: true,\r\n plugins: {\r\n title: {\r\n display: !!title,\r\n text: title\r\n },\r\n legend: {\r\n display: legends?.visible ?? true,\r\n },\r\n tooltip: {\r\n enabled: tooltip?.enable ?? true,\r\n ...(tooltip?.shared !== undefined ? { shared: tooltip.shared } : {})\r\n }\r\n },\r\n scales: {\r\n x: {\r\n title: {\r\n display: !!xLabelText,\r\n text: xLabelText\r\n }\r\n },\r\n y: {\r\n title: {\r\n display: !!yLabelText,\r\n text: yLabelText,\r\n\r\n },\r\n ticks: {\r\n callback: function (value: any) {\r\n const num = Number(value);\r\n\r\n if (Math.abs(num) >= 1_000_000) {\r\n return `${num / 1_000_000}M`;\r\n }\r\n\r\n if (Math.abs(num) >= 1_000) {\r\n return `${num / 1_000}k`;\r\n }\r\n\r\n return num;\r\n }\r\n },\r\n beginAtZero: true\r\n },\r\n // Agregamos el eje secundario (y1) dinámicamente si existe y2Axis\r\n ...(y2Axis ? {\r\n y1: {\r\n type: 'linear',\r\n position: 'right',\r\n grid: { drawOnChartArea: false }, // Evita que las líneas de la cuadrícula se encimen\r\n beginAtZero: true\r\n }\r\n } : {})\r\n }\r\n\r\n };\r\n\r\n return {\r\n barChartOptions,\r\n labels,\r\n datasets\r\n };\r\n}","\r\nimport { Component, ElementRef, Input, OnChanges, OnInit, OnDestroy, SimpleChanges, ViewChild, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChartModule,\r\n BarSeriesService,\r\n ColumnSeriesService,\r\n CategoryService,\r\n TooltipService,\r\n LegendService,\r\n ChartComponent,\r\n IPointRenderEventArgs,\r\n} from '@syncfusion/ej2-angular-charts';\r\nimport { ChartBarSeriesModelConfig } from '../../../../../models/data/charts/yw-bar-chart-data.interface';\r\nimport { parseSyncFusionData } from '../../yw-bar-chart.adapter';\r\nimport { PointRenderConfig } from '../../../../../models/config/chart/yw-line-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-bar-chart-syncfusion',\r\n standalone: true,\r\n imports: [CommonModule, ChartModule],\r\n providers: [\r\n BarSeriesService,\r\n ColumnSeriesService,\r\n CategoryService,\r\n TooltipService,\r\n LegendService,\r\n ],\r\n templateUrl: './yw-bar-chart-syncfusion.component.html',\r\n styleUrl: './yw-bar-chart-syncfusion.component.scss',\r\n})\r\nexport class BarChartSyncfusionComponent implements OnInit, OnChanges, OnDestroy {\r\n @ViewChild('chart') public chartInstance?: ChartComponent;\r\n\r\n @Input('chartData') chartData: any;\r\n @Input('config') config!: any;\r\n @Input('idComponent') idComponent: string = '';\r\n\r\n private _resizeObserver?: ResizeObserver;\r\n currentLabelSize: string = '';\r\n\r\n // Dimensiones dinámicas idénticas a tu componente gauge\r\n chartWidth: string = '100%';\r\n chartHeight: string = '300px';\r\n\r\n dataChartParse: ChartBarSeriesModelConfig[] = [];\r\n labelData: any;\r\n dataLabel: any;\r\npublic currentWidgetWidth: number = 0; // Valor inicial por defecto\r\n constructor(private elRef: ElementRef, private cdr: ChangeDetectorRef) { }\r\n\r\n ngOnInit(): void {\r\n this.updateParsedData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData'] || changes['config']) {\r\n this.updateParsedData();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n console.log(\"EL Aflther\")\r\n this._startResizeObserver();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n updateParsedData(): void {\r\n if (this.chartData && this.config) {\r\n const rawParsed = parseSyncFusionData(this.chartData, this.config);\r\n this.dataChartParse = rawParsed.series;\r\n this.labelData = rawParsed.labelData;\r\n\r\n if (this.dataLabel && this.labelData) {\r\n this.labelData.dataLabel = this.dataLabel;\r\n }\r\n\r\n this.cdr.markForCheck();\r\n\r\n if (this.chartInstance) {\r\n setTimeout(() => {\r\n this.chartInstance?.refresh();\r\n });\r\n }\r\n }\r\n }\r\n\r\n public barRender(args: IPointRenderEventArgs): void {\r\n const yValue = Number(args.point.y);\r\n const configPoint: PointRenderConfig = this.config.ruleColorBar || this.config.ruleColorPoint || null;\r\n\r\n if (configPoint) {\r\n let passesRule = false;\r\n\r\n switch (configPoint.rule) {\r\n case 'threshold':\r\n passesRule = yValue >= (configPoint.thresholdValue || 0);\r\n break;\r\n case 'pair':\r\n passesRule = yValue % 2 === 0;\r\n break;\r\n case 'range':\r\n const min = configPoint.minRange || 0;\r\n const max = configPoint.maxRange || 100;\r\n passesRule = yValue >= min && yValue <= max;\r\n break;\r\n default:\r\n passesRule = true;\r\n }\r\n\r\n args.fill = passesRule ? (configPoint.trueColor || '#10B981') : (configPoint.falseColor || '#EF4444');\r\n return;\r\n }\r\n\r\n if (this.config.color) {\r\n args.fill = this.config.color;\r\n }\r\n }\r\n\r\nprivate _startResizeObserver(): void {\r\n if (typeof ResizeObserver === 'undefined' || !this.elRef?.nativeElement) return;\r\n\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n for (const entry of entries) {\r\n // const width = entry.contentRect.width;\r\n this.currentWidgetWidth = entry.contentRect.width;\r\n \r\n\r\n // if (width > 0) {\r\n // this._updateAdaptiveLabelSize(width);\r\n \r\n // if (this.chartInstance) {\r\n // this.chartInstance.refresh();\r\n // }\r\n // }\r\n if (this.currentWidgetWidth > 0) {\r\n // Si tienes una función interna para actualizar algo, la puedes llamar aquí\r\n this._updateAdaptiveLabelSize(this.currentWidgetWidth);\r\n \r\n // Forzamos a que el gráfico se redibuje con el nuevo espacio\r\n if (this.chartInstance) {\r\n this.chartInstance.refresh();\r\n }\r\n }\r\n\r\n }\r\n });\r\n });\r\n\r\n // ¡Ojo aquí! Observa la .control-section en lugar del :host directamente, \r\n // o asegúrate de que el :host tenga un height del 100% real desde el padre.\r\n const targetElement = this.elRef.nativeElement.querySelector('.control-section') || this.elRef.nativeElement;\r\n this._resizeObserver.observe(targetElement);\r\n}\r\n \r\n private _updateAdaptiveLabelSize(width: number): void {\r\n if (this.config?.labelSize) {\r\n const parsedSize = typeof this.config.labelSize === 'number'\r\n ? this.config.labelSize\r\n : parseFloat(this.config.labelSize);\r\n\r\n if (!isNaN(parsedSize)) {\r\n if (width < 260) {\r\n const scale = Math.max(0.65, width / 260);\r\n this.currentLabelSize = `${Math.round(parsedSize * scale)}px`;\r\n } else {\r\n this.currentLabelSize = `${parsedSize}px`;\r\n }\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n }\r\n\r\n // Proporción estándar ideal (~7.5% del ancho del contenedor, acotado entre 13px y 26px)\r\n const base = Math.max(13, Math.min(26, Math.round(width * 0.075)));\r\n this.currentLabelSize = `${base}px`;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n public refresh(): void {\r\n this.updateParsedData();\r\n }\r\n\r\naxisLabelRender(args: any): void {\r\n // args.labelStyle.color = '#595959';\r\n const umbralWidget = 700; \r\n\r\n if (this.currentWidgetWidth > umbralWidget) {\r\n return; \r\n }\r\n\r\n if (args.text && typeof args.text === 'string') {\r\n const palabras = args.text.split(' '); \r\n\r\n if (palabras.length > 1) {\r\n const primeraPalabra = palabras[0];\r\n const inicialSegunda = palabras[1].charAt(0).toUpperCase();\r\n args.text = `${primeraPalabra} ${inicialSegunda}.`;\r\n } else {\r\n if (args.text.length > 10) {\r\n args.text = args.text.substring(0, 9) + '.';\r\n }\r\n }\r\n }}\r\n\r\n\r\n}","<!-- <div class=\"chart-scroll-container\"> -->\r\n\r\n<div class=\"control-section\">\r\n <ejs-chart \r\n [id]=\"idComponent\"\r\n [primaryXAxis]='labelData.axisX' \r\n [primaryYAxis]='labelData.axisY' \r\n [title]='labelData.title'\r\n [titleStyle]=\"labelData.titleStyle\"\r\n [tooltip]='labelData.tooltip'\r\n [legendSettings]=\"labelData.legendSettings\"\r\n [palettes]=\"labelData.palettes\"\r\n [chartArea]=\"labelData.chartArea\"\r\n background=\"transparent\"\r\n height=\"100%\"\r\n height=\"100%\"\r\n (pointRender)=\"barRender($event)\"\r\n (axisLabelRender)=\"axisLabelRender($event)\"\r\n #chart\r\n \r\n >\r\n \r\n <e-series-collection>\r\n\r\n @for (series of dataChartParse; track $index) {\r\n <e-series \r\n [dataSource]='series.dataSource' \r\n [type]='series.variant?.orientation === \"horizontal\" ? \"Bar\" : \"Column\"' \r\n xName='x' \r\n yName='y' \r\n [name]='series.name' \r\n [columnSpacing]='series.columnSpacing'\r\n [cornerRadius]='series.variant?.type === \"cornerRadius\" ? { topLeft: 4, topRight: 4} : null'\r\n [border]='series.border'\r\n [columnFacet]='series.columnFacet?.type'\r\n [marker]=\"labelData.marker\"\r\n >\r\n </e-series>\r\n @if (series.dataSource[0]?.y2 !== undefined) {\r\n <e-series \r\n [dataSource]='series.dataSource' \r\n [type]='series.variant?.orientation === \"horizontal\" ? \"Bar\" : \"Column\"' \r\n xName='x' \r\n yName='y2' \r\n [name]='series.name+\"(OBJ)\"'\r\n fill='#e0e0e0'\r\n [marker]=\"labelData.marker\"\r\n\r\n [columnSpacing]='0.3'>\r\n </e-series>\r\n }\r\n }\r\n </e-series-collection>\r\n \r\n </ejs-chart>\r\n</div>","// import { Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core';\r\n// import { CommonModule } from '@angular/common';\r\n// import { BaseChartDirective } from 'ng2-charts';\r\n// import { ChartConfiguration, ChartData, ChartType } from 'chart.js';\r\n\r\n// import { parseNg2Data } from '../yw-bar-chart.adapter'; \r\n\r\n// @Component({\r\n// selector: 'yw-bar-chart-ng2',\r\n// standalone: true,\r\n// imports: [CommonModule, BaseChartDirective],\r\n// templateUrl: './yw-bar-chart-ng2.component.html',\r\n// styleUrl: './yw-bar-chart-ng2.component.scss'\r\n// })\r\n// export class BarChartNg2Component implements OnInit, OnChanges {\r\n// @ViewChild(BaseChartDirective) chart?: BaseChartDirective;\r\n \r\n// @Input('chartData') chartData: any;\r\n// @Input('config') config!: any;\r\n// @Input('idComponent') idComponent: string=''\r\n\r\n// public barChartType: ChartType = 'bar';\r\n// public barChartData: ChartData<'bar'> = { labels: [], datasets: [] };\r\n// public barChartOptions: ChartConfiguration['options'] = {};\r\n\r\n// ngOnInit(): void {\r\n// this.updateChart();\r\n// }\r\n\r\n// ngOnChanges(changes: SimpleChanges): void {\r\n// if (changes['chartData'] || changes['config']) {\r\n// this.updateChart();\r\n// }\r\n// }\r\n\r\n// private updateChart(): void {\r\n// if (this.chartData && this.config) {\r\n// const parsed = parseNg2Data(this.chartData, this.config);\r\n \r\n// // Asignamos todo de golpe\r\n// this.barChartOptions = parsed.barChartOptions;\r\n// this.barChartData = {\r\n// labels: parsed.labels,\r\n// datasets: parsed.datasets\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n// }\r\n\r\nimport { Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BaseChartDirective } from 'ng2-charts';\r\nimport { ChartConfiguration, ChartData, ChartType } from 'chart.js';\r\n\r\nimport { parseNg2Data } from '../yw-bar-chart.adapter'; \r\n\r\n@Component({\r\n selector: 'yw-bar-chart-ng2',\r\n standalone: true,\r\n imports: [CommonModule, BaseChartDirective],\r\n templateUrl: './yw-bar-chart-ng2.component.html',\r\n styleUrl: './yw-bar-chart-ng2.component.scss'\r\n})\r\nexport class BarChartNg2Component implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n @ViewChild(BaseChartDirective) chart?: BaseChartDirective;\r\n \r\n @Input('chartData') chartData: any;\r\n @Input('config') config!: any;\r\n @Input('idComponent') idComponent: string = ''\r\n\r\n public barChartType: ChartType = 'bar';\r\n public barChartData: ChartData<'bar'> = { labels: [], datasets: [] };\r\n public barChartOptions: ChartConfiguration['options'] = {};\r\n\r\n private resizeObserver?: ResizeObserver;\r\n\r\n constructor(private elRef: ElementRef) {}\r\n\r\n ngOnInit(): void {\r\n this.updateChart();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Observamos el cambio de tamaño del contenedor con ResizeObserver\r\n this.resizeObserver = new ResizeObserver(() => {\r\n window.requestAnimationFrame(() => {\r\n // Chart.js tiene un método nativo .update() para recalcular dimensiones\r\n if (this.chart && this.chart.chart) {\r\n this.chart.chart.resize();\r\n }\r\n });\r\n });\r\n\r\n if (this.elRef?.nativeElement) {\r\n this.resizeObserver.observe(this.elRef.nativeElement);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData'] || changes['config']) {\r\n this.updateChart();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n }\r\n\r\n private updateChart(): void {\r\n if (this.chartData && this.config) {\r\n const parsed = parseNg2Data(this.chartData, this.config);\r\n \r\n // Forzamos las opciones de responsividad para que Chart.js ignore el aspecto fijo\r\n this.barChartOptions = {\r\n ...parsed.barChartOptions,\r\n responsive: true,\r\n maintainAspectRatio: false, // ¡Clave para que llene el contenedor en altura y ancho!\r\n };\r\n\r\n this.barChartData = {\r\n labels: parsed.labels,\r\n datasets: parsed.datasets\r\n };\r\n }\r\n }\r\n}","<!-- Template de YwLineChartNg2Component -->\r\n <div class=\"chart-container\" >\r\n \r\n <canvas baseChart\r\n [id]=\"idComponent\"\r\n [data]=\"barChartData\"\r\n [options]=\"barChartOptions\"\r\n [type]=\"barChartType\">\r\n </canvas>\r\n\r\n <!-- <button (click)=\"exportarGrafico()\" style=\"margin-top: 15px; padding: 8px 12px;\">\r\n Exportar Gráfico como PNG\r\n </button> -->\r\n </div>","import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport {\r\n BarSeriesService,\r\n CategoryService,\r\n TooltipService,\r\n LegendService,\r\n DataLabelService // Importante para manejar el dataLabel en Syncfusion si se requiere\r\n} from '@syncfusion/ej2-angular-charts';\r\n\r\nimport { BarChartSyncfusionComponent } from '../../../../../adapters/charts/bar-chart/syncfusion/visual/yw-bar-chart-syncfusion.component';\r\nimport { BarChartNg2Component } from '../../../../../adapters/charts/bar-chart/n2/yw-bar-chart-ng2.component';\r\nimport { YwBarMappingConfig } from '../../../../../models/config/chart/yw-bar-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-bar-chart',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n BarChartSyncfusionComponent,\r\n BarChartNg2Component\r\n],\r\n providers: [\r\n BarSeriesService,\r\n CategoryService,\r\n TooltipService,\r\n LegendService,\r\n DataLabelService // Añadido al proveedor por si dataLabel está activo\r\n ],\r\n templateUrl: './yw-bar-chart.component.html',\r\n styleUrl: './yw-bar-chart.component.scss',\r\n})\r\nexport class BarChartComponent implements OnChanges {\r\n \r\n @Input('chartData') chartData!: any;\r\n @Input('config') config!: YwBarMappingConfig;\r\n @Input('idComponent') idComponent: string=''\r\n\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData']) {\r\n console.log(\"change chartData:\", changes['chartData'].currentValue);\r\n }\r\n if (changes['config']) {\r\n console.log(\"change config:\", changes['config'].currentValue);\r\n }\r\n // if (changes['dataLabel']) {\r\n // console.log(\"change dataLabel:\", changes['dataLabel'].currentValue);\r\n // }\r\n }\r\n}","@if(config.provider==='syncfusion'){\r\n <div style=\"position: relative; width: 100%; height: 100%;\">\r\n <yw-bar-chart-syncfusion\r\n [idComponent]=\"idComponent\"\r\n\r\n [chartData]=\"chartData\"\r\n [config]=\"config\"\r\n style=\"display: block; width: 100%; height: 100%;\"\r\n >\r\n </yw-bar-chart-syncfusion>\r\n </div>\r\n}\r\n@if(config.provider==='chart-ng2'){\r\n <div style=\"position: relative; width: 100%; height: 100%;\">\r\n <yw-bar-chart-ng2\r\n [idComponent]=\"idComponent\"\r\n\r\n [chartData]=\"chartData\"\r\n [config]=\"config\"\r\n style=\"display: block; width: 100%; height: 100%;\"\r\n >\r\n </yw-bar-chart-ng2>\r\n </div>\r\n}","import { SfPiePoint } from '../../../models/data/charts/yw-pie-chart-data.interface';\r\nimport {\r\n ChartPieSeriesModelConfig,\r\n YwPieSeriesModelConfig,\r\n YwPieMappingConfig,\r\n YwPieChartConfig,\r\n SfPieVisualConfig,\r\n SfPieCenterLabelConfig,\r\n PieChartParseResult\r\n} from '../../../models/config/chart/yw-pie-chart-config.interface';\r\nimport { LegendSettingsModel, TooltipSettingsModel, AccumulationDataLabelSettingsModel } from '@syncfusion/ej2-angular-charts';\r\nimport { resolveChartRows, getNestedValue, unwrapApiEnvelope } from '../yw-base-chart.adapter';\r\n\r\nexport type { PieChartParseResult };\r\n\r\nconst DEFAULT_PALETTE = [\r\n '#3177c9','#6805f2','#00c853','#ff6b35',\r\n '#e91e63','#00bcd4','#ff9800','#9c27b0',\r\n];\r\n\r\n/**\r\n * Función principal del adaptador. Segmenta el parseo\r\n * según el provider definido en el YwPieMappingConfig.\r\n */\r\nexport const parseSyncFusionData = (rawData: any, config: YwPieMappingConfig | any): PieChartParseResult => {\r\n const provider = config?.provider || 'syncfusion';\r\n\r\n switch (provider) {\r\n case 'syncfusion':\r\n return parseForSyncfusion(rawData, config);\r\n default:\r\n console.warn(`Provider ${provider} no soportado aún, haciendo fallback a syncfusion`);\r\n return parseForSyncfusion(rawData, config);\r\n }\r\n};\r\n\r\n/** Alias retrocompatible */\r\nexport const parseDataPie = parseSyncFusionData;\r\n\r\n/** Detecta automáticamente la columna de categoría si no está configurada o no coincide */\r\nconst detectCategoryKey = (row: any): string | undefined => {\r\n if (!row) return undefined;\r\n const candidates = ['x', 'name', 'label', 'category', 'categoria', 'sucursal', 'producto', 'key', 'title'];\r\n for (const c of candidates) {\r\n if (row[c] !== undefined && row[c] !== null && typeof row[c] === 'string') return c;\r\n }\r\n for (const k of Object.keys(row)) {\r\n if (typeof row[k] === 'string') return k;\r\n }\r\n return undefined;\r\n};\r\n\r\n/** Detecta automáticamente la columna de métrica si no está configurada o no coincide */\r\nconst detectMetricKey = (row: any): string | undefined => {\r\n if (!row) return undefined;\r\n const candidates = ['y', 'value', 'val', 'total', 'monto', 'monto_total', 'count', 'cantidad', 'importe'];\r\n for (const c of candidates) {\r\n if (row[c] !== undefined && row[c] !== null && !isNaN(Number(row[c]))) return c;\r\n }\r\n for (const k of Object.keys(row)) {\r\n if (typeof row[k] === 'number') return k;\r\n }\r\n return undefined;\r\n};\r\n\r\n/** Parseo específico para Syncfusion AccumulationChart con soporte multi-formato */\r\nconst parseForSyncfusion = (rawData: any, config: YwPieMappingConfig | any): PieChartParseResult => {\r\n if (!rawData || !config) {\r\n return { series: [], visualConfig: {} };\r\n }\r\n\r\n // 0. Desenvolver envoltorio de API si viene como { data: ... } o { result: ... }\r\n const effectiveData = unwrapApiEnvelope(rawData);\r\n const cfg = config.configData || config;\r\n\r\n // Soporte unificado de propiedades raíz y de configData\r\n const chartTitle = config.title ?? cfg.title ?? '';\r\n const xKey = cfg.xAxis || cfg.xLabel;\r\n const yKey = cfg.yAxis || cfg.yLabel;\r\n\r\n const palette = config.palettes || DEFAULT_PALETTE;\r\n const variant = config?.variant;\r\n\r\n let innerRadius = config.innerRadius || '0%';\r\n let radius = config.radius || '70%';\r\n let startAngle = 0;\r\n let endAngle = 360;\r\n\r\n if (variant?.type === 'doughnut') {\r\n innerRadius = config.innerRadius || '40%';\r\n } else if (variant?.type === 'mid') {\r\n radius = config.radius || '100%';\r\n startAngle = 270;\r\n endAngle = 90;\r\n }\r\n\r\n // 1. Formato Primitivo directo: número o string numérico (ej: 5000 o \"5000\")\r\n if (\r\n typeof effectiveData === 'number' ||\r\n (typeof effectiveData === 'string' && effectiveData.trim() !== '' && !isNaN(Number(effectiveData)))\r\n ) {\r\n const singleVal = Number(effectiveData);\r\n const label = chartTitle || 'Total';\r\n const singlePoint: SfPiePoint = {\r\n x: label,\r\n y: singleVal,\r\n text: `${label} ${singleVal.toLocaleString()} (100%)`,\r\n fill: palette[0]\r\n };\r\n return buildPieResult([singlePoint], singleVal, config, cfg, chartTitle, startAngle, endAngle, innerRadius, radius);\r\n }\r\n\r\n // 2. Formato Arreglo de números primitivos: [100, 200, 300]\r\n if (Array.isArray(effectiveData) && effectiveData.length > 0 && typeof effectiveData[0] === 'number') {\r\n const points: { x: string; y: number }[] = effectiveData.map((val, idx) => ({\r\n x: `Item ${idx + 1}`,\r\n y: Number(val) || 0\r\n }));\r\n return buildGroupedPieResult(points, config, cfg, chartTitle, palette, startAngle, endAngle, innerRadius, radius);\r\n }\r\n\r\n // 3. Formato Diccionario clave-valor: { \"Norte\": 3000, \"Sur\": 2500 }\r\n if (\r\n effectiveData &&\r\n typeof effectiveData === 'object' &&\r\n !Array.isArray(effectiveData) &&\r\n !Object.values(effectiveData).some(v => Array.isArray(v) || (typeof v === 'object' && v !== null))\r\n ) {\r\n const entries = Object.entries(effectiveData);\r\n const points: { x: string; y: number }[] = [];\r\n entries.forEach(([key, val]) => {\r\n const num = typeof val === 'number' ? val : Number(val);\r\n if (!isNaN(num)) {\r\n points.push({ x: key, y: num });\r\n }\r\n });\r\n if (points.length > 0) {\r\n return buildGroupedPieResult(points, config, cfg, chartTitle, palette, startAngle, endAngle, innerRadius, radius);\r\n }\r\n }\r\n\r\n // 4. Colección de Filas: delegada al adaptador base (resuelve arreglos planos y multi-tabla con joins)\r\n const rawRows = resolveChartRows(effectiveData, config);\r\n\r\n if (rawRows.length === 0) {\r\n return buildPieResult([], 0, config, cfg, chartTitle, startAngle, endAngle, innerRadius, radius);\r\n }\r\n\r\n // Auto-detección de columnas si no coinciden o no están configuradas\r\n const sampleRow = rawRows[0];\r\n const effectiveXKey = xKey || detectCategoryKey(sampleRow);\r\n const effectiveYKey = yKey || detectMetricKey(sampleRow);\r\n\r\n // 5. Agrupar datos por categoría y sumar métrica usando getNestedValue\r\n const groupedData = new Map<string, number>();\r\n\r\n rawRows.forEach((row: any) => {\r\n if (!row) return;\r\n\r\n let xVal: any = effectiveXKey ? getNestedValue(row, effectiveXKey) : undefined;\r\n if (xVal === undefined) {\r\n const autoX = detectCategoryKey(row);\r\n if (autoX) xVal = row[autoX];\r\n }\r\n if (xVal === undefined || xVal === null) return;\r\n const xString = String(xVal);\r\n\r\n let yVal = 0;\r\n if (effectiveYKey) {\r\n const rawY = getNestedValue(row, effectiveYKey);\r\n if (rawY !== undefined && rawY !== null) {\r\n yVal = typeof rawY === 'number' ? rawY : Number(rawY) || 0;\r\n }\r\n } else {\r\n const autoY = detectMetricKey(row);\r\n if (autoY && row[autoY] !== undefined) {\r\n yVal = typeof row[autoY] === 'number' ? row[autoY] : Number(row[autoY]) || 0;\r\n }\r\n }\r\n\r\n if (groupedData.has(xString)) {\r\n groupedData.set(xString, groupedData.get(xString)! + yVal);\r\n } else {\r\n groupedData.set(xString, yVal);\r\n }\r\n });\r\n\r\n const pointsList = Array.from(groupedData.entries()).map(([x, y]) => ({ x, y }));\r\n return buildGroupedPieResult(pointsList, config, cfg, chartTitle, palette, startAngle, endAngle, innerRadius, radius);\r\n};\r\n\r\n/** Helper para construir el resultado mapeado a partir de pares { x, y } agrupados */\r\nconst buildGroupedPieResult = (\r\n points: { x: string; y: number }[],\r\n config: any,\r\n cfg: any,\r\n chartTitle: string,\r\n palette: string[],\r\n startAngle: number,\r\n endAngle: number,\r\n innerRadius: string,\r\n radius: string\r\n): PieChartParseResult => {\r\n let total = 0;\r\n points.forEach(p => total += p.y);\r\n\r\n const showCategory = config.showCategoryName ?? true;\r\n const displayMode = config.valueDisplayMode || 'both';\r\n\r\n const dataSource: SfPiePoint[] = points.map((p, index) => {\r\n const pct = total > 0 ? ((p.y / total) * 100).toFixed(1) : '0';\r\n const formattedVal = typeof p.y === 'number' ? p.y.toLocaleString() : String(p.y);\r\n\r\n let valueText = '';\r\n if (displayMode === 'percentage') {\r\n valueText = `${pct}%`;\r\n } else if (displayMode === 'value') {\r\n valueText = `${formattedVal}`;\r\n } else if (displayMode === 'both') {\r\n valueText = `${formattedVal} (${pct}%)`;\r\n } else if (displayMode === 'none') {\r\n valueText = '';\r\n }\r\n\r\n const labelParts: string[] = [];\r\n if (showCategory && p.x) labelParts.push(p.x);\r\n if (valueText) labelParts.push(valueText);\r\n\r\n return {\r\n x: p.x,\r\n y: p.y,\r\n text: labelParts.join(' '),\r\n fill: palette[index % palette.length],\r\n };\r\n });\r\n\r\n return buildPieResult(dataSource, total, config, cfg, chartTitle, startAngle, endAngle, innerRadius, radius);\r\n};\r\n\r\n/** Helper para construir la estructura visual final de PieChart */\r\nconst buildPieResult = (\r\n dataSource: SfPiePoint[],\r\n total: number,\r\n config: any,\r\n cfg: any,\r\n chartTitle: string,\r\n startAngle: number,\r\n endAngle: number,\r\n innerRadius: string,\r\n radius: string\r\n): PieChartParseResult => {\r\n const tooltip = cfg?.tooltip;\r\n const legends = cfg?.legends;\r\n\r\n const series: ChartPieSeriesModelConfig[] = [\r\n {\r\n name: chartTitle || 'Serie principal',\r\n dataSource: dataSource,\r\n color: undefined,\r\n startAngle,\r\n endAngle,\r\n innerRadius,\r\n radius\r\n }\r\n ];\r\n\r\n const isTooltipEnabled = tooltip?.enable !== undefined \r\n ? tooltip.enable \r\n : (config?.tooltipFormat !== undefined ? true : true);\r\n\r\n const tooltipFormat = tooltip?.format ?? config?.tooltipFormat ?? '<b>${point.x}</b>: ${point.y}';\r\n\r\n const isLegendVisible = legends?.visible !== undefined \r\n ? legends.visible \r\n : (config?.showLegend ?? true);\r\n\r\n const legendPosition = legends?.position ?? config?.legendPosition ?? 'Bottom';\r\n\r\n const visualConfig: SfPieVisualConfig = {\r\n legendSettings: {\r\n visible: isLegendVisible,\r\n position: legendPosition,\r\n } as LegendSettingsModel,\r\n tooltip: {\r\n enable: isTooltipEnabled,\r\n format: tooltipFormat,\r\n } as TooltipSettingsModel,\r\n dataLabel: {\r\n visible: config?.showDataLabels ?? true,\r\n name: 'text',\r\n position: config?.labelPosition ?? 'Outside',\r\n font: { fontWeight: '600', size: '13px' },\r\n connectorStyle: {\r\n length: '16px',\r\n type: 'Line',\r\n width: 1.5,\r\n color: '#94A3B8'\r\n }\r\n } as AccumulationDataLabelSettingsModel\r\n };\r\n\r\n const totalFormatted = total.toLocaleString();\r\n const showCenterLabel = config?.showCenterLabel ?? false;\r\n\r\n const centerLabel: SfPieCenterLabelConfig = {\r\n show: showCenterLabel,\r\n title: config?.centerLabelTitle || 'Total',\r\n value: config?.centerLabelValue || totalFormatted,\r\n titleSize: config?.centerLabelTitleSize || '14px',\r\n valueSize: config?.centerLabelValueSize || '20px',\r\n titleColor: config?.centerLabelTitleColor || '#64748b',\r\n valueColor: config?.centerLabelValueColor || '#1e293b',\r\n };\r\n\r\n const labelData = {\r\n title: chartTitle,\r\n tooltip: visualConfig.tooltip,\r\n legendSettings: visualConfig.legendSettings,\r\n centerLabel\r\n };\r\n\r\n return { series, visualConfig, labelData, centerLabel };\r\n};\r\n\r\n","import { Component, Input, OnInit, AfterViewInit, OnDestroy, SimpleChanges, OnChanges, ElementRef, ChangeDetectorRef, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AccumulationChartModule,\r\n AccumulationLegendService,\r\n AccumulationTooltipService,\r\n AccumulationDataLabelService,\r\n PieSeriesService,\r\n AccumulationAnnotationService,\r\n LegendSettingsModel,\r\n TooltipSettingsModel,\r\n AccumulationDataLabelSettingsModel,\r\n AccumulationChartComponent\r\n} from '@syncfusion/ej2-angular-charts';\r\nimport { parseSyncFusionData } from '../../yw-pie-chart.adapter';\r\nimport { SfPiePoint } from '../../../../../models/data/charts/yw-pie-chart-data.interface';\r\nimport { YwPieMappingConfig, ChartPieSeriesModelConfig, SfPieCenterLabelConfig } from '../../../../../models/config/chart/yw-pie-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-pie-chart-syncfusion',\r\n standalone: true,\r\n imports: [CommonModule, AccumulationChartModule],\r\n providers: [\r\n AccumulationLegendService,\r\n AccumulationTooltipService,\r\n AccumulationDataLabelService,\r\n PieSeriesService,\r\n AccumulationAnnotationService,\r\n ],\r\n templateUrl: './yw-pie-chart-syncfusion.component.html',\r\n styleUrl: './yw-pie-chart-syncfusion.component.scss',\r\n})\r\nexport class PieChartSyncfusionComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\r\n @ViewChild('accChart') public chartInstance?: AccumulationChartComponent;\r\n\r\n private static _nextId = 0;\r\n private _idComponent: string = '';\r\n\r\n @Input()\r\n set idComponent(val: string) {\r\n this._idComponent = val;\r\n }\r\n get idComponent(): string {\r\n if (!this._idComponent) {\r\n this._idComponent = `yw_pie_sf_${++PieChartSyncfusionComponent._nextId}`;\r\n }\r\n return this._idComponent;\r\n }\r\n @Input('chartData') chartData: any = [];\r\n @Input('config') config!: YwPieMappingConfig;\r\n\r\n dataChartParse: SfPiePoint[] = [];\r\n seriesConfig!: ChartPieSeriesModelConfig;\r\n\r\n legendSettings?: LegendSettingsModel;\r\n tooltip?: TooltipSettingsModel;\r\n dataLabel?: AccumulationDataLabelSettingsModel;\r\n centerLabelSettings: any;\r\n centerLabel?: SfPieCenterLabelConfig;\r\n\r\n private _resizeObserver?: ResizeObserver;\r\n private _lastWidth: number = 0;\r\n private _lastHeight: number = 0;\r\n\r\n constructor(private elRef: ElementRef, private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n this.updateParsedData();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n if (!this.chartInstance) return;\r\n for (const entry of entries) {\r\n const { width, height } = entry.contentRect;\r\n if (width > 0 && height > 0) {\r\n if (Math.abs(width - this._lastWidth) > 4 || Math.abs(height - this._lastHeight) > 4) {\r\n this._lastWidth = width;\r\n this._lastHeight = height;\r\n this.chartInstance.refresh();\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n if (this.elRef?.nativeElement) {\r\n this._resizeObserver.observe(this.elRef.nativeElement);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData'] || changes['config']) {\r\n this.updateParsedData();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n updateParsedData(): void {\r\n if (!this.config) return;\r\n\r\n if (this.chartData) {\r\n const parsedResult = parseSyncFusionData(this.chartData, this.config);\r\n this.seriesConfig = parsedResult.series[0];\r\n this.dataChartParse = (this.seriesConfig?.dataSource as SfPiePoint[]) || [];\r\n this.centerLabel = parsedResult.centerLabel;\r\n\r\n if (this.centerLabel?.show) {\r\n const textLines = this.centerLabel.value\r\n ? `${this.centerLabel.title}<br>${this.centerLabel.value}`\r\n : this.centerLabel.title;\r\n\r\n this.centerLabelSettings = {\r\n text: textLines,\r\n textStyle: {\r\n fontWeight: '600',\r\n size: this.centerLabel.valueSize || '18px',\r\n color: this.centerLabel.valueColor || '#1e293b',\r\n textAlignment: 'Center'\r\n }\r\n };\r\n } else {\r\n this.centerLabelSettings = undefined;\r\n }\r\n\r\n if (parsedResult.visualConfig) {\r\n this.legendSettings = parsedResult.visualConfig.legendSettings;\r\n this.tooltip = parsedResult.visualConfig.tooltip;\r\n this.dataLabel = parsedResult.visualConfig.dataLabel;\r\n }\r\n } else {\r\n this.dataChartParse = [];\r\n this.centerLabel = undefined;\r\n this.centerLabelSettings = undefined;\r\n }\r\n }\r\n\r\n onChartLoaded(args: any): void {\r\n if (this.centerLabel?.show && args?.accumulation?.element?.id) {\r\n const centerEl = document.getElementById(args.accumulation.element.id + '_centerLabel');\r\n if (centerEl) {\r\n const tspans = centerEl.querySelectorAll('tspan');\r\n if (tspans.length >= 2) {\r\n tspans[0].setAttribute('font-size', this.centerLabel.titleSize || '13px');\r\n tspans[0].setAttribute('fill', this.centerLabel.titleColor || '#64748b');\r\n tspans[0].setAttribute('font-weight', '500');\r\n\r\n tspans[1].setAttribute('font-size', this.centerLabel.valueSize || '20px');\r\n tspans[1].setAttribute('fill', this.centerLabel.valueColor || '#1e293b');\r\n tspans[1].setAttribute('font-weight', '700');\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","<div class=\"control-section\">\r\n <ejs-accumulationchart\r\n #accChart\r\n [id]=\"idComponent\"\r\n [title]=\"''\"\r\n [legendSettings]=\"legendSettings\"\r\n [tooltip]=\"tooltip\"\r\n [centerLabel]=\"centerLabelSettings\"\r\n (loaded)=\"onChartLoaded($event)\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n [enableAnimation]=\"true\">\r\n\r\n <e-accumulation-series-collection>\r\n <e-accumulation-series\r\n [dataSource]=\"dataChartParse\"\r\n xName=\"x\"\r\n yName=\"y\"\r\n pointColorMapping=\"fill\"\r\n [type]=\"'Pie'\"\r\n [radius]=\"seriesConfig.radius\"\r\n [innerRadius]=\"seriesConfig.innerRadius\"\r\n [startAngle]=\"seriesConfig.startAngle\"\r\n [endAngle]=\"seriesConfig.endAngle\"\r\n [explode]=\"config.explodeSlice ?? true\"\r\n [explodeIndex]=\"config.explodeIndex || 0\"\r\n [explodeOffset]=\"config.explodeOffset || '10%'\"\r\n [dataLabel]=\"dataLabel\">\r\n </e-accumulation-series>\r\n </e-accumulation-series-collection>\r\n\r\n </ejs-accumulationchart>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { YwPieMappingConfig, YwPieChartConfig } from '../../../../../models/config/chart/yw-pie-chart-config.interface';\r\nimport { PieChartSyncfusionComponent } from '../../../../../adapters/charts/pie-chart/syncfusion/visual/yw-pie-chart-syncfusion.component';\r\n\r\n@Component({\r\n selector: 'yw-pie-chart',\r\n standalone: true,\r\n imports: [CommonModule, PieChartSyncfusionComponent],\r\n templateUrl: './yw-pie-chart.component.html',\r\n styleUrl: './yw-pie-chart.component.scss',\r\n})\r\nexport class PieChartComponent {\r\n private static _nextId = 0;\r\n private _idComponent: string = '';\r\n\r\n @Input()\r\n set idComponent(val: string) {\r\n this._idComponent = val;\r\n }\r\n get idComponent(): string {\r\n if (!this._idComponent) {\r\n this._idComponent = `yw_pie_host_${++PieChartComponent._nextId}`;\r\n }\r\n return this._idComponent;\r\n }\r\n\r\n @Input('chartData') chartData: any = [];\r\n @Input('config') config!: YwPieMappingConfig;\r\n}","@if (config.provider === 'syncfusion') {\r\n <div style=\"position: relative; width: 100%; height: 100%;\">\r\n <yw-pie-chart-syncfusion\r\n [idComponent]=\"idComponent\"\r\n [chartData]=\"chartData\"\r\n [config]=\"config\"\r\n style=\"display: block; width: 100%; height: 100%;\">\r\n </yw-pie-chart-syncfusion>\r\n </div>\r\n}\r\n","import { SfGaugePoint } from '../../../models/data/charts/yw-gauge-chart-data.interface';\r\nimport {\r\n YwGaugeMappingConfig,\r\n YwGaugeChartConfig,\r\n YwGaugeRange,\r\n YwGaugeVariant,\r\n SfGaugeVisualConfig,\r\n GaugeChartParseResult\r\n} from '../../../models/config/chart/yw-gauge-chart-config.interface';\r\nimport { resolveChartRows, getNestedValue, unwrapApiEnvelope } from '../yw-base-chart.adapter';\r\n\r\n// Re-exportamos para que los consumers que importen desde el adapter no se rompan\r\nexport type { GaugeChartParseResult };\r\n\r\n// Rangos de color por defecto (verde, amarillo, rojo)\r\nconst DEFAULT_RANGES: YwGaugeRange[] = [\r\n { start: 0, end: 33, color: '#30B32D', width: 8 },\r\n { start: 33, end: 66, color: '#FFDD00', width: 8 },\r\n { start: 66, end: 100, color: '#F03E3E', width: 8 },\r\n];\r\n\r\nconst DEFAULT_POINTER_COLOR = '#424242';\r\n\r\ninterface VariantPreset {\r\n startAngle: number;\r\n endAngle: number;\r\n ranges?: YwGaugeRange[];\r\n pointerColor?: string;\r\n enableProgressTrack?: boolean;\r\n trackColor?: string;\r\n progressColor?: string;\r\n progressWidth?: number;\r\n startWidth?: number;\r\n endWidth?: number;\r\n cornerStyle?: 'round' | 'flat';\r\n showTicks?: boolean;\r\n tickPosition?: 'Outside' | 'Inside' | 'Cross';\r\n labelOffset?: number;\r\n labelSize?: string | number;\r\n labelBold?: boolean;\r\n labelDistance?: string | number;\r\n showNeedleWithProgress?: boolean;\r\n roundMultiRanges?: boolean;\r\n isVariableWidth?: boolean;\r\n}\r\n\r\nconst VARIANT_PRESETS: Record<YwGaugeVariant['type'], VariantPreset> = {\r\n 'position': {\r\n startAngle: 200,\r\n endAngle: 160,\r\n enableProgressTrack: true,\r\n cornerStyle: 'round',\r\n progressWidth: 16,\r\n trackColor: '#E2E8F0',\r\n progressColor: '#0066FF',\r\n pointerColor: '#0052CC',\r\n showTicks: true,\r\n tickPosition: 'Outside',\r\n labelOffset: 12,\r\n labelSize: '24px',\r\n labelBold: true,\r\n labelDistance: '0%',\r\n showNeedleWithProgress: false,\r\n ranges: [\r\n { start: 0, end: 100, color: '#0066FF', width: 16 }\r\n ]\r\n },\r\n 'width-range': {\r\n startAngle: 270,\r\n endAngle: 90,\r\n enableProgressTrack: true,\r\n cornerStyle: 'flat',\r\n startWidth: 4,\r\n endWidth: 24,\r\n progressWidth: 14,\r\n trackColor: '#F3F4F6',\r\n progressColor: '#FF6D00',\r\n pointerColor: '#FF6D00',\r\n showTicks: true,\r\n tickPosition: 'Outside',\r\n labelOffset: 12,\r\n labelSize: '24px',\r\n labelBold: true,\r\n labelDistance: '0%',\r\n showNeedleWithProgress: false,\r\n isVariableWidth: true,\r\n ranges: [\r\n { start: 0, end: 100, color: '#0052CC', startWidth: 4, endWidth: 24 }\r\n ]\r\n },\r\n 'multi': {\r\n startAngle: 240,\r\n endAngle: 120,\r\n enableProgressTrack: false,\r\n cornerStyle: 'round',\r\n roundMultiRanges: false,\r\n showTicks: true,\r\n tickPosition: 'Outside',\r\n labelOffset: 12,\r\n labelSize: '22px',\r\n labelBold: true,\r\n labelDistance: '38%',\r\n pointerColor: '#D84315',\r\n ranges: [\r\n { start: 0, end: 35, color: '#1E88E5', width: 16, label: 'Zona Baja' },\r\n { start: 35, end: 70, color: '#FB8C00', width: 16, label: 'Zona Media' },\r\n { start: 70, end: 100, color: '#37474F', width: 16, label: 'Zona Alta' }\r\n ]\r\n }\r\n};\r\n\r\n/**\r\n * Función principal del adaptador de Gauge.\r\n * Segmenta el parseo según el provider.\r\n */\r\nexport const parseSyncFusionData = (rawData: any, config: YwGaugeMappingConfig | any): GaugeChartParseResult => {\r\n const provider = config?.provider || 'syncfusion';\r\n\r\n switch (provider) {\r\n case 'syncfusion':\r\n return parseForSyncfusion(rawData, config);\r\n default:\r\n console.warn(`Provider \"${provider}\" no soportado aún, haciendo fallback a syncfusion`);\r\n return parseForSyncfusion(rawData, config);\r\n }\r\n};\r\n\r\n/** Alias retrocompatible */\r\nexport const parseDataGauge = parseSyncFusionData;\r\n\r\n/**\r\n * Agrega una lista de valores numéricos según el modo seleccionado.\r\n */\r\nconst aggregateValues = (values: number[], aggregation: string = 'sum'): number => {\r\n if (!values || values.length === 0) return 0;\r\n let computedValue = 0;\r\n switch (aggregation) {\r\n case 'sum':\r\n computedValue = values.reduce((acc, v) => acc + v, 0);\r\n break;\r\n case 'avg':\r\n computedValue = values.reduce((acc, v) => acc + v, 0) / values.length;\r\n break;\r\n case 'count':\r\n computedValue = values.length;\r\n break;\r\n case 'min':\r\n computedValue = Math.min(...values);\r\n break;\r\n case 'max':\r\n computedValue = Math.max(...values);\r\n break;\r\n case 'first':\r\n computedValue = values[0];\r\n break;\r\n default:\r\n computedValue = values.reduce((acc, v) => acc + v, 0);\r\n }\r\n return Math.round(computedValue * 100) / 100;\r\n};\r\n\r\n/** Parseo específico para Syncfusion CircularGauge con soporte multi-formato */\r\nconst parseForSyncfusion = (rawData: any, config: YwGaugeMappingConfig | any): GaugeChartParseResult => {\r\n if (!rawData || !config) {\r\n return buildGaugeResult(0, config || {});\r\n }\r\n\r\n // 0. Desenvolver envoltorio de API si viene como { data: ... } o { result: ... }\r\n const effectiveData = unwrapApiEnvelope(rawData);\r\n const cfg = config.configData || config;\r\n const yKey = cfg.yAxis || cfg.yLabel;\r\n const aggregation = config.aggregation || 'sum';\r\n\r\n // 1. Formato Primitivo directo: número o string numérico (ej: 75 o \"75.5\")\r\n if (typeof effectiveData === 'number') {\r\n return buildGaugeResult(effectiveData, config);\r\n }\r\n if (typeof effectiveData === 'string' && effectiveData.trim() !== '' && !isNaN(Number(effectiveData))) {\r\n return buildGaugeResult(Number(effectiveData), config);\r\n }\r\n\r\n // 2. Formato Objeto Resumen / KPI único (ej: { monto_total: 3000 } o { value: 75 })\r\n if (\r\n effectiveData &&\r\n typeof effectiveData === 'object' &&\r\n !Array.isArray(effectiveData) &&\r\n !Object.values(effectiveData).some(v => Array.isArray(v))\r\n ) {\r\n let kpiValue: number | undefined;\r\n if (yKey) {\r\n const v = getNestedValue(effectiveData, yKey);\r\n if (v !== undefined && !isNaN(Number(v))) kpiValue = Number(v);\r\n }\r\n if (kpiValue === undefined) {\r\n const candidateKeys = ['value', 'total', 'monto', 'amount', 'val', 'y', 'count', 'monto_total', 'promedio'];\r\n for (const k of candidateKeys) {\r\n if (effectiveData[k] !== undefined && !isNaN(Number(effectiveData[k]))) {\r\n kpiValue = Number(effectiveData[k]);\r\n break;\r\n }\r\n }\r\n }\r\n if (kpiValue === undefined) {\r\n for (const val of Object.values(effectiveData)) {\r\n if (typeof val === 'number') {\r\n kpiValue = val;\r\n break;\r\n }\r\n if (typeof val === 'string' && val.trim() !== '' && !isNaN(Number(val))) {\r\n kpiValue = Number(val);\r\n break;\r\n }\r\n }\r\n }\r\n if (kpiValue !== undefined) {\r\n return buildGaugeResult(kpiValue, config);\r\n }\r\n }\r\n\r\n // 3. Formato Arreglo de números primitivos: [100, 200, 300]\r\n if (Array.isArray(effectiveData) && effectiveData.length > 0 && typeof effectiveData[0] === 'number') {\r\n const numValues = effectiveData.map(Number).filter(v => !isNaN(v));\r\n const computed = aggregateValues(numValues, aggregation);\r\n return buildGaugeResult(computed, config);\r\n }\r\n\r\n // 4. Colección de Filas: delegada al adaptador base (resuelve arreglos planos y multi-tabla con joins)\r\n const rawRows = resolveChartRows(effectiveData, config);\r\n\r\n // 5. Extraer los valores numéricos correspondientes a yAxis usando getNestedValue\r\n const values: number[] = [];\r\n rawRows.forEach((row: any) => {\r\n if (!row) return;\r\n let numVal: number | undefined;\r\n if (yKey) {\r\n const raw = getNestedValue(row, yKey);\r\n if (raw !== undefined && raw !== null) {\r\n const parsed = typeof raw === 'number' ? raw : Number(raw);\r\n if (!isNaN(parsed)) numVal = parsed;\r\n }\r\n }\r\n // Si no se encontró por yKey, buscar primera propiedad numérica válida de la fila\r\n if (numVal === undefined) {\r\n for (const k of Object.keys(row)) {\r\n const v = row[k];\r\n if (typeof v === 'number') {\r\n numVal = v;\r\n break;\r\n }\r\n }\r\n }\r\n if (numVal !== undefined) {\r\n values.push(numVal);\r\n }\r\n });\r\n\r\n const computedValue = aggregateValues(values, aggregation);\r\n return buildGaugeResult(computedValue, config);\r\n};\r\n\r\n/**\r\n * Construye el resultado visual y punto del Gauge de forma tipada.\r\n */\r\nconst buildGaugeResult = (computedValue: number, config: YwGaugeMappingConfig | any): GaugeChartParseResult => {\r\n const cfg = config?.configData || config || {};\r\n const chartTitle = config?.title ?? cfg?.title ?? '';\r\n const tooltip = cfg?.tooltip;\r\n\r\n // 1. Preset según variante\r\n const variant = config?.variant as YwGaugeVariant | undefined;\r\n const variantPreset = variant ? VARIANT_PRESETS[variant.type] : null;\r\n\r\n // 2. Parámetros de escala y ángulos\r\n const minimum = config?.minimum ?? 0;\r\n const maximum = config?.maximum ?? 100;\r\n const labelFormat = config?.labelFormat ?? '{value}';\r\n const startAngle = config?.startAngle ?? variantPreset?.startAngle ?? 270;\r\n const endAngle = config?.endAngle ?? variantPreset?.endAngle ?? 90;\r\n\r\n // Construimos el texto de la etiqueta\r\n const text = labelFormat.replace('{value}', String(computedValue));\r\n\r\n const isTooltipEnabled = tooltip?.enable !== undefined \r\n ? tooltip.enable \r\n : (config?.enableTooltip ?? true);\r\n\r\n // 3. Parámetros de doble línea de progreso / líquido\r\n const enableProgressTrack = config?.enableProgressTrack ?? variantPreset?.enableProgressTrack ?? false;\r\n const trackColor = config?.trackColor ?? variantPreset?.trackColor ?? '#E5E7EB';\r\n const progressColor = config?.progressColor ?? variantPreset?.progressColor ?? config?.pointerColor ?? variantPreset?.pointerColor ?? '#0052CC';\r\n const progressWidth = config?.progressWidth ?? variantPreset?.progressWidth ?? 14;\r\n const showNeedleWithProgress = config?.showNeedleWithProgress ?? variantPreset?.showNeedleWithProgress ?? false;\r\n\r\n // 4. Parámetros de estilo de esquinas (redondo vs recto)\r\n const cornerStyle: 'round' | 'flat' = config?.cornerStyle ?? variantPreset?.cornerStyle ?? 'flat';\r\n const cornerRadius = cornerStyle === 'round' ? Math.round(progressWidth / 2) : 0;\r\n\r\n // 5. Parámetros de posición de la regla (ticks y cantidades)\r\n const showTicks = config?.showTicks ?? variantPreset?.showTicks ?? false;\r\n const tickPosition: 'Outside' | 'Inside' | 'Cross' = config?.tickPosition ?? variantPreset?.tickPosition ?? 'Outside';\r\n const labelOffset = config?.labelOffset ?? variantPreset?.labelOffset ?? (showTicks ? 12 : 0);\r\n\r\n // 6. Detección de ancho variable / progresivo (Range Width)\r\n const isWidthRangeVariant = variant?.type === 'width-range';\r\n const hasCustomRangeWidths = (config?.ranges ?? []).some(\r\n (r: YwGaugeRange) => r.startWidth !== undefined || r.endWidth !== undefined\r\n );\r\n\r\n const isVariableWidth = isWidthRangeVariant ||\r\n Boolean(variantPreset?.isVariableWidth) ||\r\n (config?.startWidth !== undefined && config?.endWidth !== undefined && config.startWidth !== config.endWidth) ||\r\n hasCustomRangeWidths;\r\n\r\n const defaultStartWidth = 4;\r\n const defaultEndWidth = 24;\r\n const startWidth = config?.startWidth ?? variantPreset?.startWidth ?? (isWidthRangeVariant ? defaultStartWidth : progressWidth);\r\n const endWidth = config?.endWidth ?? variantPreset?.endWidth ?? (isWidthRangeVariant ? defaultEndWidth : progressWidth);\r\n\r\n // 7. Determinar presencia de aguja para estilo por defecto del label central\r\n const hasNeedle = !enableProgressTrack || showNeedleWithProgress;\r\n\r\n // 8. Parámetros de estilo del label central\r\n const rawLabelSize = config?.labelSize ?? variantPreset?.labelSize;\r\n const labelSize = rawLabelSize\r\n ? (typeof rawLabelSize === 'number' ? `${rawLabelSize}px` : rawLabelSize)\r\n : (!hasNeedle ? '24px' : '16px');\r\n\r\n const labelBold = config?.labelBold ?? variantPreset?.labelBold ?? (!hasNeedle);\r\n const labelWeight = config?.labelWeight ?? (labelBold ? 'bold' : 'normal');\r\n const labelColor = config?.labelColor ?? '#1F2937';\r\n\r\n // 9. Posición del label central (distancia radial y ángulo)\r\n const rawDistance = config?.labelDistance ?? config?.labelRadius ?? variantPreset?.labelDistance;\r\n const labelRadius = rawDistance !== undefined\r\n ? (typeof rawDistance === 'number' ? `${rawDistance}%` : rawDistance)\r\n : (!hasNeedle ? '20%' : '40%');\r\n const labelAngle = config?.labelAngle ?? 180;\r\n\r\n // 10. Multi-rango y rangos resueltos\r\n const roundMultiRanges = config?.roundMultiRanges ?? variantPreset?.roundMultiRanges ?? false;\r\n const defaultRanges = variantPreset?.ranges\r\n ? scaledRanges(variantPreset.ranges, minimum, maximum)\r\n : scaledRanges(DEFAULT_RANGES, minimum, maximum);\r\n const rawRanges = config?.ranges ?? defaultRanges;\r\n\r\n let resolvedRanges: YwGaugeRange[] = [];\r\n if (enableProgressTrack && isVariableWidth) {\r\n const clampedValue = Math.max(minimum, Math.min(maximum, computedValue));\r\n const span = maximum - minimum;\r\n const progressRatio = span > 0 ? (clampedValue - minimum) / span : 0;\r\n // Ancho interpolado en el punto donde se encuentra el progreso actual\r\n const midWidth = Math.round((startWidth + progressRatio * (endWidth - startWidth)) * 10) / 10;\r\n\r\n resolvedRanges = [\r\n {\r\n start: minimum,\r\n end: clampedValue,\r\n color: progressColor,\r\n startWidth,\r\n endWidth: midWidth,\r\n roundedCornerRadius: 0\r\n },\r\n {\r\n start: clampedValue,\r\n end: maximum,\r\n color: trackColor,\r\n startWidth: midWidth,\r\n endWidth,\r\n roundedCornerRadius: 0\r\n }\r\n ];\r\n } else if (cornerStyle === 'round' && rawRanges.length >= 3 && !roundMultiRanges) {\r\n const totalSpan = maximum - minimum;\r\n const overlap = totalSpan * 0.03;\r\n\r\n const firstRange: YwGaugeRange = {\r\n ...rawRanges[0],\r\n end: rawRanges[0].end + overlap,\r\n roundedCornerRadius: rawRanges[0].roundedCornerRadius ?? cornerRadius\r\n };\r\n\r\n const lastIdx = rawRanges.length - 1;\r\n const lastRange: YwGaugeRange = {\r\n ...rawRanges[lastIdx],\r\n start: rawRanges[lastIdx].start - overlap,\r\n roundedCornerRadius: rawRanges[lastIdx].roundedCornerRadius ?? cornerRadius\r\n };\r\n\r\n const middleRanges: YwGaugeRange[] = rawRanges.slice(1, lastIdx).map((r: YwGaugeRange) => ({\r\n ...r,\r\n roundedCornerRadius: r.roundedCornerRadius ?? 0\r\n }));\r\n\r\n resolvedRanges = [firstRange, lastRange, ...middleRanges];\r\n } else {\r\n resolvedRanges = rawRanges.map((r: YwGaugeRange, _idx: number, arr: YwGaugeRange[]) => {\r\n const defaultRangeCorner = (arr.length > 1 && !roundMultiRanges) ? 0 : cornerRadius;\r\n return {\r\n ...r,\r\n roundedCornerRadius: r.roundedCornerRadius ?? defaultRangeCorner\r\n };\r\n });\r\n }\r\n\r\n // 5. Construimos el visualConfig tipado con SfGaugeVisualConfig\r\n const visualConfig: SfGaugeVisualConfig = {\r\n title: chartTitle,\r\n minimum,\r\n maximum,\r\n startAngle,\r\n endAngle,\r\n ranges: resolvedRanges,\r\n pointerColor: config?.pointerColor ?? variantPreset?.pointerColor ?? DEFAULT_POINTER_COLOR,\r\n enableTooltip: isTooltipEnabled,\r\n showLabel: config?.showLabel ?? true,\r\n labelFormat,\r\n showTicks,\r\n labelAngle,\r\n labelRadius,\r\n tickPosition,\r\n labelOffset,\r\n enableProgressTrack,\r\n trackColor,\r\n progressColor,\r\n progressWidth,\r\n showNeedleWithProgress,\r\n cornerStyle,\r\n cornerRadius,\r\n labelSize,\r\n labelBold,\r\n labelWeight,\r\n labelColor,\r\n roundMultiRanges,\r\n isVariableWidth,\r\n startWidth,\r\n endWidth\r\n };\r\n\r\n const gaugePoint: SfGaugePoint = {\r\n value: computedValue,\r\n text,\r\n };\r\n\r\n return { gaugePoint, visualConfig };\r\n};\r\n\r\n/**\r\n * Escala los rangos por defecto (0-100) al rango [minimum, maximum] del gauge.\r\n */\r\nconst scaledRanges = (\r\n ranges: YwGaugeRange[],\r\n minimum: number,\r\n maximum: number\r\n): YwGaugeRange[] => {\r\n const span = maximum - minimum;\r\n return ranges.map(r => ({\r\n ...r,\r\n start: minimum + (r.start / 100) * span,\r\n end: minimum + (r.end / 100) * span,\r\n }));\r\n};","import {\r\n Component,\r\n Input,\r\n OnInit,\r\n AfterViewInit,\r\n OnChanges,\r\n OnDestroy,\r\n DoCheck,\r\n SimpleChanges,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { parseSyncFusionData, parseDataGauge } from '../../yw-gauge-chart.adapter';\r\nimport { SfGaugePoint } from '../../../../../models/data/charts/yw-gauge-chart-data.interface';\r\nimport {\r\n YwGaugeMappingConfig,\r\n YwGaugeChartConfig,\r\n YwGaugeRange,\r\n SfGaugeVisualConfig\r\n} from '../../../../../models/config/chart/yw-gauge-chart-config.interface';\r\nimport { CircularGaugeModule, CircularGaugeComponent } from '@syncfusion/ej2-angular-circulargauge';\r\nimport { AnnotationsService, GaugeTooltipService } from '@syncfusion/ej2-angular-circulargauge';\r\n\r\n@Component({\r\n selector: 'yw-gauge-chart-syncfusion',\r\n standalone: true,\r\n imports: [CommonModule, CircularGaugeModule],\r\n providers: [AnnotationsService, GaugeTooltipService],\r\n templateUrl: './yw-gauge-chart-sycfusion.component.html',\r\n styleUrl: './yw-gauge-chart-sycfusion.component.scss',\r\n})\r\nexport class GaugeChartSyncfusionComponent implements OnInit, AfterViewInit, OnChanges, DoCheck, OnDestroy {\r\n @ViewChild('circulargauge') public gaugeInstance?: CircularGaugeComponent;\r\n\r\n private _chartData: any = {};\r\n private _dataSnapshot: string = '';\r\n private _resizeObserver?: ResizeObserver;\r\n private _currentAnimationId?: number;\r\n private _previousValue?: number;\r\n private _isViewInitialized: boolean = false;\r\n private _hasAnimatedInitial: boolean = false;\r\n private _isAnimating: boolean = false;\r\n\r\n private static _nextId = 0;\r\n private _idComponent: string = '';\r\n\r\n @Input()\r\n set idComponent(val: string) {\r\n this._idComponent = val;\r\n }\r\n get idComponent(): string {\r\n if (!this._idComponent) {\r\n this._idComponent = `yw_gauge_sf_${++GaugeChartSyncfusionComponent._nextId}`;\r\n }\r\n return this._idComponent;\r\n }\r\n\r\n @Input('chartData')\r\n set chartData(val: any) {\r\n this._chartData = val;\r\n }\r\n get chartData(): any {\r\n return this._chartData;\r\n }\r\n\r\n @Input('config') config!: YwGaugeMappingConfig;\r\n\r\n gaugePoint!: SfGaugePoint;\r\n visualConfig!: SfGaugeVisualConfig;\r\n\r\n /** Tamaño de fuente dinámico del label central según el tamaño del contenedor */\r\n currentLabelSize: string = '';\r\n /** Texto animado del contador central durante la interpolación */\r\n animatedLabelText: string = '';\r\n\r\n constructor(private cdr: ChangeDetectorRef, private elRef: ElementRef) { }\r\n\r\n ngOnInit(): void {\r\n this._hasAnimatedInitial = true;\r\n this.updateParsedData();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._isViewInitialized = true;\r\n this._setupResizeObserver();\r\n }\r\n\r\n /**\r\n * Evento emitido por Syncfusion cuando el SVG ha culminado su renderizado físico en el DOM.\r\n * Garantiza que los elementos <path> existen antes de arrancar la animación de llenado.\r\n */\r\n public onGaugeLoaded(args: any): void {\r\n if (this.visualConfig?.isVariableWidth && this.gaugePoint && !this._hasAnimatedInitial) {\r\n this._hasAnimatedInitial = true;\r\n window.requestAnimationFrame(() => {\r\n this._animateWidthRange(this.visualConfig.minimum, this.gaugePoint.value);\r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData'] || changes['config']) {\r\n this.updateParsedData();\r\n }\r\n }\r\n\r\n ngDoCheck(): void {\r\n try {\r\n const snap = JSON.stringify(this._chartData);\r\n if (snap !== this._dataSnapshot) {\r\n this._dataSnapshot = snap;\r\n this.updateParsedData();\r\n }\r\n } catch {\r\n // Ignorar si hay referencias circulares en los datos\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._cancelAnimation();\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n public updateParsedData(): void {\r\n if (!this.config) return;\r\n\r\n const parsedResult = parseSyncFusionData(this._chartData, this.config);\r\n this.gaugePoint = parsedResult.gaugePoint;\r\n this.visualConfig = parsedResult.visualConfig;\r\n\r\n const targetValue = this.gaugePoint.value;\r\n\r\n // Si es variante variable cónica (width-range)\r\n if (this.visualConfig.isVariableWidth) {\r\n if (!this._isViewInitialized) {\r\n // En la carga inicial antes del montaje, CONSERVAR los rangos reales calculados por el adaptador\r\n // para que Syncfusion cree los elementos <path> de Range 0 y Range 1 en el DOM SVG.\r\n this.animatedLabelText = '';\r\n this._previousValue = targetValue;\r\n } else {\r\n // Vista ya inicializada: animar fluidamente desde el valor previo hasta el nuevo valor\r\n const startVal = this._previousValue !== undefined ? this._previousValue : this.visualConfig.minimum;\r\n this._animateWidthRange(startVal, targetValue);\r\n }\r\n } else {\r\n this.animatedLabelText = '';\r\n this._previousValue = targetValue;\r\n }\r\n\r\n this.cdr.markForCheck();\r\n\r\n if (this.gaugeInstance && !this.visualConfig.isVariableWidth) {\r\n setTimeout(() => {\r\n this.gaugeInstance?.refresh();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Configura el ResizeObserver siguiendo el patrón estandarizado del Bar Chart con requestAnimationFrame.\r\n */\r\n private _setupResizeObserver(): void {\r\n if (typeof ResizeObserver === 'undefined' || !this.elRef?.nativeElement) return;\r\n\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n for (const entry of entries) {\r\n // const { width } = entry.contentRect;\r\n const { width} = entry.contentRect;\r\n \r\n if (width > 0) {\r\n this._updateAdaptiveLabelSize(width);\r\n // No refrescar la instancia completa durante la animación de llenado para evitar parpadeos\r\n if (this.gaugeInstance && !this._isAnimating) {\r\n this.gaugeInstance.refresh();\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this._resizeObserver.observe(this.elRef.nativeElement);\r\n }\r\n\r\n /**\r\n * Calcula el tamaño de fuente óptimo para el label central en función del ancho del contenedor.\r\n */\r\n private _updateAdaptiveLabelSize(width: number): void {\r\n if (this.config?.labelSize) {\r\n const parsedSize = typeof this.config.labelSize === 'number'\r\n ? this.config.labelSize\r\n : parseFloat(this.config.labelSize);\r\n\r\n if (!isNaN(parsedSize)) {\r\n if (width < 260) {\r\n const scale = Math.max(0.65, width / 260);\r\n this.currentLabelSize = `${Math.round(parsedSize * scale)}px`;\r\n } else {\r\n this.currentLabelSize = `${parsedSize}px`;\r\n }\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n }\r\n\r\n // Proporción estándar ideal (~7.5% del ancho del contenedor, acotado entre 13px y 26px)\r\n const base = Math.max(13, Math.min(26, Math.round(width * 0.075)));\r\n this.currentLabelSize = `${base}px`;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Genera los dos rangos para la variante cónica (progreso + pista restante con midWidth interpolado).\r\n * SIEMPRE produce exactamente 2 rangos para que Syncfusion los registre en el DOM.\r\n */\r\n private _getVariableWidthRanges(currentValue: number): YwGaugeRange[] {\r\n const min = this.visualConfig.minimum;\r\n const max = this.visualConfig.maximum;\r\n const clamped = Math.max(min, Math.min(max, currentValue));\r\n const span = max - min;\r\n const progressRatio = span > 0 ? (clamped - min) / span : 0;\r\n const startWidth = this.visualConfig.startWidth ?? 4;\r\n const endWidth = this.visualConfig.endWidth ?? 24;\r\n const midWidth = Math.round((startWidth + progressRatio * (endWidth - startWidth)) * 10) / 10;\r\n\r\n return [\r\n {\r\n start: min,\r\n end: clamped,\r\n color: this.visualConfig.progressColor,\r\n startWidth,\r\n endWidth: midWidth,\r\n roundedCornerRadius: 0\r\n },\r\n {\r\n start: clamped,\r\n end: max,\r\n color: this.visualConfig.trackColor,\r\n startWidth: midWidth,\r\n endWidth,\r\n roundedCornerRadius: 0\r\n }\r\n ];\r\n }\r\n\r\n /**\r\n * Motor de animación a 60fps con requestAnimationFrame para la variante width-range.\r\n * Transiciona desde startVal (0/min) hasta targetVal en duration ms con curva cúbica suave (easeOutCubic).\r\n */\r\n private _animateWidthRange(startVal: number, targetVal: number, duration: number = 900): void {\r\n this._cancelAnimation();\r\n this._isAnimating = true;\r\n\r\n const min = this.visualConfig.minimum;\r\n const max = this.visualConfig.maximum;\r\n const format = this.visualConfig.labelFormat || '{value}';\r\n const startTime = performance.now();\r\n\r\n const step = (currentTime: number) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(1, elapsed / duration);\r\n // Curva cúbica de desaceleración suave: 1 - (1 - t)^3\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n const currentVal = Math.round((startVal + (targetVal - startVal) * easeProgress) * 100) / 100;\r\n\r\n const span = max - min;\r\n const clamped = Math.max(min + 0.1, Math.min(max, currentVal));\r\n const ratio = span > 0 ? (clamped - min) / span : 0;\r\n const startW = this.visualConfig.startWidth ?? 4;\r\n const endW = this.visualConfig.endWidth ?? 24;\r\n const midW = Math.round((startW + ratio * (endW - startW)) * 10) / 10;\r\n\r\n // 1. Actualizar los arcos SVG directamente en la instancia de Syncfusion para máxima fluidez a 60fps\r\n if (this.gaugeInstance?.axes?.[0]?.ranges?.length) {\r\n const axis = this.gaugeInstance.axes[0];\r\n const ranges = axis.ranges;\r\n\r\n const gaugeId = this.gaugeInstance.element?.id || this.idComponent;\r\n const range0El = document.getElementById(`${gaugeId}_Axis_0_Range_0`);\r\n\r\n if (!range0El) {\r\n // Si el elemento SVG aún no ha sido inyectado en el DOM, esperar al siguiente frame\r\n if (progress < 1) {\r\n this._currentAnimationId = requestAnimationFrame(step);\r\n }\r\n return;\r\n }\r\n\r\n try {\r\n if (ranges && ranges[0]) {\r\n (ranges[0] as any).endWidth = midW;\r\n this.gaugeInstance.setRangeValue(0, 0, min, clamped);\r\n }\r\n if (ranges && ranges[1]) {\r\n (ranges[1] as any).startWidth = midW;\r\n this.gaugeInstance.setRangeValue(0, 1, clamped, max);\r\n }\r\n } catch (err) {\r\n // Capturar excepciones internas de Syncfusion para no abortar el bucle de animación\r\n }\r\n }\r\n\r\n // 2. Actualizar el contador numérico central en sincronía con el llenado\r\n const labelText = format.replace('{value}', String(Math.round(currentVal)));\r\n this.animatedLabelText = labelText;\r\n if (this.gaugeInstance) {\r\n try {\r\n this.gaugeInstance.setAnnotationValue(0, 0, labelText);\r\n } catch {\r\n // Ignorar si la anotación aún no se ha montado\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n\r\n if (progress < 1) {\r\n this._currentAnimationId = requestAnimationFrame(step);\r\n } else {\r\n // Al culminar la animación, fijar los valores exactos definitivos\r\n this.visualConfig.ranges = this._getVariableWidthRanges(targetVal);\r\n const finalLabel = format.replace('{value}', String(targetVal));\r\n this.animatedLabelText = finalLabel;\r\n if (this.gaugeInstance) {\r\n try {\r\n this.gaugeInstance.setAnnotationValue(0, 0, finalLabel);\r\n } catch {}\r\n }\r\n this._previousValue = targetVal;\r\n this._isAnimating = false;\r\n this._currentAnimationId = undefined;\r\n this.cdr.markForCheck();\r\n }\r\n };\r\n\r\n this._currentAnimationId = requestAnimationFrame(step);\r\n }\r\n\r\n private _cancelAnimation(): void {\r\n if (this._currentAnimationId) {\r\n cancelAnimationFrame(this._currentAnimationId);\r\n this._currentAnimationId = undefined;\r\n }\r\n this._isAnimating = false;\r\n }\r\n\r\n /** Método público para forzar refresco manual */\r\n public refresh(): void {\r\n this.updateParsedData();\r\n }\r\n\r\n /** Helper para el trackBy en la plantilla */\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"gauge-container\">\r\n\r\n @if (visualConfig && visualConfig.title) {\r\n <div class=\"gauge-header-title\" [title]=\"visualConfig.title\">\r\n {{ visualConfig.title }}\r\n </div>\r\n }\r\n\r\n <div class=\"gauge-wrapper\">\r\n <ejs-circulargauge\r\n #circulargauge\r\n [id]=\"idComponent\"\r\n [title]=\"''\"\r\n height=\"100%\"\r\n width=\"100%\"\r\n [enablePointerDrag]=\"false\"\r\n [tooltip]=\"{ enable: visualConfig.enableTooltip }\"\r\n (loaded)=\"onGaugeLoaded($event)\">\r\n\r\n <e-axes>\r\n <e-axis\r\n [minimum]=\"visualConfig.minimum\"\r\n [maximum]=\"visualConfig.maximum\"\r\n [startAngle]=\"visualConfig.startAngle\"\r\n [endAngle]=\"visualConfig.endAngle\"\r\n [lineStyle]=\"{ width: 0 }\"\r\n [labelStyle]=\"visualConfig.showTicks ? { position: 'Outside', offset: visualConfig.labelOffset, font: { size: '11px' } } : { position: 'Outside', font: { size: '0px' } }\"\r\n [majorTicks]=\"visualConfig.showTicks ? { position: visualConfig.tickPosition, width: 2, height: 10 } : { width: 0 }\"\r\n [minorTicks]=\"visualConfig.showTicks ? { position: visualConfig.tickPosition, width: 1, height: 5 } : { width: 0 }\">\r\n\r\n <!-- Rangos de color sobre el arco (modo convencional por rangos o modo ancho variable) -->\r\n @if (!visualConfig.enableProgressTrack || visualConfig.isVariableWidth) {\r\n <e-ranges>\r\n @for (range of visualConfig.ranges; track $index) {\r\n <e-range\r\n [start]=\"range.start\"\r\n [end]=\"range.end\"\r\n [color]=\"range.color\"\r\n [startWidth]=\"range.startWidth ?? range.width ?? 8\"\r\n [endWidth]=\"range.endWidth ?? range.width ?? 8\"\r\n [roundedCornerRadius]=\"range.roundedCornerRadius ?? 0\">\r\n </e-range>\r\n }\r\n </e-ranges>\r\n }\r\n\r\n <!-- Punteros: tanto la línea de fondo (vacío) como la de llenado (líquido) usan RangeBar para alineación perfecta -->\r\n <e-pointers>\r\n @if (visualConfig.enableProgressTrack && !visualConfig.isVariableWidth) {\r\n <!-- Línea 1: Fondo / vacío (del mínimo al máximo) -->\r\n <e-pointer\r\n type=\"RangeBar\"\r\n [value]=\"visualConfig.maximum\"\r\n [color]=\"visualConfig.trackColor\"\r\n [pointerWidth]=\"visualConfig.progressWidth\"\r\n [roundedCornerRadius]=\"visualConfig.cornerRadius\"\r\n [animation]=\"{ enable: false }\">\r\n </e-pointer>\r\n\r\n <!-- Línea 2: Llenado progresivo / líquido (del mínimo al valor actual) -->\r\n <e-pointer\r\n type=\"RangeBar\"\r\n [value]=\"gaugePoint.value\"\r\n [color]=\"visualConfig.progressColor\"\r\n [pointerWidth]=\"visualConfig.progressWidth\"\r\n [roundedCornerRadius]=\"visualConfig.cornerRadius\"\r\n [animation]=\"{ enable: true, duration: 900 }\">\r\n </e-pointer>\r\n }\r\n\r\n @if ((!visualConfig.enableProgressTrack || visualConfig.showNeedleWithProgress) && (!visualConfig.isVariableWidth || visualConfig.showNeedleWithProgress)) {\r\n <e-pointer\r\n [value]=\"gaugePoint.value\"\r\n type=\"Needle\"\r\n [color]=\"visualConfig.pointerColor\"\r\n [needleTail]=\"{ length: '18%' }\"\r\n [cap]=\"{ radius: 8, color: visualConfig.pointerColor }\">\r\n </e-pointer>\r\n }\r\n </e-pointers>\r\n\r\n <!-- Etiqueta central con el valor -->\r\n @if (visualConfig.showLabel) {\r\n <e-annotations>\r\n <e-annotation\r\n [angle]=\"visualConfig.labelAngle\"\r\n [radius]=\"visualConfig.labelRadius\"\r\n zIndex=\"1\"\r\n [content]=\"animatedLabelText || gaugePoint.text\"\r\n [textStyle]=\"{\r\n size: currentLabelSize || visualConfig.labelSize,\r\n fontWeight: visualConfig.labelWeight,\r\n color: visualConfig.labelColor,\r\n fontFamily: 'inherit',\r\n fontStyle: 'normal',\r\n opacity: 1\r\n }\">\r\n </e-annotation>\r\n </e-annotations>\r\n }\r\n\r\n </e-axis>\r\n </e-axes>\r\n\r\n </ejs-circulargauge>\r\n </div>\r\n\r\n</div>\r\n","import { Component, Input, OnInit, OnChanges, DoCheck, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GaugeChartSyncfusionComponent } from '../../../../../adapters/charts/gauge-chart/syncfusion/visual/yw-gauge-chart-sycfusion.component';\r\nimport { YwGaugeMappingConfig, YwGaugeChartConfig } from '../../../../../models/config/chart/yw-gauge-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-gauge-chart',\r\n standalone: true,\r\n imports: [CommonModule, GaugeChartSyncfusionComponent],\r\n templateUrl: './yw-gauge-chart.component.html',\r\n styleUrl: './yw-gauge-chart.component.scss',\r\n})\r\nexport class GaugeChartComponent implements OnChanges, DoCheck {\r\n @ViewChild(GaugeChartSyncfusionComponent) syncfusionComponent?: GaugeChartSyncfusionComponent;\r\n\r\n private _chartData: any = {};\r\n private _dataSnapshot: string = '';\r\n\r\n private static _nextId = 0;\r\n private _idComponent: string = '';\r\n\r\n @Input()\r\n set idComponent(val: string) {\r\n this._idComponent = val;\r\n }\r\n get idComponent(): string {\r\n if (!this._idComponent) {\r\n this._idComponent = `yw_gauge_host_${++GaugeChartComponent._nextId}`;\r\n }\r\n return this._idComponent;\r\n }\r\n\r\n @Input('chartData')\r\n set chartData(val: any) {\r\n this._chartData = val;\r\n }\r\n get chartData(): any {\r\n return this._chartData;\r\n }\r\n\r\n @Input('config') config!: YwGaugeMappingConfig;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData']) {\r\n this._chartData = changes['chartData'].currentValue;\r\n }\r\n this.syncfusionComponent?.updateParsedData();\r\n }\r\n\r\n ngDoCheck(): void {\r\n try {\r\n const snap = JSON.stringify(this._chartData);\r\n if (snap !== this._dataSnapshot) {\r\n this._dataSnapshot = snap;\r\n this.syncfusionComponent?.updateParsedData();\r\n }\r\n } catch {\r\n // Ignorar si hay referencias circulares en los datos\r\n }\r\n }\r\n\r\n /** Método público para forzar refresco manual */\r\n public refresh(): void {\r\n this.syncfusionComponent?.refresh();\r\n }\r\n}\r\n","@if (config.provider === 'syncfusion') {\r\n <div style=\"position: relative; width: 100%; height: 100%;\">\r\n <yw-gauge-chart-syncfusion\r\n [idComponent]=\"idComponent\"\r\n [chartData]=\"chartData\"\r\n [config]=\"config\"\r\n style=\"display: block; width: 100%; height: 100%;\">\r\n </yw-gauge-chart-syncfusion>\r\n </div>\r\n}\r\n","import { Component,SimpleChanges, computed , input, effect, ChangeDetectionStrategy, Input, output ,model, signal } from '@angular/core';\r\nimport { GridStack } from 'gridstack';\r\nimport { CommonModule } from '@angular/common'; \r\n\r\nimport { YwWidgetConfigInterface, YwWidgetStyleInterface, DEFAULT_WIDGET_STYLE } from '../../../../../models/config/dashboard/yw-dashboard-widget-config.interface';\r\n\r\n/*BEGIN - COMPONENTES VALIDOS PARA WIDGET*/\r\nimport { TestChartComponent } from '../../../../dummy/test-chart/test-chart.component';\r\nimport { YwEmptyVisualComponent } from '../../../../dummy/yw-empty-visual/yw-empty-visual.component';\r\nimport { LineChartComponent } from '../../../../basic/charts/yw-line-chart/visual/yw-line-chart.component';\r\nimport { BarChartComponent } from '../../../../basic/charts/yw-bar-chart/visual/yw-bar-chart.component';\r\nimport { PieChartComponent } from '../../../../basic/charts/yw-pie-chart/visual/yw-pie-chart.component';\r\nimport { GaugeChartComponent } from '../../../../basic/charts/yw-gauge-chart/visual/yw-gauge-chart.component';\r\n/*BEGIN - COMPONENTES VALIDOS PARA WIDGET*/\r\n\r\n@Component({\r\n selector: 'yw-dashboard-widget',\r\n standalone:true,\r\n imports: [CommonModule,\r\n TestChartComponent,\r\n YwEmptyVisualComponent,\r\n LineChartComponent,\r\n BarChartComponent,\r\n PieChartComponent,\r\n GaugeChartComponent\r\n ],\r\n templateUrl: './yw-dashboard-widget.component.html',\r\n styleUrl: './yw-dashboard-widget.component.scss',\r\n host: {\r\n '[style.--widget-bg]': 'instanceStyleWidget().widgetBackgroundColor',\r\n '[style.--widget-border-color]': 'instanceStyleWidget().widgetBorderColor'\r\n }\r\n})\r\nexport class YwDashboardWidgetComponent {\r\n\r\n public componentWidgetId: string = '';\r\n public typeComponent: string = '';\r\n public varShowConfigButtons:boolean=false;\r\n\r\n\r\n public styleWidget = input<YwWidgetStyleInterface>(DEFAULT_WIDGET_STYLE);\r\n \r\n // Signal calculada que combina los valores recibidos con los valores por defecto\r\n public instanceStyleWidget = computed(() => ({\r\n widgetBackgroundColor: this.styleWidget()?.widgetBackgroundColor ?? DEFAULT_WIDGET_STYLE.widgetBackgroundColor,\r\n widgetBorderColor: this.styleWidget()?.widgetBorderColor ?? DEFAULT_WIDGET_STYLE.widgetBorderColor\r\n }));\r\n\r\n @Input() configWidget:YwWidgetConfigInterface = {\r\n widgetId: '', \r\n title: '',\r\n typeComponent: '',\r\n showConfigButtons:false,\r\n widgetStyle:DEFAULT_WIDGET_STYLE,\r\n layoutConfig:{id: '',w: 0,h: 0,content: undefined},\r\n controlConfig:{},\r\n controlTables:[]\r\n };\r\n @Input() controlConfig:any= {};\r\n @Input() controlData:any= {};\r\n\r\n public dataWidget:any;\r\n\r\n public isLocked = model<boolean>(false);\r\n public isMaximized = signal<boolean>(false);\r\n\r\n public eventDeleteRequest = output<string>();\r\n public eventLockToggleRequest = output<{ widgetId: string, shouldLock: boolean }>();\r\n public eventMaximizeToggleRequest = output<{ widgetId: string, shouldMaximize: boolean }>();\r\n public eventShowConfigFormRequest = output<string>();\r\n\r\n\r\n\r\n constructor() {\r\n }\r\n\r\n\r\n ngOnInit(): void {\r\n\r\n this.componentWidgetId='cmpnt-'+this.configWidget.widgetId;\r\n this.typeComponent = this.configWidget.typeComponent;\r\n this.dataWidget = { idComponent: this.componentWidgetId ,\r\n controlConfig: this.controlConfig,\r\n controlData: this.controlData\r\n }; \r\n\r\n console.log('DATOS INICIALES INIT:');\r\n console.log(this.dataWidget);\r\n \r\n \r\n }\r\n \r\n\r\n ngAfterViewInit(): void {\r\n this.varShowConfigButtons = this.configWidget.showConfigButtons || false;\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes['configWidget']) {\r\n //console.log('Nuevo valor configWidget:', this.configWidget);\r\n this.varShowConfigButtons = this.configWidget.showConfigButtons || false;;\r\n }\r\n\r\n if (changes['controlConfig']) {\r\n console.log('Nuevo valor controlConfig:', this.controlConfig);\r\n }\r\n\r\n if (changes['controlData']) {\r\n //console.log('Nuevo valor controlData:', this.controlData);\r\n this.dataWidget = { idComponent: this.componentWidgetId ,\r\n controlConfig: this.controlConfig,\r\n controlData: this.controlData\r\n };\r\n }\r\n \r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n /* BEGIN - BARRA DE EVENTOS DEL WIDGET */\r\n //Eliminacion de Widget - Conectado al Dashboard\r\n public onDeleteClick(): void {\r\n this.eventDeleteRequest.emit(this.configWidget.widgetId);\r\n }\r\n\r\n public onLockClick(): void {\r\n // Invertimos el estado local y notificamos al padre\r\n const nextState = !this.isLocked();\r\n this.isLocked.set(nextState);\r\n this.eventLockToggleRequest.emit({ widgetId: this.configWidget.widgetId, shouldLock: nextState });\r\n }\r\n\r\n public onMaximizeClick(): void {\r\n const nextState = !this.isMaximized();\r\n this.isMaximized.set(nextState);\r\n this.eventMaximizeToggleRequest.emit({ widgetId: this.configWidget.widgetId, shouldMaximize: nextState });\r\n }\r\n\r\n public onShowFormConfigClick(): void {\r\n this.eventShowConfigFormRequest.emit(this.configWidget.widgetId);\r\n }\r\n /* END - BARRA DE EVENTOS DEL WIDGET */\r\n\r\n}\r\n","\r\n<!-- <div class=\"widget-action-bar\"> \r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-action\" (click)=\"onLockClick()\">{{ isLocked() ? '🔒' : '🔓' }}</button>\r\n <button class=\"btn-action\" (click)=\"onMaximizeClick()\">{{ isMaximized() ? '🗗' : '🗖' }}</button>\r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-delete\" (click)=\"onDeleteClick()\">🗑️</button>\r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-config\" (click)=\"onShowFormConfigClick()\">⚙️</button>\r\n</div> -->\r\n\r\n<div class=\"widget-action-bar\">\r\n <!-- Botón Bloquear / Desbloquear -->\r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-action\" (click)=\"onLockClick()\" [title]=\"isLocked() ? 'Desbloquear' : 'Bloquear'\">\r\n <svg *ngIf=\"isLocked(); else unlockedIcon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path></svg>\r\n <ng-template #unlockedIcon>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 9.9-1\"></path></svg>\r\n </ng-template>\r\n </button>\r\n\r\n <!-- Botón Maximizar / Restaurar -->\r\n <button class=\"btn-action\" (click)=\"onMaximizeClick()\" [title]=\"isMaximized() ? 'Restaurar' : 'Maximizar'\">\r\n <svg *ngIf=\"isMaximized(); else maxIcon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"></path></svg>\r\n <ng-template #maxIcon>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7\"></path></svg>\r\n </ng-template>\r\n </button>\r\n\r\n <!-- Botón Eliminar -->\r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-delete\" (click)=\"onDeleteClick()\" title=\"Eliminar\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"></polyline><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path></svg>\r\n </button>\r\n\r\n <!-- Botón Configuración -->\r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-config\" (click)=\"onShowFormConfigClick()\" title=\"Configurar\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path></svg>\r\n </button>\r\n</div>\r\n\r\n<div class=\"widget-content-wrapper\">\r\n @if ( typeComponent == 'dummy' ) {\r\n <ng-container *ngTemplateOutlet=\"testdummy; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'empty-visual' ) {\r\n <ng-container *ngTemplateOutlet=\"emptyvisual; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'chart-bar' ) {\r\n <ng-container *ngTemplateOutlet=\"chartbar; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'chart-line' ) {\r\n <ng-container *ngTemplateOutlet=\"chartline; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'chart-doughnut' ) {\r\n <ng-container *ngTemplateOutlet=\"chartdoughnut; context: { control: dataWidget }\"></ng-container>\r\n } \r\n @if ( typeComponent == 'chart-gauge' ) {\r\n <ng-container *ngTemplateOutlet=\"chartgauge; context: { control: dataWidget }\"></ng-container>\r\n } \r\n \r\n \r\n</div>\r\n\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- DUMMY TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #testdummy let-control = \"control\">\r\n <lib-test-chart [idComponent]=\"control.idComponent\" > \r\n </lib-test-chart>\r\n</ng-template>\r\n<!--------------------------------------------------------------->\r\n<!---------------------- EMPTY VISUAL TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #emptyvisual let-control = \"control\">\r\n <yw-empty-visual [idComponent]=\"control.idComponent\"\r\n [config]=\"control.controlConfig\" \r\n > \r\n </yw-empty-visual>\r\n</ng-template>\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- BAR CHART TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #chartbar let-control = \"control\">\r\n <yw-bar-chart [idComponent]=\"control.idComponent\"\r\n [chartData]=\"control.controlData\"\r\n [config]=\"control.controlConfig\" \r\n >\r\n </yw-bar-chart>\r\n</ng-template>\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- LINE CHART TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #chartline let-control = \"control\">\r\n <yw-line-chart [idComponent]=\"control.idComponent\"\r\n [chartData]=\"control.controlData\"\r\n [config]=\"control.controlConfig\" \r\n >\r\n </yw-line-chart>\r\n</ng-template>\r\n\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- LINE DOUGHNUT TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #chartdoughnut let-control = \"control\">\r\n <yw-pie-chart [idComponent]=\"control.idComponent\"\r\n [chartData]=\"control.controlData\"\r\n [config]=\"control.controlConfig\" \r\n >\r\n </yw-pie-chart>\r\n</ng-template>\r\n\r\n \r\n<!--------------------------------------------------------------->\r\n<!---------------------- LINE GAUGE TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #chartgauge let-control = \"control\">\r\n <yw-gauge-chart [idComponent]=\"control.idComponent\"\r\n [chartData]=\"control.controlData\"\r\n [config]=\"control.controlConfig\" \r\n >\r\n </yw-gauge-chart>\r\n</ng-template>\r\n","import { Component,OnInit,Input, input, output, signal, computed, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface DateRangeValue {\r\n startDate: string;\r\n endDate: string;\r\n}\r\n\r\nexport interface NumberRangeValue {\r\n minValue: number;\r\n maxValue: number;\r\n}\r\n\r\n@Component({\r\n selector: 'yw-base-slicer',\r\n imports: [],\r\n templateUrl: './yw-base-slicer.component.html',\r\n styleUrl: './yw-base-slicer.component.scss',\r\n host: {\r\n '[attr.id]': 'idComponent' // Vincula el atributo id al valor de la propiedad\r\n }\r\n})\r\nexport class YwBaseSlicerComponent implements OnInit {\r\n\r\n // Inputs de configuración del rango de fechas\r\n @Input() idComponent: string = '';\r\n @Input() dataType:string = 'date';\r\n public label = input<string>('Fecha'); \r\n public min = input<any>();\r\n public max = input<any>();\r\n public step = input<any>(1);\r\n\r\n public minCurrent = input<any>();\r\n public maxCurrent = input<any>();\r\n\r\n public minNumber:number = 0;\r\n public maxNumber:number = 1000;\r\n public minDate:string = '2020-01-01';\r\n public maxDate:string = '2022-12-31';\r\n\r\n // Evento de salida\r\n public rangeChange = output<any>();\r\n\r\n // Signals para las fechas seleccionadas\r\n public startDate = signal<string>('2020-01-01');\r\n public endDate = signal<string>('2022-09-22');\r\n // Signals para los numeros seleccionadas\r\n public startVal = signal<number>(0);\r\n public endVal = signal<number>(1000);\r\n\r\n public minTimestamp = computed(() => new Date(this.minDate).getTime());\r\n public maxTimestamp = computed(() => new Date(this.maxDate).getTime()); \r\n public startTimestamp = computed(() => new Date(this.startDate()).getTime());\r\n public endTimestamp = computed(() => new Date(this.endDate()).getTime());\r\n\r\n constructor() {\r\n // Inicializar valores al arrancar\r\n effect(() => {\r\n if (this.dataType == 'date'){ this.startDate.set(this.minCurrent() || this.minDate);\r\n this.endDate.set(this.maxCurrent() || this.maxDate);\r\n }\r\n if (this.dataType == 'number'){ this.startVal.set(this.minCurrent() || this.minNumber);\r\n this.endVal.set(this.maxCurrent() || this.maxNumber); \r\n }\r\n\r\n }, { allowSignalWrites: true });\r\n\r\n // Notificar al padre cada vez que cambien los valores\r\n effect(() => {\r\n\r\n if (this.dataType == 'date'){ \r\n this.rangeChange.emit({\r\n startDate: this.startDate(),\r\n endDate: this.endDate()\r\n } as DateRangeValue);\r\n }\r\n if (this.dataType == 'number'){\r\n this.rangeChange.emit({\r\n minValue: this.startVal(),\r\n maxValue: this.endVal()\r\n } as NumberRangeValue); \r\n }\r\n\r\n \r\n });\r\n }\r\n\r\n\r\n ngOnInit(): void {\r\n \r\n if (this.dataType == 'date'){\r\n this.minDate = this.min();\r\n this.maxDate = this.max();\r\n \r\n this.minTimestamp = computed(() => new Date(this.minDate).getTime());\r\n this.maxTimestamp = computed(() => new Date(this.maxDate).getTime()); \r\n this.startTimestamp = computed(() => new Date(this.startDate()).getTime());\r\n this.endTimestamp = computed(() => new Date(this.endDate()).getTime());\r\n }\r\n if (this.dataType == 'number'){\r\n this.minNumber = this.min();\r\n this.maxNumber = this.max();\r\n \r\n }\r\n\r\n }\r\n\r\n \r\n\r\n\r\n// Handlers para la entrada manual de fechas\r\n public onStartDateInput(value: string) {\r\n if (value && value <= this.endDate()) {\r\n this.startDate.set(value);\r\n }\r\n }\r\n\r\n public onEndDateInput(value: string) {\r\n if (value && value >= this.startDate()) {\r\n this.endDate.set(value);\r\n }\r\n }\r\n\r\n\r\n// Métodos para cambiar desde el Input Numérico\r\n public onStartInput(event: Event) {\r\n const value = Number((event.target as HTMLInputElement).value);\r\n if (!isNaN(value) && value <= this.endVal() && value >= this.min()) {\r\n this.startVal.set(value);\r\n }\r\n }\r\n\r\n public onEndInput(event: Event) {\r\n const value = Number((event.target as HTMLInputElement).value);\r\n if (!isNaN(value) && value >= this.startVal() && value <= this.max()) {\r\n this.endVal.set(value);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n // Handlers para el movimiento del slider\r\n public onStartSliderChange(event: Event) {\r\n if (this.dataType == 'date'){\r\n const val = Number((event.target as HTMLInputElement).value);\r\n const dateStr = new Date(val).toISOString().split('T')[0];\r\n \r\n if (val < this.endTimestamp()) {\r\n this.startDate.set(dateStr);\r\n }\r\n }\r\n if (this.dataType == 'number'){\r\n const val = Number((event.target as HTMLInputElement).value);\r\n if (val < this.endVal()) {\r\n this.startVal.set(val);\r\n }\r\n }\r\n }\r\n\r\n public onEndSliderChange(event: Event) {\r\n if (this.dataType == 'date'){\r\n const val = Number((event.target as HTMLInputElement).value);\r\n const dateStr = new Date(val).toISOString().split('T')[0];\r\n\r\n if (val > this.startTimestamp()) {\r\n this.endDate.set(dateStr);\r\n }\r\n }\r\n if (this.dataType == 'number'){\r\n const val = Number((event.target as HTMLInputElement).value);\r\n if (val > this.startVal()) {\r\n this.endVal.set(val);\r\n }\r\n }\r\n }\r\n\r\n \r\n\r\n\r\n\r\n}\r\n","<div class=\"filter-container\">\r\n <label class=\"filter-label\">{{ label() }}</label>\r\n\r\n <!-- Inputs de fecha superiores -->\r\n <div class=\"date-inputs-row\">\r\n <div class=\"input-wrapper\">\r\n @if (dataType === 'date') { \r\n <input \r\n type=\"date\" \r\n [value]=\"startDate()\"\r\n [min]=\"minDate\"\r\n [max]=\"endDate()\"\r\n (change)=\"onStartDateInput($any($event.target).value)\" \r\n />\r\n }\r\n @if (dataType === 'number') { \r\n <input \r\n type=\"number\" \r\n [value]=\"startVal()\"\r\n [min]=\"minNumber\"\r\n [max]=\"endVal()\"\r\n [step]=\"step()\"\r\n (input)=\"onStartInput($event)\" \r\n />\r\n } \r\n </div>\r\n\r\n <div class=\"input-wrapper\">\r\n @if (dataType === 'date') { \r\n <input \r\n type=\"date\" \r\n [value]=\"endDate()\"\r\n [min]=\"startDate()\"\r\n [max]=\"maxDate\"\r\n (change)=\"onEndDateInput($any($event.target).value)\" \r\n />\r\n }\r\n @if (dataType === 'number') { \r\n <input \r\n type=\"number\" \r\n [value]=\"endVal()\"\r\n [min]=\"startVal()\"\r\n [max]=\"maxNumber\"\r\n [step]=\"step()\"\r\n (input)=\"onEndInput($event)\" \r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Dual Slider personalizado -->\r\n <div class=\"slider-container\">\r\n <div class=\"slider-track\"></div>\r\n @if (dataType === 'date') { \r\n <!-- Slider Inicio -->\r\n <input \r\n type=\"range\" \r\n [min]=\"minTimestamp()\" \r\n [max]=\"maxTimestamp()\" \r\n [value]=\"startTimestamp()\"\r\n (input)=\"onStartSliderChange($event)\"\r\n class=\"thumb thumb-left\"\r\n />\r\n\r\n <!-- Slider Fin -->\r\n <input \r\n type=\"range\" \r\n [min]=\"minTimestamp()\" \r\n [max]=\"maxTimestamp()\" \r\n [value]=\"endTimestamp()\"\r\n (input)=\"onEndSliderChange($event)\"\r\n class=\"thumb thumb-right\"\r\n />\r\n }\r\n\r\n @if (dataType === 'number') { \r\n\r\n <input \r\n type=\"range\" \r\n [min]=\"minNumber\" \r\n [max]=\"maxNumber\" \r\n [step]=\"step()\"\r\n [value]=\"startVal()\"\r\n (input)=\"onStartSliderChange($event)\"\r\n class=\"thumb thumb-left\"\r\n />\r\n\r\n <!-- Slider Máximo -->\r\n <input \r\n type=\"range\" \r\n [min]=\"minNumber\" \r\n [max]=\"maxNumber\" \r\n [step]=\"step()\"\r\n [value]=\"endVal()\"\r\n (input)=\"onEndSliderChange($event)\"\r\n class=\"thumb thumb-right\"\r\n />\r\n\r\n }\r\n\r\n </div>\r\n</div>","import { Component,Input, OnInit,input, output, signal, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface FilterOption {\r\n id: string | number;\r\n label: string;\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'yw-button-slicer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './yw-button-slicer.component.html',\r\n styleUrl: './yw-button-slicer.component.scss',\r\n host: {\r\n '[attr.id]': 'idComponent' // Vincula el atributo id al valor de la propiedad\r\n }\r\n})\r\nexport class YwButtonSlicerComponent implements OnInit {\r\n\r\n// Configuración de entradas\r\n @Input() idComponent: string = '';\r\n public label = input<string>('Tipo de producto');\r\n public options = input<FilterOption[]>([]);\r\n public allowMultiple = input<boolean>(true); // Permite cambiar a selección única si es necesario\r\n\r\n // Evento de salida con la lista de IDs seleccionados\r\n public selectionChange = output<(string | number)[]>();\r\n\r\n // Signal con los IDs seleccionados\r\n public selectedIds = signal<Set<string | number>>(new Set());\r\n\r\n // Current IDs seleccionados\r\n public currentIds = input<string[] | number[]>([]);\r\n\r\n\r\n constructor() {\r\n // Emitir el listado en Array cada vez que la Signal de selección cambie\r\n effect(() => {\r\n this.selectionChange.emit(Array.from(this.selectedIds()));\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n if( this.currentIds() && this.currentIds().length >0 )\r\n { this.selectedIds().clear();\r\n this.currentIds().forEach((itemId:any)=>{\r\n this.selectedIds().add(itemId);\r\n });\r\n }\r\n\r\n }\r\n\r\n public clearSelection(): void {\r\n this.selectedIds().clear(); \r\n this.selectionChange.emit([]);\r\n }\r\n\r\n // Toggle para seleccionar / deseleccionar\r\n public toggleSelection(id: string | number): void {\r\n const current = new Set(this.selectedIds());\r\n\r\n if (this.allowMultiple()) {\r\n if (current.has(id)) {\r\n current.delete(id);\r\n } else {\r\n current.add(id);\r\n }\r\n } else {\r\n // Si es selección única\r\n current.clear();\r\n current.add(id);\r\n }\r\n\r\n this.selectedIds.set(current);\r\n }\r\n\r\n public isSelected(id: string | number): boolean {\r\n return this.selectedIds().has(id);\r\n }\r\n\r\n}\r\n","<div class=\"filter-container\">\r\n \r\n <div class=\"filter-header\">\r\n <span class=\"filter-label\">{{ label() }}</span>\r\n <div class=\"header-actions\"> \r\n <button class=\"icon-btn\" (click)=\"clearSelection()\" >🧹</button> \r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Contenedor con barra de desplazamiento interna -->\r\n <div class=\"grid-scroll-container\">\r\n <div class=\"buttons-grid\">\r\n @for (item of options(); track item.id) {\r\n <button \r\n type=\"button\" \r\n class=\"option-btn\" \r\n [class.selected]=\"isSelected(item.id)\"\r\n (click)=\"toggleSelection(item.id)\"\r\n [title]=\"item.label\">\r\n <span class=\"btn-text\">{{ item.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>","import { Component, OnInit, Input, input, output, signal, effect, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface TreeNode {\r\n id: string;\r\n label: string;\r\n children?: TreeNode[];\r\n expanded?: boolean;\r\n value?: any; // Para guardar fechas o datos asociados\r\n}\r\n\r\nexport type HierarchyDateType = \r\n | 'YEAR_TRIMESTER_MONTH' \r\n | 'YEAR_SEMESTER_MONTH' \r\n | 'SEMESTER_MONTH_WEEK';\r\n\r\n\r\nexport interface FilterValueOutput {\r\n type: 'DATE_RANGE' | 'TEXT_LEAVES';\r\n // Si es fecha:\r\n dateRange?: {\r\n minDate: string; // 'YYYY-MM-DD'\r\n maxDate: string; // 'YYYY-MM-DD'\r\n };\r\n // Si es texto:\r\n leafNodes?: TreeNode[]; // Lista de todos los nodos terminales\r\n leafIds?: (string | number)[]; // Lista de IDs de las hojas\r\n currentNodeId?:any;\r\n}\r\n\r\n@Component({\r\n selector: 'yw-list-slicer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './yw-list-slicer.component.html',\r\n styleUrl: './yw-list-slicer.component.scss',\r\n host: {\r\n '[attr.id]': 'idComponent' // Vincula el atributo id al valor de la propiedad\r\n }\r\n})\r\nexport class YwListSlicerComponent implements OnInit {\r\n\r\n// Entradas generales\r\n @Input() idComponent: string = '';\r\n public label = input<string>('Filtro Jerárquico');\r\n public clearTitleLabel = input<string>('Limpiar Seleccion');\r\n \r\n // Opción 1: Entregar datos en árbol de texto directo\r\n public rawData = input<TreeNode[]>([]);\r\n\r\n // Opción 2: Generar desde fechas\r\n public dataType = input<string>('date');\r\n public minDate = input<string>(''); // Formato 'YYYY-MM-DD'\r\n public maxDate = input<string>('');\r\n public dateHierarchyType = input<HierarchyDateType>('YEAR_TRIMESTER_MONTH');\r\n public monthNames = input<string[]>(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']);\r\n\r\n // Evento de salida con el ID/Nodo seleccionado\r\n public selectionChange = output<TreeNode|any|null>();\r\n public filterValueChange = output<FilterValueOutput | null>(); // Output 2 (Rangos o Hojas)\r\n\r\n // ID del elemento seleccionado (Selección Simple)\r\n public selectedId = signal<string | null>(null);\r\n\r\n public currentSelectedId = input<any| null>(null);\r\n \r\n\r\n // Arbol de nodos computado\r\n public treeNodes = computed<TreeNode[]>(() => {\r\n if (this.dataType() == 'date' && this.minDate() && this.maxDate()) {\r\n return this.generateDateHierarchy(this.minDate(), this.maxDate(), this.dateHierarchyType());\r\n }\r\n return this.rawData();\r\n });\r\n\r\n\r\n constructor() {\r\n effect(() => {\r\n const currentId = this.selectedId();\r\n if (!currentId) {\r\n this.selectionChange.emit(null);\r\n this.filterValueChange.emit(null);\r\n return;\r\n }\r\n\r\n const node = this.findNodeById(this.treeNodes(), currentId);\r\n this.selectionChange.emit(node);\r\n\r\n if (node) {\r\n // Emitir el segundo Output según el modo\r\n const calculatedValue = this.processFilterOutput(node);\r\n \r\n this.filterValueChange.emit(calculatedValue);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void { \r\n if (this.currentSelectedId())\r\n { this.selectedId.set(this.currentSelectedId()); }\r\n }\r\n\r\n\r\n // Métodos de Selección y Expansión\r\n public toggleExpand(node: TreeNode, event: Event): void {\r\n event.stopPropagation();\r\n node.expanded = !node.expanded;\r\n }\r\n\r\n public selectNode(node: TreeNode, event: Event): void {\r\n event.stopPropagation();\r\n this.selectedId.set(this.selectedId() === node.id ? null : node.id);\r\n }\r\n\r\n public clearSelection(): void { \r\n this.selectedId.set(null);\r\n this.filterValueChange.emit(null);\r\n }\r\n\r\n // --- LÓGICA DE PROCESAMIENTO DE LAS HOJAS / RANGOS ---\r\n private processFilterOutput(selectedNode: TreeNode): FilterValueOutput {\r\n // 1. Obtener todas las hojas (nodos del nivel más bajo) pertenecientes al bloque seleccionado\r\n const leaves = this.getLeafNodes(selectedNode);\r\n\r\n if (this.dataType() == 'date') {\r\n // Extraer todas las fechas de las hojas del bloque\r\n const dates = leaves\r\n .map(leaf => leaf.value as Date)\r\n .filter(d => d instanceof Date)\r\n .sort((a, b) => a.getTime() - b.getTime());\r\n\r\n if (dates.length > 0) {\r\n const minD = dates[0];\r\n // Para la fecha máxima, tomamos el último día del mes correspondiente\r\n const maxD = new Date(dates[dates.length - 1].getFullYear(), dates[dates.length - 1].getMonth() + 1, 0);\r\n\r\n return {\r\n type: 'DATE_RANGE',\r\n dateRange: {\r\n minDate: minD.toISOString().split('T')[0],\r\n maxDate: maxD.toISOString().split('T')[0]\r\n },\r\n currentNodeId: selectedNode.id\r\n };\r\n }\r\n }\r\n\r\n // Modo Texto: Entregar arreglo con las hojas\r\n return {\r\n type: 'TEXT_LEAVES',\r\n leafNodes: leaves,\r\n leafIds: leaves.map(l => l.id),\r\n currentNodeId: selectedNode.id\r\n };\r\n }\r\n\r\n // Recorrido recursivo para obtener solo los nodos terminales (sin hijos)\r\n private getLeafNodes(node: TreeNode): TreeNode[] {\r\n if (!node.children || node.children.length === 0) {\r\n return [node];\r\n }\r\n let leaves: TreeNode[] = [];\r\n for (const child of node.children) {\r\n leaves = leaves.concat(this.getLeafNodes(child));\r\n }\r\n return leaves;\r\n }\r\n\r\n private findNodeById(nodes: TreeNode[], id: string): TreeNode | null {\r\n for (const node of nodes) {\r\n if (node.id === id) return node;\r\n if (node.children) {\r\n const found = this.findNodeById(node.children, id);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Generador de Jerarquía por Fechas\r\n private generateDateHierarchy(startStr: string, endStr: string, type: HierarchyDateType): TreeNode[] {\r\n const start = new Date(startStr);\r\n const end = new Date(endStr);\r\n const tree: TreeNode[] = [];\r\n const monthNames = this.monthNames();\r\n\r\n if (type === 'YEAR_TRIMESTER_MONTH') {\r\n let current = new Date(start);\r\n while (current <= end) {\r\n const year = current.getFullYear();\r\n let yearNode = tree.find(n => n.id === `Y_${year}`);\r\n if (!yearNode) {\r\n yearNode = { id: `Y_${year}`, label: `${year}`, children: [], expanded: false };\r\n tree.push(yearNode);\r\n }\r\n\r\n const month = current.getMonth();\r\n const qtrNum = Math.floor(month / 3) + 1;\r\n let qtrNode = yearNode.children!.find(n => n.id === `Q_${year}_${qtrNum}`);\r\n if (!qtrNode) {\r\n qtrNode = { id: `Q_${year}_${qtrNum}`, label: `Qtr ${qtrNum}`, children: [], expanded: false };\r\n yearNode.children!.push(qtrNode);\r\n }\r\n\r\n const monthId = `M_${year}_${month + 1}`;\r\n if (!qtrNode.children!.some(n => n.id === monthId)) {\r\n qtrNode.children!.push({\r\n id: monthId,\r\n label: monthNames[month],\r\n value: new Date(year, month, 1) // Fecha inicial del mes\r\n });\r\n }\r\n\r\n current.setMonth(current.getMonth() + 1);\r\n }\r\n }\r\n \r\n if (type === 'YEAR_SEMESTER_MONTH') {\r\n let current = new Date(start);\r\n while (current <= end) {\r\n const year = current.getFullYear();\r\n let yearNode = tree.find(n => n.id === `Y_${year}`);\r\n if (!yearNode) {\r\n yearNode = { id: `Y_${year}`, label: `${year}`, children: [], expanded: false };\r\n tree.push(yearNode);\r\n }\r\n\r\n const month = current.getMonth();\r\n const qtrNum = Math.floor(month / 6) + 1;\r\n let qtrNode = yearNode.children!.find(n => n.id === `S_${year}_${qtrNum}`);\r\n if (!qtrNode) {\r\n qtrNode = { id: `S_${year}_${qtrNum}`, label: `S ${qtrNum}`, children: [], expanded: false };\r\n yearNode.children!.push(qtrNode);\r\n }\r\n\r\n const monthId = `M_${year}_${month + 1}`;\r\n if (!qtrNode.children!.some(n => n.id === monthId)) {\r\n qtrNode.children!.push({\r\n id: monthId,\r\n label: monthNames[month],\r\n value: new Date(year, month, 1) // Fecha inicial del mes\r\n });\r\n }\r\n\r\n current.setMonth(current.getMonth() + 1);\r\n }\r\n }\r\n\r\n return tree;\r\n }\r\n}","<div class=\"filter-container\">\r\n <!-- Cabecera con título y acciones de filtro -->\r\n <div class=\"filter-header\">\r\n <span class=\"filter-label\">{{ label() }}</span>\r\n <div class=\"header-actions\">\r\n <!--<button class=\"icon-btn\" title=\"Filtro\">🔻</button>-->\r\n <button class=\"icon-btn\" (click)=\"clearSelection()\" title=\"{{clearTitleLabel}}\">🧹</button>\r\n <!--<button class=\"icon-btn\" title=\"Más opciones\">⋮</button>-->\r\n </div>\r\n </div>\r\n\r\n <!-- Vista en Árbol con scroll interno -->\r\n <div class=\"tree-scroll-container\">\r\n <ng-container *ngTemplateOutlet=\"nodeListTemplate; context: { $implicit: treeNodes(), level: 0 }\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Plantilla Recursiva para renderizar niveles del Árbol -->\r\n<ng-template #nodeListTemplate let-nodes let-level=\"level\">\r\n <div class=\"tree-level\">\r\n @for (node of nodes; track node.id) {\r\n <div class=\"tree-node-wrapper\">\r\n <!-- Fila de opción -->\r\n <div \r\n class=\"tree-node-row\" \r\n [class.selected]=\"selectedId() === node.id\"\r\n [style.padding-left.px]=\"level * 18 + 6\"\r\n (click)=\"selectNode(node, $event)\">\r\n \r\n <!-- Flecha expandir/colapsar (si tiene hijos) -->\r\n @if (node.children && node.children.length > 0) {\r\n <span class=\"chevron-icon\" (click)=\"toggleExpand(node, $event)\">\r\n {{ node.expanded ? '🞃' : '🞂' }}\r\n </span>\r\n } @else {\r\n <span class=\"chevron-spacer\"></span>\r\n }\r\n\r\n <!-- Radio Button (Selección simple) -->\r\n <div class=\"radio-circle\" [class.checked]=\"selectedId() === node.id\">\r\n <div class=\"radio-inner\"></div>\r\n </div>\r\n\r\n <!-- Etiqueta del Nodo -->\r\n <span class=\"node-label\">{{ node.label }}</span>\r\n </div>\r\n\r\n <!-- Renderizado de hijos si está expandido -->\r\n @if (node.children && node.children.length > 0 && node.expanded) {\r\n <ng-container *ngTemplateOutlet=\"nodeListTemplate; context: { $implicit: node.children, level: level + 1 }\"></ng-container>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-template>","import { Component,Input, input ,effect ,output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common'; \r\n\r\n\r\n/*BEGIN - COMPONENTES VALIDOS PARA WIDGET*/\r\nimport { YwEmptyVisualComponent } from '../../../../dummy/yw-empty-visual/yw-empty-visual.component';\r\nimport { NumberRangeValue, DateRangeValue, YwBaseSlicerComponent } from '../../../../basic/filters/yw-base-slicer/yw-base-slicer.component';\r\nimport { YwButtonSlicerComponent } from '../../../../basic/filters/yw-button-slicer/yw-button-slicer.component';\r\nimport { YwListSlicerComponent, FilterValueOutput } from '../../../../basic/filters/yw-list-slicer/yw-list-slicer.component';\r\nimport { YwBaseSlicerFilterConfig, YwButtonSlicerFilterConfig, YwListSlicerFilterConfig, YwWidgetFilterConfigInterface } from '../../../../../models/config/dashboard/yw-dashboard-filter-config.interface';\r\n\r\n/*END - COMPONENTES VALIDOS PARA WIDGET*/\r\n\r\nexport interface TreeNode {\r\n id: string;\r\n label: string;\r\n parentId?: string;\r\n children?: TreeNode[];\r\n expanded?: boolean;\r\n value?: any; // Para guardar fechas o datos asociados\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'yw-dashboard-filter-widget',\r\n standalone:true,\r\n imports: [CommonModule,\r\n YwEmptyVisualComponent,\r\n YwBaseSlicerComponent,\r\n YwButtonSlicerComponent,\r\n YwListSlicerComponent,\r\n ],\r\n templateUrl: './yw-dashboard-filter-widget.component.html',\r\n styleUrl: './yw-dashboard-filter-widget.component.scss',\r\n})\r\nexport class YwDashboardFilterWidgetComponent {\r\n\r\n public componentWidgetId: string = '';\r\n public typeComponent: string = '';\r\n public varShowConfigButtons:boolean=false;\r\n\r\n @Input() configWidget:YwWidgetFilterConfigInterface = {\r\n widgetId: '',\r\n label: '',\r\n typeComponent: '', \r\n controlTable: '',\r\n };\r\n public controlConfig = input<undefined|YwBaseSlicerFilterConfig|YwButtonSlicerFilterConfig|YwListSlicerFilterConfig>();\r\n @Input() controlData:any[]= [];\r\n\r\n public dataWidget:any;\r\n public eventDeleteRequest = output<string>();\r\n public eventShowConfigFormRequest = output<string>();\r\n\r\n public selectionChange = output<{ widgetId: string, eventResponse:any}>();\r\n\r\n constructor() {\r\n\r\n effect(() => {\r\n\r\n const value_controlConfig = this.fnFormatConfigData();\r\n this.dataWidget = { idComponent : this.componentWidgetId ,\r\n configWidget : this.configWidget ,\r\n controlConfig: value_controlConfig\r\n }; \r\n });\r\n\r\n }\r\n\r\n\r\n ngOnInit(): void {\r\n\r\n this.componentWidgetId=this.configWidget.widgetId;\r\n this.typeComponent = this.configWidget.typeComponent;\r\n \r\n const value_controlConfig = this.fnFormatConfigData();\r\n \r\n this.dataWidget = { idComponent : this.componentWidgetId ,\r\n configWidget : this.configWidget ,\r\n controlConfig: value_controlConfig\r\n }; \r\n \r\n }\r\n\r\n\r\n\r\n\r\n\r\n /*\r\n Los Datos a este componente llegan a un nivel basico, sin embargo es necesario configurar la informacion, para que se adapte a los componentes. \r\n */\r\n public fnFormatConfigData(){\r\n\r\n let responsedata:any = {};\r\n\r\n const typeComponent = this.configWidget.typeComponent; \r\n \r\n if( typeComponent == 'filter-slicer' )\r\n { \r\n const dataType = (this.controlConfig() as YwBaseSlicerFilterConfig).dataType; \r\n const currentData = (this.controlConfig() as YwBaseSlicerFilterConfig); \r\n if( dataType == 'date' )\r\n { \r\n const fieldName = (this.controlConfig() as YwBaseSlicerFilterConfig).filterField!;\r\n const fechas = this.controlData.map((d:any) => new Date(d[fieldName]).getTime()); \r\n const val_min = new Date(Math.min(...fechas)).toISOString().split(\"T\")[0];\r\n const val_max = new Date(Math.max(...fechas)).toISOString().split(\"T\")[0];\r\n responsedata = { dataType:dataType, min:val_min,max: val_max , minCurrent: currentData?.minCurrent, maxCurrent: currentData?.maxCurrent } as YwBaseSlicerFilterConfig ;\r\n }\r\n\r\n if( dataType == 'number' )\r\n {\r\n const fieldName = (this.controlConfig() as YwBaseSlicerFilterConfig).filterField!;\r\n const valStep = (this.controlConfig() as YwBaseSlicerFilterConfig).step!;\r\n const DataNumbers = this.controlData.map((d:any) => d[fieldName]);\r\n const val_min = Math.min(...DataNumbers); \r\n const val_max = Math.max(...DataNumbers); \r\n responsedata = {dataType:dataType, min:val_min,max: val_max, step: valStep , minCurrent: currentData?.minCurrent, maxCurrent: currentData?.maxCurrent } as YwBaseSlicerFilterConfig ;\r\n }\r\n }\r\n\r\n if( typeComponent == 'filter-button' )\r\n {\r\n const fieldName = (this.controlConfig() as YwButtonSlicerFilterConfig).filterField!;\r\n const fieldNameId = (this.controlConfig() as YwButtonSlicerFilterConfig ).filterFieldId!;\r\n const val_allowMultiple = (this.controlConfig() as YwButtonSlicerFilterConfig ).allowMultiple!; \r\n const currentData = (this.controlConfig() as YwButtonSlicerFilterConfig); \r\n \r\n let listoptions = this.controlData.map((item:any) =>{ return { 'id':item[fieldNameId], 'label': item[fieldName]}});\r\n const listoptionsunicos = [...new Map(listoptions.map(d => [d.id, d])).values()];\r\n responsedata = { options:listoptionsunicos , allowMultiple:val_allowMultiple , currentIds:currentData?.currentIds } as YwButtonSlicerFilterConfig;\r\n }\r\n\r\n\r\n if( typeComponent == 'filter-list' )\r\n {\r\n const dataType = (this.controlConfig() as YwListSlicerFilterConfig).dataType; \r\n const currentData = (this.controlConfig() as YwListSlicerFilterConfig); \r\n if( dataType == 'date' )\r\n {\r\n const fieldName = (this.controlConfig() as YwListSlicerFilterConfig).filterField!;\r\n const val_dateHierarchyType = (this.controlConfig() as YwListSlicerFilterConfig).dateHierarchyType!;\r\n const fechas = this.controlData.map((d:any) => new Date(d[fieldName]).getTime()); \r\n const val_min = new Date(Math.min(...fechas)).toISOString().split(\"T\")[0];\r\n const val_max = new Date(Math.max(...fechas)).toISOString().split(\"T\")[0];\r\n responsedata = { dataType:dataType, minDate:val_min,maxDate: val_max, dateHierarchyType: val_dateHierarchyType , currentSelectedId:currentData.currentSelectedId } as YwListSlicerFilterConfig ;\r\n }\r\n\r\n if( dataType == 'text' )\r\n {\r\n const fieldName1 = (this.controlConfig() as YwListSlicerFilterConfig).filterField!;\r\n const fieldName2 = (this.controlConfig() as YwListSlicerFilterConfig).filterFieldN2;\r\n const fieldName3 = (this.controlConfig() as YwListSlicerFilterConfig).filterFieldN3;\r\n \r\n let foundN2 :boolean = false;\r\n let foundN3 :boolean = false;\r\n let lsizeN2 :number = 0;\r\n let lsizeN3 :number = 0;\r\n let nodebase:TreeNode = {id: '',label: ''};\r\n let nodeN2:TreeNode = {id: '',label: ''};\r\n let nodeN3:TreeNode = {id: '',label: ''};\r\n\r\n let listNivel1:any[] = [];\r\n let listNivel2:any[] = [];\r\n let listNivel3:any[] = [];\r\n \r\n this.controlData.forEach((item:any)=>{\r\n nodebase = { id:item[fieldName1] , label:item[fieldName1] };\r\n //NIVEL 2\r\n if( fieldName2 )\r\n { \r\n foundN2 = false;\r\n lsizeN2 = Object.keys(listNivel2).length;\r\n for(let i=0; i< lsizeN2;i++){\r\n const itemN2:any = listNivel2[i];\r\n if( itemN2.id == item[fieldName2] ){ \r\n itemN2.children.push(nodebase);\r\n nodeN2 = itemN2;\r\n foundN2 = true; break;\r\n }\r\n };\r\n\r\n if( foundN2 == false )\r\n { nodeN2 = { id:item[fieldName2] , label:item[fieldName2], expanded: true, children: [nodebase]};\r\n if( fieldName3 ){ nodeN2.parentId = item[fieldName3]; }\r\n listNivel2.push(nodeN2);\r\n } \r\n }\r\n else\r\n { listNivel1.push(nodebase); }\r\n });\r\n\r\n //NIVEL 1 - Basico no hay Jerarquia \r\n responsedata = { dataType:dataType, rawData:listNivel1 , currentSelectedId:currentData.currentSelectedId } as YwListSlicerFilterConfig;\r\n\r\n //NIVEL 2 - Jerarquia de 2 niveles\r\n if( fieldName2 )\r\n { responsedata = { dataType:dataType, rawData:listNivel2 , currentSelectedId:currentData.currentSelectedId} as YwListSlicerFilterConfig; }\r\n \r\n\r\n //NIVEL 3 - Jerarquia de 3 niveles\r\n if( fieldName3 ){\r\n\r\n listNivel2.forEach((item:any)=>{\r\n nodebase = item;\r\n\r\n foundN3 = false; \r\n lsizeN3 = Object.keys(listNivel3).length;\r\n for(let i=0; i<lsizeN3;i++){\r\n const itemN3:any = listNivel3[i];\r\n if( itemN3.id == item.parentId ){ \r\n itemN3.children.push(nodebase); \r\n foundN3 = true; break;\r\n }\r\n };\r\n\r\n if( foundN3 == false )\r\n { nodeN3 = { id:item[fieldName3] , label:item[fieldName3], expanded: true, children: [nodebase]};\r\n listNivel3.push(nodeN3);\r\n }\r\n\r\n });\r\n \r\n responsedata = { dataType:dataType, rawData:listNivel3 , currentSelectedId:currentData.currentSelectedId } as YwListSlicerFilterConfig;\r\n }\r\n\r\n }\r\n }\r\n\r\n return responsedata;\r\n\r\n }\r\n\r\n \r\n\r\n\r\n //Filtro Slicer\r\n public onFilterSlicerChange(range: any) {\r\n console.log('Filtro actualizado:', range ); \r\n this.selectionChange.emit({widgetId:this.componentWidgetId,eventResponse:range});\r\n }\r\n\r\n //Filtro Button\r\n public onFilterButtonChange(selectedIds: (string | number)[]) {\r\n console.log('Tipos seleccionados:', selectedIds);\r\n this.selectionChange.emit({widgetId:this.componentWidgetId,eventResponse:selectedIds});\r\n }\r\n\r\n//Filtro Lista - 1\r\npublic onFilterListChange(selectedData:any) {\r\n console.log('Tipos seleccionados:', selectedData);\r\n // Filtrar la información del dashboard\r\n //this.selectionChange.emit({widgetId:this.componentWidgetId,eventResponse:selectedData});\r\n}\r\n\r\n //Filtro Lista - 2\r\n public onFilterListCalculated(data: FilterValueOutput | null) {\r\n if (!data){\r\n this.selectionChange.emit({widgetId:this.componentWidgetId,eventResponse:null});\r\n return;\r\n } \r\n\r\n if (data.type === 'DATE_RANGE') {\r\n //console.log('Rango a filtrar en SQL/Dashboard:', data.dateRange?.minDate, 'hasta', data.dateRange?.maxDate);\r\n this.selectionChange.emit({widgetId:this.componentWidgetId,eventResponse:{minDate:data.dateRange?.minDate, maxDate: data.dateRange?.maxDate , currentNodeId:data.currentNodeId }});\r\n } else if (data.type === 'TEXT_LEAVES') {\r\n //console.log('Lista de elementos terminales seleccionados:', data.leafIds);\r\n this.selectionChange.emit({widgetId:this.componentWidgetId,eventResponse:{ ids:data.leafIds, currentNodeId:data.currentNodeId }});\r\n }\r\n \r\n}\r\n\r\n\r\n\r\n public onDeleteClick(): void {\r\n \r\n }\r\n public onShowFormConfigClick(): void {\r\n \r\n } \r\n\r\n\r\n}\r\n","\r\n<div class=\"widget-filter-action-bar\"> \r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-delete\" (click)=\"onDeleteClick()\">🗑️</button>\r\n <button [hidden]=\"!varShowConfigButtons\" class=\"btn-config\" (click)=\"onShowFormConfigClick()\">⚙️</button>\r\n</div>\r\n<div class=\"widget-filter-content-wrapper\">\r\n @if ( typeComponent == 'empty-visual' ) { \r\n <ng-container *ngTemplateOutlet=\"emptyvisual; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'filter-slicer' ) { \r\n <ng-container *ngTemplateOutlet=\"filterslicer; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'filter-button' ) { \r\n <ng-container *ngTemplateOutlet=\"filterbutton; context: { control: dataWidget }\"></ng-container>\r\n }\r\n @if ( typeComponent == 'filter-list' ) { \r\n <ng-container *ngTemplateOutlet=\"filterlist; context: { control: dataWidget }\"></ng-container>\r\n } \r\n \r\n</div>\r\n\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- EMPTY VISUAL TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #emptyvisual let-control = \"control\">\r\n <yw-empty-visual [idComponent]=\"control.idComponent\"\r\n [config]=\"control.controlConfig\" \r\n > \r\n </yw-empty-visual>\r\n</ng-template>\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- FILTER SLICER TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #filterslicer let-control = \"control\"> \r\n @if (control.controlConfig.dataType === 'date') { \r\n <yw-base-slicer [idComponent]=\"control.idComponent\"\r\n [dataType]=\"control.controlConfig.dataType\"\r\n [label]=\"control.configWidget.label\"\r\n [min]=\"control.controlConfig.min\"\r\n [max]=\"control.controlConfig.max\" \r\n [minCurrent]=\"control.controlConfig.minCurrent\"\r\n [maxCurrent]=\"control.controlConfig.maxCurrent\" \r\n (rangeChange)=\"onFilterSlicerChange($event)\"\r\n >\r\n </yw-base-slicer>\r\n }\r\n @if (control.controlConfig.dataType === 'number') { \r\n <yw-base-slicer [idComponent]=\"control.idComponent\"\r\n [dataType]=\"control.controlConfig.dataType\"\r\n [label]=\"control.configWidget.label\"\r\n [min]=\"control.controlConfig.min\"\r\n [max]=\"control.controlConfig.max\"\r\n [minCurrent]=\"control.controlConfig.minCurrent\"\r\n [maxCurrent]=\"control.controlConfig.maxCurrent\"\r\n [step]=\"control.controlConfig.step\"\r\n (rangeChange)=\"onFilterSlicerChange($event)\"\r\n >\r\n </yw-base-slicer>\r\n }\r\n</ng-template>\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- FILTER BUTTON TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #filterbutton let-control = \"control\"> \r\n <yw-button-slicer [idComponent]=\"control.idComponent\" \r\n [label]=\"control.configWidget.label\"\r\n [options]=\"control.controlConfig.options\"\r\n [allowMultiple]=\"control.controlConfig.allowMultiple\"\r\n [currentIds]=\"control.controlConfig.currentIds\"\r\n (selectionChange)=\"onFilterButtonChange($event)\" \r\n >\r\n </yw-button-slicer>\r\n</ng-template>\r\n\r\n\r\n<!--------------------------------------------------------------->\r\n<!---------------------- FILTER LIST TEMPLATE ---------------------->\r\n<!--------------------------------------------------------------->\r\n<ng-template #filterlist let-control = \"control\"> \r\n \r\n @if (control.controlConfig.dataType === 'date') { \r\n <yw-list-slicer [idComponent]=\"control.idComponent\" \r\n [label]=\"control.configWidget.label\"\r\n [dataType]=\"control.controlConfig.dataType\"\r\n [minDate]=\"control.controlConfig.minDate\"\r\n [maxDate]=\"control.controlConfig.maxDate\"\r\n [dateHierarchyType]=\"control.controlConfig.dateHierarchyType\"\r\n [currentSelectedId]=\"control.controlConfig.currentSelectedId\"\r\n (selectionChange)=\"onFilterListChange($event)\"\r\n (filterValueChange)=\"onFilterListCalculated($event)\" \r\n >\r\n </yw-list-slicer>\r\n }\r\n\r\n\r\n @if (control.controlConfig.dataType === 'text') { \r\n <yw-list-slicer [idComponent]=\"control.idComponent\"\r\n [label]=\"control.configWidget.label\"\r\n [dataType]=\"control.controlConfig.dataType\"\r\n [rawData]=\"control.controlConfig.rawData\"\r\n [currentSelectedId]=\"control.controlConfig.currentSelectedId\"\r\n (selectionChange)=\"onFilterListChange($event)\"\r\n (filterValueChange)=\"onFilterListCalculated($event)\" \r\n >\r\n </yw-list-slicer>\r\n }\r\n\r\n\r\n</ng-template>","import { Component,OnInit,Input, input ,effect ,output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common'; \r\nimport { YwDashboardDataInterface } from '../../../../../models/config/dashboard/yw-dashboard-config.interface';\r\nimport { YwDashboardWidgetFilterConfigInterface, YwDashboardFilterConfigInterface, YwWidgetFilterConfigInterface, YwBaseSlicerFilterConfig, YwButtonSlicerFilterConfig, YwListSlicerFilterConfig } from '../../../../../models/config/dashboard/yw-dashboard-filter-config.interface';\r\nimport { YwDashboardFilterWidgetComponent } from '../yw-dashboard-filter-widget/yw-dashboard-filter-widget.component';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\n\r\n\r\n@Component({\r\n selector: 'yw-dashboard-filter',\r\n standalone:true,\r\n imports: [CommonModule, \r\n YwDashboardFilterWidgetComponent,\r\n NzIconModule,\r\n NzButtonModule,\r\n ],\r\n templateUrl: './yw-dashboard-filter.component.html',\r\n styleUrl: './yw-dashboard-filter.component.scss',\r\n})\r\nexport class YwDashboardFilterComponent implements OnInit {\r\n\r\n\r\n @Input() dashboardFilterConfig:YwDashboardFilterConfigInterface={\r\n showConfigButtons:false,\r\n lockPositionWidgets:false,\r\n controlListConfig: []\r\n };\r\n\r\n @Input() dashboardData:YwDashboardDataInterface[]= [];\r\n \r\n public filterSelectionChange = output<{ widgetId: string, eventResponse:any}>();\r\n\r\n public controlListConfig:any[] = [];\r\n\r\n constructor(){ \r\n }\r\n\r\n\r\n ngOnInit(): void {\r\n\r\n this.controlListConfig = [];\r\n this.dashboardFilterConfig.controlListConfig.forEach((item:YwDashboardWidgetFilterConfigInterface)=>{\r\n\r\n const tableName:string = item.controlTable!;\r\n const prmcontrolData = this.fn_getDataForWidgetFilterComponent(tableName,this.dashboardData);\r\n\r\n const prmconfigWidget:any = {... item} as YwWidgetFilterConfigInterface; \r\n \r\n if(item.controlFilterData)\r\n { item.configComponent = this.fnSetControlFilterCurrentValues(prmconfigWidget); }\r\n \r\n const configControl:any ={ configWidget: prmconfigWidget,\r\n controlData: prmcontrolData,\r\n controlConfig: item.configComponent\r\n };\r\n\r\n this.controlListConfig.push(configControl);\r\n \r\n });\r\n \r\n }\r\n\r\n\r\n //Filtrar Datos por Componente del Widget\r\n public fn_getDataForWidgetFilterComponent(prmTableName:string, prmdashboardData:YwDashboardDataInterface[]){\r\n let dataresponse:any[] = [];\r\n const ldsize:number = prmdashboardData.length;\r\n \r\n prmdashboardData.forEach((curTableRef:YwDashboardDataInterface) => {\r\n if( prmTableName.localeCompare(curTableRef.tableName) == 0)\r\n { \r\n dataresponse = curTableRef.tableData;\r\n } \r\n });\r\n \r\n return dataresponse;\r\n }\r\n\r\n\r\n public onFilterChange(eventData:any)\r\n {\r\n this.filterSelectionChange.emit({widgetId:eventData.widgetId,eventResponse:eventData.eventResponse});\r\n }\r\n\r\n\r\n public fnSetControlFilterCurrentValues(prmControlConfig : YwDashboardWidgetFilterConfigInterface) :any{\r\n\r\n if (prmControlConfig.typeComponent == 'filter-slicer' )\r\n { let curConfigComponent:YwBaseSlicerFilterConfig = prmControlConfig.configComponent as YwBaseSlicerFilterConfig;\r\n if( prmControlConfig.configComponent.dataType == 'date' )\r\n { \r\n curConfigComponent.minCurrent = prmControlConfig.controlFilterData['startDate'];\r\n curConfigComponent.maxCurrent = prmControlConfig.controlFilterData['endDate'];\r\n }\r\n if( prmControlConfig.configComponent.dataType == 'number' )\r\n {\r\n curConfigComponent.minCurrent = prmControlConfig.controlFilterData['minValue'];\r\n curConfigComponent.maxCurrent = prmControlConfig.controlFilterData['maxValue'];\r\n }\r\n return curConfigComponent;\r\n }\r\n\r\n\r\n if (prmControlConfig.typeComponent == 'filter-button' )\r\n { let curConfigComponent:YwButtonSlicerFilterConfig = prmControlConfig.configComponent as YwButtonSlicerFilterConfig;\r\n curConfigComponent.currentIds = prmControlConfig.controlFilterData as any[] || [];\r\n return curConfigComponent;\r\n }\r\n\r\n\r\n if (prmControlConfig.typeComponent == 'filter-list' )\r\n { let curConfigComponent:YwListSlicerFilterConfig = prmControlConfig.configComponent as YwListSlicerFilterConfig;\r\n curConfigComponent.currentSelectedId = prmControlConfig.controlFilterData['currentNodeId']; \r\n return curConfigComponent;\r\n } \r\n\r\n }\r\n\r\n\r\n public handleClearFilter(){\r\n\r\n this.controlListConfig = [];\r\n this.dashboardFilterConfig.controlListConfig.forEach((item:YwDashboardWidgetFilterConfigInterface)=>{\r\n\r\n const tableName:string = item.controlTable!;\r\n const prmcontrolData = this.fn_getDataForWidgetFilterComponent(tableName,this.dashboardData);\r\n\r\n const prmconfigWidget:any = {... item} as YwWidgetFilterConfigInterface; \r\n \r\n if(item.controlFilterData)\r\n { item.configComponent = this.fnSetControlFilterClearValues(prmconfigWidget); }\r\n\r\n const configControl:any ={ configWidget: prmconfigWidget,\r\n controlData: prmcontrolData,\r\n controlConfig: item.configComponent\r\n };\r\n\r\n this.controlListConfig.push(configControl);\r\n \r\n });\r\n \r\n\r\n\r\n }\r\n\r\n\r\n\r\n public fnSetControlFilterClearValues(prmControlConfig : YwDashboardWidgetFilterConfigInterface) :any{\r\n\r\n if (prmControlConfig.typeComponent == 'filter-slicer' )\r\n { let curConfigComponent:YwBaseSlicerFilterConfig = prmControlConfig.configComponent as YwBaseSlicerFilterConfig;\r\n curConfigComponent.minCurrent = null;\r\n curConfigComponent.maxCurrent = null; \r\n return curConfigComponent;\r\n }\r\n\r\n if (prmControlConfig.typeComponent == 'filter-button' )\r\n { let curConfigComponent:YwButtonSlicerFilterConfig = prmControlConfig.configComponent as YwButtonSlicerFilterConfig;\r\n curConfigComponent.currentIds = [];\r\n return curConfigComponent;\r\n }\r\n\r\n if (prmControlConfig.typeComponent == 'filter-list' )\r\n { let curConfigComponent:YwListSlicerFilterConfig = prmControlConfig.configComponent as YwListSlicerFilterConfig;\r\n curConfigComponent.currentSelectedId = null; \r\n return curConfigComponent;\r\n } \r\n\r\n }\r\n\r\n\r\n\r\n \r\n\r\n}\r\n","\r\n <div class=\"dashboard-filter-content-bar\">\r\n @if ( dashboardFilterConfig.showConfigButtons ) { \r\n <button nz-button nzType=\"primary\" >\r\n <span nz-icon nz-type=\"plus\"></span> Añadir widget\r\n </button>\r\n }\r\n <button nz-button \r\n nzType=\"default\" \r\n nzShape=\"circle\" \r\n (click)=\"handleClearFilter()\" \r\n class=\"btn-clean\" \r\n > \r\n <!-- Icono de Borrador (Eraser) activo / relleno --> \r\n <svg \r\n xmlns=\"http://www.w3.org/2000/svg\" \r\n width=\"16\" height=\"16\" \r\n viewBox=\"0 0 24 24\" \r\n fill=\"currentColor\">\r\n <path d=\"M16.24 3.56a2.12 2.12 0 0 1 3 0l1.2 1.2a2.12 2.12 0 0 1 0 3l-8.5 8.5H6.5a1.5 1.5 0 0 1-1.5-1.5v-5.44l11.24-11.24zM19 19H5a1 1 0 0 1 0-2h14a1 1 0 0 1 0 2z\"/>\r\n </svg>\r\n \r\n </button>\r\n </div>\r\n\r\n <div class=\"dashboard-filter-content-wrapper\">\r\n @for ( colFilter of controlListConfig; track colFilter) { \r\n <div class=\"dashboard-filter-content-wrapper-item\">\r\n \r\n <yw-dashboard-filter-widget \r\n [configWidget]=\"colFilter.configWidget\"\r\n [controlConfig]=\"colFilter.controlConfig\"\r\n [controlData]=\"colFilter.controlData\"\r\n (selectionChange)=\"onFilterChange($event)\"\r\n > \r\n </yw-dashboard-filter-widget>\r\n\r\n </div>\r\n }\r\n </div>","import { Component,effect,SimpleChanges,Input, input,OnInit, ApplicationRef,EnvironmentInjector , AfterViewInit, ElementRef, ViewChild, ViewContainerRef,ComponentRef , createComponent ,signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common'; \r\nimport { GridStack, GridStackOptions, GridStackWidget } from 'gridstack';\r\nimport { YwDashboardConfigInterface, YwDashboardDataInterface, YwDashboardLayoutInterface ,YwDashboardStyleInterface} from '../../../../../models/config/dashboard/yw-dashboard-config.interface';\r\nimport { YwDashboardWidgetComponent } from '../yw-dashboard-widget/yw-dashboard-widget.component';\r\nimport { YwWidgetConfigInterface, YwWidgetLayoutInterface ,YwWidgetStyleInterface,DEFAULT_WIDGET_STYLE} from '../../../../../models/config/dashboard/yw-dashboard-widget-config.interface';\r\n\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\n\r\n/* BEGIN - FILTROS */\r\nimport { DateRangeValue ,NumberRangeValue, YwBaseSlicerComponent } from '../../../../basic/filters/yw-base-slicer/yw-base-slicer.component';\r\nimport { FilterOption , YwButtonSlicerComponent} from '../../../../basic/filters/yw-button-slicer/yw-button-slicer.component';\r\nimport { TreeNode, FilterValueOutput,YwListSlicerComponent} from '../../../../basic/filters/yw-list-slicer/yw-list-slicer.component';\r\nimport { YwDashboardFilterComponent } from '../yw-dashboard-filter/yw-dashboard-filter.component';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { YwDashboardFilterConfigInterface, YwDashboardWidgetFilterConfigInterface } from '../../../../../models/config/dashboard/yw-dashboard-filter-config.interface';\r\n\r\n/* END - FILTROS */\r\n\r\n\r\n\r\n@Component({\r\n selector: 'yw-dashboard',\r\n standalone:true,\r\n imports: [CommonModule,\r\n YwDashboardWidgetComponent,\r\n NzDrawerModule,\r\n NzTabsModule,\r\n YwBaseSlicerComponent,\r\n NzIconModule,\r\n NzButtonModule,\r\n YwButtonSlicerComponent,\r\n YwListSlicerComponent,\r\n YwDashboardFilterComponent\r\n\r\n ],\r\n templateUrl: './yw-dashboard.component.html',\r\n styleUrl: './yw-dashboard.component.scss'\r\n})\r\nexport class YwDashboardComponent implements OnInit, AfterViewInit {\r\n\r\n @ViewChild('gridContainer', { static: true }) gridContainer!: ElementRef;\r\n private grid!: GridStack;\r\n private widgetsActivos = new Map<string, ComponentRef<any>>();\r\n public showControls = input<boolean>(false);\r\n public showFilter = input<boolean>(false);\r\n public allIsLocked = signal<boolean>(false);\r\n\r\n drawerfiltervisible:boolean = false;\r\n drawerconfigvisible:boolean = false;\r\n drawerCurrentWidgetObject:any = {};\r\n\r\n isLocked = false;\r\n private countWidget = 1;\r\n public layoutConfig: YwDashboardLayoutInterface = {\r\n margin: 10,\r\n cellHeight: 100,\r\n columns: 24\r\n };\r\n\r\n /* ejemplo de Items \r\n items: [\r\n { id: 'div-1', x: 0, y: 0, w: 14, h: 2, content: 'DIV 1' , contentData : {}},\r\n { id: 'div-2', x: 5, y: 2, w: 19, h: 1, content: 'DIV 2' , contentData : {}},\r\n { id: 'div-3', x: 0, y: 3, w: 22, h: 1, content: 'DIV 3', contentData : {} }\r\n ] \r\n */\r\n\r\n\r\n @Input() dashboardStyle:YwDashboardStyleInterface={\r\n canvasBackgroundColor: \"#f5f5f5\",\r\n widgetBackgroundColor: \"#ffffff\",\r\n widgetBorderColor: \"#007bff\"\r\n };\r\n\r\n \r\n @Input() dashboardConfig:YwDashboardConfigInterface={\r\n showConfigButtons:false,\r\n lockPositionWidgets:false,\r\n layoutConfig: {\r\n margin: 0,\r\n cellHeight: 0,\r\n columns: 0\r\n },\r\n controlListConfig: []\r\n };\r\n @Input() dashboardData:YwDashboardDataInterface[]= [];\r\n\r\n dashboardItems:YwWidgetLayoutInterface[] =[]\r\n\r\n\r\n /* REF FILTROS */\r\n @Input() dashboardFilterConfig:YwDashboardFilterConfigInterface={\r\n showConfigButtons:false,\r\n lockPositionWidgets:false,\r\n controlListConfig: []\r\n };\r\n\r\n \r\n /* */\r\n\r\n\r\n\r\n constructor(\r\n private environmentInjector: EnvironmentInjector,\r\n private appRef: ApplicationRef\r\n ) {\r\n \r\n\r\n //Configurar Bloqueo de Widgets\r\n /*\r\n effect(() => {\r\n const isLocked = this.allIsLocked();\r\n console.log('El estado de bloqueo cambió a:', isLocked); \r\n this.fn_lockPositionWidgets(isLocked);\r\n });\r\n */\r\n\r\n }\r\n\r\n\r\n\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n \r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['dashboardConfig']) {\r\n console.log('Nuevo valor dashboardConfig:', this.dashboardConfig);\r\n //this.initCanvasGrid();\r\n }\r\n\r\n if (changes['dashboardData']) {\r\n console.log('Nuevo valor dashboardData:', this.dashboardData);\r\n //this.initCanvasGrid();\r\n }\r\n \r\n }\r\n\r\n\r\n\r\n ngAfterViewInit(): void {\r\n this.initCanvasGrid();\r\n }\r\n\r\n \r\n\r\n private initCanvasGrid(): void {\r\n \r\n this.layoutConfig = this.dashboardConfig.layoutConfig;\r\n\r\n // Opciones para restringir colisiones y comportamiento\r\n let options: GridStackOptions = {\r\n column: this.layoutConfig.columns,\r\n cellHeight: this.layoutConfig.cellHeight,\r\n margin: this.layoutConfig.margin,\r\n float: true, // Evita que los divs floten automáticamente hacia arriba\r\n //noOverlap: true, // CLAVE: Bloquea el movimiento si colisiona con otro DIV\r\n resizable: { handles: 'e, se, s, sw, w, nw, n, ne', autoHide: true } // Permite redimensionar desde todos los bordes\r\n };\r\n\r\n if (this.layoutConfig.columnOpts)\r\n {\r\n options = {\r\n column: this.layoutConfig.columns,\r\n cellHeight: this.layoutConfig.cellHeight,\r\n margin: this.layoutConfig.margin,\r\n columnOpts: {\r\n breakpointForWindow: this.layoutConfig.columnOpts.breakpointForWindow, // Mide el ancho de la ventana gráfica\r\n breakpoints:this.layoutConfig.columnOpts.breakpoints,\r\n layout: this.layoutConfig.columnOpts.layout||'list', // Mantiene el orden de los widgets secuencialmente al colapsar\r\n },\r\n float: true, // Evita que los divs floten automáticamente hacia arriba\r\n //noOverlap: true, // CLAVE: Bloquea el movimiento si colisiona con otro DIV\r\n resizable: { handles: 'e, se, s, sw, w, nw, n, ne', autoHide: true } // Permite redimensionar desde todos los bordes\r\n };\r\n }\r\n\r\n /*EXAMPLE OF \"columnOpts\"\r\n columnOpts: {\r\n breakpointForWindow: true,\r\n breakpoints: [\r\n { w: 768, c: 1 },\r\n { w: 992, c: 6 },\r\n { w: 1200, c: this.layoutConfig.columns } // 👈 Usa tu variable para consistencia en Desktop\r\n ],\r\n layout: 'list'\r\n }\r\n */\r\n\r\n\r\n\r\n\r\n // Inicializar el canvas\r\n this.grid = GridStack.init(options, this.gridContainer.nativeElement)!;\r\n\r\n // Cargar los elementos iniciales desde el JSON\r\n //this.loadLayoutFromJSON(this.dashboardItems);\r\n this.loadLayoutFromJSON(this.dashboardConfig,this.dashboardStyle);\r\n\r\n //Evaluar Bloqueo de Widgets en Inicializacion\r\n if (this.dashboardConfig.lockPositionWidgets)\r\n {this.fn_lockPositionWidgets(this.dashboardConfig.lockPositionWidgets);}\r\n\r\n // Listener para detectar cambios y actualizar el JSON\r\n this.grid.on('change', (event, items) => {\r\n this.saveLayoutToJSON();\r\n });\r\n\r\n //Listener para detectar cuando cambia las dimenciones de un widget\r\n this.grid.on('resizestop', (event: any, el: HTMLElement) => {\r\n // Disparamos el evento nativo del navegador de forma controlada\r\n window.dispatchEvent(new Event('resize'));\r\n });\r\n\r\n }\r\n\r\n //Filtrar Datos por Componente del Widget\r\n public fn_getDataForWidgetComponent(listTables:string[], prmDashboardData:YwDashboardDataInterface[]){\r\n let dataresponse = new Map<string, any>();\r\n const ldsize:number = prmDashboardData.length;\r\n const ltsize:number = listTables.length;\r\n\r\n if ( ltsize > 0 ){\r\n listTables.forEach((curTableName:string) => {\r\n prmDashboardData.forEach((curTableRef:YwDashboardDataInterface) => {\r\n if( curTableName.localeCompare(curTableRef.tableName) == 0)\r\n { \r\n dataresponse.set(curTableRef.tableName, curTableRef.tableData);\r\n } \r\n }); \r\n }); \r\n }\r\n else{\r\n prmDashboardData.forEach((curTableRef:YwDashboardDataInterface) => { \r\n dataresponse.set(curTableRef.tableName, curTableRef.tableData); \r\n }); \r\n }\r\n\r\n const object_base_response:any = Object.fromEntries(dataresponse); \r\n\r\n return object_base_response;\r\n }\r\n\r\n public fn_getDataForWidgetComponent_back(listTables:string[]){\r\n let dataresponse:any[] = []; \r\n const ldsize:number = this.dashboardData.length;\r\n const ltsize:number = listTables.length;\r\n\r\n if ( ltsize > 0 ){\r\n listTables.forEach((curTableName:string) => {\r\n this.dashboardData.forEach((curTableData:YwDashboardDataInterface) => {\r\n if( curTableName.localeCompare(curTableData.tableName) == 0)\r\n { dataresponse.push(curTableData); } \r\n }); \r\n }); \r\n }\r\n else{ return this.dashboardData; }\r\n\r\n return dataresponse;\r\n }\r\n\r\n\r\n\r\n\r\n // Carga elementos desde la configuración JSON\r\n //public loadLayoutFromJSON(dashboardItems: YwWidgetLayoutInterface[], ): void {\r\n public loadLayoutFromJSON(prmDashboardConfig: YwDashboardConfigInterface,prmDashboardStyle:YwDashboardStyleInterface ): void {\r\n \r\n this.grid.removeAll();\r\n const widgets: GridStackWidget[] = [];\r\n this.grid.load(widgets);\r\n\r\n const lsize:number = prmDashboardConfig.controlListConfig.length;\r\n\r\n if( lsize > 0){\r\n prmDashboardConfig.controlListConfig.forEach((widgetConfig: YwWidgetConfigInterface) => {\r\n //Agregar uno por uno, para poder cargar los parametros internos de los componentes.\r\n const controlData = this.fn_getDataForWidgetComponent(widgetConfig.controlTables,this.dashboardData);\r\n \r\n //Sobre Escribir el ID Correcto en Layaout\r\n widgetConfig.layoutConfig.id = widgetConfig.widgetId;\r\n //Evaluar Mostrar Eventos\r\n if( widgetConfig.showConfigButtons == null || widgetConfig.showConfigButtons == undefined )\r\n { widgetConfig.showConfigButtons = prmDashboardConfig.showConfigButtons; }\r\n //Evalua Asignacion de Estilos\r\n if( widgetConfig.widgetStyle == null || widgetConfig.widgetStyle == undefined )\r\n { widgetConfig['widgetStyle'] = {} \r\n widgetConfig['widgetStyle']['widgetBackgroundColor'] = prmDashboardStyle.widgetBackgroundColor; \r\n widgetConfig['widgetStyle']['widgetBorderColor'] = prmDashboardStyle.widgetBorderColor; \r\n }\r\n\r\n this.eventAddWidget(widgetConfig,widgetConfig.controlConfig,controlData,widgetConfig.layoutConfig); \r\n });\r\n\r\n }\r\n\r\n\r\n\r\n\r\n\r\n }\r\n\r\n\r\n // Guarda los elementos desde la configuración JSON\r\n public saveLayoutToJSON(): YwWidgetLayoutInterface[] {\r\n const currentWidgets = this.grid.save(false) as GridStackWidget[];\r\n \r\n this.dashboardItems = currentWidgets.map(w => ({\r\n id: w.id as string,\r\n x: w.x || 0,\r\n y: w.y || 0,\r\n w: w.w || 1,\r\n h: w.h || 1,\r\n content: w.content,\r\n contentData: {}\r\n }));\r\n\r\n console.log('JSON Guardado:', JSON.stringify(this.dashboardItems));\r\n return this.dashboardItems;\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n /*BUTTON ADD WIDGET*/\r\n public fn_btn_addWidget(){\r\n this.countWidget++;\r\n const newWidgetId:string = 'widget-'+this.countWidget;\r\n let newItem:GridStackWidget = {\r\n id: newWidgetId,autoPosition:true,w: 6,h: 3,\r\n content: ''\r\n };\r\n \r\n //Datos de Widget y sus Contenidos\r\n const widgetConfig:YwWidgetConfigInterface = {\r\n widgetId: newWidgetId, \r\n title: '',\r\n typeComponent: 'empty-visual' ,\r\n showConfigButtons:true,\r\n widgetStyle:DEFAULT_WIDGET_STYLE,\r\n layoutConfig:{\r\n id: '',\r\n w: 0,\r\n h: 0,\r\n content: undefined\r\n },\r\n controlConfig:{},\r\n controlTables:[] \r\n }\r\n const controlConfig:any = {};\r\n const controlData:any = {};\r\n\r\n this.eventAddWidget(widgetConfig,controlConfig,controlData,newItem);\r\n }\r\n\r\n\r\n\r\n /*BUTTON DELETE WIDGET*/\r\n public fn_btn_deleteWidget(){\r\n\r\n const newWidgetId:string = 'widget-'+this.countWidget; \r\n this.eventRemoveWidgetById(newWidgetId);\r\n this.countWidget--;\r\n\r\n\r\n }\r\n\r\n\r\n /*BUTTON BLOCK WIDGETS*/\r\n public fn_btn_lockPositionWidgets(): void {\r\n this.isLocked = !this.isLocked\r\n const shouldLock:boolean = !this.allIsLocked();\r\n this.allIsLocked.set(shouldLock);\r\n this.fn_lockPositionWidgets(shouldLock);\r\n console.log(`All widgets have been visually and functionally locked: ${shouldLock}`);\r\n }\r\n\r\n public fn_lockPositionWidgets(prmAllIsLocked:boolean): void {\r\n\r\n const shouldLock:boolean = prmAllIsLocked; \r\n // 1. Perform the functional Gridstack task on the core grid layout\r\n this.grid.movable('.grid-stack-item', !shouldLock);\r\n this.grid.resizable('.grid-stack-item', !shouldLock);\r\n\r\n // 2. Broadcast the state change down to every active dynamic child component\r\n this.widgetsActivos.forEach((componentRef: ComponentRef<YwDashboardWidgetComponent>) => {\r\n componentRef.setInput('isLocked', shouldLock); \r\n });\r\n\r\n console.log(`All widgets have been visually and functionally locked - por TS Config: ${shouldLock}`);\r\n }\r\n\r\n\r\n\r\n\r\n\r\n /*BUTTON UPDATE WIDGET - CONTROL CONFIG */\r\n public fn_btn_updateWidgetControlConfig(idWidget: string): void {\r\n\r\n let newControlConfig:any ={};\r\n\r\n /*MODIFICAR METODO PARA CARGAR INFO DEL FORMULARIO*/\r\n newControlConfig['provider'] = 'syncfusion';\r\n \r\n this.eventUpdateWidgetControlConfig(idWidget, newControlConfig);\r\n\r\n }\r\n\r\n\r\n /*BUTTON UPDATE WIDGET - CONTROL CONFIG */\r\n public fn_btn_updateWidgetControlData(idWidget: string): void {\r\n\r\n let newControlData:any[] =[];\r\n\r\n /*MODIFICAR METODO PARA CARGAR INFO DEL FORMULARIO*/\r\n newControlData = [\r\n { month: 'Ene', sales: 35, expenses: 28 },\r\n { month: 'Feb', sales: 28, expenses: 22 },\r\n { month: 'Mar', sales: 34, expenses: 25 },\r\n { month: 'Abr', sales: 32, expenses: 27 },\r\n { month: 'May', sales: 40, expenses: 30 },\r\n { month: 'Jun', sales: 32, expenses: 26 },\r\n { month: 'Jul', sales: 45, expenses: 32 },\r\n { month: 'Ago', sales: 38, expenses: 29 },\r\n { month: 'Sep', sales: 42, expenses: 31 },\r\n { month: 'Oct', sales: 48, expenses: 35 },\r\n { month: 'Nov', sales: 52, expenses: 38 },\r\n { month: 'Dic', sales: 58, expenses: 42 },\r\n ];\r\n \r\n this.eventUpdateWidgetControlData(idWidget, newControlData);\r\n\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n /****************************************************** */\r\n\r\n\r\n /*AGREGAR WIDGET*/\r\n public eventAddWidget(widgetConfig:YwWidgetConfigInterface ,controlConfig:any,controlData:any, item:GridStackWidget): void {\r\n // 1. Agregar el contenedor del widget a Gridstack\r\n const el:any = this.grid.addWidget(item);\r\n\r\n // 2. Obtener el contenedor interno generado por Gridstack\r\n const contentElement = el.querySelector('.grid-stack-item-content') as HTMLElement;\r\n\r\n if (contentElement) {\r\n // 3. Crear dinámicamente la instancia del componente Angular\r\n const componentRef = createComponent(YwDashboardWidgetComponent, {\r\n environmentInjector: this.environmentInjector, // Requerido para resolver dependencias\r\n hostElement: contentElement // Renderiza directamente aquí dentro\r\n });\r\n\r\n // 4. Pasar las propiedades/Inputs al componente creado\r\n //Evaluar Estilos \r\n componentRef.setInput('styleWidget',widgetConfig.widgetStyle);\r\n\r\n //componentRef.instance.configWidget = widgetConfig;\r\n componentRef.setInput('configWidget',widgetConfig);\r\n componentRef.setInput('controlConfig',controlConfig);\r\n componentRef.setInput('controlData',controlData);\r\n\r\n\r\n \r\n\r\n /* BEGIN - Eventos que provienen desde widget */\r\n componentRef.instance.eventDeleteRequest.subscribe((idWidget: string) => {\r\n // Ejecutamos la función de borrado que ya programamos en el paso anterior\r\n this.eventRemoveWidgetById(idWidget);\r\n });\r\n\r\n componentRef.instance.eventLockToggleRequest.subscribe((event) => {\r\n this.eventToggleLockWidget(event.widgetId, event.shouldLock);\r\n });\r\n\r\n componentRef.instance.eventMaximizeToggleRequest.subscribe((event) => {\r\n this.eventToggleMaximizeWidget(event.widgetId, event.shouldMaximize);\r\n });\r\n\r\n //Mostrar\r\n componentRef.instance.eventShowConfigFormRequest.subscribe((idWidget: string) => { \r\n this.eventShowFormConfigWidget(idWidget);\r\n });\r\n\r\n /* END - Eventos que provienen desde widget */\r\n\r\n // 5. Mover los nodos del DOM generados por Angular dentro del DIV del Widget\r\n this.appRef.attachView(componentRef.hostView);\r\n // Guardar la referencia de Componentes para hacer operaciones con estas.\r\n this.widgetsActivos.set(item.id!, componentRef)\r\n\r\n //El componente interno no aparece bien dimensionado, con esto disparamos el evento para que se ajuste a las dimenciones correctas\r\n setTimeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n }, 50);\r\n }\r\n }\r\n\r\n\r\n\r\n /*UPDATE CONTROLCONFIG WIDGET*/\r\n public eventUpdateWidgetControlConfig(idWidget: string, newControlConfig: any): void {\r\n //Obtener la referencia del componente almacenada en el Map\r\n const componentRef = this.widgetsActivos.get(idWidget);\r\n\r\n if (!componentRef) {\r\n console.warn(`No se encontró un widget activo con el ID: ${idWidget}`);\r\n return;\r\n }\r\n //Actualizar el Input usando la API oficial setInput\r\n componentRef.setInput('controlConfig', newControlConfig);\r\n // NOTA: setInput dispara automáticamente la detección de cambios (ChangeDetectionStrategy.OnPush).\r\n // Si deseas asegurarte manualmente, puedes forzar un render:\r\n // componentRef.changeDetectorRef.detectChanges();\r\n }\r\n\r\n\r\n /*UPDATE CONTROL DATA WIDGET*/\r\n public eventUpdateWidgetControlData(idWidget: string, newControlData: any): void { \r\n //Obtener la referencia del componente almacenada en el Map\r\n const componentRef = this.widgetsActivos.get(idWidget);\r\n\r\n if (!componentRef){\r\n console.warn(`No se encontró un widget activo con el ID: ${idWidget}`);\r\n return;\r\n }\r\n //Actualizar el Input usando la API oficial setInput\r\n componentRef.setInput('controlData', newControlData);\r\n // NOTA: setInput dispara automáticamente la detección de cambios (ChangeDetectionStrategy.OnPush).\r\n // Si deseas asegurarte manualmente, puedes forzar un render:\r\n componentRef.changeDetectorRef.detectChanges();\r\n }\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n /****************************************************** */\r\n\r\n\r\n\r\n\r\n\r\n\r\n /* BEGIN - DRAWER */\r\n\r\n\r\n handleShowFormFilterDrawer(): void {\r\n this.drawerfiltervisible = true;\r\n } \r\n handleCloseFormFilterDrawer(): void {\r\n this.drawerfiltervisible = false;\r\n } \r\n\r\n\r\n handleCloseFormDrawer(): void {\r\n this.drawerconfigvisible = false;\r\n } \r\n\r\n\r\n fnGetDrawerWidth(prm_percent : any){\r\n const curWidth = window.innerWidth;\r\n let newWidth = curWidth;\r\n if( prm_percent ){ newWidth = Math.floor(curWidth*prm_percent/100); }\r\n if( newWidth < 400 ){newWidth = curWidth; }\r\n return newWidth;\r\n }\r\n\r\n\r\n public onFilterSelectionChange(eventData:any)\r\n {\r\n const lsize = this.widgetsActivos.size;\r\n //Validar que ya se crearon y renderizaron los componentes graficos.\r\n if(lsize > 0){\r\n \r\n const currentFilterController = this.dashboardFilterConfig.controlListConfig.find((x:YwDashboardWidgetFilterConfigInterface) => x.widgetId == eventData['widgetId']);\r\n \r\n if (currentFilterController){\r\n currentFilterController.controlFilterData = eventData['eventResponse'];\r\n this.fnUpdateDataControllerBasedOnFilter(this.dashboardFilterConfig.controlListConfig);\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n public fnUpdateDataControllerBasedOnFilter(filterControlListConfig:YwDashboardWidgetFilterConfigInterface[]){\r\n \r\n let copyDashboardData : YwDashboardDataInterface[] = structuredClone(this.dashboardData);\r\n \r\n filterControlListConfig.forEach((item:YwDashboardWidgetFilterConfigInterface)=>{\r\n \r\n let tableSelected = copyDashboardData.find((x:YwDashboardDataInterface)=> x.tableName == item.controlTable );\r\n \r\n if( item.typeComponent == 'filter-slicer' && tableSelected && item.controlFilterData )\r\n { const fieldName = item.configComponent.filterField;\r\n if( item.configComponent.dataType == 'date' )\r\n {\r\n const minDate = item.controlFilterData['startDate'];\r\n const maxDate = item.controlFilterData['endDate'];\r\n if( minDate && maxDate ){\r\n const filterData = tableSelected.tableData.filter((y:any)=> ( minDate <= y[fieldName] && y[fieldName] <= maxDate ));\r\n tableSelected.tableData = filterData;\r\n }\r\n }\r\n if( item.configComponent.dataType == 'number' )\r\n {\r\n const minNum = Number(item.controlFilterData['minValue']);\r\n const maxNum = Number(item.controlFilterData['maxValue']);\r\n if( minNum && maxNum ){\r\n const filterData = tableSelected.tableData.filter((y:any)=> ( minNum <= y[fieldName] && y[fieldName] <= maxNum ));\r\n tableSelected.tableData = filterData;\r\n }\r\n }\r\n }\r\n \r\n if( item.typeComponent == 'filter-button' && tableSelected && item.controlFilterData )\r\n { const fieldName = item.configComponent.filterField;\r\n const listValues = item.controlFilterData as any[] || [];\r\n if( listValues && listValues.length > 0 ){\r\n const filterData = tableSelected.tableData.filter((y:any)=> ( listValues.includes(y[fieldName]) ));\r\n tableSelected.tableData = filterData;\r\n }\r\n }\r\n\r\n if( item.typeComponent == 'filter-list' && tableSelected && item.controlFilterData )\r\n {\r\n const fieldName = item.configComponent.filterField;\r\n if( item.configComponent.dataType == 'text' )\r\n {\r\n const listValues = item.controlFilterData['ids'] as any[] || [];\r\n if( listValues && listValues.length > 0 ){\r\n const listValues1D = listValues; \r\n const filterData = tableSelected.tableData.filter((y:any)=> ( listValues1D.includes(y[fieldName]) ));\r\n tableSelected.tableData = filterData;\r\n }\r\n\r\n }\r\n\r\n if( item.configComponent.dataType == 'date' )\r\n {\r\n const minDate = item.controlFilterData['minDate'];\r\n const maxDate = item.controlFilterData['maxDate'];\r\n if( minDate && maxDate ){\r\n const filterData = tableSelected.tableData.filter((y:any)=> ( minDate <= y[fieldName] && y[fieldName] <= maxDate ));\r\n tableSelected.tableData = filterData;\r\n }\r\n }\r\n }\r\n });\r\n\r\n //Actualizacion de Data Componentes Graficos\r\n this.dashboardConfig.controlListConfig.forEach((item:YwWidgetConfigInterface) => {\r\n \r\n const controlData = this.fn_getDataForWidgetComponent(item.controlTables,copyDashboardData); \r\n this.eventUpdateWidgetControlData( item.widgetId, controlData);\r\n\r\n });\r\n\r\n \r\n\r\n\r\n }\r\n\r\n/* END - DRAWER */\r\n\r\n\r\n\r\n\r\n\r\n /* BEGIN - Eventos que provienen desde widget */\r\n\r\n public eventRemoveWidgetById(widgetId: string): void {\r\n // 1. Buscar el elemento HTML físico dentro de Gridstack usando su atributo interno [gs-id]\r\n const elementoHtml = this.gridContainer.nativeElement.querySelector(`[gs-id=\"${widgetId}\"]`);\r\n\r\n if (elementoHtml) {\r\n // 2. Remover el elemento de Gridstack (esto limpia el HTML y reordena el tablero si float es false)\r\n // El parámetro false indica que remueva el nodo del DOM pero no dispare eventos internos destructivos pesados\r\n this.grid.removeWidget(elementoHtml, false);\r\n }\r\n\r\n // 3. Buscar y destruir la instancia de Angular en memoria RAM\r\n const componentRef = this.widgetsActivos.get(widgetId);\r\n if (componentRef) {\r\n // Desengancha la vista del ciclo de renderizado global de Angular\r\n this.appRef.detachView(componentRef.hostView);\r\n // Destruye el componente y libera la memoria RAM\r\n componentRef.destroy();\r\n \r\n // Eliminamos el registro de nuestro Mapa\r\n this.widgetsActivos.delete(widgetId);\r\n }\r\n\r\n //console.log(`Widget ${widgetId} eliminado con éxito de Gridstack y Angular.`);\r\n}\r\n\r\n\r\npublic eventToggleLockWidget(widgetId: string, shouldLock: boolean): void {\r\n const elementoHtml = this.gridContainer.nativeElement.querySelector(`[gs-id=\"${widgetId}\"]`);\r\n \r\n if (elementoHtml) {\r\n // La API de Gridstack nos permite congelar un nodo específico pasándole true/false\r\n this.grid.movable(elementoHtml, !shouldLock);\r\n this.grid.resizable(elementoHtml, !shouldLock);\r\n \r\n //console.log(`Widget ${widgetId} cambiado a estado bloqueado: ${shouldLock}`);\r\n }\r\n}\r\n\r\n\r\npublic eventToggleMaximizeWidget(widgetId: string, shouldMaximize: boolean): void {\r\n\r\n const elementoHtml = this.gridContainer.nativeElement.querySelector(`[gs-id=\"${widgetId}\"]`);\r\n \r\n if (elementoHtml) {\r\n if (shouldMaximize) {\r\n // Aplicamos estilos CSS nativos para forzar al contenedor a flotar sobre todo el dashboard\r\n elementoHtml.classList.add('widget-maximized');\r\n // Deshabilitamos temporalmente que Gridstack intente moverlo mientras está maximizado\r\n this.grid.movable(elementoHtml, false);\r\n this.grid.resizable(elementoHtml, false);\r\n } else {\r\n elementoHtml.classList.remove('widget-maximized');\r\n \r\n // Restauramos los permisos normales leyendo si el componente de Angular estaba bloqueado previamente\r\n const componentRef = this.widgetsActivos.get(widgetId);\r\n const isCurrentlyLocked = componentRef?.instance.isLocked() || false;\r\n \r\n this.grid.movable(elementoHtml, !isCurrentlyLocked);\r\n this.grid.resizable(elementoHtml, !isCurrentlyLocked);\r\n }\r\n\r\n // Forzamos un evento resize simulado para que los gráficos de Syncfusion recalculen su nuevo tamaño gigante/pequeño\r\n setTimeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n }, 50);\r\n }\r\n}\r\n\r\n\r\n\r\npublic eventShowFormConfigWidget(widgetId: string): void {\r\n this.drawerCurrentWidgetObject['widgetId'] = widgetId;\r\n this.drawerconfigvisible = true; \r\n}\r\n\r\n\r\n/* END - Eventos que provienen desde widget */\r\n\r\n\r\n\r\n\r\n\r\n\r\n}\r\n","<!-- <div class=\"controls\" [hidden]=\"!showControls()\">\r\n <button (click)=\"saveLayoutToJSON()\">Guardar JSON en Consola</button>\r\n <button (click)=\"fn_btn_addWidget()\">add widget</button>\r\n <button (click)=\"fn_btn_lockPositionWidgets()\">Lock widgets</button>\r\n <button (click)=\"handleShowFormFilterDrawer()\" class=\"btn-filtro\">\r\n <svg *ngIf=\"drawerfiltervisible; else filtroInactivo\" \r\n xmlns=\"http://www.w3.org/2000/svg\" \r\n width=\"20\" height=\"20\" \r\n viewBox=\"0 0 24 24\" \r\n fill=\"currentColor\">\r\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\r\n </svg>\r\n <ng-template #filtroInactivo>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" \r\n width=\"20\" height=\"20\" \r\n viewBox=\"0 0 24 24\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n stroke-width=\"2\">\r\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>\r\n </svg>\r\n </ng-template>\r\n </button>\r\n</div> -->\r\n\r\n<div class=\"controls-container\" >\r\n @if ( showControls() ) { \r\n <!-- Botones principales con nz-button y tipos de Ant Design -->\r\n <button nz-button nzType=\"default\" (click)=\"saveLayoutToJSON()\" >\r\n <span nz-icon nz-type=\"code\"></span> Guardar JSON\r\n </button>\r\n\r\n <button nz-button nzType=\"primary\" (click)=\"fn_btn_addWidget()\" >\r\n <span nz-icon nz-type=\"plus\"></span> Añadir widget\r\n </button>\r\n\r\n <button nz-button [nzType]=\"isLocked ? 'primary' : 'default'\" nzDanger (click)=\"fn_btn_lockPositionWidgets()\" >\r\n <span nz-icon [nzType]=\"isLocked ? 'lock' : 'unlock'\"></span> \r\n {{ isLocked ? 'Bloqueado' : 'Bloquear' }}\r\n </button>\r\n }\r\n @if ( showFilter() ) { \r\n <!-- Botón de filtro con estilo icónico -->\r\n <button nz-button nzType=\"default\" nzShape=\"circle\" (click)=\"handleShowFormFilterDrawer()\" class=\"btn-filtro\" [class.active]=\"drawerfiltervisible\" >\r\n <svg *ngIf=\"drawerfiltervisible; else filtroInactivo\" \r\n xmlns=\"http://www.w3.org/2000/svg\" \r\n width=\"16\" height=\"16\" \r\n viewBox=\"0 0 24 24\" \r\n fill=\"currentColor\">\r\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\r\n </svg>\r\n <ng-template #filtroInactivo>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" \r\n width=\"16\" height=\"16\" \r\n viewBox=\"0 0 24 24\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n stroke-width=\"2\">\r\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>\r\n </svg>\r\n </ng-template>\r\n </button>\r\n }\r\n</div>\r\n<div #gridContainer class=\"grid-stack canvas-container\"\r\n [style.--canvas-bg]=\"dashboardStyle.canvasBackgroundColor\"\r\n></div>\r\n\r\n\r\n\r\n\r\n<!-- DRAWER - FILTER -->\r\n\r\n<nz-drawer\r\n[nzVisible]=\"drawerfiltervisible\"\r\n[nzMaskClosable]=\"false\"\r\nnzPlacement=\"right\"\r\n[nzWidth]=\"fnGetDrawerWidth(50)\"\r\n(nzOnClose)=\"handleCloseFormFilterDrawer()\"\r\n>\r\n<ng-container *nzDrawerContent>\r\n <div class=\"widget-details-info\">\r\n <h6 nz-typography>Filtros</h6>\r\n <yw-dashboard-filter\r\n [dashboardFilterConfig]=\"dashboardFilterConfig\"\r\n [dashboardData]=\"dashboardData\"\r\n (filterSelectionChange)=\"onFilterSelectionChange($event)\"\r\n >\r\n </yw-dashboard-filter>\r\n </div>\r\n\r\n <!--\r\n <nz-tabset nzCentered>\r\n <nz-tab nzTitle=\"Secion de Filtros\">\r\n <div class=\"controls\">\r\n aqui botones de control:\r\n\r\n </div>\r\n <div>\r\n \r\n\r\n </div>\r\n\r\n </nz-tab>\r\n \r\n </nz-tabset>\r\n-->\r\n</ng-container>\r\n</nz-drawer>\r\n\r\n\r\n\r\n<!-- DRAWER - CONFIGURACION -->\r\n<nz-drawer\r\n[nzVisible]=\"drawerconfigvisible\"\r\n[nzMaskClosable]=\"false\"\r\nnzPlacement=\"right\"\r\n[nzWidth]=\"fnGetDrawerWidth(50)\"\r\n(nzOnClose)=\"handleCloseFormDrawer()\"\r\n>\r\n<ng-container *nzDrawerContent>\r\n <div class=\"widget-details-info\">\r\n <h6 nz-typography>{{ drawerCurrentWidgetObject.widgetId }}</h6>\r\n </div>\r\n <nz-tabset nzCentered>\r\n <nz-tab nzTitle=\"{{ drawerCurrentWidgetObject.widgetId }}\">\r\n <div class=\"controls\">\r\n <button (click)=\"fn_btn_updateWidgetControlConfig(drawerCurrentWidgetObject.widgetId)\">Actualiza Configuracion</button>\r\n <button (click)=\"fn_btn_updateWidgetControlData(drawerCurrentWidgetObject.widgetId)\">Actualiza Data</button> \r\n </div>\r\n <div>\r\n bla bla bla\r\n </div>\r\n\r\n </nz-tab>\r\n \r\n </nz-tabset>\r\n</ng-container>\r\n</nz-drawer>","import { getNestedValue, resolveJoinedTableData } from \"../yw-base-chart.adapter\";\r\nimport { ChartDataModel } from \"../../../models/data/charts/yw-chart-data.interface\";\r\nimport { BubbleChartSeriesModelConfig } from \"../../../models/data/charts/yw-bubble-chart-interface\";\r\n\r\nexport const parseSyncFusionData = (allTablesData: any, configData_: any) => {\r\n if (!allTablesData || !configData_) {\r\n return { series: [], labelData: {} };\r\n }\r\n console.log(\"bubble data:--\",allTablesData,configData_)\r\n // SI LO MANDAN COMO UN ARREGLO PLANO, LO ENVOLVEMOS AUTOMÁTICAMENTE\r\n if (Array.isArray(allTablesData)) {\r\n const defaultTableName = configData_?.configData?.table || 'default';\r\n allTablesData = { [defaultTableName]: allTablesData };\r\n }\r\n\r\n const {\r\n ruleColorPoint,\r\n configData,\r\n xLabelText,\r\n yLabelText,\r\n title,\r\n chartoColoredLine,\r\n opacity,\r\n emptyPointSettings\r\n } = configData_;\r\n console.log(\"configData_:.::\",configData_)\r\n const cfg = configData || {};\r\n const { xAxis, yAxis, joins, configJoins, table, serie, tooltip,\r\n legends } = cfg;\r\n let series: BubbleChartSeriesModelConfig[] = [];\r\n\r\n // Función auxiliar robusta para obtener propiedades (soporta notación con puntos de los joins)\r\n // const getNestedValue = (obj: any, path: string) => {\r\n // if (!obj || !path) return undefined;\r\n // if (obj[path] !== undefined) return obj[path];\r\n // return path.split('.').reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n // };\r\n\r\n\r\n const sortByXAxis = (data: any[]): any[] => {\r\n if (!xAxis) return data;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = getNestedValue(a, xAxis);\r\n const bValue = getNestedValue(b, xAxis);\r\n\r\n if (aValue == null) return 1;\r\n if (bValue == null) return -1;\r\n\r\n return String(aValue).localeCompare(\r\n String(bValue),\r\n undefined,\r\n { numeric: true, sensitivity: 'base' }\r\n );\r\n });\r\n };\r\n\r\n\r\n\r\n if (joins === true) {\r\n if (!configJoins) {\r\n series = [];\r\n } else {\r\n const unifiedTable = resolveJoinedTableData(allTablesData, configJoins);\r\n console.log('unifiedTable bubble', unifiedTable);\r\n\r\n if (unifiedTable && unifiedTable.length > 0) {\r\n // const validRawData = unifiedTable.filter(\r\n // (item: any) =>\r\n // item &&\r\n // xAxis &&\r\n // getNestedValue(item, xAxis) !== undefined &&\r\n // getNestedValue(item, xAxis) !== null,\r\n // );\r\n const validRawData = unifiedTable.filter(\r\n (item: any) =>\r\n item &&\r\n xAxis &&\r\n getNestedValue(item, xAxis) !== undefined &&\r\n getNestedValue(item, xAxis) !== null,\r\n );\r\n\r\n const orderedRawData = sortByXAxis(validRawData);\r\n\r\n\r\n if (orderedRawData.length > 0) {\r\n if (serie) {\r\n // 2. Agrupamos los datos por el valor de la serie (ej. sucursal o vendedor)\r\n const groupedBySerie = orderedRawData.reduce(\r\n (acc: Record<string, any[]>, item: any) => {\r\n const serieVal = getNestedValue(item, serie);\r\n const serieKey =\r\n serieVal !== undefined && serieVal !== null\r\n ? String(serieVal)\r\n : 'Desconocido';\r\n\r\n if (!acc[serieKey]) {\r\n acc[serieKey] = [];\r\n }\r\n\r\n acc[serieKey].push(item);\r\n return acc;\r\n },\r\n {}\r\n );\r\n\r\n\r\n series = Object.entries(groupedBySerie).map(\r\n ([serieName, groupItems]: [string, any[]]) => {\r\n const orderedGroupItems = [...groupItems].sort((a, b) => {\r\n const aValue = getNestedValue(a, xAxis);\r\n const bValue = getNestedValue(b, xAxis);\r\n \r\n return String(aValue).localeCompare(\r\n String(bValue),\r\n undefined,\r\n {\r\n numeric: true,\r\n sensitivity: 'base'\r\n }\r\n );\r\n });\r\n console.log(\"SERIES NAME:\",orderedGroupItems)\r\n \r\n const dataSource: ChartDataModel[] = orderedGroupItems.map((item) => {\r\n const rawVal = getNestedValue(item, yAxis);\r\n\r\n const valorFinal =\r\n rawVal !== undefined\r\n ? typeof rawVal === 'number'\r\n ? rawVal\r\n : Number(rawVal) || 0\r\n : 0;\r\n const sizeFinal = Math.abs(valorFinal) !== 0 ? Math.abs(valorFinal) * 0.05 : 0;\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n size: sizeFinal,\r\n name: String(getNestedValue(item, xAxis!)),\r\n\r\n // ...(chartoColoredLine\r\n // ? { color: getRandomProfessionalHex() }\r\n // : {})\r\n };\r\n });\r\n\r\n return {\r\n name: serieName === 'default' ? 'Serie 1' : serieName,\r\n dataSource,\r\n opacity: opacity,\r\n emptyPointSettings: emptyPointSettings\r\n // dashArray: dashArray !== undefined ? dashArray : undefined,\r\n // width: width !== undefined ? width : undefined,\r\n // widthLine: widthLine !== undefined ? widthLine : undefined,\r\n } as BubbleChartSeriesModelConfig;\r\n }\r\n );\r\n\r\n }\r\n else {\r\n const dataSource: ChartDataModel[] = orderedRawData.map((item: any) => {\r\n let valorFinal = 0;\r\n let sizeFinal = 0;\r\n\r\n // const shouldColorLine = chartoColoredLine;\r\n const rawVal = getNestedValue(item, yAxis);\r\n // const rawSize = getNestedValue(item, size); // <--- Extraer el valor real\r\n\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === 'number' ? rawVal : Number(rawVal) || 0;\r\n\r\n }\r\n \r\n\r\n // if (rawSize !== undefined) {\r\n sizeFinal = Math.abs(valorFinal) !== 0 ? Math.abs(valorFinal) * 0.05 : 0;\r\n \r\n // }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n size: sizeFinal, // <--- Valor numérico extraído\r\n name: String(getNestedValue(item, xAxis!)),\r\n\r\n // ...(shouldColorLine ? { color: getRandomProfessionalHex() } : {})\r\n };\r\n });\r\n\r\n series = [\r\n {\r\n name: xAxis.split(\".\")[0] && xAxis !== 'default' ? xAxis.split(\".\")[0] : 'Serie Join',\r\n dataSource: dataSource,\r\n opacity: opacity,\r\n emptyPointSettings: emptyPointSettings\r\n\r\n // dashArray: dashArray !== undefined ? dashArray : undefined,\r\n // width: width !== undefined ? width : undefined,\r\n // widthLine: widthLine !== undefined ? widthLine : undefined,\r\n } as BubbleChartSeriesModelConfig\r\n ];\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n let normalizedTables: string[] = [];\r\n\r\n if (Array.isArray(table)) {\r\n normalizedTables = table.filter((t): t is string => typeof t === 'string' && t.trim() !== '');\r\n } else if (typeof table === 'string' && table.trim() !== '') {\r\n normalizedTables = [table];\r\n } else {\r\n normalizedTables = Object.keys(allTablesData);\r\n }\r\n\r\n series = normalizedTables\r\n .map((tableName): BubbleChartSeriesModelConfig | null => {\r\n const rawData: any[] = (allTablesData && allTablesData[tableName]) ? allTablesData[tableName] : [];\r\n\r\n if (!rawData || rawData.length === 0) return null;\r\n\r\n const orderedRawData = rawData.filter(\r\n (item: any) => item && xAxis && getNestedValue(item, xAxis) !== undefined && getNestedValue(item, xAxis) !== null\r\n );\r\n if (orderedRawData.length === 0) return null;\r\n\r\n const dataSource: ChartDataModel[] = orderedRawData.map((item: any) => {\r\n let valorFinal = 0;\r\n let sizeFinal = 0;\r\n const shouldColorLine = chartoColoredLine;\r\n const rawVal = getNestedValue(item, yAxis);\r\n // const rawSize = getNestedValue(item, size);\r\n if (rawVal !== undefined) {\r\n valorFinal = typeof rawVal === \"number\" ? rawVal : Number(rawVal) || 0;\r\n }\r\n\r\n // if (rawSize !== undefined) {\r\n sizeFinal = Math.abs(valorFinal) !== 0 ? Math.abs(valorFinal) * 0.05 : 0;\r\n // }\r\n\r\n return {\r\n x: String(getNestedValue(item, xAxis!)),\r\n y: valorFinal,\r\n size: sizeFinal, // <--- Valor numérico extraído\r\n name: String(getNestedValue(item, xAxis!)) \r\n // ...(shouldColorLine ? { color: getRandomProfessionalHex() } : {})\r\n };\r\n });\r\n\r\n return {\r\n name: tableName === 'default' ? xAxis : tableName,\r\n dataSource: dataSource,\r\n opacity: opacity,\r\n emptyPointSettings: emptyPointSettings\r\n // dashArray: dashArray !== undefined ? dashArray : undefined,\r\n // width: width !== undefined ? width : undefined,\r\n // widthLine: widthLine !== undefined ? widthLine : undefined,\r\n } as BubbleChartSeriesModelConfig;\r\n\r\n })\r\n .filter((item): item is BubbleChartSeriesModelConfig => item !== null);\r\n }\r\n\r\n const labelData = {\r\n title: title || \"\",\r\n axisX: {\r\n valueType: 'Category',\r\n title: typeof xLabelText === 'string' ? xLabelText : 'Categoría',\r\n // labelIntersectAction: 'Rotate90',\r\n // labelIntersectAction: 'Rotate45',\r\n\r\n\r\n },\r\n axisY: {\r\n title: typeof yLabelText === 'string' ? yLabelText : 'Valor'\r\n },\r\n tooltip: {\r\n ...(tooltip?.enable !== undefined ? { enable: tooltip.enable } : {}),\r\n ...(tooltip?.format ? { format: tooltip.format } : {}),\r\n ...(tooltip?.header ? { header: tooltip.header } : {}),\r\n ...(tooltip?.shared !== undefined ? { shared: tooltip.shared } : {}),\r\n enableHighlight: true,\r\n },\r\n legendSettings: {\r\n visible: legends?.visible !== undefined ? legends.visible : undefined,\r\n position: legends?.position !== undefined ? legends.position : undefined\r\n },\r\n ruleColorPoint: ruleColorPoint !== undefined ? ruleColorPoint : undefined\r\n };\r\n\r\n return {\r\n series,\r\n labelData\r\n };\r\n};\r\n","import {\r\n Component,\r\n Input,\r\n OnInit,\r\n AfterViewInit,\r\n OnChanges,\r\n OnDestroy,\r\n DoCheck,\r\n SimpleChanges,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { BubbleSeriesService, CategoryService, ChartComponent, ChartModule, DateTimeService, IPointRenderEventArgs, LegendService, TooltipService } from '@syncfusion/ej2-angular-charts';\r\nimport { BubbleChartSeriesModelConfig } from '../../../../../models/data/charts/yw-bubble-chart-interface';\r\nimport { parseSyncFusionData } from '../../yw-bubble-adapter';\r\nimport { PointRenderConfig } from '../../../../../models/config/chart/yw-line-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-bubble-chart-syncfusion',\r\n standalone: true,\r\n imports: [CommonModule, ChartModule],\r\n providers: [BubbleSeriesService,CategoryService, CategoryService,\r\n TooltipService,\r\n LegendService,\r\n DateTimeService],\r\n templateUrl: './yw-bubble-chart-sycfusion.component.html',\r\n styleUrl: './yw-bubble-chart-sycfusion.component.scss',\r\n})\r\nexport class BubbleChartSyncfusionComponent implements OnInit{\r\n\r\n \r\n @ViewChild('chart') public chartInstance?: ChartComponent;\r\n \r\n @Input('chartData') chartData: any;\r\n @Input('config') config!: any;\r\n @Input('idComponent') idComponent: string = '';\r\n\r\n dataChartParse: BubbleChartSeriesModelConfig[] = [];\r\n labelData: any; \r\n dataLabel: any;\r\n\r\n private _resizeObserver?: ResizeObserver;\r\n currentLabelSize: string = '';\r\npublic currentWidgetWidth: number = 0; // Valor inicial por defecto\r\n \r\n constructor(private elRef: ElementRef, private cdr: ChangeDetectorRef) {}\r\n ngOnInit(): void {\r\n this.updateParsedData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData'] || changes['config']) {\r\n this.updateParsedData();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._startResizeObserver();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n updateParsedData(): void {\r\n if (this.chartData && this.config) {\r\n const rawParsed = parseSyncFusionData(this.chartData, this.config);\r\n this.dataChartParse = rawParsed.series;\r\n \r\n this.labelData = rawParsed.labelData; \r\n console.log(\"DATA CREADA PARA AEL BUBBLE:\",this.dataChartParse, this.labelData)\r\n\r\n if (this.dataLabel && this.labelData) {\r\n this.labelData.dataLabel = this.dataLabel;\r\n }\r\n\r\n this.cdr.markForCheck();\r\n\r\n if (this.chartInstance) {\r\n setTimeout(() => {\r\n this.chartInstance?.refresh();\r\n });\r\n }\r\n }\r\n }\r\n\r\n// public pointRender(args: IPointRenderEventArgs): void {\r\n// const yValue = Number(args.point.y);\r\n// const configPoint: PointRenderConfig = this.config.ruleColorPoint || null;\r\n\r\n// if (!configPoint) return;\r\n\r\n// let passesRule = false;\r\n\r\n// switch (configPoint.rule) {\r\n// case 'threshold':\r\n// passesRule = yValue >= (configPoint.thresholdValue || 0);\r\n// break;\r\n\r\n// case 'pair':\r\n// passesRule = yValue % 2 === 0;\r\n// break;\r\n\r\n// case 'range':\r\n// const min = configPoint.minRange || 0;\r\n// const max = configPoint.maxRange || 100;\r\n// passesRule = yValue >= min && yValue <= max;\r\n// break;\r\n\r\n// default:\r\n// passesRule = true;\r\n// }\r\n\r\n// args.fill = passesRule ? (configPoint.trueColor || '#10B981') : (configPoint.falseColor || '#EF4444');\r\n// }\r\npublic pointRender(args: IPointRenderEventArgs): void {\r\n\r\n const yValue = Number(args.point.y);\r\n\r\n // =====================================================\r\n // EMPTY POINT / VALOR 0\r\n // Tiene prioridad sobre ruleColorPoint\r\n // =====================================================\r\n\r\nif (yValue === 0) {\r\n\r\n const emptyPoint = this.config.emptyPointSettings;\r\n\r\n if (emptyPoint && emptyPoint !== '') {\r\n args.fill = emptyPoint;\r\n }\r\n\r\n return;\r\n}\r\n\r\n // =====================================================\r\n // RULE COLOR POINT\r\n // =====================================================\r\n\r\n const configPoint: PointRenderConfig =\r\n this.config.ruleColorPoint || null;\r\n\r\n if (!configPoint) {\r\n return;\r\n }\r\n\r\n let passesRule = false;\r\n\r\n switch (configPoint.rule) {\r\n\r\n case 'threshold':\r\n passesRule =\r\n yValue >= (configPoint.thresholdValue || 0);\r\n break;\r\n\r\n case 'pair':\r\n passesRule = yValue % 2 === 0;\r\n break;\r\n\r\n case 'range':\r\n const min = configPoint.minRange || 0;\r\n const max = configPoint.maxRange || 100;\r\n\r\n passesRule =\r\n yValue >= min &&\r\n yValue <= max;\r\n break;\r\n\r\n default:\r\n passesRule = true;\r\n }\r\n\r\n args.fill = passesRule\r\n ? (configPoint.trueColor || '#10B981')\r\n : (configPoint.falseColor || '#EF4444');\r\n}\r\n\r\nprivate _startResizeObserver(): void {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n\r\n const hostEl: HTMLElement = this.elRef.nativeElement;\r\n\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n for (const entry of entries) {\r\n this.currentWidgetWidth = entry.contentRect.width;\r\n \r\n if (this.currentWidgetWidth > 0) {\r\n this._updateAdaptiveLabelSize(this.currentWidgetWidth);\r\n \r\n \r\n \r\n if (this.chartInstance) {\r\n // SI ACTIVAMSO EL REFRESH DA UN REBOTE AL REDIMENCIONAR\r\n this.chartInstance.refresh();\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this._resizeObserver.observe(hostEl);\r\n }\r\n \r\n private _updateAdaptiveLabelSize(width: number): void {\r\n if (this.config?.labelSize) {\r\n const parsedSize = typeof this.config.labelSize === 'number'\r\n ? this.config.labelSize\r\n : parseFloat(this.config.labelSize);\r\n\r\n if (!isNaN(parsedSize)) {\r\n if (width < 260) {\r\n const scale = Math.max(0.65, width / 260);\r\n this.currentLabelSize = `${Math.round(parsedSize * scale)}px`;\r\n } else {\r\n this.currentLabelSize = `${parsedSize}px`;\r\n }\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n }\r\n\r\n // Proporción estándar ideal (~7.5% del ancho del contenedor, acotado entre 13px y 26px)\r\n const base = Math.max(13, Math.min(26, Math.round(width * 0.075)));\r\n this.currentLabelSize = `${base}px`;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n\r\n public refresh(): void {\r\n this.updateParsedData();\r\n }\r\n// pointRender(args: any) {\r\n\r\n// if (args.point?.y === 0) {\r\n\r\n// args.fill = this.emptyPointSettings.fill;\r\n\r\n// args.border = {\r\n// width: this.emptyPointSettings.border?.width ?? 0,\r\n// color: this.emptyPointSettings.border?.color ?? ''\r\n// };\r\n// }\r\n// }\r\n\r\n\r\naxisLabelRender(args: any): void {\r\n const umbralWidget = 700; \r\n\r\n if (this.currentWidgetWidth > umbralWidget) {\r\n return; \r\n }\r\n\r\n // Si la tarjeta es estrecha, aplicamos el recorte de etiquetas\r\n if (args.text && typeof args.text === 'string') {\r\n const palabras = args.text.split(' '); \r\n\r\n if (palabras.length > 1) {\r\n const primeraPalabra = palabras[0];\r\n const inicialSegunda = palabras[1].charAt(0).toUpperCase();\r\n args.text = `${primeraPalabra} ${inicialSegunda}.`;\r\n } else {\r\n if (args.text.length > 10) {\r\n args.text = args.text.substring(0, 9) + '.';\r\n }\r\n }\r\n }}\r\n}\r\n","<div class=\"control-section\">\r\n\r\n <ejs-chart \r\n #chart \r\n [primaryXAxis]=\"labelData.axisX\" \r\n [primaryYAxis]=\"labelData.axisY\" \r\n [title]=\"labelData.title\" \r\n (pointRender)=\"pointRender($event)\" \r\n height=\"100%\"\r\n width=\"100%\"\r\n [legendSettings]=\"labelData.legendSettings\"\r\n (axisLabelRender)=\"axisLabelRender($event)\"\r\n\r\n [tooltip]=\"labelData.tooltip\">\r\n <e-series-collection>\r\n @for(series of dataChartParse; track $index){\r\n <e-series \r\n [opacity]=\"series.opacity\"\r\n [dataSource]='series.dataSource' \r\n type='Bubble' \r\n xName='x' \r\n yName='y' \r\n size='size' \r\n [name]='series.name'>\r\n </e-series>\r\n\r\n }\r\n </e-series-collection>\r\n</ejs-chart>\r\n</div>","import { Component, Input, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { YwBubbleMappingConfig } from '../../../../../models/config/chart/yw-bubble-chart.interface';\r\nimport { BubbleChartSyncfusionComponent } from '../../../../../adapters/charts/bubble-chart/syncfusion/visual/yw-bubble-chart-sycfusion.component';\r\n// import { LineChartSyncfusionComponent } from '../../../../../adapters/charts/line-chart/syncfusion/visual/yw-line-chart-syncfusion.component';\r\n// import { YwLineMappingConfig } from '../../../../../models/config/chart/yw-line-chart-config.interface';\r\n\r\n@Component({\r\n selector: 'yw-bubble-chart',\r\n standalone: true,\r\n imports: [CommonModule, BubbleChartSyncfusionComponent],\r\n templateUrl: './yw-bubble-chart.component.html',\r\n styleUrl: './yw-bubble-chart.component.scss',\r\n})\r\nexport class BubbleChartComponent {\r\n \r\n @Input('chartData') chartData!: any;\r\n @Input('config') config!: YwBubbleMappingConfig;\r\n @Input('idComponent') idComponent: string=''\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['chartData']) {\r\n console.log('change chartData:', changes['chartData'].currentValue);\r\n }\r\n if (changes['config']) {\r\n console.log('change config:', changes['config'].currentValue);\r\n }\r\n }\r\n}\r\n","llegamos\r\n@if(config.provider==='syncfusion'){\r\n <div style=\"position: relative; width: 100%; height: 100%;\">\r\n <yw-bubble-chart-syncfusion \r\n [idComponent]=\"idComponent\"\r\n [chartData]=\"chartData\" \r\n [config]=\"config\" style=\"display: block; width: 100%; height: 100%;\">\r\n </yw-bubble-chart-syncfusion>\r\n</div>\r\n}","// Configuraciones especificas de pie chart -> acumulation chart en syncfusion\r\n\r\nimport { YwMappingConfig } from \"../../base/yw-component-base.interface\";\r\nimport { ChartSeriesModel } from \"../../data/charts/yw-chart-data.interface\";\r\nimport {\r\n LegendSettingsModel,\r\n TooltipSettingsModel,\r\n AccumulationDataLabelSettingsModel\r\n} from '@syncfusion/ej2-angular-charts';\r\n\r\nexport type YwPieLabelPosition = 'Inside' | 'Outside';\r\nexport type YwPieVariant = {type:'pie' | 'doughnut' | 'mid'};\r\nexport type YwPieValueDisplayMode = 'percentage' | 'value' | 'both' | 'none';\r\n\r\nexport interface YwPieMappingConfig extends YwMappingConfig {\r\n /** Variante visual del gráfico */\r\n variant?: YwPieVariant;\r\n /** Radio general del gráfico. Ej: '70%' */\r\n radius?: string;\r\n /** Radio interno para el tipo 'Doughnut'. Ej: '40%' */\r\n innerRadius?: string;\r\n /** Mostrar etiquetas en los slices */\r\n showDataLabels?: boolean;\r\n /** Posición de la etiqueta en el slice */\r\n labelPosition?: YwPieLabelPosition;\r\n /** Separar el slice más destacado */\r\n explodeSlice?: boolean;\r\n /** Índice del slice a separar (0 = primero) */\r\n explodeIndex?: number;\r\n /** Distancia de separación del slice. Ej: '10%' */\r\n explodeOffset?: string;\r\n /** Paleta de colores personalizada para los slices */\r\n palettes?: string[];\r\n /** Altura del gráfico. Ej: '400px' */\r\n height?: string;\r\n\r\n /** Habilita la etiqueta en el centro de la dona (Center View). Default: false */\r\n showCenterLabel?: boolean;\r\n /** Título de la etiqueta central (ej: 'Total', 'Ventas', 'Taxes') */\r\n centerLabelTitle?: string;\r\n /** Valor de la etiqueta central (si no se define, calcula la suma total acumulada) */\r\n centerLabelValue?: string;\r\n /** Tamaño del título central. Default: '14px' */\r\n centerLabelTitleSize?: string;\r\n /** Tamaño del valor central. Default: '20px' */\r\n centerLabelValueSize?: string;\r\n /** Color del título central. Default: '#64748b' */\r\n centerLabelTitleColor?: string;\r\n /** Color del valor central. Default: '#1e293b' */\r\n centerLabelValueColor?: string;\r\n\r\n /** Muestra u oculta el nombre/categoría en la etiqueta de cada área. Default: true */\r\n showCategoryName?: boolean;\r\n /** Modo de visualización del valor en la etiqueta: porcentaje, valor numérico total, ambos o ninguno. Default: 'both' */\r\n valueDisplayMode?: YwPieValueDisplayMode;\r\n\r\n /** Formato del tooltip (fallback si no se especifica en configData.tooltip.format) */\r\n tooltipFormat?: string;\r\n /** Mostrar leyenda (fallback si no se especifica en configData.legends.visible) */\r\n showLegend?: boolean;\r\n /** Posición de leyenda (fallback si no se especifica en configData.legends.position) */\r\n legendPosition?: 'Top' | 'Bottom' | 'Left' | 'Right';\r\n}\r\n\r\n/** Alias retrocompatible */\r\nexport type YwPieChartConfig = YwPieMappingConfig;\r\n\r\nexport interface ChartPieSeriesModelConfig extends ChartSeriesModel {\r\n color?: string;\r\n innerRadius?: string;\r\n startAngle?: number;\r\n endAngle?: number;\r\n radius?: string;\r\n}\r\n\r\n/** Alias retrocompatible */\r\nexport type YwPieSeriesModelConfig = ChartPieSeriesModelConfig;\r\n\r\n/** Configuración visual procesada para Syncfusion AccumulationChart */\r\nexport interface SfPieVisualConfig {\r\n legendSettings?: LegendSettingsModel;\r\n tooltip?: TooltipSettingsModel;\r\n dataLabel?: AccumulationDataLabelSettingsModel;\r\n}\r\n\r\n/** Configuración de la etiqueta central para la variante Dona */\r\nexport interface SfPieCenterLabelConfig {\r\n show: boolean;\r\n title: string;\r\n value: string;\r\n titleSize: string;\r\n valueSize: string;\r\n titleColor: string;\r\n valueColor: string;\r\n}\r\n\r\n/** Resultado estructurado que entrega el adaptador de Pie al componente visual */\r\nexport interface PieChartParseResult {\r\n series: ChartPieSeriesModelConfig[];\r\n visualConfig: SfPieVisualConfig;\r\n centerLabel?: SfPieCenterLabelConfig;\r\n labelData?: any;\r\n}\r","//Interface data especifica para char data extiende de la base general capa 2\r\n\r\nimport { ChartDataModel } from \"./yw-chart-data.interface\";\r\n\r\n// Punto mapeado listo para ejs-accumulationchart (Syncfusion) \r\nexport interface SfPiePoint extends ChartDataModel {\r\n text?: string; // etiqueta visible en el slice\r\n fill?: string; // color del slice opcional\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';\r\n\r\n// Módulos de NG-Zorro\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzMessageService } from 'ng-zorro-antd/message';\r\n\r\nexport interface JoinItem {\r\n join: string;\r\n}\r\n\r\nexport interface ConfigJoinOutput {\r\n configJoins: JoinItem[];\r\n}\r\n\r\n@Component({\r\n selector: 'yw-table-relationship',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n NzSelectModule,\r\n NzButtonModule,\r\n NzCardModule,\r\n NzIconModule,\r\n NzGridModule\r\n ],\r\n templateUrl: './yw-table-relationship.component.html',\r\n styleUrls: ['./yw-table-relationship.component.scss']\r\n})\r\nexport class TableRelationshipComponent implements OnInit, OnChanges {\r\n @Input() chartData: Record<string, any[]> = {};\r\n @Input() config?: ConfigJoinOutput;\r\n @Output() saveRelations = new EventEmitter<ConfigJoinOutput>();\r\n\r\n relationshipForm!: FormGroup;\r\n resultado?: ConfigJoinOutput;\r\n\r\n constructor(private fb: FormBuilder, private message: NzMessageService) { }\r\n\r\n ngOnInit(): void {\r\n this.relationshipForm = this.fb.group({\r\n joins: this.fb.array([])\r\n });\r\n\r\n // Intentamos cargar por si ya viene con datos al inicio\r\n this.evaluarYcargarConfig();\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] && !changes['config'].firstChange) {\r\n this.evaluarYcargarConfig();\r\n }\r\n }\r\n evaluarYcargarConfig(): void {\r\n if (this.config && this.config.configJoins && this.config.configJoins.length > 0) {\r\n // Limpiamos los formularios actuales por si acaso antes de rellenar\r\n this.getJoins().clear();\r\n this.cargarConfiguracionPrevia(this.config.configJoins);\r\n }\r\n }\r\n\r\n // Función para parsear los strings tipo \"ventas.id_producto = productos.id\" y llenar los FormGroups\r\n cargarConfiguracionPrevia(joinsArray: JoinItem[]): void {\r\n joinsArray.forEach(item => {\r\n \r\n const partes = item.join.split('=');\r\n if (partes.length === 2) {\r\n const ladoIzquierdo = partes[0].trim(); \r\n const ladoDerecho = partes[1].trim(); \r\n\r\n const [table1, column1] = ladoIzquierdo.split('.'); \r\n const [table2, column2] = ladoDerecho.split('.'); \r\n\r\n // Creamos el grupo de formulario con los datos extraídos\r\n const joinGroup = this.fb.group({\r\n table1: [table1 || '', Validators.required],\r\n column1: [column1 || '', Validators.required],\r\n table2: [table2 || '', Validators.required],\r\n column2: [column2 || '', Validators.required]\r\n });\r\n\r\n this.getJoins().push(joinGroup);\r\n }\r\n });\r\n }\r\n getJoins(): FormArray {\r\n return this.relationshipForm.get('joins') as FormArray;\r\n }\r\n\r\n getNombresTablas(): string[] {\r\n return Object.keys(this.chartData || {});\r\n }\r\n\r\n getColumnasDeTabla(tableName: string): string[] {\r\n if (!tableName || !this.chartData[tableName]) return [];\r\n const rows = this.chartData[tableName];\r\n return rows.length > 0 ? Object.keys(rows[0]) : [];\r\n }\r\n\r\n // getTablaIzquierdaSugerida(index: number): string {\r\n // if (index === 0) return '';\r\n // const joinsArray = this.getJoins().value;\r\n // // Si existe el join anterior, devolvemos su table2\r\n // return joinsArray[index - 1]?.table2 || '';\r\n // }\r\n // Añadir un nuevo par de relación (Izquierda = Tabla 1, Derecha = Tabla 2)\r\n agregarRelacionItem(): void {\r\n const indexActual = this.getJoins().length;\r\n // Si hay un join previo, heredamos su table2 como table1 de este nuevo join\r\n // const tablaHeredada = indexActual > 0 ? this.getJoins().at(indexActual - 1).get('table2')?.value || '' : '';\r\n// const tablaHeredada = indexActual > 0 ? this.getJoins().at(indexActual - 1).get('table2')?.value || '' : '';\r\n const joinGroup = this.fb.group({\r\n table1: ['', Validators.required],\r\n column1: ['', Validators.required],\r\n table2: ['', Validators.required],\r\n column2: ['', Validators.required]\r\n });\r\n\r\n this.getJoins().push(joinGroup);\r\n }\r\n\r\n eliminarRelacionItem(index: number): void {\r\n this.getJoins().removeAt(index);\r\n this.emitirDatos();\r\n }\r\n\r\n emitirDatos(): void {\r\n if (this.relationshipForm.valid && this.getJoins().length > 0) {\r\n // Mapeamos los valores del formulario al formato de texto exacto: \"tabla1.col1 = tabla2.col2\"\r\n const rawJoins = this.getJoins().value;\r\n const formattedJoins: JoinItem[] = rawJoins.map((item: any) => ({\r\n join: `${item.table1}.${item.column1} = ${item.table2}.${item.column2}`\r\n }));\r\n\r\n this.resultado = {\r\n configJoins: formattedJoins\r\n };\r\n this.saveRelations.emit(this.resultado);\r\n }\r\n }\r\n\r\n\r\n}","<nz-card nzTitle=\"Configuración de Relaciones (Joins)\" class=\"series-config-panel\">\r\n\r\n <div class=\"joins-container\">\r\n \r\n <!-- Cabecera -->\r\n <div class=\"joins-header\">\r\n <span class=\"joins-subtitle\">Define las parejas de tablas y columnas que se conectarán:</span>\r\n <button nz-button nzType=\"primary\" (click)=\"agregarRelacionItem()\">\r\n <span nz-icon nzType=\"plus\"></span> Añadir Relación\r\n </button>\r\n </div>\r\n\r\n <!-- Formulario Dinámico -->\r\n <form [formGroup]=\"relationshipForm\">\r\n <div formArrayName=\"joins\" class=\"joins-list\">\r\n \r\n <!-- Tarjeta por cada par de relación -->\r\n <div *ngFor=\"let join of this.getJoins().controls; let i = index\" [formGroupName]=\"i\" class=\"join-card-item\">\r\n \r\n <!-- Cabecera de la tarjeta -->\r\n <div class=\"join-card-header\">\r\n <span class=\"join-badge\">Join #{{ i + 1 }}</span>\r\n <button nz-button nzType=\"text\" nzDanger nzSize=\"small\" (click)=\"eliminarRelacionItem(i)\">\r\n <span nz-icon nzType=\"delete\"></span> Eliminar\r\n </button>\r\n </div>\r\n\r\n <!-- Estructura Lado a Lado (Izquierda vs Derecha) -->\r\n <div nz-row [nzGutter]=\"16\" nzAlign=\"middle\">\r\n \r\n <!-- LADO IZQUIERDO: Tabla 1 y Columna 1 -->\r\n <div nz-col [nzXs]=\"24\" [nzSm]=\"11\">\r\n <div class=\"form-group-custom mb-2\">\r\n <label class=\"custom-label\">\r\n Tabla Izquierda \r\n <span *ngIf=\"i > 0\" class=\"text-xs text-blue-500 font-normal\">(Heredada del join anterior)</span>\r\n </label>\r\n <nz-select \r\n formControlName=\"table1\" \r\n nzShowSearch \r\n nzAllowClear \r\n nzPlaceHolder=\"Seleccione tabla\" \r\n class=\"w-full\"\r\n (ngModelChange)=\"emitirDatos()\"\r\n >\r\n <nz-option *ngFor=\"let tabla of getNombresTablas()\" [nzValue]=\"tabla\" [nzLabel]=\"tabla\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <div class=\"form-group-custom\">\r\n <label class=\"custom-label\">Columna Izquierda</label>\r\n <nz-select \r\n formControlName=\"column1\" \r\n nzShowSearch \r\n nzAllowClear \r\n nzPlaceHolder=\"Seleccione columna\" \r\n class=\"w-full\"\r\n (ngModelChange)=\"emitirDatos()\"\r\n >\r\n <nz-option \r\n *ngFor=\"let col of getColumnasDeTabla(join.get('table1')?.value)\" \r\n [nzValue]=\"col\" \r\n [nzLabel]=\"col\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n </div>\r\n\r\n <!-- CONECTOR CENTRAL (=) -->\r\n <div nz-col [nzXs]=\"24\" [nzSm]=\"2\" class=\"join-connector-col\">\r\n <div class=\"join-connector-icon\">\r\n <span style=\"font-weight: bold; font-size: 16px;\">=</span>\r\n </div>\r\n </div>\r\n\r\n <!-- LADO DERECHO: Tabla 2 y Columna 2 -->\r\n <div nz-col [nzXs]=\"24\" [nzSm]=\"11\">\r\n <div class=\"form-group-custom mb-2\">\r\n <label class=\"custom-label\">Tabla Derecha</label>\r\n <nz-select \r\n formControlName=\"table2\" \r\n nzShowSearch \r\n nzAllowClear \r\n nzPlaceHolder=\"Seleccione tabla\" \r\n class=\"w-full\"\r\n (ngModelChange)=\"emitirDatos()\"\r\n >\r\n <nz-option *ngFor=\"let tabla of getNombresTablas()\" [nzValue]=\"tabla\" [nzLabel]=\"tabla\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <div class=\"form-group-custom\">\r\n <label class=\"custom-label\">Columna Derecha</label>\r\n <nz-select \r\n formControlName=\"column2\" \r\n nzShowSearch \r\n nzAllowClear \r\n nzPlaceHolder=\"Seleccione columna\" \r\n class=\"w-full\"\r\n (ngModelChange)=\"emitirDatos()\"\r\n >\r\n <nz-option \r\n *ngFor=\"let col of getColumnasDeTabla(join.get('table2')?.value)\" \r\n [nzValue]=\"col\" \r\n [nzLabel]=\"col\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </form>\r\n\r\n <!-- Botón Guardar -->\r\n <!-- <div class=\"joins-footer\" *ngIf=\"getJoins().controls.length>0\">\r\n <button nz-button nzType=\"primary\" nzSize=\"large\" (click)=\"guardarConfiguracion()\">\r\n <span nz-icon nzType=\"check\"></span> Guardar Configuración\r\n </button>\r\n </div> -->\r\n\r\n </div>\r\n\r\n</nz-card>","/*\r\n * Public API Surface of yw-charts-library\r\n */\r\n\r\nexport * from './lib/yw-charts-library.service';\r\nexport * from './lib/yw-charts-library.component';\r\n\r\n//Providders\r\nexport * from './lib/providers';\r\n\r\n//Dashboards\r\nexport * from './lib/models/config/dashboard/yw-dashboard-config.interface';\r\nexport * from './lib/models/config/dashboard/yw-dashboard-filter-config.interface';\r\nexport * from './lib/models/config/dashboard/yw-dashboard-widget-config.interface';\r\nexport * from './lib/components/compounds/yw-dashboard/visual/yw-dashboard/yw-dashboard.component';\r\nexport * from './lib/components/compounds/yw-dashboard/visual/yw-dashboard-widget/yw-dashboard-widget.component';\r\n\r\n// Base Models\r\nexport * from './lib/models/base/yw-component-base.interface';\r\nexport * from './lib/models/data/charts/yw-chart-data.interface';\r\n\r\n// Bar Chart\r\nexport * from './lib/models/config/chart/yw-bar-chart-config.interface';\r\nexport * from './lib/components/basic/charts/yw-bar-chart/visual/yw-bar-chart.component';\r\n// export * from './lib/components/basic/charts/yw-bar-chart/config/yw-bar-chart-config.component';\r\n// export { parseData as parseBarData } from './lib/adapters/charts/bar-chart/yw-bar-chart.adapter';\r\n\r\n// Line Chart\r\nexport * from './lib/models/config/chart/yw-line-chart-config.interface';\r\nexport * from './lib/components/basic/charts/yw-line-chart/visual/yw-line-chart.component';\r\n// export { parseData as parseLineData } from './lib/adapters/charts/line-chart/yw-line-chart.adapter';\r\n\r\n\r\n\r\n// Bubble Chart\r\nexport * from './lib/models/config/chart/yw-bubble-chart.interface';\r\nexport * from './lib/components/basic/charts/yw-bubble-chart/visual/yw-bubble-chart.component';\r\n// export { parseData as parseLineData } from './lib/adapters/charts/line-chart/yw-line-chart.adapter';\r\n\r\n\r\n// Pie Chart\r\nexport * from './lib/models/config/chart/yw-pie-chart-config.interface';\r\nexport * from './lib/models/data/charts/yw-pie-chart-data.interface';\r\nexport * from './lib/components/basic/charts/yw-pie-chart/visual/yw-pie-chart.component';\r\n\r\n// Componentes configuración\r\n// export * from './lib/components/basic/charts/yw-bar-chart/config/yw-bar-chart-config.component';\r\n\r\n// Gauge Chart\r\nexport * from './lib/models/config/chart/yw-gauge-chart-config.interface';\r\nexport * from './lib/models/data/charts/yw-gauge-chart-data.interface';\r\nexport * from './lib/components/basic/charts/yw-gauge-chart/visual/yw-gauge-chart.component';\r\n\r\n// Bar Chart\r\nexport * from './lib/models/config/chart/yw-bar-chart-config.interface';\r\n// Line Chart\r\nexport * from './lib/models/config/chart/yw-line-chart-config.interface';\r\n\r\n// table-relationship\r\nexport * from './lib/components/basic/reusable/yw-table-relationship/yw-table-relationship.component'\r\n\r\n\r\n// componentes chart-ng2\r\n// export * from './lib/components/basic/charts/yw-bar-chart/visual/yw-bar-chart.component'export * from './lib/components/compounds/yw-dashboard/visual/yw-dashboard/yw-dashboard.component';\r\n\r\n\r\n//Constantes\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["parseSyncFusionData","parseForSyncfusion","i1","i2","i3","i4"],"mappings":"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"}