@visionaris-bruno/vs-echarts 9.0.6 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { provideEchartsCore, NgxEchartsDirective } from 'ngx-echarts';
2
2
  import * as echarts from 'echarts/core';
3
- import { BarChart, PieChart, LineChart, ScatterChart, FunnelChart, SunburstChart, SankeyChart, BoxplotChart } from 'echarts/charts';
4
- import { TooltipComponent, GridComponent, LegendComponent, GraphicComponent, PolarComponent, DatasetComponent, DataZoomComponent } from 'echarts/components';
3
+ import { BarChart, PieChart, LineChart, ScatterChart, FunnelChart, SunburstChart, SankeyChart, BoxplotChart, HeatmapChart } from 'echarts/charts';
4
+ import { TooltipComponent, GridComponent, CalendarComponent, LegendComponent, GraphicComponent, PolarComponent, DatasetComponent, DataZoomComponent, VisualMapComponent } from 'echarts/components';
5
5
  import { CanvasRenderer, SVGRenderer } from 'echarts/renderers';
6
6
  import * as i0 from '@angular/core';
7
7
  import { InjectionToken, Inject, Injectable, EventEmitter, inject, Output, Input, ViewChild, Directive, Component } from '@angular/core';
@@ -78,6 +78,8 @@ function initializeEcharts() {
78
78
  BoxplotChart,
79
79
  TooltipComponent,
80
80
  GridComponent,
81
+ HeatmapChart,
82
+ CalendarComponent,
81
83
  LegendComponent,
82
84
  CanvasRenderer,
83
85
  SVGRenderer,
@@ -85,6 +87,7 @@ function initializeEcharts() {
85
87
  PolarComponent,
86
88
  DatasetComponent,
87
89
  DataZoomComponent,
90
+ VisualMapComponent,
88
91
  ]);
89
92
  // Register additional locales in ECharts
90
93
  echarts.registerLocale('ES', langES);
@@ -183,6 +186,9 @@ function defaultOptionsOverrides() {
183
186
  hBoxplot: {
184
187
  series: {}
185
188
  },
189
+ heatmapCalendar: {
190
+ series: {},
191
+ },
186
192
  };
187
193
  }
188
194
  const defaultValueFormatter = (value) => `${value}`;
