grafana/public/app/features/scenes/components/ScenePanelRepeater.tsx
Torkel Ödegaard 849134b5dd
Scene: Small refactorings and name changes (#51866)
* Rename onMount and onUnmount and some other small refactorings

* More refactorings fixing typescript issues
2022-07-07 16:49:05 +02:00

55 lines
1.5 KiB
TypeScript

import React from 'react';
import { LoadingState, PanelData } from '@grafana/data';
import { SceneDataNode } from '../core/SceneDataNode';
import { SceneObjectBase } from '../core/SceneObjectBase';
import { SceneComponentProps, SceneObject, SceneObjectList, SceneObjectState, SceneLayoutState } from '../core/types';
interface RepeatOptions extends SceneObjectState {
layout: SceneObject<SceneLayoutState>;
}
export class ScenePanelRepeater extends SceneObjectBase<RepeatOptions> {
activate(): void {
super.activate();
this.subs.add(
this.getData().subscribe({
next: (data) => {
if (data.data?.state === LoadingState.Done) {
this.performRepeat(data.data);
}
},
})
);
}
performRepeat(data: PanelData) {
// assume parent is a layout
const firstChild = this.state.layout.state.children[0]!;
const newChildren: SceneObjectList = [];
for (const series of data.series) {
const clone = firstChild.clone({
key: `${newChildren.length}`,
$data: new SceneDataNode({
data: {
...data,
series: [series],
},
}),
});
newChildren.push(clone);
}
this.state.layout.setState({ children: newChildren });
}
static Component = ({ model, isEditing }: SceneComponentProps<ScenePanelRepeater>) => {
const { layout } = model.useState();
return <layout.Component model={layout} isEditing={isEditing} />;
};
}