@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,
|
|
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
|
-
|
|
698
|
+
const categoryName = params.name || (row && typeof row === 'object' ? row.category : '');
|
|
699
|
+
title = categoryName;
|
|
698
700
|
subtitle = serieName;
|
|
699
|
-
valFormatted =
|
|
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
|
-
|
|
704
|
-
|
|
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} → ${targetName}`;
|
|
715
|
-
valFormatted =
|
|
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 =
|
|
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,
|
|
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 =
|
|
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,
|
|
767
|
+
function getTooltipFormatter(trigger, data, valueFormatter, opts) {
|
|
766
768
|
return trigger === 'axis'
|
|
767
|
-
? getAxisTooltipFormatter(data,
|
|
768
|
-
: getItemTooltipFormatter(data,
|
|
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 =
|
|
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
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
const tooltip = getTooltipOptions(
|
|
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 =
|
|
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
|
-
*
|
|
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
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
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
|
-
|
|
1281
|
-
|
|
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
|
-
|
|
1302
|
-
const
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
this.
|
|
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
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
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
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
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
|
-
|
|
1351
|
-
const
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
this.
|
|
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
|
-
|
|
1367
|
-
const
|
|
1368
|
-
this.
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
this.
|
|
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
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
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
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
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
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
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
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
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
|
-
|
|
1356
|
+
const radialAxisOptions = getValueAxisOptions(radiusAxisOverrides);
|
|
1357
|
+
radiusAxis.push(radialAxisOptions);
|
|
1358
|
+
this.result.radiusAxis = radiusAxis;
|
|
1463
1359
|
}
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
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
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
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
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
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
|
-
*
|
|
1406
|
+
* Permite inyectar un resolver de colores dinámico.
|
|
1518
1407
|
*/
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
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 =
|
|
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
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
const tooltip = getTooltipOptions(
|
|
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 =
|
|
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
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
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
|
-
|
|
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
|
;
|