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"; import am4themes_dataviz from "@amcharts/amcharts4/themes/dataviz"; export interface IDumbbellPlotDataItem { name: string; open: number; close: number; tooltip?: string; } @Component({ selector: "rd-amchart-dumbbell-plot", template: `
` }) export class AmChartDumbbellPlot 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; chart: am4charts.XYChart ngAfterViewInit() { this.zone.runOutsideAngular(() => { am4core.useTheme(am4themes_dataviz); this.chart = am4core.create(this.container, this.dimension == "2D" ? am4charts.XYChart : am4charts.XYChart3D); this.chart.data = this.data; let categoryAxis = this.chart.xAxes.push(new am4charts.CategoryAxis()); categoryAxis.renderer.grid.template.location = 0; categoryAxis.dataFields.category = "name"; categoryAxis.renderer.minGridDistance = 15; categoryAxis.renderer.grid.template.location = 0.5; categoryAxis.renderer.grid.template.strokeDasharray = "1,3"; categoryAxis.renderer.labels.template.rotation = -90; categoryAxis.renderer.labels.template.horizontalCenter = "left"; categoryAxis.renderer.labels.template.location = 0.5; categoryAxis.renderer.inside = true; categoryAxis.renderer.labels.template.adapter.add("dx", (dx, target) => { return -target.maxRight / 2; }); let valueAxis = this.chart.yAxes.push(new am4charts.ValueAxis()); valueAxis.renderer.ticks.template.disabled = true; valueAxis.renderer.axisFills.template.disabled = true; let series = this.chart.series.push(new am4charts.ColumnSeries()); series.dataFields.categoryX = "name"; series.dataFields.openValueY = "open"; series.dataFields.valueY = "close"; series.dataFields.id = "tooltip"; if (this.customTooltip) series.tooltipHTML = "{id}"; else series.tooltipText = "open: {openValueY.value} close: {valueY.value}"; series.sequencedInterpolation = true; series.fillOpacity = 0; series.strokeOpacity = 1; series.columns.template.width = 0.01; series.tooltip.pointerOrientation = "horizontal"; let openBullet = series.bullets.create(am4charts.CircleBullet); openBullet.locationY = 1; let closeBullet = series.bullets.create(am4charts.CircleBullet); closeBullet.fill = this.chart.colors.getIndex(4); closeBullet.stroke = closeBullet.fill; this.chart.cursor = new am4charts.XYCursor(); if (this.export) { this.chart.exporting.menu = new am4core.ExportMenu(); this.setExportMenu(); } }); } ngOnChanges(changes) { if (!this.chart) return; if (changes.data) this.chart.data = this.data; } }