import { css } from '@emotion/css'; import { GrafanaTheme2, LinkModel } from '@grafana/data'; 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 WindTurbineData { rpm?: number; links?: LinkModel[]; } interface WindTurbineConfig { rpm?: ScalarDimensionConfig; } const WindTurbineDisplay = ({ data }: CanvasElementProps) => { const styles = useStyles2(getStyles); const windTurbineAnimation = `spin ${data?.rpm ? 60 / Math.abs(data.rpm) : 0}s linear infinite`; return ( ); }; export const windTurbineItem: CanvasElementItem = { id: 'windTurbine', name: 'Wind Turbine', description: 'Spinny spinny', display: WindTurbineDisplay, defaultSize: { width: 100, height: 155, }, getNewOptions: (options) => ({ ...options, background: { color: { fixed: 'transparent', }, }, placement: { width: options?.placement?.width ?? 100, height: options?.placement?.height ?? 155, 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 windTurbineConfig = elementOptions.config; const data: WindTurbineData = { rpm: windTurbineConfig?.rpm ? dimensionContext.getScalar(windTurbineConfig.rpm).value() : 0, }; return data; }, registerOptionsUI: (builder) => { const category = ['Wind Turbine']; builder.addCustomEditor({ category, id: 'rpm', path: 'config.rpm', name: 'RPM', editor: ScalarDimensionEditor, }); }, }; const getStyles = (theme: GrafanaTheme2) => ({ blade: css({ transformOrigin: '94.663px 94.663px', transform: 'rotate(15deg)', '@keyframes spin': { from: { transform: 'rotate(0deg)', }, to: { transform: 'rotate(360deg)', }, }, }), });