import { Component, NgZone, ElementRef, Input, AfterViewInit, OnChanges } from "@angular/core"; import { Portlet } from "../../portlet/portlet"; import { BaseAmChart } from "./baseAmChart"; import * as am4core from "@amcharts/amcharts4/core"; import * as am4charts from "@amcharts/amcharts4/charts"; export interface IPyramidDataItem { name: string; left: number; right: number; tooltip?: string; } @Component({ selector: "rd-amchart-pyramid", template: `
` }) export class AmChartPyramid extends BaseAmChart implements OnChanges, AfterViewInit { constructor(zone: NgZone, public element: ElementRef, portlet: Portlet) { super(zone, element, portlet); } @Input("rd-data") data: Array = []; @Input("rd-custom-tooltip") customTooltip: boolean = false; chartConfigs = [ { name: "left", chartInstance: null }, { name: "right", chartInstance: null } ]; ngAfterViewInit() { this.zone.runOutsideAngular(() => { let mainContainer = am4core.create(this.container, am4core.Container); mainContainer.width = am4core.percent(100); mainContainer.height = am4core.percent(100); mainContainer.layout = "horizontal"; for (const chart of this.chartConfigs) { chart.chartInstance = mainContainer.createChild(am4charts.XYChart); chart.chartInstance.paddingLeft = 0; chart.chartInstance.data = this.data; let categoryAxis = chart.chartInstance.yAxes.push(new am4charts.CategoryAxis()); categoryAxis.dataFields.category = "name"; categoryAxis.renderer.grid.template.location = 0; categoryAxis.renderer.minGridDistance = 15; if (chart.name == "right") categoryAxis.renderer.opposite = true; let valueAxis = chart.chartInstance.xAxes.push(new am4charts.ValueAxis()); valueAxis.min = 0; valueAxis.max = 10; valueAxis.strictMinMax = true; valueAxis.numberFormatter = new am4core.NumberFormatter(); valueAxis.numberFormatter.numberFormat = "#.#'%'"; if (chart.name == "left") valueAxis.renderer.inversed = true; let series = chart.chartInstance.series.push(new am4charts.ColumnSeries()); series.dataFields.valueX = chart.name; series.dataFields.categoryY = "name"; series.dataFields.valueXShow = "percent"; series.dataFields.id = "tooltip"; series.calculatePercent = true; series.sequencedInterpolation = true; series.interpolationDuration = 1000; if (chart.name == "right") { series.fill = chart.chartInstance.colors.getIndex(4); series.stroke = series.fill; } if (this.customTooltip) series.columns.template.tooltipHTML = "{id}"; else series.columns.template.tooltipText = "{categoryY}: {valueX} ({valueX.percent.formatNumber('#.0')}%)" } }); } ngOnChanges(changes) { if (changes.data) { for (const item of this.chartConfigs) { if (item.chartInstance) item.chartInstance.data = this.data; } } } }