@visionaris-bruno/vs-echarts 9.0.3 → 9.0.6

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.
@@ -185,6 +185,7 @@ function defaultOptionsOverrides() {
185
185
  },
186
186
  };
187
187
  }
188
+ const defaultValueFormatter = (value) => `${value}`;
188
189
 
189
190
  // TODO: Exportar valores por defecto de vs-echarts.config.ts por este servicio y actualizar en logica de frontend.
190
191
  class VSEchartsConfigService {
@@ -237,11 +238,11 @@ class BaseEchartsComponent {
237
238
  data = { dimensions: [], source: [] };
238
239
  optionsOverrides = defaultOptionsOverrides();
239
240
  /** Paleta de colores básica */
240
- palette;
241
+ palette = getDefaultPalette();
241
242
  /** Resolver de colores dinámico (Callback) */
242
243
  colorResolver;
243
244
  /** Formateador de valores para etiquetas y tooltips */
244
- valueFormatter;
245
+ valueFormatter = defaultValueFormatter;
245
246
  chartClick = new EventEmitter();
246
247
  /** Subject para debouncing de actualizaciones. ReplaySubject asegura no perder el primer renderizado. */
247
248
  updateSubject = new ReplaySubject(1);
@@ -683,7 +684,7 @@ function getCellValue(val) {
683
684
  /**
684
685
  * Formatter generator for 'item' trigger strategy in tooltips.
685
686
  */
686
- function getItemTooltipFormatter(data, formatCellValue, opts) {
687
+ function getItemTooltipFormatter(data, valueFormatter, opts) {
687
688
  return (params) => {
688
689
  let title = '', subtitle = '', valFormatted = '', percentVal = '';
689
690
  const showSerieName = opts?.showSerieName ?? true;
@@ -694,15 +695,16 @@ function getItemTooltipFormatter(data, formatCellValue, opts) {
694
695
  return '';
695
696
  const rawValue = (row && typeof row === 'object') ? row[dimensionName] : params.value;
696
697
  const serieName = showSerieName ? `${params.marker} ${params.seriesName}<br/ >` : '';
697
- title = params.name || (row && typeof row === 'object' ? row.category : '');
698
+ const categoryName = params.name || (row && typeof row === 'object' ? row.category : '');
699
+ title = categoryName;
698
700
  subtitle = serieName;
699
- valFormatted = formatCellValue(Number(rawValue ?? 0), dimensionName);
700
- // pie/funnel series
701
+ valFormatted = valueFormatter(Number(rawValue ?? 0), dimensionName);
702
+ // pie/funnel/ring series
701
703
  if (params.percent != undefined) {
702
704
  percentVal = ` (${params.percent}%)`;
703
- if (data.dimensions.length <= 2) {
704
- subtitle = '';
705
- }
705
+ // invertir titulo y subtitulo
706
+ title = `${params.seriesName}`;
707
+ subtitle = `${params.marker} ${categoryName}</br>`;
706
708
  }
707
709
  // sankey
708
710
  if (params.dataType != undefined) {
@@ -712,11 +714,11 @@ function getItemTooltipFormatter(data, formatCellValue, opts) {
712
714
  const sourceName = params.data.source.split('___')[0];
713
715
  const targetName = params.data.target.split('___')[0];
714
716
  title = `${sourceName} &rarr; ${targetName}`;
715
- valFormatted = formatCellValue(Number(params.value ?? 0), dimensionName);
717
+ valFormatted = valueFormatter(Number(params.value ?? 0), dimensionName);
716
718
  }
717
719
  else if (dataType === 'node') {
718
720
  title = params.name.split('___')[0];
719
- valFormatted = formatCellValue(Number(params.value ?? 0), dimensionName);
721
+ valFormatted = valueFormatter(Number(params.value ?? 0), dimensionName);
720
722
  }
721
723
  }
722
724
  // sunburst treemap
@@ -735,7 +737,7 @@ function getItemTooltipFormatter(data, formatCellValue, opts) {
735
737
  /**
736
738
  * Formatter generator for 'axis' trigger strategy in tooltips.
737
739
  */
738
- function getAxisTooltipFormatter(data, formatCellValue, opts) {
740
+ function getAxisTooltipFormatter(data, valueFormatter, opts) {
739
741
  return (params) => {
740
742
  if (!params)
741
743
  return '';
@@ -753,7 +755,7 @@ function getAxisTooltipFormatter(data, formatCellValue, opts) {
753
755
  continue;
754
756
  const itemRow = item.value;
755
757
  const rawValue = (itemRow && typeof itemRow === 'object') ? itemRow[dimensionName] : item.value;
756
- const valFormatted = formatCellValue(Number(rawValue ?? 0), dimensionName);
758
+ const valFormatted = valueFormatter(Number(rawValue ?? 0), dimensionName);
757
759
  html += `${item.marker} ${item.seriesName}: <b>${valFormatted}</b><br/>`;
758
760
  }
759
761
  return html;
@@ -762,10 +764,10 @@ function getAxisTooltipFormatter(data, formatCellValue, opts) {
762
764
  /**
763
765
  * Unified tooltip formatter generator that selects the appropriate strategy based on the trigger.
764
766
  */
765
- function getTooltipFormatter(trigger, data, formatCellValue, opts) {
767
+ function getTooltipFormatter(trigger, data, valueFormatter, opts) {
766
768
  return trigger === 'axis'
767
- ? getAxisTooltipFormatter(data, formatCellValue, opts)
768
- : getItemTooltipFormatter(data, formatCellValue, opts);
769
+ ? getAxisTooltipFormatter(data, valueFormatter, opts)
770
+ : getItemTooltipFormatter(data, valueFormatter, opts);
769
771
  }
770
772
  function getCommons(opts) {
771
773
  const palette = opts?.palette ?? getDefaultPalette();
@@ -852,7 +854,7 @@ function getTreeDepth(nodes) {
852
854
  */
853
855
  class RingBuilder {
854
856
  baseProduct;
855
- valueFormatter = (value) => value.toLocaleString();
857
+ valueFormatter = defaultValueFormatter;
856
858
  palette = [];
857
859
  colorResolver;
858
860
  result = {};
@@ -948,10 +950,10 @@ class RingBuilder {
948
950
  }];
949
951
  }
950
952
  addTooltip(data, overrides) {
951
- merge(overrides, {
952
- formatter: getTooltipFormatter(overrides.trigger, data, this.formatCellValue.bind(this)),
953
- });
954
- const tooltip = getTooltipOptions(overrides);
953
+ const tooltipOptsOverrides = {};
954
+ tooltipOptsOverrides.formatter = getTooltipFormatter(overrides.trigger, data, this.valueFormatter);
955
+ merge(tooltipOptsOverrides, overrides);
956
+ const tooltip = getTooltipOptions(tooltipOptsOverrides);
955
957
  this.result.tooltip = tooltip;
956
958
  }
957
959
  addLegend() {
@@ -984,15 +986,12 @@ class RingBuilder {
984
986
  getResult() {
985
987
  return this.result;
986
988
  }
987
- formatCellValue(value, key) {
988
- return this.valueFormatter(value, key);
989
- }
990
989
  }
991
990
 
992
991
  class BoxPlotBuilder {
993
992
  baseProduct;
994
993
  translateService;
995
- valueFormatter = (value, key) => value.toLocaleString();
994
+ valueFormatter = defaultValueFormatter;
996
995
  palette = [];
997
996
  // TODO: Hay que implementar un valor por defecto.
998
997
  colorResolver;
@@ -1200,344 +1199,231 @@ class BoxPlotBuilder {
1200
1199
  }
1201
1200
 
1202
1201
  /**
1203
- * Director de Builds.
1202
+ * Builder principal.
1203
+ *
1204
+ * Es muy completo, tiene soporte para ejes y sistema cartesiano polar.
1205
+ *
1206
+ * Puede verse utilizado en graficos como Lineas y Bars. Siempre que se pueda priorizar utilizar este.
1204
1207
  */
1205
- class VSECDirector {
1206
- builder = undefined;
1207
- constructor(builder) {
1208
- this.builder = builder;
1209
- }
1210
- makeBar(data, overrides, opts = {}) {
1211
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1212
- x: 'category',
1213
- y: 'value',
1214
- // TODO agregar radius y angle axis
1215
- } } = opts;
1216
- this.builder.reset();
1217
- // El orden importa, primero callbaks y despues componentes.
1218
- //chart callbacks
1219
- this.builder.setValueFormatter(valueFormatter);
1220
- this.builder.setPalette(palette);
1221
- this.builder.setColorResolver(colorResolver);
1222
- const product = this.builder.baseProduct;
1223
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1224
- // chart components
1225
- this.builder.addCommons();
1226
- const layoutOpts = { axisTypes };
1227
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1228
- this.builder.addXAxis(data, overrides.axis, axisTypes.x);
1229
- this.builder.addYAxis(data, overrides.axis, axisTypes.y);
1230
- this.builder.addTooltip(data, overrides.tooltip);
1231
- this.builder.addLegend();
1232
- }
1233
- makeBarRadial(data, overrides, opts = {}) {
1234
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1235
- x: 'category',
1236
- y: 'value',
1237
- // TODO agregar radius y angle axis
1238
- } } = opts;
1239
- this.builder.reset();
1240
- // El orden importa, primero callbaks y despues componentes.
1241
- //chart callbacks
1242
- this.builder.setValueFormatter(valueFormatter);
1243
- this.builder.setPalette(palette);
1244
- this.builder.setColorResolver(colorResolver);
1245
- const product = this.builder.baseProduct;
1246
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1247
- // chart components
1248
- this.builder.addCommons();
1249
- const layoutOpts = { axisTypes, coordinateSystem: 'polar' };
1250
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1251
- this.builder.addPolar();
1252
- this.builder.addAngleAxis(data, overrides['axis']);
1253
- this.builder.addRadiusAxis(data, overrides['axis']);
1254
- this.builder.addTooltip(data, overrides.tooltip);
1255
- this.builder.addLegend();
1256
- }
1257
- makeLine(data, overrides, opts = {}) {
1258
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1259
- x: 'category',
1260
- y: 'value',
1261
- // TODO agregar radius y angle axis
1262
- } } = opts;
1263
- this.builder.reset();
1264
- // El orden importa, primero callbaks y despues componentes.
1265
- //chart callbacks
1266
- this.builder.setValueFormatter(valueFormatter);
1267
- this.builder.setPalette(palette);
1268
- this.builder.setColorResolver(colorResolver);
1269
- const product = this.builder.baseProduct;
1270
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1271
- // chart components
1272
- this.builder.addCommons();
1273
- const layoutOpts = { axisTypes };
1274
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1275
- this.builder.addXAxis(data, overrides.axis, axisTypes.x);
1276
- this.builder.addYAxis(data, overrides.axis, axisTypes.y);
1277
- this.builder.addTooltip(data, overrides.tooltip);
1278
- this.builder.addLegend();
1208
+ class EChartBuilder {
1209
+ baseProduct = undefined;
1210
+ valueFormatter = defaultValueFormatter;
1211
+ palette = [];
1212
+ colorResolver;
1213
+ result = {};
1214
+ constructor(baseProduct) {
1215
+ this.baseProduct = baseProduct;
1279
1216
  }
1280
- makeScatter(data, overrides, opts = {}) {
1281
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1282
- x: 'category',
1283
- y: 'value',
1284
- } } = opts;
1285
- this.builder.reset();
1286
- // El orden importa, primero callbacks y despues componentes.
1287
- this.builder.setValueFormatter(valueFormatter);
1288
- this.builder.setPalette(palette);
1289
- this.builder.setColorResolver(colorResolver);
1290
- const product = this.builder.baseProduct;
1291
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1292
- // chart components
1293
- this.builder.addCommons();
1294
- const layoutOpts = { axisTypes };
1295
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1296
- this.builder.addXAxis(data, overrides.axis, axisTypes.x);
1297
- this.builder.addYAxis(data, overrides.axis, axisTypes.y);
1298
- this.builder.addTooltip(data, overrides.tooltip);
1299
- this.builder.addLegend();
1217
+ reset() {
1218
+ this.result = {};
1300
1219
  }
1301
- makeRing(data, overrides, opts = {}) {
1302
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
1303
- this.builder.reset();
1304
- // El orden importa, primero callbacks y despues componentes.
1305
- this.builder.setValueFormatter(valueFormatter);
1306
- this.builder.setPalette(palette);
1307
- this.builder.setColorResolver(colorResolver);
1308
- const product = this.builder.baseProduct;
1309
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1310
- // chart components
1311
- this.builder.addCommons();
1312
- const layoutOpts = {};
1313
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1314
- this.builder.addGraphic();
1315
- this.builder.addTooltip(data, overrides.tooltip);
1316
- this.builder.addLegend();
1220
+ addCommons() {
1221
+ const opts = {
1222
+ palette: this.palette,
1223
+ };
1224
+ merge$1(this.result, getCommons(opts));
1317
1225
  }
1318
- makePie(data, overrides, opts = {}) {
1319
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
1320
- this.builder.reset();
1321
- // El orden importa, primero callbacks y despues componentes.
1322
- this.builder.setValueFormatter(valueFormatter);
1323
- this.builder.setPalette(palette);
1324
- this.builder.setColorResolver(colorResolver);
1325
- const product = this.builder.baseProduct;
1326
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1327
- // chart components
1328
- this.builder.addCommons();
1329
- const layoutOpts = {};
1330
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1331
- this.builder.addTooltip(data, overrides.tooltip);
1332
- this.builder.addLegend();
1226
+ /**
1227
+ *
1228
+ * @param data
1229
+ * @param overrides
1230
+ * @returns
1231
+ */
1232
+ addSeries(data, overrides, opts) {
1233
+ if (!data || !data.dimensions || !data.source || data.source.length === 0)
1234
+ return;
1235
+ this.result.dataset = {
1236
+ dimensions: data.dimensions,
1237
+ source: data.source
1238
+ };
1239
+ const measureDims = data.dimensions.filter(d => d.name !== 'category');
1240
+ const isPolar = opts?.coordinateSystem === 'polar';
1241
+ const isHorizontal = opts?.axisTypes?.x === 'value' && opts?.axisTypes?.y === 'category';
1242
+ const series = measureDims.map((dim) => {
1243
+ const friendlyName = dim.displayName || dim.name;
1244
+ const dimKey = dim.name;
1245
+ let encode = {
1246
+ x: 'category',
1247
+ y: dimKey
1248
+ };
1249
+ if (isPolar) {
1250
+ encode = {
1251
+ angle: 'category',
1252
+ radius: dimKey
1253
+ };
1254
+ }
1255
+ else if (isHorizontal) {
1256
+ encode = {
1257
+ x: dimKey,
1258
+ y: 'category'
1259
+ };
1260
+ }
1261
+ const dynamicOverrides = {
1262
+ name: friendlyName,
1263
+ encode,
1264
+ };
1265
+ const seriesOption = merge$1(dynamicOverrides, overrides);
1266
+ // Inyectar el resolver de color si existe
1267
+ if (this.colorResolver && seriesOption.itemStyle) {
1268
+ seriesOption.itemStyle.color = this.colorResolver;
1269
+ }
1270
+ // Inyectar el formatter de etiquetas
1271
+ if (seriesOption.label && this.valueFormatter != undefined) {
1272
+ const valueFormatter = this.valueFormatter;
1273
+ seriesOption.label.formatter = (params) => {
1274
+ const row = params.value;
1275
+ const rawValue = (row && typeof row === 'object') ? row[dimKey] : params.value;
1276
+ return valueFormatter(Number(rawValue ?? 0), dimKey);
1277
+ };
1278
+ }
1279
+ return seriesOption;
1280
+ });
1281
+ this.result.series = series;
1333
1282
  }
1334
- makeFunnel(data, overrides, opts = {}) {
1335
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
1336
- this.builder.reset();
1337
- // El orden importa, primero callbacks y despues componentes.
1338
- this.builder.setValueFormatter(valueFormatter);
1339
- this.builder.setPalette(palette);
1340
- this.builder.setColorResolver(colorResolver);
1341
- const product = this.builder.baseProduct;
1342
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1343
- // chart components
1344
- this.builder.addCommons();
1345
- const layoutOpts = {};
1346
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1347
- this.builder.addTooltip(data, overrides.tooltip);
1348
- this.builder.addLegend();
1283
+ /**
1284
+ * TODO: Mejorar funcion, no me convence como se implemento el tooltip formatter.
1285
+ * @param data
1286
+ * @param overrides
1287
+ */
1288
+ addTooltip(data, overrides) {
1289
+ const optsOverrides = {};
1290
+ // inyecto formateador personalizado de tooltip
1291
+ optsOverrides.formatter = getTooltipFormatter(overrides.trigger, data, this.valueFormatter.bind(this));
1292
+ merge$1(optsOverrides, overrides);
1293
+ const tooltip = getTooltipOptions(optsOverrides);
1294
+ this.result.tooltip = tooltip;
1349
1295
  }
1350
- makeSunburst(data, overrides, opts = {}) {
1351
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
1352
- this.builder.reset();
1353
- // El orden importa, primero callbacks y despues componentes.
1354
- this.builder.setValueFormatter(valueFormatter);
1355
- this.builder.setPalette(palette);
1356
- this.builder.setColorResolver(colorResolver);
1357
- const product = this.builder.baseProduct;
1358
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1359
- // chart components
1360
- this.builder.addCommons();
1361
- const layoutOpts = {};
1362
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1363
- this.builder.addTooltip(data, overrides.tooltip);
1364
- // this.builder.addLegend();
1296
+ addPolar() {
1297
+ const polar = [];
1298
+ polar.push({
1299
+ radius: '65%',
1300
+ center: ["50%", "44%"],
1301
+ });
1302
+ this.result.polar = polar;
1365
1303
  }
1366
- makeSankey(data, overrides, opts = {}) {
1367
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
1368
- this.builder.reset();
1369
- // El orden importa, primero callbacks y despues componentes.
1370
- this.builder.setValueFormatter(valueFormatter);
1371
- this.builder.setPalette(palette);
1372
- this.builder.setColorResolver(colorResolver);
1373
- const product = this.builder.baseProduct;
1374
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1375
- // chart components
1376
- this.builder.addCommons();
1377
- const layoutOpts = {};
1378
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1379
- this.builder.addTooltip(data, overrides.tooltip);
1304
+ addXAxis(data, overrides, type = 'category') {
1305
+ const xAxis = [];
1306
+ const categoryAxisOptions = this.getCategoryAxisOptions(data, overrides);
1307
+ const valueAxisOptions = this.getValueAxisOptions(data, overrides);
1308
+ if (type == 'category') {
1309
+ xAxis.push(categoryAxisOptions);
1310
+ }
1311
+ else if (type == 'value') {
1312
+ xAxis.push(valueAxisOptions);
1313
+ }
1314
+ this.result.xAxis = xAxis;
1380
1315
  }
1381
- makeBoxplot(data, overrides, opts = {}) {
1382
- if (this.builder instanceof BoxPlotBuilder == false) {
1383
- return;
1316
+ addYAxis(data, overrides, type = 'value') {
1317
+ const yAxis = [];
1318
+ const categoryAxisOptions = this.getCategoryAxisOptions(data, overrides);
1319
+ const valueAxisOptions = this.getValueAxisOptions(data, overrides);
1320
+ if (type == 'category') {
1321
+ yAxis.push(categoryAxisOptions);
1384
1322
  }
1385
- const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1386
- x: 'value',
1387
- y: 'category',
1388
- }, } = opts;
1389
- this.builder.reset();
1390
- // El orden importa, primero callbacks y despues componentes.
1391
- this.builder.setValueFormatter(valueFormatter);
1392
- this.builder.setPalette(palette);
1393
- this.builder.setColorResolver(colorResolver);
1394
- const product = this.builder.baseProduct;
1395
- const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1396
- // chart components
1397
- this.builder.addCommons();
1398
- const layoutOpts = { axisTypes };
1399
- this.builder.addDataset(data);
1400
- this.builder.addSeries(data, seriesOverrides, layoutOpts);
1401
- this.builder.addXAxis(data, overrides.axis, axisTypes.x);
1402
- this.builder.addYAxis(data, overrides.axis, axisTypes.y);
1403
- this.builder.addTooltip(data, overrides.tooltip);
1404
- this.builder.addDataZoom();
1323
+ else if (type == 'value') {
1324
+ yAxis.push(valueAxisOptions);
1325
+ }
1326
+ this.result.yAxis = yAxis;
1405
1327
  }
1406
- }
1407
-
1408
- /**
1409
- * EchartsRingComponent
1410
- *
1411
- * Especialista en visualización de tipo Ring. Soporta multi-medidas y KPI central.
1412
- * @see {@link vs-echarts/docs/charts/ring-patterns.md}
1413
- */
1414
- class EchartsRingComponent extends BaseEchartsComponent {
1415
- baseSeriesOptions = {
1416
- type: 'pie',
1417
- center: ['50%', '50%'],
1418
- avoidLabelOverlap: true,
1419
- minAngle: 3,
1420
- selectedMode: 'single',
1421
- selectedOffset: 4,
1422
- itemStyle: {
1423
- borderColor: '#fff',
1424
- },
1425
- label: { show: false },
1426
- emphasis: {
1427
- scale: true,
1428
- scaleSize: 2,
1429
- },
1430
- select: {
1431
- itemStyle: {
1432
- borderColor: EChartsTokens.sBorderColor,
1433
- shadowColor: EChartsTokens.sShadowColor,
1434
- borderWidth: 1,
1435
- shadowBlur: 4,
1328
+ addRadiusAxis(data, overrides) {
1329
+ const radiusAxis = [];
1330
+ /** estilos exclusivos hardcodeados para el eje de valores del sistema de coordenadas polar*/
1331
+ const radiusAxisOverrides = {
1332
+ zlevel: 10,
1333
+ axisTick: {
1334
+ show: false,
1436
1335
  },
1437
- },
1438
- animationType: 'scale',
1439
- animationEasing: 'elasticOut',
1440
- };
1441
- baseProduct = {
1442
- chartKey: 'ring',
1443
- baseOptions: {
1444
- series: this.baseSeriesOptions,
1445
- }
1446
- };
1447
- builder = new RingBuilder(this.baseProduct);
1448
- director = new VSECDirector(this.builder);
1449
- lastSelectedSeriesIndex = null;
1450
- lastSelectedDataIndex = null;
1451
- selectedPercent = null;
1452
- currentGraphicText = '';
1453
- constructor() {
1454
- super();
1455
- }
1456
- make() {
1457
- const makeOpts = {
1458
- valueFormatter: this.valueFormatter,
1459
- palette: this.palette,
1460
- colorResolver: this.colorResolver,
1336
+ axisLabel: {
1337
+ margin: 2,
1338
+ fontSize: 8,
1339
+ align: 'right',
1340
+ rotate: 20,
1341
+ verticalAlign: 'top',
1342
+ },
1343
+ splitLine: {
1344
+ show: true,
1345
+ lineStyle: {
1346
+ opacity: 0.2,
1347
+ type: 'solid',
1348
+ }
1349
+ },
1350
+ axisLine: {
1351
+ lineStyle: {
1352
+ type: 'dashed',
1353
+ },
1354
+ }
1461
1355
  };
1462
- this.director.makeRing(this.data, this.optionsOverrides, makeOpts);
1356
+ const radialAxisOptions = getValueAxisOptions(radiusAxisOverrides);
1357
+ radiusAxis.push(radialAxisOptions);
1358
+ this.result.radiusAxis = radiusAxis;
1463
1359
  }
1464
- onInputChanges(changes) {
1465
- // Reset selection only if data changed
1466
- if (changes['data']) {
1467
- this.lastSelectedSeriesIndex = null;
1468
- this.lastSelectedDataIndex = null;
1469
- this.selectedPercent = null;
1470
- this.currentGraphicText = '';
1471
- }
1472
- super.onInputChanges(changes);
1360
+ addAngleAxis(data, overrides) {
1361
+ const angleAxis = [];
1362
+ const categoryAxisOptions = this.getCategoryAxisOptions(data, overrides);
1363
+ angleAxis.push(categoryAxisOptions);
1364
+ this.result.angleAxis = angleAxis;
1473
1365
  }
1474
- /**
1475
- * Maneja clics en los sectores del ring.
1476
- * Soporta múltiples series (anillos) y actualiza el KPI central.
1477
- */
1478
- onChartClick(event) {
1479
- if (this.chartInstance && event && event.dataIndex !== undefined) {
1480
- const isSameSelection = event.seriesIndex === this.lastSelectedSeriesIndex &&
1481
- event.dataIndex === this.lastSelectedDataIndex;
1482
- if (isSameSelection) {
1483
- // Toggle OFF
1484
- this.lastSelectedSeriesIndex = null;
1485
- this.lastSelectedDataIndex = null;
1486
- this.selectedPercent = null;
1487
- this.setGraphicText('');
1488
- }
1489
- else {
1490
- // SELECT
1491
- this.lastSelectedSeriesIndex = event.seriesIndex;
1492
- this.lastSelectedDataIndex = event.dataIndex;
1493
- this.selectedPercent = (event.percent !== undefined) ? event.percent + '%' : '';
1494
- this.setGraphicText(this.selectedPercent);
1366
+ addLegend() {
1367
+ this.result.legend = getLegendOptions();
1368
+ }
1369
+ // No-ops for ring charts
1370
+ addGraphic() { }
1371
+ addDataset(data) { }
1372
+ addDataZoom() {
1373
+ this.result.dataZoom = [
1374
+ {
1375
+ type: 'inside'
1376
+ },
1377
+ {
1378
+ type: 'slider',
1379
+ height: 20,
1380
+ bottom: 60
1495
1381
  }
1496
- this.chartClick.emit({
1497
- type: 'cross-filter',
1498
- data: {
1499
- category: event.name,
1500
- serie: event.seriesName,
1501
- value: event.value
1502
- }
1503
- });
1504
- }
1382
+ ];
1505
1383
  }
1506
- onChartMouseOver(event) {
1507
- if (this.selectedPercent === null && event && event.percent !== undefined) {
1508
- this.setGraphicText(event.percent + '%');
1384
+ getResult() {
1385
+ return this.result;
1386
+ }
1387
+ ;
1388
+ // Setters
1389
+ /**
1390
+ * Permite inyectar un formateador de valores externo.
1391
+ */
1392
+ setValueFormatter(formatter) {
1393
+ if (formatter) {
1394
+ this.valueFormatter = formatter;
1509
1395
  }
1510
1396
  }
1511
- onChartMouseOut(event) {
1512
- if (this.selectedPercent === null) {
1513
- this.setGraphicText('');
1397
+ /**
1398
+ * Permite inyectar una paleta de colores básica.
1399
+ */
1400
+ setPalette(palette) {
1401
+ if (palette) {
1402
+ this.palette = palette;
1514
1403
  }
1515
1404
  }
1516
1405
  /**
1517
- * Actualiza el texto del Graphic central y persiste la selección en el modelo de opciones.
1406
+ * Permite inyectar un resolver de colores dinámico.
1518
1407
  */
1519
- setGraphicText(text) {
1520
- this.currentGraphicText = text;
1521
- // Persistencia de GRAPHIC (KPI central)
1522
- this.chartInstance?.setOption({
1523
- graphic: {
1524
- style: {
1525
- text: this.currentGraphicText,
1526
- opacity: this.currentGraphicText ? 1 : 0,
1527
- }
1528
- }
1529
- });
1408
+ setColorResolver(resolver) {
1409
+ if (resolver) {
1410
+ this.colorResolver = resolver;
1411
+ }
1412
+ }
1413
+ // Utils
1414
+ getCategoryAxisOptions(data, overrides) {
1415
+ // No explicit data needed on category axis when using ECharts dataset
1416
+ const categoryAxisOptionsOverrides = {
1417
+ ...overrides.categoryAxis[0]
1418
+ };
1419
+ const categoryAxisOptions = getCategoryAxisOptions(categoryAxisOptionsOverrides);
1420
+ return categoryAxisOptions;
1421
+ }
1422
+ getValueAxisOptions(data, overrides) {
1423
+ const valueAxisOptions = getValueAxisOptions();
1424
+ return valueAxisOptions;
1530
1425
  }
1531
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsRingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1532
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EchartsRingComponent, isStandalone: true, selector: "vs-echarts-ring", usesInheritance: true, ngImport: i0, template: "<div class=\"echarts-container\" \n echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartMouseOver)=\"onChartMouseOver($event)\" \n (chartMouseOut)=\"onChartMouseOut($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n ", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
1533
1426
  }
1534
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsRingComponent, decorators: [{
1535
- type: Component,
1536
- args: [{ selector: 'vs-echarts-ring', standalone: true, imports: [
1537
- CommonModule,
1538
- NgxEchartsDirective,
1539
- ], template: "<div class=\"echarts-container\" \n echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartMouseOver)=\"onChartMouseOver($event)\" \n (chartMouseOut)=\"onChartMouseOut($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n ", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
1540
- }], ctorParameters: () => [] });
1541
1427
 
1542
1428
  /**
1543
1429
  * PieBuilder
@@ -1547,7 +1433,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
1547
1433
  */
1548
1434
  class PieBuilder {
1549
1435
  baseProduct;
1550
- valueFormatter = (value) => value.toLocaleString();
1436
+ valueFormatter = defaultValueFormatter;
1551
1437
  palette = [];
1552
1438
  colorResolver;
1553
1439
  result = {};
@@ -1659,10 +1545,10 @@ class PieBuilder {
1659
1545
  this.result.series = series;
1660
1546
  }
1661
1547
  addTooltip(data, overrides) {
1662
- merge(overrides, {
1663
- formatter: getTooltipFormatter(overrides.trigger, data, this.formatCellValue.bind(this)),
1664
- });
1665
- const tooltip = getTooltipOptions(overrides);
1548
+ const tooltipOptsOverrides = {};
1549
+ tooltipOptsOverrides.formatter = getTooltipFormatter(overrides.trigger, data, this.valueFormatter);
1550
+ merge(tooltipOptsOverrides, overrides);
1551
+ const tooltip = getTooltipOptions(tooltipOptsOverrides);
1666
1552
  this.result.tooltip = tooltip;
1667
1553
  }
1668
1554
  addLegend() {
@@ -1696,70 +1582,7 @@ class PieBuilder {
1696
1582
  getResult() {
1697
1583
  return this.result;
1698
1584
  }
1699
- formatCellValue(value, key) {
1700
- return this.valueFormatter(value, key);
1701
- }
1702
- }
1703
-
1704
- /**
1705
- * EchartsPieComponent
1706
- *
1707
- * Especialista en visualización de tipo Pie (Torta y Anillos concéntricos).
1708
- * La primera serie se dibuja como un gráfico de torta tradicional (lleno) y
1709
- * las subsecuentes como anillos concéntricos alrededor.
1710
- */
1711
- class EchartsPieComponent extends BaseEchartsComponent {
1712
- baseSeriesOptions = {
1713
- type: 'pie',
1714
- center: ['50%', '50%'],
1715
- avoidLabelOverlap: true,
1716
- minAngle: 3,
1717
- selectedMode: 'single',
1718
- selectedOffset: 4,
1719
- emphasis: {
1720
- scale: true,
1721
- scaleSize: 2,
1722
- },
1723
- select: {
1724
- itemStyle: {
1725
- borderColor: EChartsTokens.sBorderColor,
1726
- shadowColor: EChartsTokens.sShadowColor,
1727
- borderWidth: 1,
1728
- shadowBlur: 4,
1729
- },
1730
- },
1731
- animationType: 'scale',
1732
- animationEasing: 'elasticOut',
1733
- };
1734
- baseProduct = {
1735
- chartKey: 'pie',
1736
- baseOptions: {
1737
- series: this.baseSeriesOptions,
1738
- }
1739
- };
1740
- builder = new PieBuilder(this.baseProduct);
1741
- director = new VSECDirector(this.builder);
1742
- constructor() {
1743
- super();
1744
- }
1745
- make() {
1746
- const makeOpts = {
1747
- valueFormatter: this.valueFormatter,
1748
- palette: this.palette,
1749
- colorResolver: this.colorResolver,
1750
- };
1751
- this.director.makePie(this.data, this.optionsOverrides, makeOpts);
1752
- }
1753
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsPieComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1754
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EchartsPieComponent, isStandalone: true, selector: "vs-echarts-pie", usesInheritance: true, ngImport: i0, template: "<div\n class=\"echarts-container\"\n echarts\n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
1755
1585
  }
1756
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsPieComponent, decorators: [{
1757
- type: Component,
1758
- args: [{ selector: 'vs-echarts-pie', standalone: true, imports: [
1759
- CommonModule,
1760
- NgxEchartsDirective,
1761
- ], template: "<div\n class=\"echarts-container\"\n echarts\n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
1762
- }], ctorParameters: () => [] });
1763
1586
 
1764
1587
  /**
1765
1588
  * FunnelBuilder
@@ -1768,7 +1591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
1768
1591
  */
1769
1592
  class FunnelBuilder {
1770
1593
  baseProduct;
1771
- valueFormatter = (value) => value.toLocaleString();
1594
+ valueFormatter = defaultValueFormatter;
1772
1595
  palette = [];
1773
1596
  colorResolver;
1774
1597
  result = {};
@@ -1823,10 +1646,12 @@ class FunnelBuilder {
1823
1646
  this.result.series = seriesOption;
1824
1647
  }
1825
1648
  addTooltip(data, overrides) {
1826
- merge(overrides, {
1827
- formatter: getTooltipFormatter(overrides.trigger, data, this.formatCellValue.bind(this)),
1828
- });
1829
- const tooltip = getTooltipOptions(overrides);
1649
+ const tooltipOptsOverrides = {};
1650
+ if (this.valueFormatter != undefined) {
1651
+ tooltipOptsOverrides.formatter = getTooltipFormatter(overrides.trigger, data, this.valueFormatter);
1652
+ }
1653
+ merge(tooltipOptsOverrides, overrides);
1654
+ const tooltip = getTooltipOptions(tooltipOptsOverrides);
1830
1655
  this.result.tooltip = tooltip;
1831
1656
  }
1832
1657
  addLegend() {
@@ -1860,11 +1685,721 @@ class FunnelBuilder {
1860
1685
  getResult() {
1861
1686
  return this.result;
1862
1687
  }
1863
- formatCellValue(value, key) {
1864
- return this.valueFormatter(value, key);
1865
- }
1866
1688
  }
1867
1689
 
1690
+ class SunburstBuilder {
1691
+ baseProduct;
1692
+ valueFormatter = defaultValueFormatter;
1693
+ palette = [];
1694
+ colorResolver;
1695
+ result = {};
1696
+ constructor(baseProduct) {
1697
+ this.baseProduct = baseProduct;
1698
+ }
1699
+ reset() {
1700
+ this.result = {};
1701
+ }
1702
+ addSeries(data, overrides) {
1703
+ if (!data || !data.source || data.source.length === 0) {
1704
+ return;
1705
+ }
1706
+ const sunburstData = mapHierarchicalData(data.source, data.dimensions);
1707
+ const depth = getTreeDepth(sunburstData);
1708
+ const levels = [];
1709
+ for (let i = 0; i <= depth; i++) {
1710
+ levels.push({
1711
+ label: {
1712
+ show: false,
1713
+ },
1714
+ });
1715
+ }
1716
+ const dynamiSerieOptions = {
1717
+ name: '',
1718
+ data: sunburstData,
1719
+ levels: levels
1720
+ };
1721
+ const serie = merge$1({}, dynamiSerieOptions, overrides);
1722
+ if (this.colorResolver) {
1723
+ if (!serie.itemStyle) {
1724
+ serie.itemStyle = {};
1725
+ }
1726
+ serie.itemStyle.color = this.colorResolver;
1727
+ }
1728
+ this.result.series = serie;
1729
+ }
1730
+ addTooltip(data, overrides) {
1731
+ const tooltipOptsOverrides = {};
1732
+ tooltipOptsOverrides.formatter = getTooltipFormatter(overrides.trigger || 'item', data, this.valueFormatter);
1733
+ merge$1(tooltipOptsOverrides, overrides);
1734
+ const tooltip = getTooltipOptions(tooltipOptsOverrides);
1735
+ this.result.tooltip = tooltip;
1736
+ }
1737
+ addCommons() {
1738
+ const opts = {
1739
+ palette: this.palette,
1740
+ };
1741
+ merge$1(this.result, getCommons(opts));
1742
+ }
1743
+ getResult() {
1744
+ return this.result;
1745
+ }
1746
+ ;
1747
+ // No-ops
1748
+ addPolar() { }
1749
+ addXAxis(data, overrides, type) { }
1750
+ addYAxis(data, overrides, type) { }
1751
+ addRadiusAxis(data, overrides) { }
1752
+ addAngleAxis(data, overrides) { }
1753
+ addLegend() { }
1754
+ addDataZoom() { }
1755
+ addDataset(data, opts) { }
1756
+ addGraphic() { }
1757
+ // Setters
1758
+ /**
1759
+ * Permite inyectar un formateador de valores externo.
1760
+ */
1761
+ setValueFormatter(formatter) {
1762
+ if (formatter) {
1763
+ this.valueFormatter = formatter;
1764
+ }
1765
+ }
1766
+ /**
1767
+ * Permite inyectar una paleta de colores básica.
1768
+ */
1769
+ setPalette(palette) {
1770
+ if (palette) {
1771
+ this.palette = palette;
1772
+ }
1773
+ }
1774
+ /**
1775
+ * Permite inyectar un resolver de colores dinámico.
1776
+ */
1777
+ setColorResolver(resolver) {
1778
+ if (resolver) {
1779
+ this.colorResolver = resolver;
1780
+ }
1781
+ }
1782
+ }
1783
+
1784
+ /**
1785
+ * SankeyBuilder
1786
+ *
1787
+ * Builder concreto para el gráfico Sankey (diagrama de flujos de izquierda a derecha).
1788
+ */
1789
+ class SankeyBuilder {
1790
+ baseProduct;
1791
+ valueFormatter = defaultValueFormatter;
1792
+ palette = [];
1793
+ colorResolver;
1794
+ result = {};
1795
+ constructor(baseProduct) {
1796
+ this.baseProduct = baseProduct;
1797
+ }
1798
+ reset() {
1799
+ this.result = {};
1800
+ }
1801
+ addSeries(data, overrides) {
1802
+ if (!data || !data.source || data.source.length === 0) {
1803
+ return;
1804
+ }
1805
+ // Identificar medidas (todas las dimensiones excepto 'category')
1806
+ const measureKeys = data.dimensions
1807
+ .filter((d) => d.name !== "category")
1808
+ .map((d) => d.name);
1809
+ // Función auxiliar para sumarizar valores de medidas en caso de haber más de una
1810
+ const getNodeValue = (node) => {
1811
+ return measureKeys.reduce((sum, key) => sum + (Number(node[key]) || 0), 0);
1812
+ };
1813
+ const nodesMap = new Map();
1814
+ const linksMap = new Map();
1815
+ // Función recursiva para aplanar datos jerárquicos a nodos y enlaces
1816
+ const traverse = (nodeList, level, parentId) => {
1817
+ for (const node of nodeList) {
1818
+ const category = node.category;
1819
+ const currentId = `${category}___${level}`;
1820
+ const value = getNodeValue(node);
1821
+ nodesMap.set(currentId, (nodesMap.get(currentId) || 0) + value);
1822
+ if (parentId) {
1823
+ const linkKey = `${parentId}--->${currentId}`;
1824
+ if (linksMap.has(linkKey)) {
1825
+ linksMap.get(linkKey).value += value;
1826
+ }
1827
+ else {
1828
+ linksMap.set(linkKey, {
1829
+ source: parentId,
1830
+ target: currentId,
1831
+ value: value,
1832
+ });
1833
+ }
1834
+ }
1835
+ if (node.children && node.children.length > 0) {
1836
+ traverse(node.children, level + 1, currentId);
1837
+ }
1838
+ }
1839
+ };
1840
+ // Comenzar el recorrido en el nivel 0
1841
+ traverse(data.source, 0);
1842
+ // al menos un nivel de links para dibujar.
1843
+ if (linksMap.size === 0)
1844
+ return;
1845
+ // Mapear nodos acumulados a la estructura requerida por ECharts (name y opcionalmente color, sin value redundante)
1846
+ const nodes = Array.from(nodesMap.keys()).map((currentId) => {
1847
+ const category = currentId.split("___")[0];
1848
+ const nodeItem = {
1849
+ name: currentId,
1850
+ };
1851
+ if (this.colorResolver) {
1852
+ const color = this.colorResolver({ name: category, data: nodeItem });
1853
+ if (color) {
1854
+ nodeItem.itemStyle = { color };
1855
+ }
1856
+ }
1857
+ return nodeItem;
1858
+ });
1859
+ const dynamicSerieOptions = {
1860
+ type: "sankey",
1861
+ orient: "horizontal", // De izquierda a derecha
1862
+ draggable: true,
1863
+ emphasis: {
1864
+ focus: "adjacency",
1865
+ },
1866
+ lineStyle: {
1867
+ color: "source",
1868
+ opacity: 0.25,
1869
+ curveness: 0.5,
1870
+ },
1871
+ label: {
1872
+ show: true,
1873
+ position: "right",
1874
+ fontFamily: "'Inter', 'Roboto', 'Open Sans', sans-serif",
1875
+ fontSize: 10,
1876
+ formatter: (params) => {
1877
+ // Remover el sufijo de nivel de la etiqueta visual
1878
+ return params.name.split("___")[0];
1879
+ },
1880
+ },
1881
+ roam: true,
1882
+ data: nodes,
1883
+ links: Array.from(linksMap.values()),
1884
+ };
1885
+ const serie = merge$1({}, dynamicSerieOptions, overrides);
1886
+ if (this.colorResolver && !serie.itemStyle) {
1887
+ serie.itemStyle = {};
1888
+ }
1889
+ if (this.colorResolver && serie.itemStyle) {
1890
+ serie.itemStyle.color = this.colorResolver;
1891
+ }
1892
+ this.result.series = serie;
1893
+ }
1894
+ addTooltip(data, overrides) {
1895
+ const tooltipOptsOverrides = {};
1896
+ tooltipOptsOverrides.formatter = getTooltipFormatter(overrides.trigger || 'item', data, this.valueFormatter);
1897
+ merge$1(tooltipOptsOverrides, overrides);
1898
+ const tooltip = getTooltipOptions(tooltipOptsOverrides);
1899
+ this.result.tooltip = tooltip;
1900
+ }
1901
+ addPolar() { }
1902
+ addXAxis(data, overrides, type) { }
1903
+ addYAxis(data, overrides, type) { }
1904
+ addRadiusAxis(data, overrides) { }
1905
+ addAngleAxis(data, overrides) { }
1906
+ addLegend() { }
1907
+ addDataZoom() { }
1908
+ addDataset(data, opts) { }
1909
+ addCommons() {
1910
+ const opts = {
1911
+ palette: this.palette,
1912
+ };
1913
+ merge$1(this.result, getCommons(opts));
1914
+ }
1915
+ addGraphic() { }
1916
+ getResult() {
1917
+ return this.result;
1918
+ }
1919
+ setValueFormatter(formatter) {
1920
+ if (formatter) {
1921
+ this.valueFormatter = formatter;
1922
+ }
1923
+ }
1924
+ setPalette(palette) {
1925
+ if (palette) {
1926
+ this.palette = palette;
1927
+ }
1928
+ }
1929
+ setColorResolver(resolver) {
1930
+ if (resolver) {
1931
+ this.colorResolver = resolver;
1932
+ }
1933
+ }
1934
+ }
1935
+
1936
+ /**
1937
+ * Director de Builds.
1938
+ */
1939
+ class VSECDirector {
1940
+ builder = undefined;
1941
+ constructor(builder) {
1942
+ this.builder = builder;
1943
+ }
1944
+ makeBar(data, overrides, opts = {}) {
1945
+ if (this.builder instanceof EChartBuilder == false) {
1946
+ return;
1947
+ }
1948
+ ;
1949
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1950
+ x: 'category',
1951
+ y: 'value',
1952
+ // TODO agregar radius y angle axis
1953
+ } } = opts;
1954
+ this.builder.reset();
1955
+ // El orden importa, primero callbacks y despues componentes.
1956
+ // chart callbaks
1957
+ if (valueFormatter)
1958
+ this.builder.setValueFormatter(valueFormatter);
1959
+ if (palette)
1960
+ this.builder.setPalette(palette);
1961
+ if (colorResolver)
1962
+ this.builder.setColorResolver(colorResolver);
1963
+ const product = this.builder.baseProduct;
1964
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1965
+ // chart components
1966
+ this.builder.addCommons();
1967
+ const seriesOptions = { axisTypes };
1968
+ this.builder.addSeries(data, seriesOverrides, seriesOptions);
1969
+ this.builder.addXAxis(data, overrides.axis, axisTypes.x);
1970
+ this.builder.addYAxis(data, overrides.axis, axisTypes.y);
1971
+ this.builder.addTooltip(data, overrides.tooltip);
1972
+ this.builder.addLegend();
1973
+ }
1974
+ makeBarRadial(data, overrides, opts = {}) {
1975
+ if (this.builder instanceof EChartBuilder == false) {
1976
+ return;
1977
+ }
1978
+ ;
1979
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
1980
+ x: 'category',
1981
+ y: 'value',
1982
+ // TODO agregar radius y angle axis
1983
+ } } = opts;
1984
+ this.builder.reset();
1985
+ // El orden importa, primero callbacks y despues componentes.
1986
+ // chart callbaks
1987
+ if (valueFormatter)
1988
+ this.builder.setValueFormatter(valueFormatter);
1989
+ if (palette)
1990
+ this.builder.setPalette(palette);
1991
+ if (colorResolver)
1992
+ this.builder.setColorResolver(colorResolver);
1993
+ const product = this.builder.baseProduct;
1994
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
1995
+ // chart components
1996
+ this.builder.addCommons();
1997
+ const seriesOptions = { axisTypes, coordinateSystem: 'polar' };
1998
+ this.builder.addSeries(data, seriesOverrides, seriesOptions);
1999
+ this.builder.addPolar();
2000
+ this.builder.addAngleAxis(data, overrides['axis']);
2001
+ this.builder.addRadiusAxis(data, overrides['axis']);
2002
+ this.builder.addTooltip(data, overrides.tooltip);
2003
+ this.builder.addLegend();
2004
+ }
2005
+ makeLine(data, overrides, opts = {}) {
2006
+ if (this.builder instanceof EChartBuilder == false) {
2007
+ return;
2008
+ }
2009
+ ;
2010
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
2011
+ x: 'category',
2012
+ y: 'value',
2013
+ // TODO agregar radius y angle axis
2014
+ } } = opts;
2015
+ this.builder.reset();
2016
+ // El orden importa, primero callbacks y despues componentes.
2017
+ // chart callbaks
2018
+ if (valueFormatter)
2019
+ this.builder.setValueFormatter(valueFormatter);
2020
+ if (palette)
2021
+ this.builder.setPalette(palette);
2022
+ if (colorResolver)
2023
+ this.builder.setColorResolver(colorResolver);
2024
+ const product = this.builder.baseProduct;
2025
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2026
+ // chart components
2027
+ this.builder.addCommons();
2028
+ const seriesOptions = { axisTypes };
2029
+ this.builder.addSeries(data, seriesOverrides, seriesOptions);
2030
+ this.builder.addXAxis(data, overrides.axis, axisTypes.x);
2031
+ this.builder.addYAxis(data, overrides.axis, axisTypes.y);
2032
+ this.builder.addTooltip(data, overrides.tooltip);
2033
+ this.builder.addLegend();
2034
+ }
2035
+ makeScatter(data, overrides, opts = {}) {
2036
+ if (this.builder instanceof EChartBuilder == false) {
2037
+ return;
2038
+ }
2039
+ ;
2040
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
2041
+ x: 'category',
2042
+ y: 'value',
2043
+ } } = opts;
2044
+ this.builder.reset();
2045
+ // El orden importa, primero callbacks y despues componentes.
2046
+ // chart callbaks
2047
+ if (valueFormatter)
2048
+ this.builder.setValueFormatter(valueFormatter);
2049
+ if (palette)
2050
+ this.builder.setPalette(palette);
2051
+ if (colorResolver)
2052
+ this.builder.setColorResolver(colorResolver);
2053
+ const product = this.builder.baseProduct;
2054
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2055
+ // chart components
2056
+ this.builder.addCommons();
2057
+ const seriesOptions = { axisTypes };
2058
+ this.builder.addSeries(data, seriesOverrides, seriesOptions);
2059
+ this.builder.addXAxis(data, overrides.axis, axisTypes.x);
2060
+ this.builder.addYAxis(data, overrides.axis, axisTypes.y);
2061
+ this.builder.addTooltip(data, overrides.tooltip);
2062
+ this.builder.addLegend();
2063
+ }
2064
+ makeRing(data, overrides, opts = {}) {
2065
+ if (this.builder instanceof RingBuilder == false) {
2066
+ return;
2067
+ }
2068
+ ;
2069
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
2070
+ this.builder.reset();
2071
+ // El orden importa, primero callbacks y despues componentes.
2072
+ // chart callbaks
2073
+ if (valueFormatter)
2074
+ this.builder.setValueFormatter(valueFormatter);
2075
+ if (palette)
2076
+ this.builder.setPalette(palette);
2077
+ if (colorResolver)
2078
+ this.builder.setColorResolver(colorResolver);
2079
+ const product = this.builder.baseProduct;
2080
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2081
+ // chart components
2082
+ this.builder.addCommons();
2083
+ this.builder.addSeries(data, seriesOverrides);
2084
+ this.builder.addGraphic();
2085
+ this.builder.addTooltip(data, overrides.tooltip);
2086
+ this.builder.addLegend();
2087
+ }
2088
+ makePie(data, overrides, opts = {}) {
2089
+ if (this.builder instanceof PieBuilder == false) {
2090
+ return;
2091
+ }
2092
+ ;
2093
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
2094
+ this.builder.reset();
2095
+ // El orden importa, primero callbacks y despues componentes.
2096
+ // chart callbaks
2097
+ if (valueFormatter)
2098
+ this.builder.setValueFormatter(valueFormatter);
2099
+ if (palette)
2100
+ this.builder.setPalette(palette);
2101
+ if (colorResolver)
2102
+ this.builder.setColorResolver(colorResolver);
2103
+ const product = this.builder.baseProduct;
2104
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2105
+ // chart components
2106
+ this.builder.addCommons();
2107
+ this.builder.addSeries(data, seriesOverrides);
2108
+ this.builder.addTooltip(data, overrides.tooltip);
2109
+ this.builder.addLegend();
2110
+ }
2111
+ makeFunnel(data, overrides, opts = {}) {
2112
+ if (this.builder instanceof FunnelBuilder == false) {
2113
+ return;
2114
+ }
2115
+ ;
2116
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
2117
+ this.builder.reset();
2118
+ // El orden importa, primero callbacks y despues componentes.
2119
+ // chart callbaks
2120
+ if (valueFormatter)
2121
+ this.builder.setValueFormatter(valueFormatter);
2122
+ if (palette)
2123
+ this.builder.setPalette(palette);
2124
+ if (colorResolver)
2125
+ this.builder.setColorResolver(colorResolver);
2126
+ const product = this.builder.baseProduct;
2127
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2128
+ // chart components
2129
+ this.builder.addCommons();
2130
+ this.builder.addSeries(data, seriesOverrides);
2131
+ this.builder.addTooltip(data, overrides.tooltip);
2132
+ this.builder.addLegend();
2133
+ }
2134
+ makeSunburst(data, overrides, opts = {}) {
2135
+ if (this.builder instanceof SunburstBuilder == false) {
2136
+ return;
2137
+ }
2138
+ ;
2139
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
2140
+ this.builder.reset();
2141
+ // El orden importa, primero callbacks y despues componentes.
2142
+ // chart callbaks
2143
+ if (valueFormatter)
2144
+ this.builder.setValueFormatter(valueFormatter);
2145
+ if (palette)
2146
+ this.builder.setPalette(palette);
2147
+ if (colorResolver)
2148
+ this.builder.setColorResolver(colorResolver);
2149
+ const product = this.builder.baseProduct;
2150
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2151
+ // chart components
2152
+ this.builder.addCommons();
2153
+ this.builder.addSeries(data, seriesOverrides);
2154
+ this.builder.addTooltip(data, overrides.tooltip);
2155
+ }
2156
+ makeSankey(data, overrides, opts = {}) {
2157
+ if (this.builder instanceof SankeyBuilder == false) {
2158
+ return;
2159
+ }
2160
+ ;
2161
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, } = opts;
2162
+ this.builder.reset();
2163
+ // El orden importa, primero callbacks y despues componentes.
2164
+ // chart callbaks
2165
+ if (valueFormatter)
2166
+ this.builder.setValueFormatter(valueFormatter);
2167
+ if (palette)
2168
+ this.builder.setPalette(palette);
2169
+ if (colorResolver)
2170
+ this.builder.setColorResolver(colorResolver);
2171
+ const product = this.builder.baseProduct;
2172
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2173
+ // chart components
2174
+ this.builder.addCommons();
2175
+ this.builder.addSeries(data, seriesOverrides);
2176
+ this.builder.addTooltip(data, overrides.tooltip);
2177
+ }
2178
+ makeBoxplot(data, overrides, opts = {}) {
2179
+ if (this.builder instanceof BoxPlotBuilder == false) {
2180
+ return;
2181
+ }
2182
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
2183
+ x: 'value',
2184
+ y: 'category',
2185
+ }, } = opts;
2186
+ this.builder.reset();
2187
+ // El orden importa, primero callbacks y despues componentes.
2188
+ // chart callbaks
2189
+ if (valueFormatter)
2190
+ this.builder.setValueFormatter(valueFormatter);
2191
+ if (palette)
2192
+ this.builder.setPalette(palette);
2193
+ if (colorResolver)
2194
+ this.builder.setColorResolver(colorResolver);
2195
+ const product = this.builder.baseProduct;
2196
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2197
+ // chart components
2198
+ this.builder.addCommons();
2199
+ const configOpts = { axisTypes };
2200
+ this.builder.addDataset(data);
2201
+ this.builder.addSeries(data, seriesOverrides, configOpts);
2202
+ this.builder.addXAxis(data, overrides.axis, axisTypes.x);
2203
+ this.builder.addYAxis(data, overrides.axis, axisTypes.y);
2204
+ this.builder.addTooltip(data, overrides.tooltip);
2205
+ this.builder.addDataZoom();
2206
+ }
2207
+ }
2208
+
2209
+ /**
2210
+ * EchartsRingComponent
2211
+ *
2212
+ * Especialista en visualización de tipo Ring. Soporta multi-medidas y KPI central.
2213
+ * @see {@link vs-echarts/docs/charts/ring-patterns.md}
2214
+ */
2215
+ class EchartsRingComponent extends BaseEchartsComponent {
2216
+ baseSeriesOptions = {
2217
+ type: 'pie',
2218
+ center: ['50%', '50%'],
2219
+ avoidLabelOverlap: true,
2220
+ minAngle: 3,
2221
+ selectedMode: 'single',
2222
+ selectedOffset: 4,
2223
+ itemStyle: {
2224
+ borderColor: '#fff',
2225
+ },
2226
+ label: { show: false },
2227
+ emphasis: {
2228
+ scale: true,
2229
+ scaleSize: 2,
2230
+ },
2231
+ select: {
2232
+ itemStyle: {
2233
+ borderColor: EChartsTokens.sBorderColor,
2234
+ shadowColor: EChartsTokens.sShadowColor,
2235
+ borderWidth: 1,
2236
+ shadowBlur: 4,
2237
+ },
2238
+ },
2239
+ animationType: 'scale',
2240
+ animationEasing: 'elasticOut',
2241
+ };
2242
+ baseProduct = {
2243
+ chartKey: 'ring',
2244
+ baseOptions: {
2245
+ series: this.baseSeriesOptions,
2246
+ }
2247
+ };
2248
+ builder = new RingBuilder(this.baseProduct);
2249
+ director = new VSECDirector(this.builder);
2250
+ lastSelectedSeriesIndex = null;
2251
+ lastSelectedDataIndex = null;
2252
+ selectedPercent = null;
2253
+ currentGraphicText = '';
2254
+ constructor() {
2255
+ super();
2256
+ }
2257
+ make() {
2258
+ const makeOpts = {
2259
+ valueFormatter: this.valueFormatter,
2260
+ palette: this.palette,
2261
+ colorResolver: this.colorResolver,
2262
+ };
2263
+ this.director.makeRing(this.data, this.optionsOverrides, makeOpts);
2264
+ }
2265
+ onInputChanges(changes) {
2266
+ // Reset selection only if data changed
2267
+ if (changes['data']) {
2268
+ this.lastSelectedSeriesIndex = null;
2269
+ this.lastSelectedDataIndex = null;
2270
+ this.selectedPercent = null;
2271
+ this.currentGraphicText = '';
2272
+ }
2273
+ super.onInputChanges(changes);
2274
+ }
2275
+ /**
2276
+ * Maneja clics en los sectores del ring.
2277
+ * Soporta múltiples series (anillos) y actualiza el KPI central.
2278
+ */
2279
+ onChartClick(event) {
2280
+ if (this.chartInstance && event && event.dataIndex !== undefined) {
2281
+ const isSameSelection = event.seriesIndex === this.lastSelectedSeriesIndex &&
2282
+ event.dataIndex === this.lastSelectedDataIndex;
2283
+ if (isSameSelection) {
2284
+ // Toggle OFF
2285
+ this.lastSelectedSeriesIndex = null;
2286
+ this.lastSelectedDataIndex = null;
2287
+ this.selectedPercent = null;
2288
+ this.setGraphicText('');
2289
+ }
2290
+ else {
2291
+ // SELECT
2292
+ this.lastSelectedSeriesIndex = event.seriesIndex;
2293
+ this.lastSelectedDataIndex = event.dataIndex;
2294
+ this.selectedPercent = (event.percent !== undefined) ? event.percent + '%' : '';
2295
+ this.setGraphicText(this.selectedPercent);
2296
+ }
2297
+ this.chartClick.emit({
2298
+ type: 'cross-filter',
2299
+ data: {
2300
+ category: event.name,
2301
+ serie: event.seriesName,
2302
+ value: event.value
2303
+ }
2304
+ });
2305
+ }
2306
+ }
2307
+ onChartMouseOver(event) {
2308
+ if (this.selectedPercent === null && event && event.percent !== undefined) {
2309
+ this.setGraphicText(event.percent + '%');
2310
+ }
2311
+ }
2312
+ onChartMouseOut(event) {
2313
+ if (this.selectedPercent === null) {
2314
+ this.setGraphicText('');
2315
+ }
2316
+ }
2317
+ /**
2318
+ * Actualiza el texto del Graphic central y persiste la selección en el modelo de opciones.
2319
+ */
2320
+ setGraphicText(text) {
2321
+ this.currentGraphicText = text;
2322
+ // Persistencia de GRAPHIC (KPI central)
2323
+ this.chartInstance?.setOption({
2324
+ graphic: {
2325
+ style: {
2326
+ text: this.currentGraphicText,
2327
+ opacity: this.currentGraphicText ? 1 : 0,
2328
+ }
2329
+ }
2330
+ });
2331
+ }
2332
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsRingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2333
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EchartsRingComponent, isStandalone: true, selector: "vs-echarts-ring", usesInheritance: true, ngImport: i0, template: "<div class=\"echarts-container\" \n echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartMouseOver)=\"onChartMouseOver($event)\" \n (chartMouseOut)=\"onChartMouseOut($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n ", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
2334
+ }
2335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsRingComponent, decorators: [{
2336
+ type: Component,
2337
+ args: [{ selector: 'vs-echarts-ring', standalone: true, imports: [
2338
+ CommonModule,
2339
+ NgxEchartsDirective,
2340
+ ], template: "<div class=\"echarts-container\" \n echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartMouseOver)=\"onChartMouseOver($event)\" \n (chartMouseOut)=\"onChartMouseOut($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n ", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
2341
+ }], ctorParameters: () => [] });
2342
+
2343
+ /**
2344
+ * EchartsPieComponent
2345
+ *
2346
+ * Especialista en visualización de tipo Pie (Torta y Anillos concéntricos).
2347
+ * La primera serie se dibuja como un gráfico de torta tradicional (lleno) y
2348
+ * las subsecuentes como anillos concéntricos alrededor.
2349
+ */
2350
+ class EchartsPieComponent extends BaseEchartsComponent {
2351
+ baseSeriesOptions = {
2352
+ type: 'pie',
2353
+ center: ['50%', '50%'],
2354
+ avoidLabelOverlap: true,
2355
+ minAngle: 3,
2356
+ selectedMode: 'single',
2357
+ selectedOffset: 4,
2358
+ emphasis: {
2359
+ scale: true,
2360
+ scaleSize: 2,
2361
+ },
2362
+ select: {
2363
+ itemStyle: {
2364
+ borderColor: EChartsTokens.sBorderColor,
2365
+ shadowColor: EChartsTokens.sShadowColor,
2366
+ borderWidth: 1,
2367
+ shadowBlur: 4,
2368
+ },
2369
+ },
2370
+ animationType: 'scale',
2371
+ animationEasing: 'elasticOut',
2372
+ };
2373
+ baseProduct = {
2374
+ chartKey: 'pie',
2375
+ baseOptions: {
2376
+ series: this.baseSeriesOptions,
2377
+ }
2378
+ };
2379
+ builder = new PieBuilder(this.baseProduct);
2380
+ director = new VSECDirector(this.builder);
2381
+ constructor() {
2382
+ super();
2383
+ }
2384
+ make() {
2385
+ const makeOpts = {
2386
+ valueFormatter: this.valueFormatter,
2387
+ palette: this.palette,
2388
+ colorResolver: this.colorResolver,
2389
+ };
2390
+ this.director.makePie(this.data, this.optionsOverrides, makeOpts);
2391
+ }
2392
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsPieComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2393
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EchartsPieComponent, isStandalone: true, selector: "vs-echarts-pie", usesInheritance: true, ngImport: i0, template: "<div\n class=\"echarts-container\"\n echarts\n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
2394
+ }
2395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsPieComponent, decorators: [{
2396
+ type: Component,
2397
+ args: [{ selector: 'vs-echarts-pie', standalone: true, imports: [
2398
+ CommonModule,
2399
+ NgxEchartsDirective,
2400
+ ], template: "<div\n class=\"echarts-container\"\n echarts\n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
2401
+ }], ctorParameters: () => [] });
2402
+
1868
2403
  /**
1869
2404
  * EchartsFunnelComponent
1870
2405
  *
@@ -1922,253 +2457,21 @@ class EchartsFunnelComponent extends BaseEchartsComponent {
1922
2457
  make() {
1923
2458
  const makeOpts = {
1924
2459
  valueFormatter: this.valueFormatter,
1925
- palette: this.palette,
1926
- colorResolver: this.colorResolver,
1927
- };
1928
- this.director.makeFunnel(this.data, this.optionsOverrides, makeOpts);
1929
- }
1930
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsFunnelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1931
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EchartsFunnelComponent, isStandalone: true, selector: "vs-echarts-funnel", usesInheritance: true, ngImport: i0, template: "<div class=\"echarts-container\" echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\" \n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
1932
- }
1933
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsFunnelComponent, decorators: [{
1934
- type: Component,
1935
- args: [{ selector: 'vs-echarts-funnel', standalone: true, imports: [
1936
- CommonModule,
1937
- NgxEchartsDirective,
1938
- ], template: "<div class=\"echarts-container\" echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\" \n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
1939
- }], ctorParameters: () => [] });
1940
-
1941
- /**
1942
- * Builder principal.
1943
- *
1944
- * Es muy completo, tiene soporte para ejes y sistema cartesiano polar.
1945
- *
1946
- * Puede verse utilizado en graficos como Lineas y Bars. Siempre que se pueda priorizar utilizar este.
1947
- */
1948
- class EChartBuilder {
1949
- baseProduct = undefined;
1950
- valueFormatter = (value) => value.toLocaleString();
1951
- palette = [];
1952
- // TODO: Hay que implementar un valor por defecto.
1953
- colorResolver;
1954
- result = {};
1955
- constructor(baseProduct) {
1956
- this.baseProduct = baseProduct;
1957
- }
1958
- reset() {
1959
- this.result = {};
1960
- }
1961
- addCommons() {
1962
- const opts = {
1963
- palette: this.palette,
1964
- };
1965
- merge$1(this.result, getCommons(opts));
1966
- }
1967
- /**
1968
- *
1969
- * @param data
1970
- * @param overrides
1971
- * @returns
1972
- */
1973
- addSeries(data, overrides, opts) {
1974
- if (!data || !data.dimensions || !data.source || data.source.length === 0)
1975
- return;
1976
- this.result.dataset = {
1977
- dimensions: data.dimensions,
1978
- source: data.source
1979
- };
1980
- const measureDims = data.dimensions.filter(d => d.name !== 'category');
1981
- const isPolar = opts?.coordinateSystem === 'polar';
1982
- const isHorizontal = opts?.axisTypes?.x === 'value' && opts?.axisTypes?.y === 'category';
1983
- const series = measureDims.map((dim) => {
1984
- const friendlyName = dim.displayName || dim.name;
1985
- const dimKey = dim.name;
1986
- let encode = {
1987
- x: 'category',
1988
- y: dimKey
1989
- };
1990
- if (isPolar) {
1991
- encode = {
1992
- angle: 'category',
1993
- radius: dimKey
1994
- };
1995
- }
1996
- else if (isHorizontal) {
1997
- encode = {
1998
- x: dimKey,
1999
- y: 'category'
2000
- };
2001
- }
2002
- const dynamicOverrides = {
2003
- name: friendlyName,
2004
- encode,
2005
- label: {
2006
- formatter: (params) => {
2007
- const row = params.value;
2008
- const rawValue = (row && typeof row === 'object') ? row[dimKey] : params.value;
2009
- return this.formatCellValue(Number(rawValue ?? 0), dimKey);
2010
- }
2011
- }
2012
- };
2013
- const seriesOption = merge$1(dynamicOverrides, overrides);
2014
- // Inyectar el resolver de color si existe
2015
- if (this.colorResolver && seriesOption.itemStyle) {
2016
- seriesOption.itemStyle.color = this.colorResolver;
2017
- }
2018
- return seriesOption;
2019
- });
2020
- this.result.series = series;
2021
- }
2022
- /**
2023
- * TODO: Mejorar funcion, no me convence como se implemento el tooltip formatter.
2024
- * @param data
2025
- * @param overrides
2026
- */
2027
- addTooltip(data, overrides) {
2028
- // inyecto formateador a overrides de tooltip
2029
- merge$1(overrides, {
2030
- formatter: getTooltipFormatter(overrides.trigger, data, this.formatCellValue.bind(this)),
2031
- });
2032
- const tooltip = getTooltipOptions(overrides);
2033
- this.result.tooltip = tooltip;
2034
- }
2035
- addPolar() {
2036
- const polar = [];
2037
- polar.push({
2038
- radius: '65%',
2039
- center: ["50%", "44%"],
2040
- });
2041
- this.result.polar = polar;
2042
- }
2043
- addXAxis(data, overrides, type = 'category') {
2044
- const xAxis = [];
2045
- const categoryAxisOptions = this.getCategoryAxisOptions(data, overrides);
2046
- const valueAxisOptions = this.getValueAxisOptions(data, overrides);
2047
- if (type == 'category') {
2048
- xAxis.push(categoryAxisOptions);
2049
- }
2050
- else if (type == 'value') {
2051
- xAxis.push(valueAxisOptions);
2052
- }
2053
- this.result.xAxis = xAxis;
2054
- }
2055
- addYAxis(data, overrides, type = 'value') {
2056
- const yAxis = [];
2057
- const categoryAxisOptions = this.getCategoryAxisOptions(data, overrides);
2058
- const valueAxisOptions = this.getValueAxisOptions(data, overrides);
2059
- if (type == 'category') {
2060
- yAxis.push(categoryAxisOptions);
2061
- }
2062
- else if (type == 'value') {
2063
- yAxis.push(valueAxisOptions);
2064
- }
2065
- this.result.yAxis = yAxis;
2066
- }
2067
- addRadiusAxis(data, overrides) {
2068
- const radiusAxis = [];
2069
- /** estilos exclusivos hardcodeados para el eje de valores del sistema de coordenadas polar*/
2070
- const radiusAxisOverrides = {
2071
- zlevel: 10,
2072
- axisTick: {
2073
- show: false,
2074
- },
2075
- axisLabel: {
2076
- margin: 2,
2077
- fontSize: 8,
2078
- align: 'right',
2079
- rotate: 20,
2080
- verticalAlign: 'top',
2081
- },
2082
- splitLine: {
2083
- show: true,
2084
- lineStyle: {
2085
- opacity: 0.2,
2086
- type: 'solid',
2087
- }
2088
- },
2089
- axisLine: {
2090
- lineStyle: {
2091
- type: 'dashed',
2092
- },
2093
- }
2094
- };
2095
- const radialAxisOptions = getValueAxisOptions(radiusAxisOverrides);
2096
- radiusAxis.push(radialAxisOptions);
2097
- this.result.radiusAxis = radiusAxis;
2098
- }
2099
- addAngleAxis(data, overrides) {
2100
- const angleAxis = [];
2101
- const categoryAxisOptions = this.getCategoryAxisOptions(data, overrides);
2102
- angleAxis.push(categoryAxisOptions);
2103
- this.result.angleAxis = angleAxis;
2104
- }
2105
- addLegend() {
2106
- this.result.legend = getLegendOptions();
2107
- }
2108
- // No-ops for ring charts
2109
- addGraphic() { }
2110
- addDataset(data, opts) { }
2111
- addDataZoom() {
2112
- this.result.dataZoom = [
2113
- {
2114
- type: 'inside'
2115
- },
2116
- {
2117
- type: 'slider',
2118
- height: 20,
2119
- bottom: 60
2120
- }
2121
- ];
2122
- }
2123
- getResult() {
2124
- return this.result;
2125
- }
2126
- ;
2127
- /**
2128
- * Formatea un valor utilizando el callback inyectado.
2129
- */
2130
- formatCellValue(value, key) {
2131
- return this.valueFormatter(value, key);
2132
- }
2133
- // Setters
2134
- /**
2135
- * Permite inyectar un formateador de valores externo.
2136
- */
2137
- setValueFormatter(formatter) {
2138
- if (formatter) {
2139
- this.valueFormatter = formatter;
2140
- }
2141
- }
2142
- /**
2143
- * Permite inyectar una paleta de colores básica.
2144
- */
2145
- setPalette(palette) {
2146
- if (palette) {
2147
- this.palette = palette;
2148
- }
2149
- }
2150
- /**
2151
- * Permite inyectar un resolver de colores dinámico.
2152
- */
2153
- setColorResolver(resolver) {
2154
- if (resolver) {
2155
- this.colorResolver = resolver;
2156
- }
2157
- }
2158
- // Utils
2159
- getCategoryAxisOptions(data, overrides) {
2160
- // No explicit data needed on category axis when using ECharts dataset
2161
- const categoryAxisOptionsOverrides = {
2162
- ...overrides.categoryAxis[0]
2460
+ palette: this.palette,
2461
+ colorResolver: this.colorResolver,
2163
2462
  };
2164
- const categoryAxisOptions = getCategoryAxisOptions(categoryAxisOptionsOverrides);
2165
- return categoryAxisOptions;
2166
- }
2167
- getValueAxisOptions(data, overrides) {
2168
- const valueAxisOptions = getValueAxisOptions();
2169
- return valueAxisOptions;
2463
+ this.director.makeFunnel(this.data, this.optionsOverrides, makeOpts);
2170
2464
  }
2465
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsFunnelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2466
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EchartsFunnelComponent, isStandalone: true, selector: "vs-echarts-funnel", usesInheritance: true, ngImport: i0, template: "<div class=\"echarts-container\" echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\" \n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
2171
2467
  }
2468
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EchartsFunnelComponent, decorators: [{
2469
+ type: Component,
2470
+ args: [{ selector: 'vs-echarts-funnel', standalone: true, imports: [
2471
+ CommonModule,
2472
+ NgxEchartsDirective,
2473
+ ], template: "<div class=\"echarts-container\" echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\" \n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event, { fixPieDataIndexInside: true })\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
2474
+ }], ctorParameters: () => [] });
2172
2475
 
2173
2476
  class EchartsBarComponent extends BaseEchartsComponent {
2174
2477
  /**
@@ -2570,100 +2873,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
2570
2873
  ], template: "<div class=\"echarts-container\" echarts \n [options]=\"{}\"\n [initOpts]=\"initOptions\" \n [autoResize]=\"true\" \n (chartInit)=\"onChartInit($event)\" \n (chartClick)=\"onChartClick($event)\" \n (chartSelectChanged)=\"onChartSelectChanged($event)\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
2571
2874
  }], ctorParameters: () => [] });
2572
2875
 
2573
- class SunburstBuilder {
2574
- baseProduct;
2575
- valueFormatter = (value) => value.toLocaleString();
2576
- palette = [];
2577
- // TODO: Hay que implementar un valor por defecto.
2578
- colorResolver;
2579
- result = {};
2580
- constructor(baseProduct) {
2581
- this.baseProduct = baseProduct;
2582
- }
2583
- reset() {
2584
- this.result = {};
2585
- }
2586
- addSeries(data, overrides) {
2587
- if (!data || !data.source || data.source.length === 0) {
2588
- return;
2589
- }
2590
- const sunburstData = mapHierarchicalData(data.source, data.dimensions);
2591
- const depth = getTreeDepth(sunburstData);
2592
- const levels = [];
2593
- for (let i = 0; i <= depth; i++) {
2594
- levels.push({
2595
- label: {
2596
- show: false,
2597
- },
2598
- });
2599
- }
2600
- const dynamiSerieOptions = {
2601
- name: '',
2602
- data: sunburstData,
2603
- levels: levels
2604
- };
2605
- const serie = merge$1({}, dynamiSerieOptions, overrides);
2606
- if (this.colorResolver) {
2607
- if (!serie.itemStyle) {
2608
- serie.itemStyle = {};
2609
- }
2610
- serie.itemStyle.color = this.colorResolver;
2611
- }
2612
- this.result.series = serie;
2613
- }
2614
- addTooltip(data, overrides) {
2615
- merge$1(overrides, {
2616
- formatter: getTooltipFormatter(overrides.trigger || 'item', data, this.valueFormatter),
2617
- });
2618
- const tooltip = getTooltipOptions(overrides);
2619
- this.result.tooltip = tooltip;
2620
- }
2621
- addCommons() {
2622
- const opts = {
2623
- palette: this.palette,
2624
- };
2625
- merge$1(this.result, getCommons(opts));
2626
- }
2627
- addGraphic() { }
2628
- getResult() {
2629
- return this.result;
2630
- }
2631
- ;
2632
- addPolar() { }
2633
- addXAxis(data, overrides, type) { }
2634
- addYAxis(data, overrides, type) { }
2635
- addRadiusAxis(data, overrides) { }
2636
- addAngleAxis(data, overrides) { }
2637
- addLegend() { }
2638
- addDataZoom() { }
2639
- addDataset(data, opts) { }
2640
- // Setters
2641
- /**
2642
- * Permite inyectar un formateador de valores externo.
2643
- */
2644
- setValueFormatter(formatter) {
2645
- if (formatter) {
2646
- this.valueFormatter = formatter;
2647
- }
2648
- }
2649
- /**
2650
- * Permite inyectar una paleta de colores básica.
2651
- */
2652
- setPalette(palette) {
2653
- if (palette) {
2654
- this.palette = palette;
2655
- }
2656
- }
2657
- /**
2658
- * Permite inyectar un resolver de colores dinámico.
2659
- */
2660
- setColorResolver(resolver) {
2661
- if (resolver) {
2662
- this.colorResolver = resolver;
2663
- }
2664
- }
2665
- }
2666
-
2667
2876
  class EChartsSunburstComponent extends BaseEchartsComponent {
2668
2877
  baseSeriesOptions = {
2669
2878
  type: 'sunburst',
@@ -2712,158 +2921,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
2712
2921
  ], template: "<div\n class=\"echarts-container\"\n echarts\n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n></div>", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
2713
2922
  }] });
2714
2923
 
2715
- /**
2716
- * SankeyBuilder
2717
- *
2718
- * Builder concreto para el gráfico Sankey (diagrama de flujos de izquierda a derecha).
2719
- */
2720
- class SankeyBuilder {
2721
- baseProduct;
2722
- valueFormatter = (value) => value.toLocaleString();
2723
- palette = [];
2724
- colorResolver;
2725
- result = {};
2726
- constructor(baseProduct) {
2727
- this.baseProduct = baseProduct;
2728
- }
2729
- reset() {
2730
- this.result = {};
2731
- }
2732
- addSeries(data, overrides) {
2733
- if (!data || !data.source || data.source.length === 0) {
2734
- return;
2735
- }
2736
- // Identificar medidas (todas las dimensiones excepto 'category')
2737
- const measureKeys = data.dimensions
2738
- .filter((d) => d.name !== "category")
2739
- .map((d) => d.name);
2740
- // Función auxiliar para sumarizar valores de medidas en caso de haber más de una
2741
- const getNodeValue = (node) => {
2742
- return measureKeys.reduce((sum, key) => sum + (Number(node[key]) || 0), 0);
2743
- };
2744
- const nodesMap = new Map();
2745
- const linksMap = new Map();
2746
- // Función recursiva para aplanar datos jerárquicos a nodos y enlaces
2747
- const traverse = (nodeList, level, parentId) => {
2748
- for (const node of nodeList) {
2749
- const category = node.category;
2750
- const currentId = `${category}___${level}`;
2751
- const value = getNodeValue(node);
2752
- nodesMap.set(currentId, (nodesMap.get(currentId) || 0) + value);
2753
- if (parentId) {
2754
- const linkKey = `${parentId}--->${currentId}`;
2755
- if (linksMap.has(linkKey)) {
2756
- linksMap.get(linkKey).value += value;
2757
- }
2758
- else {
2759
- linksMap.set(linkKey, {
2760
- source: parentId,
2761
- target: currentId,
2762
- value: value,
2763
- });
2764
- }
2765
- }
2766
- if (node.children && node.children.length > 0) {
2767
- traverse(node.children, level + 1, currentId);
2768
- }
2769
- }
2770
- };
2771
- // Comenzar el recorrido en el nivel 0
2772
- traverse(data.source, 0);
2773
- // al menos un nivel de links para dibujar.
2774
- if (linksMap.size === 0)
2775
- return;
2776
- // Mapear nodos acumulados a la estructura requerida por ECharts (name y opcionalmente color, sin value redundante)
2777
- const nodes = Array.from(nodesMap.keys()).map((currentId) => {
2778
- const category = currentId.split("___")[0];
2779
- const nodeItem = {
2780
- name: currentId,
2781
- };
2782
- if (this.colorResolver) {
2783
- const color = this.colorResolver({ name: category, data: nodeItem });
2784
- if (color) {
2785
- nodeItem.itemStyle = { color };
2786
- }
2787
- }
2788
- return nodeItem;
2789
- });
2790
- const dynamicSerieOptions = {
2791
- type: "sankey",
2792
- orient: "horizontal", // De izquierda a derecha
2793
- draggable: true,
2794
- emphasis: {
2795
- focus: "adjacency",
2796
- },
2797
- lineStyle: {
2798
- color: "source",
2799
- opacity: 0.25,
2800
- curveness: 0.5,
2801
- },
2802
- label: {
2803
- show: true,
2804
- position: "right",
2805
- fontFamily: "'Inter', 'Roboto', 'Open Sans', sans-serif",
2806
- fontSize: 10,
2807
- formatter: (params) => {
2808
- // Remover el sufijo de nivel de la etiqueta visual
2809
- return params.name.split("___")[0];
2810
- },
2811
- },
2812
- roam: true,
2813
- data: nodes,
2814
- links: Array.from(linksMap.values()),
2815
- };
2816
- const serie = merge$1({}, dynamicSerieOptions, overrides);
2817
- if (this.colorResolver && !serie.itemStyle) {
2818
- serie.itemStyle = {};
2819
- }
2820
- if (this.colorResolver && serie.itemStyle) {
2821
- serie.itemStyle.color = this.colorResolver;
2822
- }
2823
- this.result.series = serie;
2824
- }
2825
- addTooltip(data, overrides) {
2826
- merge$1(overrides, {
2827
- formatter: getTooltipFormatter(overrides.trigger || 'item', data, this.valueFormatter),
2828
- });
2829
- const tooltip = getTooltipOptions(overrides);
2830
- this.result.tooltip = tooltip;
2831
- }
2832
- addPolar() { }
2833
- addXAxis(data, overrides, type) { }
2834
- addYAxis(data, overrides, type) { }
2835
- addRadiusAxis(data, overrides) { }
2836
- addAngleAxis(data, overrides) { }
2837
- addLegend() { }
2838
- addDataZoom() { }
2839
- addDataset(data, opts) { }
2840
- addCommons() {
2841
- const opts = {
2842
- palette: this.palette,
2843
- };
2844
- merge$1(this.result, getCommons(opts));
2845
- }
2846
- addGraphic() { }
2847
- getResult() {
2848
- return this.result;
2849
- }
2850
- setValueFormatter(formatter) {
2851
- if (formatter) {
2852
- this.valueFormatter = formatter;
2853
- }
2854
- }
2855
- setPalette(palette) {
2856
- if (palette) {
2857
- this.palette = palette;
2858
- }
2859
- }
2860
- setColorResolver(resolver) {
2861
- if (resolver) {
2862
- this.colorResolver = resolver;
2863
- }
2864
- }
2865
- }
2866
-
2867
2924
  class EchartsSankeyComponent extends BaseEchartsComponent {
2868
2925
  baseSeriesOptions = {
2869
2926
  type: 'sankey',
@@ -2949,7 +3006,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
2949
3006
  ], template: "<div\n class=\"echarts-container\"\n echarts\n [options]=\"{}\"\n [initOpts]=\"initOptions\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n></div>\n", styles: [".echarts-container{width:100%;height:100%;position:relative}\n"] }]
2950
3007
  }] });
2951
3008
 
2952
- // Interfaces de Inputs de Base EChart Component //
3009
+ // Interfaces de Inputs de Base EChart Component //
3010
+ // TopLevelFormatterParams
2953
3011
 
2954
3012
  ;
2955
3013
  ;