@@ -247,6 +253,7 @@ class BaseEchartsComponent {
247
253
  /** Subject para debouncing de actualizaciones. ReplaySubject asegura no perder el primer renderizado. */
248
254
  updateSubject = new ReplaySubject(1);
249
255
  updateSubscription;
256
+ afterSetOptionsHook;
250
257
  chartInstance;
251
258
  vsEchartsConfig = (() => {
252
259
  try {
@@ -290,6 +297,9 @@ class BaseEchartsComponent {
290
297
  replaceMerge,
291
298
  };
292
299
  this.chartInstance?.setOption(chartOptions, _opts);
300
+ if (this.afterSetOptionsHook) {
301
+ this.afterSetOptionsHook();
302
+ }
293
303
  }
294
304
  // metodos protegidos //
295
305
  dispatchAction(type, d) {
@@ -1041,7 +1051,9 @@ class BoxPlotBuilder {
1041
1051
  };
1042
1052
  }
1043
1053
  ;
1044
- const resumen5NumerosXCat = data.source.map(s => {
1054
+ const resumen5NumerosXCat = data.source
1055
+ .reverse() // reverse para no modificar el orden original
1056
+ .map(s => {
1045
1057
  // filtro category para excluirlo de la lista de métricas
1046
1058
  const values = Object.entries(s)
1047
1059
  .filter(([key, val]) => key !== 'category' && !isNaN(val))
@@ -1933,6 +1945,123 @@ class SankeyBuilder {
1933
1945
  }
1934
1946
  }
1935
1947
 
1948
+ class HeatmapCalendarBuilder {
1949
+ baseProduct;
1950
+ result = {};
1951
+ calendarHeight = 0;
1952
+ valueFormatter = defaultValueFormatter;
1953
+ palette = [];
1954
+ colorResolver;
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
+ const commonsOverrides = getCommons(opts);
1966
+ merge$1(this.result, commonsOverrides, { grid: {} });
1967
+ }
1968
+ addDataset(data, opts) { }
1969
+ addVisualmap(data) { }
1970
+ addCalendar(data) { }
1971
+ addSeries(data, overrides, opts) {
1972
+ if (!data || !data.dimensions || !data.source || data.source.length === 0)
1973
+ return;
1974
+ const calendarOverrides = opts.calendar;
1975
+ const visualMapOverrides = opts.visualMap;
1976
+ const measureDim = data.dimensions.find(d => d.name !== 'category');
1977
+ const dimKey = measureDim ? measureDim.name : '';
1978
+ const dataByYear = new Map();
1979
+ let min = Infinity;
1980
+ let max = -Infinity;
1981
+ data.source.forEach((s) => {
1982
+ if (!s.category)
1983
+ return;
1984
+ const dateObj = new Date(s.category);
1985
+ if (isNaN(dateObj.getTime()))
1986
+ return;
1987
+ const year = dateObj.getFullYear().toString();
1988
+ const value = s[dimKey] !== undefined && s[dimKey] !== null ? Number(s[dimKey]) : 0;
1989
+ if (value < min)
1990
+ min = value;
1991
+ if (value > max)
1992
+ max = value;
1993
+ if (!dataByYear.has(year)) {
1994
+ dataByYear.set(year, []);
1995
+ }
1996
+ const formattedDate = dateObj.toISOString().split('T')[0];
1997
+ dataByYear.get(year).push([formattedDate, value]);
1998
+ });
1999
+ if (min === Infinity)
2000
+ min = 0;
2001
+ if (max === -Infinity)
2002
+ max = 0;
2003
+ const sortedYears = Array.from(dataByYear.keys()).sort();
2004
+ const calendars = [];
2005
+ const series = [];
2006
+ sortedYears.forEach((year, index) => {
2007
+ calendars.push(merge$1({
2008
+ top: 120 + index * 180,
2009
+ range: year,
2010
+ }, calendarOverrides));
2011
+ series.push(merge$1({
2012
+ calendarIndex: index,
2013
+ data: dataByYear.get(year) || []
2014
+ }, overrides));
2015
+ });
2016
+ this.result.calendar = calendars;
2017
+ this.result.series = series;
2018
+ const visualMap = merge$1({
2019
+ min: min,
2020
+ max: max,
2021
+ }, visualMapOverrides);
2022
+ if (this.palette && this.palette.length > 0) {
2023
+ visualMap.inRange = {
2024
+ color: this.palette
2025
+ };
2026
+ }
2027
+ this.result.visualMap = visualMap;
2028
+ }
2029
+ addTooltip(data, overrides) {
2030
+ const mainDim = data.dimensions.filter(d => d.name != 'category')[0];
2031
+ const valueFormatter = this.valueFormatter;
2032
+ const dimkey = mainDim.name, dimAlias = mainDim.displayName;
2033
+ const tooltipFormatter = (params) => {
2034
+ const date = params.value[params.encode['time']], value = params.value[params.encode['value']];
2035
+ return `<div style="text-align: center;" ><b>${date}</b></br>${params.marker} ${mainDim.displayName}</br><b>${valueFormatter(value, dimkey)}</b></div>`;
2036
+ };
2037
+ const tooltipOptions = getTooltipOptions({
2038
+ trigger: 'item',
2039
+ formatter: tooltipFormatter,
2040
+ });
2041
+ this.result.tooltip = tooltipOptions;
2042
+ }
2043
+ addPolar() { }
2044
+ addXAxis(data, overrides, type) { }
2045
+ addYAxis(data, overrides, type) { }
2046
+ addRadiusAxis(data, overrides) { }
2047
+ addAngleAxis(data, overrides) { }
2048
+ addLegend() { }
2049
+ addGraphic() { }
2050
+ addDataZoom() { }
2051
+ setValueFormatter(formatter) {
2052
+ this.valueFormatter = formatter;
2053
+ }
2054
+ setPalette(palette) {
2055
+ this.palette = palette;
2056
+ }
2057
+ setColorResolver(resolver) {
2058
+ this.colorResolver = resolver;
2059
+ }
2060
+ getResult() {
2061
+ return this.result;
2062
+ }
2063
+ }
2064
+
1936
2065
  /**
1937
2066
  * Director de Builds.
1938
2067
  */
@@ -2204,6 +2333,30 @@ class VSECDirector {
2204
2333
  this.builder.addTooltip(data, overrides.tooltip);
2205
2334
  this.builder.addDataZoom();
2206
2335
  }
2336
+ makeHeatmapCalendar(data, overrides, opts = {}) {
2337
+ if (this.builder instanceof HeatmapCalendarBuilder == false) {
2338
+ return;
2339
+ }
2340
+ const { valueFormatter = undefined, palette = undefined, colorResolver = undefined, axisTypes = {
2341
+ x: 'value',
2342
+ y: 'category',
2343
+ }, } = opts;
2344
+ this.builder.reset();
2345
+ // El orden importa, primero callbacks y despues componentes.
2346
+ // chart callbaks
2347
+ if (valueFormatter)
2348
+ this.builder.setValueFormatter(valueFormatter);
2349
+ const product = this.builder.baseProduct;
2350
+ const seriesOverrides = merge$1({}, product.baseOptions.series, overrides[product.chartKey].series);
2351
+ // chart components
2352
+ this.builder.addCommons();
2353
+ const seriesConfigOpts = {
2354
+ calendar: product.baseOptions.calendar,
2355
+ visualMap: product.baseOptions.visualMap,
2356
+ };
2357
+ this.builder.addSeries(data, seriesOverrides, seriesConfigOpts);
2358
+ this.builder.addTooltip(data, overrides.tooltip);
2359
+ }
2207
2360
  }
2208
2361
 
2209
2362
  /**
@@ -3006,6 +3159,104 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
3006
3159
  ], 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"] }]
3007
3160
  }] });
3008
3161
 
3162
+ class EChartsHeatmapCalendar extends BaseEchartsComponent {
3163
+ /** aires para el calculo de resize y posicionamientos de distintos componentes */
3164
+ calendarPaddings = {
3165
+ visualMapTop: 5,
3166
+ };
3167
+ baseSeriesOptions = {
3168
+ type: 'heatmap',
3169
+ coordinateSystem: 'calendar',
3170
+ selectedMode: 'single',
3171
+ select: {
3172
+ itemStyle: {
3173
+ borderWidth: 2,
3174
+ borderColor: EChartsTokens.sBorderColor,
3175
+ shadowColor: EChartsTokens.sShadowColor,
3176
+ shadowBlur: 6,
3177
+ }
3178
+ }
3179
+ };
3180
+ baseProduct = {
3181
+ chartKey: 'heatmapCalendar',
3182
+ baseOptions: {
3183
+ visualMap: {
3184
+ calculable: true,
3185
+ orient: 'horizontal',
3186
+ left: 'center',
3187
+ top: this.calendarPaddings.visualMapTop,
3188
+ formatter: (dv) => {
3189
+ const value = dv ?? '';
3190
+ return value.toLocaleString();
3191
+ },
3192
+ }, // dinamico
3193
+ calendar: {
3194
+ cellSize: ['auto', 20],
3195
+ right: 5,
3196
+ left: 60,
3197
+ yearLabel: { show: true },
3198
+ dayLabel: { firstDay: 1 },
3199
+ },
3200
+ series: this.baseSeriesOptions, // dinamico, uno por año.
3201
+ }
3202
+ };
3203
+ builder = new HeatmapCalendarBuilder(this.baseProduct);
3204
+ director = new VSECDirector(this.builder);
3205
+ make() {
3206
+ const makeOpts = {
3207
+ palette: this.palette,
3208
+ valueFormatter: this.valueFormatter,
3209
+ colorResolver: this.colorResolver,
3210
+ };
3211
+ this.director.makeHeatmapCalendar(this.data, this.optionsOverrides, makeOpts);
3212
+ }
3213
+ afterSetOptionsHook = () => {
3214
+ if (!this.chartInstance)
3215
+ return;
3216
+ let chartHeight = 0;
3217
+ const gElements = this.chartInstance.getDom().getElementsByTagName("g");
3218
+ for (let i = 0; i < gElements.length; i++) {
3219
+ const ge = gElements[i];
3220
+ const geHeight = ge.getBBox().height;
3221
+ if (chartHeight < geHeight) {
3222
+ chartHeight = geHeight;
3223
+ }
3224
+ }
3225
+ const { visualMapTop } = this.calendarPaddings;
3226
+ /**
3227
+ * aire inferior para el svg maestro.
3228
+ */
3229
+ const svgBottom = 5;
3230
+ this.chartInstance.resize({ height: chartHeight + visualMapTop + svgBottom });
3231
+ };
3232
+ onChartClick(event) {
3233
+ if (event.componentType === 'series') {
3234
+ const dimension = this.data.dimensions.filter(d => d.name != 'category')[0];
3235
+ const dimensionAlias = dimension.displayName;
3236
+ const dimensionKey = dimension.name;
3237
+ const itemValue = event.value[event.encode['value']];
3238
+ const date = event.value[event.encode['time']];
3239
+ // opero event para que sea compatible con el de base
3240
+ event.value = {
3241
+ category: date,
3242
+ [dimensionKey]: itemValue,
3243
+ };
3244
+ event.name = date;
3245
+ event.seriesName = dimensionAlias;
3246
+ super.onChartClick(event);
3247
+ }
3248
+ }
3249
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EChartsHeatmapCalendar, deps: null, target: i0.ɵɵFactoryTarget.Component });
3250
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: EChartsHeatmapCalendar, isStandalone: true, selector: "vs-echarts-heatmapCalendar", 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)\"\n></div>", styles: [".echarts-container{width:100%;height:100%;position:relative;overflow-y:auto;scrollbar-gutter:stable}\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"] }] });
3251
+ }
3252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: EChartsHeatmapCalendar, decorators: [{
3253
+ type: Component,
3254
+ args: [{ selector: 'vs-echarts-heatmapCalendar', standalone: true, imports: [
3255
+ CommonModule,
3256
+ NgxEchartsDirective,
3257
+ ], 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)\"\n></div>", styles: [".echarts-container{width:100%;height:100%;position:relative;overflow-y:auto;scrollbar-gutter:stable}\n"] }]
3258
+ }] });
3259
+
3009
3260
  // Interfaces de Inputs de Base EChart Component //
