212 lines
6.6 KiB
TypeScript
212 lines
6.6 KiB
TypeScript
import { Component, OnInit, ViewChild } from '@angular/core';
|
|
import { PlotService, PlotType, PlotRequest, PlotResponse, TagField, FilterDefaults, DataType, YAxisDefinition, AxesTypes, PlotConfig } from '../plot.service';
|
|
import { UntypedFormControl, Validators } from '@angular/forms';
|
|
import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
|
|
import { LimitByComponent } from '../limit-by/limit-by.component';
|
|
import { YAxisDefinitionComponent } from '../y-axis-definition/y-axis-definition.component';
|
|
import { QueryAutocompleteComponent } from '../query-autocomplete/query-autocomplete.component';
|
|
import { PlotViewComponent, SelectionRange, DateAnchor, LoadingEvent } from '../plot-view/plot-view.component';
|
|
import { GalleryViewComponent } from '../gallery-view/gallery-view.component';
|
|
import * as moment from 'moment';
|
|
import { WidgetDimensions } from '../dashboard.service';
|
|
|
|
@Component({
|
|
selector: 'pdb-visualization-page',
|
|
templateUrl: './visualization-page.component.html',
|
|
styleUrls: ['./visualization-page.component.scss']
|
|
})
|
|
export class VisualizationPageComponent implements OnInit {
|
|
|
|
readonly DATE_PATTERN = "YYYY-MM-DD HH:mm:ss"; // for moment-JS
|
|
|
|
dateRange = new UntypedFormControl('2019-10-05 00:00:00 - 2019-10-11 23:59:59');
|
|
|
|
selectedPlotType = new Array<PlotType>();
|
|
plotTypes: Array<any> = [];
|
|
|
|
tagFields: Array<TagField> = new Array<TagField>();
|
|
|
|
groupBy = new Array<TagField>();
|
|
|
|
@ViewChild('limitbycomponent')
|
|
private limitbycomponent! : LimitByComponent;
|
|
|
|
|
|
@ViewChild('y1AxisDefinitionComponent', { read: YAxisDefinitionComponent })
|
|
private y1AxisDefinitionComponent! : YAxisDefinitionComponent;
|
|
|
|
@ViewChild('y2AxisDefinitionComponent', { read: YAxisDefinitionComponent })
|
|
private y2AxisDefinitionComponent! : YAxisDefinitionComponent;
|
|
|
|
@ViewChild('query')
|
|
query!: QueryAutocompleteComponent;
|
|
|
|
@ViewChild('plotView')
|
|
plotView!: PlotViewComponent;
|
|
|
|
@ViewChild('galleryView')
|
|
galleryView!: GalleryViewComponent;
|
|
|
|
enableGallery = false;
|
|
splitBy : TagField | undefined = undefined;
|
|
y2AxisAvailable = false;
|
|
|
|
intervalUnit = 'NO_INTERVAL';
|
|
intervalValue = 1;
|
|
renderBarChartTickLabels = false;
|
|
|
|
plotJobActive = false;
|
|
|
|
constructor(private plotService: PlotService, private snackBar: MatSnackBar) {
|
|
}
|
|
|
|
showError(message:string) {
|
|
this.snackBar.open(message, "", {
|
|
duration: 5000,
|
|
verticalPosition: 'top'
|
|
});
|
|
}
|
|
|
|
ngOnInit() {
|
|
const that = this;
|
|
|
|
(<any>window).initDatePicker();
|
|
|
|
this.plotTypes = this.plotService.getPlotTypes();
|
|
this.selectedPlotType.push(this.plotTypes[0]);
|
|
|
|
that.plotService.getFilterDefaults().subscribe(function(filterDefaults: FilterDefaults) {
|
|
|
|
filterDefaults.fields.forEach(function(name:string) {
|
|
that.tagFields.push(new TagField(name));
|
|
},
|
|
(error: any) => {
|
|
that.showError(error.error.message);
|
|
});
|
|
|
|
that.groupBy = that.tagFields.filter(val => filterDefaults.groupBy.includes(val.name));
|
|
that.splitBy = that.tagFields.find(val => filterDefaults.splitBy == val.name);
|
|
});
|
|
}
|
|
loading(event: LoadingEvent) {
|
|
this.plotJobActive = event.loading;
|
|
}
|
|
|
|
updateDateRange(newDateRange: string) {
|
|
(<HTMLInputElement>document.getElementById("search-date-range")).value = newDateRange;
|
|
this.plot();
|
|
}
|
|
|
|
changePlotType(selectedPlotTypes: Array<PlotType>) {
|
|
const compatiblePlotTypes = this.plotTypes.filter(pt => pt.compatible(selectedPlotTypes));
|
|
this.plotTypes.forEach(pt => pt.active=false);
|
|
compatiblePlotTypes.forEach(pt => pt.active=true);
|
|
|
|
const axesTypes = this.getAxes();
|
|
this.y2AxisAvailable = axesTypes.y.length == 2;
|
|
}
|
|
|
|
selectedPlotTypesContains(plotTypeIds: Array<string>){
|
|
return this.selectedPlotType.filter(pt => plotTypeIds.includes(pt.id)).length > 0;
|
|
}
|
|
|
|
|
|
dateRangeAsString() : string {
|
|
return (<HTMLInputElement>document.getElementById("search-date-range")).value;
|
|
}
|
|
|
|
gallery(){
|
|
if (this.splitBy != null){
|
|
this.plotView.imageUrl = '';
|
|
this.plotView.stats = null;
|
|
this.galleryView.show=true;
|
|
const request = this.createPlotRequest();
|
|
this.galleryView.renderGallery(request, this.splitBy.name);
|
|
} else {
|
|
console.error("variable splitBy was null when rendering gallery");
|
|
}
|
|
}
|
|
|
|
getAxes() : AxesTypes {
|
|
|
|
const x = new Array<DataType>();
|
|
const y = new Array<DataType>();
|
|
|
|
for(var i = 0; i < this.selectedPlotType.length; i++){
|
|
var plotType = this.selectedPlotType[i];
|
|
if (!x.includes(plotType.xAxis)) {
|
|
x.push(plotType.xAxis);
|
|
}
|
|
if (!y.includes(plotType.yAxis)) {
|
|
y.push(plotType.yAxis);
|
|
}
|
|
}
|
|
|
|
return new AxesTypes(x,y);
|
|
}
|
|
|
|
abort() {
|
|
this.plotService.abort((<any>window).submitterId).subscribe({
|
|
complete: () => {
|
|
//this.plotView.imageUrl = '';
|
|
//this.plotView.stats = null;
|
|
//this.plotJobActive = false;
|
|
//this.showError("Job aborted");
|
|
//document.dispatchEvent(new Event("invadersPause", {}));
|
|
}
|
|
});
|
|
}
|
|
|
|
plot(){
|
|
const config = this.createPlotConfig();
|
|
this.plotView.plot(config, this.plotDimensionSupplier);
|
|
}
|
|
|
|
plotDimensionSupplier(): WidgetDimensions{
|
|
const results = document.getElementById("results");
|
|
return new WidgetDimensions(results != null ? results.offsetHeight-1: 1024,
|
|
results != null ? results.offsetWidth-1 : 1024,);
|
|
}
|
|
|
|
createPlotConfig(): PlotConfig {
|
|
const aggregates = new Array<string>();
|
|
this.selectedPlotType.forEach(a => aggregates.push(a.id));
|
|
|
|
const y1 = this.y1AxisDefinitionComponent.getAxisDefinition();
|
|
const y2 = this.y2AxisDefinitionComponent ? this.y2AxisDefinitionComponent.getAxisDefinition() : undefined;
|
|
|
|
const config = new PlotConfig(
|
|
this.query.query,
|
|
this.groupBy.map(o => o.name),
|
|
this.limitbycomponent.limitBy,
|
|
this.limitbycomponent.limit,
|
|
y1,
|
|
y2,
|
|
this.dateRangeAsString(), // dateRange
|
|
aggregates, // aggregates
|
|
this.intervalUnit,
|
|
this.intervalValue,
|
|
this.renderBarChartTickLabels,
|
|
);
|
|
return config;
|
|
}
|
|
|
|
createPlotRequest(): PlotRequest {
|
|
const results = document.getElementById("results");
|
|
|
|
const config = this.createPlotConfig();
|
|
|
|
const request = new PlotRequest(
|
|
results != null ? results.offsetHeight-1: 1024,
|
|
results != null ? results.offsetWidth-1 : 1024,
|
|
300, // thumbnailMaxWidth
|
|
200, // thumbnailMaxHeight
|
|
false, // keyOutside
|
|
this.enableGallery, // generateThumbnail
|
|
(<any>window).submitterId,
|
|
config,
|
|
{});
|
|
return request;
|
|
}
|
|
}
|