mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
* WIP: First approach to scene grid layout * Flex layout * Grid layout rows * Allow passing custom props to scene object renderers * Allow nesting grid layouts * Re-layout nested grid's enclosing grids * Update public/app/features/scenes/components/layout/SceneGridLayout.tsx Co-authored-by: Torkel Ödegaard <torkel@grafana.com> * Review comments * Got rid of flex & grid child layout objects * WIP: Recreating rows behaviour (almost working) * Major progress on rows * remove nested grid example (not supported) * Remove removal damn * Trying to use children directly * Ts fixes * chore: Fix TS * Fix issue when row bboxes when not updated on layout change * Now the tricky part * working * Removing some code * needs more work * Getting some thing working * Getting some thing working * fix toggle row * Starting to work * Fix * Yay it's working * Updates * Updates * Added some sorting of children * Updated comment * Simplify sorting * removed commented code * Updated * Pushed a fix so we can move a panel out from a row and into the parent grid * simplify move logic * Minor simplification * Removed some unnesary code * fixed comment * Removed unnessary condition in findGridSceneParent * remove unnessary if * Simplify toGridCell * removed duplicate if * removed unused code * Adds grid demo with different data scenarios * Make it green * Demo grid with multiple time ranges * Move child atomically * Add tests * Cleanup * Fix unused import Co-authored-by: Torkel Ödegaard <torkel@grafana.com> Co-authored-by: Ivan Ortega <ivanortegaalba@gmail.com>
37 lines
947 B
TypeScript
37 lines
947 B
TypeScript
import React, { useEffect } from 'react';
|
|
|
|
import { SceneComponentEditingWrapper } from '../editor/SceneComponentEditWrapper';
|
|
|
|
import { SceneComponentProps, SceneObject } from './types';
|
|
|
|
export function SceneComponentWrapper<T extends SceneObject>({
|
|
model,
|
|
isEditing,
|
|
...otherProps
|
|
}: SceneComponentProps<T>) {
|
|
const Component = (model as any).constructor['Component'] ?? EmptyRenderer;
|
|
const inner = <Component {...otherProps} model={model} isEditing={isEditing} />;
|
|
|
|
// Handle component activation state state
|
|
useEffect(() => {
|
|
if (!model.isActive) {
|
|
model.activate();
|
|
}
|
|
return () => {
|
|
if (model.isActive) {
|
|
model.deactivate();
|
|
}
|
|
};
|
|
}, [model]);
|
|
|
|
if (!isEditing) {
|
|
return inner;
|
|
}
|
|
|
|
return <SceneComponentEditingWrapper model={model}>{inner}</SceneComponentEditingWrapper>;
|
|
}
|
|
|
|
function EmptyRenderer<T>(_: SceneComponentProps<T>): React.ReactElement | null {
|
|
return null;
|
|
}
|