From af3860e95374db1ec617b13ee155614027835f24 Mon Sep 17 00:00:00 2001 From: Nathan Marrs Date: Sat, 18 Dec 2021 11:20:50 -0800 Subject: [PATCH] Canvas: add wind turbine element to canvas panel (#43309) --- .../features/canvas/elements/windTurbine.tsx | 118 ++++++++++++++++++ public/app/features/canvas/registry.ts | 2 + 2 files changed, 120 insertions(+) create mode 100644 public/app/features/canvas/elements/windTurbine.tsx diff --git a/public/app/features/canvas/elements/windTurbine.tsx b/public/app/features/canvas/elements/windTurbine.tsx new file mode 100644 index 00000000000..e0b636ab41f --- /dev/null +++ b/public/app/features/canvas/elements/windTurbine.tsx @@ -0,0 +1,118 @@ +import React, { FC } from 'react'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { useStyles2 } from '@grafana/ui'; + +import { ScalarDimensionEditor } from 'app/features/dimensions/editors'; +import { CanvasElementItem, CanvasElementProps } from '../element'; +import { DimensionContext, ScalarDimensionConfig } from 'app/features/dimensions'; + +interface WindTurbineData { + rpm?: number; +} + +interface WindTurbineConfig { + rpm?: ScalarDimensionConfig; +} + +const WindTurbineDisplay: FC> = (props) => { + const styles = useStyles2(getStyles); + + const { data } = props; + + 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: 100, + }, + + getNewOptions: (options) => ({ + ...options, + }), + + // Called when data changes + prepareData: (ctx: DimensionContext, cfg: WindTurbineConfig) => { + const data: WindTurbineData = { + rpm: cfg?.rpm ? ctx.getScalar(cfg.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` + @keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + } + + transform-origin: 94.663px 94.663px; + transform: rotate(15deg); + `, +}); diff --git a/public/app/features/canvas/registry.ts b/public/app/features/canvas/registry.ts index 642ef0668e4..6bbf24f53c7 100644 --- a/public/app/features/canvas/registry.ts +++ b/public/app/features/canvas/registry.ts @@ -6,6 +6,7 @@ import { droneSideItem } from './elements/droneSide'; import { droneTopItem } from './elements/droneTop'; import { iconItem } from './elements/icon'; import { textBoxItem } from './elements/textBox'; +import { windTurbineItem } from './elements/windTurbine'; export const DEFAULT_CANVAS_ELEMENT_CONFIG: CanvasElementOptions = { ...iconItem.getNewOptions(), @@ -20,4 +21,5 @@ export const canvasElementRegistry = new Registry(() => [ droneTopItem, droneFrontItem, droneSideItem, + windTurbineItem, ]);