grafana/public/app/features/scenes/editor/SceneComponentEditWrapper.tsx
Torkel Ödegaard 8c585a4ebf
Scene: Variables interpolation formats and multi value handling (#58591)
* Component that can cache and extract variable dependencies

* Component that can cache and extract variable dependencies

* Updates

* Refactoring

* Lots of refactoring and iterations of supporting both re-rendering and query re-execution

* Updated SceneCanvasText

* Updated name of file

* Updated

* Refactoring a bit

* Added back getName

* Added comment

* minor fix

* Minor fix

* Merge fixes

* Scene variable interpolation progress

* Merge fixes

* Added all format registeries

* Progress on multi value support

* Progress on multi value support

* Updates

* Progress on scoped vars

* Fixed circular dependency

* Updates

* Some review fixes

* Updated comment

* Added forceRender function

* Add back fail on console log

* Update public/app/features/scenes/variables/interpolation/sceneInterpolator.test.ts

* Moving functions from SceneObjectBase

* fixing tests

* Fixed e2e

Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
2022-11-16 11:36:30 +01:00

63 lines
1.5 KiB
TypeScript

import { css } from '@emotion/css';
import React, { CSSProperties } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
import { SceneEditor, SceneObject } from '../core/types';
export function SceneComponentEditWrapper({
model,
editor,
children,
}: {
model: SceneObject;
editor: SceneEditor;
children: React.ReactNode;
}) {
const styles = useStyles2(getStyles);
const { hoverObject, selectedObject } = editor.useState();
const onMouseEnter = () => editor.onMouseEnterObject(model);
const onMouseLeave = () => editor.onMouseLeaveObject(model);
const onClick = (evt: React.MouseEvent) => {
evt.stopPropagation();
editor.onSelectObject(model);
};
const style: CSSProperties = {};
let className = styles.wrapper;
if (hoverObject?.ref === model) {
className += ' ' + styles.hover;
}
if (selectedObject?.ref === model) {
className += ' ' + styles.selected;
}
return (
<div style={style} className={className} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} onClick={onClick}>
{children}
</div>
);
}
const getStyles = (theme: GrafanaTheme2) => {
return {
wrapper: css({
display: 'flex',
flexGrow: 1,
padding: 8,
border: `1px dashed ${theme.colors.primary.main}`,
cursor: 'pointer',
}),
hover: css({
border: `1px solid ${theme.colors.primary.border}`,
}),
selected: css({
border: `1px solid ${theme.colors.error.border}`,
}),
};
};