mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
935334cbda
* Playing around * This is getting interesting * Updates * Updated * Observable experiments * This is tricky * VizPanel panel renderer * New model progress * Maybe this could be something * Updated * Rename * updates * Updated * Query runners? not sure * Updated * updates * flex box layout starting to work * Testing * Tested an action * Parent context sort of working * Progress * Progress * Updated * Starting to work * Things are working * Scene list, nested scene demo * Progress on repeats * Moving things * Pretty big progress * More things working * Great progress * Progress * Name changing * Minor tweaks * Simplified sizing * Move toggleDirection to SceneFlexLayout * add feature flag (#50990) * removed new useObservable hook * Rename folder and feature toggle to scenes * Caching scenes so you can go back to another scene without having to re-query data * Fix issue with subs on re-mount * Fixing test * Added SceneCanvasText to play around with layout elements with size based on content * Scene: Edit mode and component edit wrapper that handles selection (#51078) * First step for scene variables * Started playing around with a scene edit mode * Better way to set component * Progress on edit mode * Update * Progress on edit mode * Progress on editor * Progress on editor * Updates * More working * Progress * Minor update * removed unnessary file * Moving things around * Updated * Making time range separate from time picker * minor rename of methods * The most basic variable start * Minor renames * Fixed interpolate issue if not found at closest level * An embryo of event model and url sync handling * Update url sync types * Removed unnessary any type arg Co-authored-by: Ryan McKinley <ryantxu@gmail.com> Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
82 lines
2.1 KiB
TypeScript
82 lines
2.1 KiB
TypeScript
import { css, cx } from '@emotion/css';
|
|
import React from 'react';
|
|
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
|
import { Icon, useStyles2 } from '@grafana/ui';
|
|
|
|
import { SceneObject, SceneLayoutState, SceneObjectList, isSceneObject } from '../core/types';
|
|
|
|
export interface Props {
|
|
node: SceneObject;
|
|
selectedObject?: SceneObject;
|
|
}
|
|
|
|
export function SceneObjectTree({ node, selectedObject }: Props) {
|
|
const styles = useStyles2(getStyles);
|
|
const state = node.useState();
|
|
let children: SceneObjectList = [];
|
|
|
|
for (const propKey of Object.keys(state)) {
|
|
const propValue = (state as any)[propKey];
|
|
if (isSceneObject(propValue)) {
|
|
children.push(propValue);
|
|
}
|
|
}
|
|
|
|
let layoutChildren = (state as SceneLayoutState).children;
|
|
if (layoutChildren) {
|
|
for (const child of layoutChildren) {
|
|
children.push(child);
|
|
}
|
|
}
|
|
|
|
const name = node.constructor.name;
|
|
const isSelected = selectedObject === node;
|
|
const onSelectNode = () => node.getSceneEditor().onSelectObject(node);
|
|
|
|
return (
|
|
<div className={styles.node}>
|
|
<div className={styles.header} onClick={onSelectNode}>
|
|
<div className={styles.icon}>{children.length > 0 && <Icon name="angle-down" size="sm" />}</div>
|
|
<div className={cx(styles.name, isSelected && styles.selected)}>{name}</div>
|
|
</div>
|
|
{children.length > 0 && (
|
|
<div className={styles.children}>
|
|
{children.map((child) => (
|
|
<SceneObjectTree node={child} selectedObject={selectedObject} key={child.state.key} />
|
|
))}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => {
|
|
return {
|
|
node: css({
|
|
display: 'flex',
|
|
flexGrow: 0,
|
|
cursor: 'pointer',
|
|
flexDirection: 'column',
|
|
padding: '2px 4px',
|
|
}),
|
|
header: css({
|
|
display: 'flex',
|
|
fontWeight: 500,
|
|
}),
|
|
name: css({}),
|
|
selected: css({
|
|
color: theme.colors.error.text,
|
|
}),
|
|
icon: css({
|
|
width: theme.spacing(3),
|
|
color: theme.colors.text.secondary,
|
|
}),
|
|
children: css({
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
paddingLeft: 8,
|
|
}),
|
|
};
|
|
};
|