3010
3261
  // TopLevelFormatterParams
3011
3262
 
@@ -3021,5 +3272,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
3021
3272
  * Generated bundle index. Do not edit.
3022
3273
  */
3023
3274
 
3024
- export { BaseEchartsComponent, EChartsAreaComponent, EChartsAreaStackComponent, EChartsBarStackedComponent, EChartsBarStackedRadialComponent, EChartsHBarComponent, EChartsHBarStackedComponent, EChartsHBoxplotComponent, EChartsSunburstComponent, EchartsBarComponent, EchartsFunnelComponent, EchartsLineComponent, EchartsPieComponent, EchartsRingComponent, EchartsSankeyComponent, EchartsScatterComponent, VSEchartsConfigService, defaultOptionsOverrides, provideVSEcharts };
3275
+ export { BaseEchartsComponent, EChartsAreaComponent, EChartsAreaStackComponent, EChartsBarStackedComponent, EChartsBarStackedRadialComponent, EChartsHBarComponent, EChartsHBarStackedComponent, EChartsHBoxplotComponent, EChartsHeatmapCalendar, EChartsSunburstComponent, EchartsBarComponent, EchartsFunnelComponent, EchartsLineComponent, EchartsPieComponent, EchartsRingComponent, EchartsSankeyComponent, EchartsScatterComponent, VSEchartsConfigService, defaultOptionsOverrides, provideVSEcharts };
3025
3276
  //# sourceMappingURL=visionaris-bruno-vs-echarts.mjs.map