import React from 'react'; import { useObservable } from 'react-use'; import { Subject } from 'rxjs'; import { SelectableValue, StandardEditorProps } from '@grafana/data'; import { Field, HorizontalGroup, Icon, InlineField, InlineFieldRow, Select, VerticalGroup } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; import { HorizontalConstraint, Placement, VerticalConstraint } from 'app/features/canvas'; import { PanelOptions } from '../models.gen'; import { ConstraintSelectionBox } from './ConstraintSelectionBox'; import { QuickPositioning } from './QuickPositioning'; import { CanvasEditorOptions } from './elementEditor'; const places: Array = ['top', 'left', 'bottom', 'right', 'width', 'height']; const horizontalOptions: Array> = [ { label: 'Left', value: HorizontalConstraint.Left }, { label: 'Right', value: HorizontalConstraint.Right }, { label: 'Left & right', value: HorizontalConstraint.LeftRight }, { label: 'Center', value: HorizontalConstraint.Center }, { label: 'Scale', value: HorizontalConstraint.Scale }, ]; const verticalOptions: Array> = [ { label: 'Top', value: VerticalConstraint.Top }, { label: 'Bottom', value: VerticalConstraint.Bottom }, { label: 'Top & bottom', value: VerticalConstraint.TopBottom }, { label: 'Center', value: VerticalConstraint.Center }, { label: 'Scale', value: VerticalConstraint.Scale }, ]; type Props = StandardEditorProps; export function PlacementEditor({ item }: Props) { const settings = item.settings; // Will force a rerender whenever the subject changes useObservable(settings?.scene ? settings.scene.moved : new Subject()); if (!settings) { return
Loading...
; } const element = settings.element; if (!element) { return
???
; } const { options } = element; const { placement, constraint: layout } = options; const reselectElementAfterChange = () => { setTimeout(() => { settings.scene.select({ targets: [element.div!] }); }); }; const onHorizontalConstraintSelect = (h: SelectableValue) => { onHorizontalConstraintChange(h.value!); }; const onHorizontalConstraintChange = (h: HorizontalConstraint) => { element.options.constraint!.horizontal = h; element.setPlacementFromConstraint(); settings.scene.revId++; settings.scene.save(true); reselectElementAfterChange(); }; const onVerticalConstraintSelect = (v: SelectableValue) => { onVerticalConstraintChange(v.value!); }; const onVerticalConstraintChange = (v: VerticalConstraint) => { element.options.constraint!.vertical = v; element.setPlacementFromConstraint(); settings.scene.revId++; settings.scene.save(true); reselectElementAfterChange(); }; const onPositionChange = (value: number | undefined, placement: keyof Placement) => { element.options.placement![placement] = value ?? element.options.placement![placement]; element.applyLayoutStylesToDiv(); settings.scene.clearCurrentSelection(true); reselectElementAfterChange(); }; const constraint = element.tempConstraint ?? layout ?? {}; return (


<> {places.map((p) => { const v = placement![p]; if (v == null) { return null; } return ( onPositionChange(v, p)} /> ); })}
); }