72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import { DataFrame, FieldType, VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data';
|
|
import { SuggestionName } from 'app/types/suggestions';
|
|
|
|
export class NodeGraphSuggestionsSupplier {
|
|
getListWithDefaults(builder: VisualizationSuggestionsBuilder) {
|
|
return builder.getListAppender<{}, {}>({
|
|
name: SuggestionName.NodeGraph,
|
|
pluginId: 'nodeGraph',
|
|
});
|
|
}
|
|
|
|
hasCorrectFields(frames: DataFrame[]): boolean {
|
|
let hasNodesFrame = false;
|
|
let hasEdgesFrame = false;
|
|
|
|
const nodeFields: Array<[string, FieldType]> = [
|
|
['id', FieldType.string],
|
|
['title', FieldType.string],
|
|
['mainstat', FieldType.number],
|
|
];
|
|
const edgeFields: Array<[string, FieldType]> = [
|
|
['id', FieldType.string],
|
|
['source', FieldType.string],
|
|
['target', FieldType.string],
|
|
];
|
|
|
|
for (const frame of frames) {
|
|
if (this.checkFields(nodeFields, frame)) {
|
|
hasNodesFrame = true;
|
|
}
|
|
if (this.checkFields(edgeFields, frame)) {
|
|
hasEdgesFrame = true;
|
|
}
|
|
}
|
|
|
|
return hasNodesFrame && hasEdgesFrame;
|
|
}
|
|
|
|
checkFields(fields: Array<[string, FieldType]>, frame: DataFrame): boolean {
|
|
let hasCorrectFields = true;
|
|
|
|
for (const field of fields) {
|
|
const [name, type] = field;
|
|
const frameField = frame.fields.find((f) => f.name === name);
|
|
if (!frameField || type !== frameField.type) {
|
|
hasCorrectFields = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return hasCorrectFields;
|
|
}
|
|
|
|
getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {
|
|
if (!builder.data) {
|
|
return;
|
|
}
|
|
|
|
const hasCorrectFields = this.hasCorrectFields(builder.data.series);
|
|
const nodeGraphFrames = builder.data.series.filter(
|
|
(df) => df.meta && df.meta.preferredVisualisationType === 'nodeGraph'
|
|
);
|
|
|
|
if (hasCorrectFields || nodeGraphFrames.length === 2) {
|
|
this.getListWithDefaults(builder).append({
|
|
name: SuggestionName.NodeGraph,
|
|
score: VisualizationSuggestionScore.Best,
|
|
});
|
|
}
|
|
}
|
|
}
|