UNPKG

ngx-graph-new

Version:

Modify the ngx-chart version is used

233 lines (198 loc) 5.25 kB
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import * as shape from 'd3-shape'; import { Subject } from 'rxjs'; import { colorSets } from '../src/utils/color-sets'; import { id } from '../src/utils/id'; import chartGroups from './chartTypes'; import { countries, getTurbineData } from './data'; @Component({ selector: 'app', encapsulation: ViewEncapsulation.None, styleUrls: ['./app.component.scss'], templateUrl: './app.component.html' }) export class AppComponent implements OnInit { version = APP_VERSION; theme = 'dark'; chartType = 'directed-graph'; chartTypeGroups: any; chart: any; realTimeData: boolean = false; countrySet: any[]; graph: { links: any[]; nodes: any[] }; hierarchialGraph: { links: any[]; nodes: any[] }; view: any[]; width: number = 700; height: number = 300; fitContainer: boolean = true; autoZoom: boolean = false; panOnZoom: boolean = true; enableZoom: boolean = true; autoCenter: boolean = false; // observables update$: Subject<any> = new Subject(); center$: Subject<any> = new Subject(); zoomToFit$: Subject<any> = new Subject(); // options showLegend = false; orientation: string = 'LR'; // LR, RL, TB, BT orientations: any[] = [ { label: 'Left to Right', value: 'LR' }, { label: 'Right to Left', value: 'RL' }, { label: 'Top to Bottom', value: 'TB' }, { label: 'Bottom to Top', value: 'BT' } ]; // line interpolation curveType: string = 'Linear'; curve: any = shape.curveLinear; interpolationTypes = [ 'Bundle', 'Cardinal', 'Catmull Rom', 'Linear', 'Monotone X', 'Monotone Y', 'Natural', 'Step', 'Step After', 'Step Before' ]; colorSchemes: any; colorScheme: any; schemeType: string = 'ordinal'; selectedColorScheme: string; constructor() { Object.assign(this, { countrySet: countries, colorSchemes: colorSets, chartTypeGroups: chartGroups, hierarchialGraph: getTurbineData() }); this.setColorScheme('picnic'); this.setInterpolationType('Bundle'); } ngOnInit() { this.selectChart(this.chartType); setInterval(this.updateData.bind(this), 1000); if (!this.fitContainer) { this.applyDimensions(); } } updateData() { if (!this.realTimeData) { return; } const country = this.countrySet[Math.floor(Math.random() * this.countrySet.length)]; const add = Math.random() < 0.7; const remove = Math.random() < 0.5; if (add) { // directed graph const hNode = { id: id(), label: country }; this.hierarchialGraph.nodes.push(hNode); this.hierarchialGraph.links.push({ source: this.hierarchialGraph.nodes[Math.floor(Math.random() * (this.hierarchialGraph.nodes.length - 1))].id, target: hNode.id, label: 'on success' }); this.hierarchialGraph.links = [...this.hierarchialGraph.links]; this.hierarchialGraph.nodes = [...this.hierarchialGraph.nodes]; } } applyDimensions() { this.view = [this.width, this.height]; } toggleEnableZoom(enableZoom: boolean) { this.enableZoom = enableZoom; } toggleFitContainer(fitContainer: boolean, autoZoom: boolean, autoCenter: boolean): void { this.fitContainer = fitContainer; this.autoZoom = autoZoom; this.autoCenter = autoCenter; if (this.fitContainer) { this.view = undefined; } else { this.applyDimensions(); } } selectChart(chartSelector) { this.chartType = chartSelector; for (const group of this.chartTypeGroups) { for (const chart of group.charts) { if (chart.selector === chartSelector) { this.chart = chart; return; } } } } select(data) { console.log('Item clicked', data); } setColorScheme(name) { this.selectedColorScheme = name; this.colorScheme = this.colorSchemes.find(s => s.name === name); } setInterpolationType(curveType) { this.curveType = curveType; if (curveType === 'Bundle') { this.curve = shape.curveBundle.beta(1); } if (curveType === 'Cardinal') { this.curve = shape.curveCardinal; } if (curveType === 'Catmull Rom') { this.curve = shape.curveCatmullRom; } if (curveType === 'Linear') { this.curve = shape.curveLinear; } if (curveType === 'Monotone X') { this.curve = shape.curveMonotoneX; } if (curveType === 'Monotone Y') { this.curve = shape.curveMonotoneY; } if (curveType === 'Natural') { this.curve = shape.curveNatural; } if (curveType === 'Step') { this.curve = shape.curveStep; } if (curveType === 'Step After') { this.curve = shape.curveStepAfter; } if (curveType === 'Step Before') { this.curve = shape.curveStepBefore; } } onLegendLabelClick(entry) { console.log('Legend clicked', entry); } toggleExpand(node) { console.log('toggle expand', node); } updateChart() { this.update$.next(true); } zoomToFit() { this.zoomToFit$.next(true); } center() { this.center$.next(true); } }