import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { t } from '@grafana/i18n'; import { ScalarDimensionConfig } from '@grafana/schema'; import { useStyles2 } from '@grafana/ui'; import { DimensionContext } from 'app/features/dimensions'; import { ScalarDimensionEditor } from 'app/features/dimensions/editors'; import { CanvasElementItem, CanvasElementOptions, CanvasElementProps, defaultBgColor } from '../element'; interface DroneSideData { pitchAngle?: number; } interface DroneSideConfig { pitchAngle?: ScalarDimensionConfig; } const DroneSideDisplay = ({ data }: CanvasElementProps) => { const styles = useStyles2(getStyles); const droneSidePitchTransformStyle = `rotate(${data?.pitchAngle ? data.pitchAngle : 0}deg)`; return ( ); }; export const droneSideItem: CanvasElementItem = { id: 'droneSide', name: 'Drone Side', description: 'Drone Side', display: DroneSideDisplay, defaultSize: { width: 100, height: 26, }, getNewOptions: (options) => ({ ...options, background: { color: { fixed: 'transparent', }, }, placement: { width: options?.placement?.width ?? 100, height: options?.placement?.height ?? 26, top: options?.placement?.top, left: options?.placement?.left, rotation: options?.placement?.rotation ?? 0, }, links: options?.links ?? [], }), // Called when data changes prepareData: (dimensionContext: DimensionContext, elementOptions: CanvasElementOptions) => { const droneSideConfig = elementOptions.config; const data: DroneSideData = { pitchAngle: droneSideConfig?.pitchAngle ? dimensionContext.getScalar(droneSideConfig.pitchAngle).value() : 0, }; return data; }, registerOptionsUI: (builder) => { const category = [t('canvas.drone-side-item.category-drone-side', 'Drone Side')]; builder.addCustomEditor({ category, id: 'pitchAngle', path: 'config.pitchAngle', name: t('canvas.drone-side-item.name-pitch-angle', 'Pitch Angle'), editor: ScalarDimensionEditor, }); }, }; const getStyles = (theme: GrafanaTheme2) => ({ droneSide: css({ // TODO: figure out what styles to apply when prefers-reduced-motion is set // eslint-disable-next-line @grafana/no-unreduced-motion transition: 'transform 0.4s', }), });