forked from grafana.jool/grafana-jool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.0 KiB
66 lines
2.0 KiB
import React, { FC } from 'react';
|
|
import { Button, Field, HorizontalGroup, InlineField, InlineFieldRow } from '@grafana/ui';
|
|
import { StandardEditorProps } from '@grafana/data';
|
|
|
|
import { PanelOptions } from '../models.gen';
|
|
import { useObservable } from 'react-use';
|
|
import { Subject } from 'rxjs';
|
|
import { CanvasEditorOptions } from './elementEditor';
|
|
import { Anchor, Placement } from 'app/features/canvas';
|
|
import { NumberInput } from 'app/features/dimensions/editors/NumberInput';
|
|
|
|
const anchors: Array<keyof Anchor> = ['top', 'left', 'bottom', 'right'];
|
|
const places: Array<keyof Placement> = ['top', 'left', 'bottom', 'right', 'width', 'height'];
|
|
|
|
export const PlacementEditor: FC<StandardEditorProps<any, CanvasEditorOptions, PanelOptions>> = ({ item }) => {
|
|
const settings = item.settings;
|
|
|
|
// Will force a rerender whenever the subject changes
|
|
useObservable(settings?.scene ? settings.scene.moved : new Subject());
|
|
|
|
if (!settings) {
|
|
return <div>Loading...</div>;
|
|
}
|
|
|
|
const element = settings.element;
|
|
if (!element) {
|
|
return <div>???</div>;
|
|
}
|
|
const { placement } = element;
|
|
|
|
return (
|
|
<div>
|
|
<HorizontalGroup>
|
|
{anchors.map((a) => (
|
|
<Button
|
|
key={a}
|
|
size="sm"
|
|
variant={element.anchor[a] ? 'primary' : 'secondary'}
|
|
onClick={() => settings.scene.toggleAnchor(element, a)}
|
|
>
|
|
{a}
|
|
</Button>
|
|
))}
|
|
</HorizontalGroup>
|
|
<br />
|
|
|
|
<Field label="Position">
|
|
<>
|
|
{places.map((p) => {
|
|
const v = placement[p];
|
|
if (v == null) {
|
|
return null;
|
|
}
|
|
return (
|
|
<InlineFieldRow key={p}>
|
|
<InlineField label={p} labelWidth={8} grow={true}>
|
|
<NumberInput value={v} onChange={(v) => console.log('TODO, edit!!!', p, v)} />
|
|
</InlineField>
|
|
</InlineFieldRow>
|
|
);
|
|
})}
|
|
</>
|
|
</Field>
|
|
</div>
|
|
);
|
|
};
|
|
|