{"version":3,"file":"6324.89ae5dd8a705de223c89.js","mappings":"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","sources":["webpack://grafana/./public/app/features/canvas/elements/icon.tsx","webpack://grafana/./public/app/features/canvas/elements/notFound.tsx","webpack://grafana/./public/app/features/canvas/elements/button.tsx","webpack://grafana/./public/app/features/canvas/elements/droneFront.tsx","webpack://grafana/./public/app/features/canvas/elements/droneSide.tsx","webpack://grafana/./public/app/features/canvas/elements/droneTop.tsx","webpack://grafana/./public/app/features/canvas/elements/textBox.tsx","webpack://grafana/./public/app/features/canvas/elements/windTurbine.tsx","webpack://grafana/./public/app/features/canvas/registry.ts","webpack://grafana/./public/app/features/canvas/runtime/element.tsx","webpack://grafana/./public/app/features/canvas/types.ts","webpack://grafana/./public/app/plugins/panel/canvas/editor/APIEditor.tsx","webpack://grafana/./public/app/plugins/panel/canvas/editor/options.ts"],"sourcesContent":["import { css } from '@emotion/css';\nimport { isString } from 'lodash';\nimport React, { CSSProperties } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport {\n ColorDimensionConfig,\n ResourceDimensionConfig,\n ResourceDimensionMode,\n getPublicOrAbsoluteUrl,\n} from 'app/features/dimensions';\nimport { DimensionContext } from 'app/features/dimensions/context';\nimport { ColorDimensionEditor, ResourceDimensionEditor } from 'app/features/dimensions/editors';\nimport { APIEditor, APIEditorConfig, callApi } from 'app/plugins/panel/canvas/editor/APIEditor';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\nimport { LineConfig } from '../types';\n\nexport interface IconConfig {\n path?: ResourceDimensionConfig;\n fill?: ColorDimensionConfig;\n stroke?: LineConfig;\n api?: APIEditorConfig;\n}\n\ninterface IconData {\n path: string;\n fill: string;\n strokeColor?: string;\n stroke?: number;\n api?: APIEditorConfig;\n}\n\n// When a stoke is defined, we want the path to be in page units\nconst svgStrokePathClass = css`\n path {\n vector-effect: non-scaling-stroke;\n }\n`;\n\nexport function IconDisplay(props: CanvasElementProps) {\n const { data } = props;\n if (!data?.path) {\n return null;\n }\n\n const onClick = () => {\n if (data?.api) {\n callApi(data.api);\n }\n };\n\n const svgStyle: CSSProperties = {\n fill: data?.fill,\n stroke: data?.strokeColor,\n strokeWidth: data?.stroke,\n };\n\n return (\n \n );\n}\n\nexport const iconItem: CanvasElementItem = {\n id: 'icon',\n name: 'Icon',\n description: 'SVG Icon display',\n\n display: IconDisplay,\n\n getNewOptions: (options) => ({\n placement: {\n width: 50,\n height: 50,\n top: 0,\n left: 0,\n },\n ...options,\n config: {\n path: {\n mode: ResourceDimensionMode.Fixed,\n fixed: 'img/icons/unicons/question-circle.svg',\n },\n fill: { fixed: '#FFF899' },\n },\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: IconConfig) => {\n let path: string | undefined = undefined;\n if (cfg.path) {\n path = ctx.getResource(cfg.path).value();\n }\n if (!path || !isString(path)) {\n path = getPublicOrAbsoluteUrl('img/icons/unicons/question-circle.svg');\n }\n\n const data: IconData = {\n path,\n fill: cfg.fill ? ctx.getColor(cfg.fill).value() : '#CCC',\n api: cfg?.api ?? undefined,\n };\n\n if (cfg.stroke?.width && cfg.stroke.color) {\n if (cfg.stroke.width > 0) {\n data.stroke = cfg.stroke?.width;\n data.strokeColor = ctx.getColor(cfg.stroke.color).value();\n }\n }\n return data;\n },\n\n // Heatmap overlay options\n registerOptionsUI: (builder) => {\n const category = ['Icon'];\n builder\n .addCustomEditor({\n category,\n id: 'iconSelector',\n path: 'config.path',\n name: 'SVG Path',\n editor: ResourceDimensionEditor,\n settings: {\n resourceType: 'icon',\n },\n })\n .addCustomEditor({\n category,\n id: 'config.fill',\n path: 'config.fill',\n name: 'Fill color',\n editor: ColorDimensionEditor,\n settings: {},\n defaultValue: {\n // Configured values\n fixed: 'grey',\n },\n })\n .addSliderInput({\n category,\n path: 'config.stroke.width',\n name: 'Stroke',\n defaultValue: 0,\n settings: {\n min: 0,\n max: 10,\n },\n })\n .addCustomEditor({\n category,\n id: 'config.stroke.color',\n path: 'config.stroke.color',\n name: 'Stroke color',\n editor: ColorDimensionEditor,\n settings: {},\n defaultValue: {\n // Configured values\n fixed: 'grey',\n },\n showIf: (cfg) => Boolean(cfg?.config?.stroke?.width),\n })\n .addCustomEditor({\n category,\n id: 'apiSelector',\n path: 'config.api',\n name: 'API',\n editor: APIEditor,\n });\n },\n};\n","import React, { PureComponent } from 'react';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\ninterface NotFoundConfig {\n orig?: any;\n}\n\nclass NotFoundDisplay extends PureComponent> {\n render() {\n const { config } = this.props;\n return (\n \n NOT FOUND:\n {JSON.stringify(config, null, 2)}\n \n );\n }\n}\n\nexport const notFoundItem: CanvasElementItem = {\n id: 'not-found',\n name: 'Not found',\n description: 'Display when element type is not found in the registry',\n\n display: NotFoundDisplay,\n\n defaultSize: {\n width: 100,\n height: 100,\n },\n\n getNewOptions: () => ({\n config: {},\n }),\n};\n","import React, { PureComponent } from 'react';\n\nimport { Button } from '@grafana/ui';\nimport { DimensionContext } from 'app/features/dimensions/context';\nimport { TextDimensionEditor } from 'app/features/dimensions/editors/TextDimensionEditor';\nimport { TextDimensionConfig } from 'app/features/dimensions/types';\nimport { APIEditor, APIEditorConfig, callApi } from 'app/plugins/panel/canvas/editor/APIEditor';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\ninterface ButtonData {\n text?: string;\n api?: APIEditorConfig;\n}\n\ninterface ButtonConfig {\n text?: TextDimensionConfig;\n api?: APIEditorConfig;\n}\n\nclass ButtonDisplay extends PureComponent> {\n render() {\n const { data } = this.props;\n const onClick = () => {\n if (data?.api) {\n callApi(data.api);\n }\n };\n\n return (\n \n {data?.text}\n \n );\n }\n}\n\nexport const buttonItem: CanvasElementItem = {\n id: 'button',\n name: 'Button',\n description: 'Button',\n\n display: ButtonDisplay,\n\n defaultSize: {\n width: 200,\n height: 50,\n },\n\n getNewOptions: (options) => ({\n ...options,\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: ButtonConfig) => {\n const data: ButtonData = {\n text: cfg?.text ? ctx.getText(cfg.text).value() : '',\n api: cfg?.api ?? undefined,\n };\n\n return data;\n },\n\n // Heatmap overlay options\n registerOptionsUI: (builder) => {\n const category = ['Button'];\n builder\n .addCustomEditor({\n category,\n id: 'textSelector',\n path: 'config.text',\n name: 'Text',\n editor: TextDimensionEditor,\n })\n .addCustomEditor({\n category,\n id: 'apiSelector',\n path: 'config.api',\n name: 'API',\n editor: APIEditor,\n });\n },\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { DimensionContext, ScalarDimensionConfig } from 'app/features/dimensions';\nimport { ScalarDimensionEditor } from 'app/features/dimensions/editors';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\ninterface DroneFrontData {\n rollAngle?: number;\n}\n\ninterface DroneFrontConfig {\n rollAngle?: ScalarDimensionConfig;\n}\n\nconst DroneFrontDisplay: FC> = (props) => {\n const styles = useStyles2(getStyles);\n\n const { data } = props;\n\n const droneFrontTransformStyle = `rotate(${data?.rollAngle ? data.rollAngle : 0}deg)`;\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport const droneFrontItem: CanvasElementItem = {\n id: 'droneFront',\n name: 'Drone Front',\n description: 'Drone front',\n\n display: DroneFrontDisplay,\n\n defaultSize: {\n width: 100,\n height: 100,\n },\n\n getNewOptions: (options) => ({\n ...options,\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: DroneFrontConfig) => {\n const data: DroneFrontData = {\n rollAngle: cfg?.rollAngle ? ctx.getScalar(cfg.rollAngle).value() : 0,\n };\n\n return data;\n },\n\n registerOptionsUI: (builder) => {\n const category = ['Drone Front'];\n builder.addCustomEditor({\n category,\n id: 'rollAngle',\n path: 'config.rollAngle',\n name: 'Roll Angle',\n editor: ScalarDimensionEditor,\n });\n },\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n droneFront: css`\n transition: transform 0.4s;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { DimensionContext, ScalarDimensionConfig } from 'app/features/dimensions';\nimport { ScalarDimensionEditor } from 'app/features/dimensions/editors';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\ninterface DroneSideData {\n pitchAngle?: number;\n}\n\ninterface DroneSideConfig {\n pitchAngle?: ScalarDimensionConfig;\n}\n\nconst DroneSideDisplay: FC> = (props) => {\n const styles = useStyles2(getStyles);\n\n const { data } = props;\n\n const droneSidePitchTransformStyle = `rotate(${data?.pitchAngle ? data.pitchAngle : 0}deg)`;\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport const droneSideItem: CanvasElementItem = {\n id: 'droneSide',\n name: 'Drone Side',\n description: 'Drone Side',\n\n display: DroneSideDisplay,\n\n defaultSize: {\n width: 100,\n height: 100,\n },\n\n getNewOptions: (options) => ({\n ...options,\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: DroneSideConfig) => {\n const data: DroneSideData = {\n pitchAngle: cfg?.pitchAngle ? ctx.getScalar(cfg.pitchAngle).value() : 0,\n };\n\n return data;\n },\n\n registerOptionsUI: (builder) => {\n const category = ['Drone Side'];\n builder.addCustomEditor({\n category,\n id: 'pitchAngle',\n path: 'config.pitchAngle',\n name: 'Pitch Angle',\n editor: ScalarDimensionEditor,\n });\n },\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n droneSide: css`\n transition: transform 0.4s;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { DimensionContext, ScalarDimensionConfig } from 'app/features/dimensions';\nimport { ScalarDimensionEditor } from 'app/features/dimensions/editors';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\ninterface DroneTopData {\n bRightRotorRPM?: number;\n bLeftRotorRPM?: number;\n fRightRotorRPM?: number;\n fLeftRotorRPM?: number;\n yawAngle?: number;\n}\n\ninterface DroneTopConfig {\n bRightRotorRPM?: ScalarDimensionConfig;\n bLeftRotorRPM?: ScalarDimensionConfig;\n fRightRotorRPM?: ScalarDimensionConfig;\n fLeftRotorRPM?: ScalarDimensionConfig;\n yawAngle?: ScalarDimensionConfig;\n}\n\nconst DroneTopDisplay: FC> = (props) => {\n const styles = useStyles2(getStyles);\n\n const { data } = props;\n\n const fRightRotorAnimation = `spin ${data?.fRightRotorRPM ? 60 / Math.abs(data.fRightRotorRPM) : 0}s linear infinite`;\n\n const fLeftRotorAnimation = `spin ${data?.fLeftRotorRPM ? 60 / Math.abs(data.fLeftRotorRPM) : 0}s linear infinite`;\n\n const bRightRotorAnimation = `spin ${data?.bRightRotorRPM ? 60 / Math.abs(data.bRightRotorRPM) : 0}s linear infinite`;\n\n const bLeftRotorAnimation = `spin ${data?.bLeftRotorRPM ? 60 / Math.abs(data.bLeftRotorRPM) : 0}s linear infinite`;\n\n const droneTopTransformStyle = `rotate(${data?.yawAngle ? data.yawAngle : 0}deg)`;\n\n return (\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport const droneTopItem: CanvasElementItem = {\n id: 'droneTop',\n name: 'Drone Top',\n description: 'Drone top',\n\n display: DroneTopDisplay,\n\n defaultSize: {\n width: 100,\n height: 100,\n },\n\n getNewOptions: (options) => ({\n ...options,\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: DroneTopConfig) => {\n const data: DroneTopData = {\n bRightRotorRPM: cfg?.bRightRotorRPM ? ctx.getScalar(cfg.bRightRotorRPM).value() : 0,\n bLeftRotorRPM: cfg?.bLeftRotorRPM ? ctx.getScalar(cfg.bLeftRotorRPM).value() : 0,\n fRightRotorRPM: cfg?.fRightRotorRPM ? ctx.getScalar(cfg.fRightRotorRPM).value() : 0,\n fLeftRotorRPM: cfg?.fLeftRotorRPM ? ctx.getScalar(cfg.fLeftRotorRPM).value() : 0,\n yawAngle: cfg?.yawAngle ? ctx.getScalar(cfg.yawAngle).value() : 0,\n };\n\n return data;\n },\n\n registerOptionsUI: (builder) => {\n const category = ['Drone Top'];\n builder\n .addCustomEditor({\n category,\n id: 'yawAngle',\n path: 'config.yawAngle',\n name: 'Yaw Angle',\n editor: ScalarDimensionEditor,\n })\n .addCustomEditor({\n category,\n id: 'fRightRotorRPM',\n path: 'config.fRightRotorRPM',\n name: 'Front Right Rotor RPM',\n editor: ScalarDimensionEditor,\n })\n .addCustomEditor({\n category,\n id: 'fLeftRotorRPM',\n path: 'config.fLeftRotorRPM',\n name: 'Front Left Rotor RPM',\n editor: ScalarDimensionEditor,\n })\n .addCustomEditor({\n category,\n id: 'bRightRotorRPM',\n path: 'config.bRightRotorRPM',\n name: 'Back Right Rotor RPM',\n editor: ScalarDimensionEditor,\n })\n .addCustomEditor({\n category,\n id: 'bLeftRotorRPM',\n path: 'config.bLeftRotorRPM',\n name: 'Back Left Rotor RPM',\n editor: ScalarDimensionEditor,\n });\n },\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n propeller: css`\n transform-origin: 50% 50%;\n transform-box: fill-box;\n display: block;\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `,\n propellerCW: css`\n animation-direction: normal;\n `,\n propellerCCW: css`\n animation-direction: reverse;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory } from '@grafana/ui';\nimport { config } from 'app/core/config';\nimport { DimensionContext } from 'app/features/dimensions/context';\nimport { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor';\nimport { TextDimensionEditor } from 'app/features/dimensions/editors/TextDimensionEditor';\nimport { ColorDimensionConfig, TextDimensionConfig } from 'app/features/dimensions/types';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\nexport enum Align {\n Left = 'left',\n Center = 'center',\n Right = 'right',\n}\n\nexport enum VAlign {\n Top = 'top',\n Middle = 'middle',\n Bottom = 'bottom',\n}\n\ninterface TextBoxData {\n text?: string;\n color?: string;\n size?: number; // 0 or missing will \"auto size\"\n align: Align;\n valign: VAlign;\n}\n\ninterface TextBoxConfig {\n text?: TextDimensionConfig;\n color?: ColorDimensionConfig;\n size?: number; // 0 or missing will \"auto size\"\n align: Align;\n valign: VAlign;\n}\n\nclass TextBoxDisplay extends PureComponent> {\n render() {\n const { data } = this.props;\n const styles = getStyles(config.theme2, data);\n return (\n \n {data?.text}\n \n );\n }\n}\nconst getStyles = stylesFactory((theme: GrafanaTheme2, data) => ({\n container: css`\n position: absolute;\n height: 100%;\n width: 100%;\n display: table;\n `,\n span: css`\n display: table-cell;\n vertical-align: ${data.valign};\n text-align: ${data.align};\n font-size: ${data?.size}px;\n color: ${data?.color};\n `,\n}));\nexport const textBoxItem: CanvasElementItem = {\n id: 'text-box',\n name: 'Text',\n description: 'Text box',\n\n display: TextBoxDisplay,\n\n defaultSize: {\n width: 240,\n height: 160,\n },\n\n getNewOptions: (options) => ({\n background: {\n color: {\n fixed: 'grey',\n },\n },\n ...options,\n config: {\n align: Align.Left,\n valign: VAlign.Middle,\n },\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: TextBoxConfig) => {\n const data: TextBoxData = {\n text: cfg.text ? ctx.getText(cfg.text).value() : '',\n align: cfg.align ?? Align.Center,\n valign: cfg.valign ?? VAlign.Middle,\n size: cfg.size,\n };\n\n if (cfg.color) {\n data.color = ctx.getColor(cfg.color).value();\n }\n\n return data;\n },\n\n // Heatmap overlay options\n registerOptionsUI: (builder) => {\n const category = ['Text box'];\n builder\n .addCustomEditor({\n category,\n id: 'textSelector',\n path: 'config.text',\n name: 'Text',\n editor: TextDimensionEditor,\n })\n .addCustomEditor({\n category,\n id: 'config.color',\n path: 'config.color',\n name: 'Text color',\n editor: ColorDimensionEditor,\n settings: {},\n defaultValue: {},\n })\n .addRadio({\n category,\n path: 'config.align',\n name: 'Align text',\n settings: {\n options: [\n { value: Align.Left, label: 'Left' },\n { value: Align.Center, label: 'Center' },\n { value: Align.Right, label: 'Right' },\n ],\n },\n defaultValue: Align.Left,\n })\n .addRadio({\n category,\n path: 'config.valign',\n name: 'Vertical align',\n settings: {\n options: [\n { value: VAlign.Top, label: 'Top' },\n { value: VAlign.Middle, label: 'Middle' },\n { value: VAlign.Bottom, label: 'Bottom' },\n ],\n },\n defaultValue: VAlign.Middle,\n })\n .addNumberInput({\n category,\n path: 'config.size',\n name: 'Text size',\n settings: {\n placeholder: 'Auto',\n },\n });\n },\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { DimensionContext, ScalarDimensionConfig } from 'app/features/dimensions';\nimport { ScalarDimensionEditor } from 'app/features/dimensions/editors';\n\nimport { CanvasElementItem, CanvasElementProps } from '../element';\n\ninterface WindTurbineData {\n rpm?: number;\n}\n\ninterface WindTurbineConfig {\n rpm?: ScalarDimensionConfig;\n}\n\nconst WindTurbineDisplay: FC> = (props) => {\n const styles = useStyles2(getStyles);\n\n const { data } = props;\n\n const windTurbineAnimation = `spin ${data?.rpm ? 60 / Math.abs(data.rpm) : 0}s linear infinite`;\n\n return (\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport const windTurbineItem: CanvasElementItem = {\n id: 'windTurbine',\n name: 'Wind Turbine',\n description: 'Spinny spinny',\n\n display: WindTurbineDisplay,\n\n defaultSize: {\n width: 100,\n height: 100,\n },\n\n getNewOptions: (options) => ({\n ...options,\n }),\n\n // Called when data changes\n prepareData: (ctx: DimensionContext, cfg: WindTurbineConfig) => {\n const data: WindTurbineData = {\n rpm: cfg?.rpm ? ctx.getScalar(cfg.rpm).value() : 0,\n };\n\n return data;\n },\n\n registerOptionsUI: (builder) => {\n const category = ['Wind Turbine'];\n builder.addCustomEditor({\n category,\n id: 'rpm',\n path: 'config.rpm',\n name: 'RPM',\n editor: ScalarDimensionEditor,\n });\n },\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n blade: css`\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n transform-origin: 94.663px 94.663px;\n transform: rotate(15deg);\n `,\n});\n","import { Registry } from '@grafana/data';\n\nimport { CanvasElementItem, CanvasElementOptions } from './element';\nimport { buttonItem } from './elements/button';\nimport { droneFrontItem } from './elements/droneFront';\nimport { droneSideItem } from './elements/droneSide';\nimport { droneTopItem } from './elements/droneTop';\nimport { iconItem } from './elements/icon';\nimport { textBoxItem } from './elements/textBox';\nimport { windTurbineItem } from './elements/windTurbine';\n\nexport const DEFAULT_CANVAS_ELEMENT_CONFIG: CanvasElementOptions = {\n ...iconItem.getNewOptions(),\n type: iconItem.id,\n name: `Element 1`,\n};\n\nexport const canvasElementRegistry = new Registry(() => [\n iconItem, // default for now\n textBoxItem,\n buttonItem,\n droneTopItem,\n droneFrontItem,\n droneSideItem,\n windTurbineItem,\n]);\n","import React, { CSSProperties } from 'react';\nimport { OnDrag, OnResize } from 'react-moveable/declaration/types';\n\nimport { LayerElement } from 'app/core/components/Layers/types';\nimport {\n BackgroundImageSize,\n CanvasElementItem,\n CanvasElementOptions,\n canvasElementRegistry,\n} from 'app/features/canvas';\nimport { notFoundItem } from 'app/features/canvas/elements/notFound';\nimport { DimensionContext } from 'app/features/dimensions';\n\nimport { Constraint, HorizontalConstraint, Placement, VerticalConstraint } from '../types';\n\nimport { FrameState } from './frame';\nimport { RootElement } from './root';\nimport { Scene } from './scene';\n\nlet counter = 0;\n\nexport class ElementState implements LayerElement {\n // UID necessary for moveable to work (for now)\n readonly UID = counter++;\n revId = 0;\n sizeStyle: CSSProperties = {};\n dataStyle: CSSProperties = {};\n\n // Determine whether or not element is in motion or not (via moveable)\n isMoving = false;\n\n // Temp stored constraint for visualization purposes (switch to top / left constraint to simplify some functionality)\n tempConstraint: Constraint | undefined;\n\n // Filled in by ref\n div?: HTMLDivElement;\n\n // Calculated\n data?: any; // depends on the type\n\n constructor(public item: CanvasElementItem, public options: CanvasElementOptions, public parent?: FrameState) {\n const fallbackName = `Element ${Date.now()}`;\n if (!options) {\n this.options = { type: item.id, name: fallbackName };\n }\n\n options.constraint = options.constraint ?? {\n vertical: VerticalConstraint.Top,\n horizontal: HorizontalConstraint.Left,\n };\n options.placement = options.placement ?? { width: 100, height: 100, top: 0, left: 0 };\n const scene = this.getScene();\n if (!options.name) {\n const newName = scene?.getNextElementName();\n options.name = newName ?? fallbackName;\n }\n scene?.byName.set(options.name, this);\n }\n\n private getScene(): Scene | undefined {\n let trav = this.parent;\n while (trav) {\n if (trav.isRoot()) {\n return trav.scene;\n }\n trav = trav.parent;\n }\n\n return undefined;\n }\n\n getName() {\n return this.options.name;\n }\n\n /** Use the configured options to update CSS style properties directly on the wrapper div **/\n applyLayoutStylesToDiv() {\n if (this.isRoot()) {\n // Root supersedes layout engine and is always 100% width + height of panel\n return;\n }\n\n const { constraint } = this.options;\n const { vertical, horizontal } = constraint ?? {};\n const placement = this.options.placement ?? ({} as Placement);\n\n const style: React.CSSProperties = {\n position: 'absolute',\n // Minimum element size is 10x10\n minWidth: '10px',\n minHeight: '10px',\n };\n\n const translate = ['0px', '0px'];\n\n switch (vertical) {\n case VerticalConstraint.Top:\n placement.top = placement.top ?? 0;\n placement.height = placement.height ?? 100;\n style.top = `${placement.top}px`;\n style.height = `${placement.height}px`;\n delete placement.bottom;\n break;\n case VerticalConstraint.Bottom:\n placement.bottom = placement.bottom ?? 0;\n placement.height = placement.height ?? 100;\n style.bottom = `${placement.bottom}px`;\n style.height = `${placement.height}px`;\n delete placement.top;\n break;\n case VerticalConstraint.TopBottom:\n placement.top = placement.top ?? 0;\n placement.bottom = placement.bottom ?? 0;\n style.top = `${placement.top}px`;\n style.bottom = `${placement.bottom}px`;\n delete placement.height;\n style.height = '';\n break;\n case VerticalConstraint.Center:\n placement.top = placement.top ?? 0;\n placement.height = placement.height ?? 100;\n translate[1] = '-50%';\n style.top = `calc(50% - ${placement.top}px)`;\n style.height = `${placement.height}px`;\n delete placement.bottom;\n break;\n case VerticalConstraint.Scale:\n placement.top = placement.top ?? 0;\n placement.bottom = placement.bottom ?? 0;\n style.top = `${placement.top}%`;\n style.bottom = `${placement.bottom}%`;\n delete placement.height;\n style.height = '';\n break;\n }\n\n switch (horizontal) {\n case HorizontalConstraint.Left:\n placement.left = placement.left ?? 0;\n placement.width = placement.width ?? 100;\n style.left = `${placement.left}px`;\n style.width = `${placement.width}px`;\n delete placement.right;\n break;\n case HorizontalConstraint.Right:\n placement.right = placement.right ?? 0;\n placement.width = placement.width ?? 100;\n style.right = `${placement.right}px`;\n style.width = `${placement.width}px`;\n delete placement.left;\n break;\n case HorizontalConstraint.LeftRight:\n placement.left = placement.left ?? 0;\n placement.right = placement.right ?? 0;\n style.left = `${placement.left}px`;\n style.right = `${placement.right}px`;\n delete placement.width;\n style.width = '';\n break;\n case HorizontalConstraint.Center:\n placement.left = placement.left ?? 0;\n placement.width = placement.width ?? 100;\n translate[0] = '-50%';\n style.left = `calc(50% - ${placement.left}px)`;\n style.width = `${placement.width}px`;\n delete placement.right;\n break;\n case HorizontalConstraint.Scale:\n placement.left = placement.left ?? 0;\n placement.right = placement.right ?? 0;\n style.left = `${placement.left}%`;\n style.right = `${placement.right}%`;\n delete placement.width;\n style.width = '';\n break;\n }\n\n style.transform = `translate(${translate[0]}, ${translate[1]})`;\n this.options.placement = placement;\n this.sizeStyle = style;\n if (this.div) {\n for (const key in this.sizeStyle) {\n this.div.style[key as any] = (this.sizeStyle as any)[key];\n }\n\n for (const key in this.dataStyle) {\n this.div.style[key as any] = (this.dataStyle as any)[key];\n }\n }\n }\n\n setPlacementFromConstraint(elementContainer?: DOMRect, parentContainer?: DOMRect) {\n const { constraint } = this.options;\n const { vertical, horizontal } = constraint ?? {};\n\n if (!elementContainer) {\n elementContainer = this.div && this.div.getBoundingClientRect();\n }\n if (!parentContainer) {\n parentContainer = this.div && this.div.parentElement?.getBoundingClientRect();\n }\n\n const relativeTop =\n elementContainer && parentContainer ? Math.round(elementContainer.top - parentContainer.top) : 0;\n const relativeBottom =\n elementContainer && parentContainer ? Math.round(parentContainer.bottom - elementContainer.bottom) : 0;\n const relativeLeft =\n elementContainer && parentContainer ? Math.round(elementContainer.left - parentContainer.left) : 0;\n const relativeRight =\n elementContainer && parentContainer ? Math.round(parentContainer.right - elementContainer.right) : 0;\n\n const placement = {} as Placement;\n\n const width = elementContainer?.width ?? 100;\n const height = elementContainer?.height ?? 100;\n\n switch (vertical) {\n case VerticalConstraint.Top:\n placement.top = relativeTop;\n placement.height = height;\n break;\n case VerticalConstraint.Bottom:\n placement.bottom = relativeBottom;\n placement.height = height;\n break;\n case VerticalConstraint.TopBottom:\n placement.top = relativeTop;\n placement.bottom = relativeBottom;\n break;\n case VerticalConstraint.Center:\n const elementCenter = elementContainer ? relativeTop + height / 2 : 0;\n const parentCenter = parentContainer ? parentContainer.height / 2 : 0;\n const distanceFromCenter = parentCenter - elementCenter;\n placement.top = distanceFromCenter;\n placement.height = height;\n break;\n case VerticalConstraint.Scale:\n placement.top = (relativeTop / (parentContainer?.height ?? height)) * 100;\n placement.bottom = (relativeBottom / (parentContainer?.height ?? height)) * 100;\n break;\n }\n\n switch (horizontal) {\n case HorizontalConstraint.Left:\n placement.left = relativeLeft;\n placement.width = width;\n break;\n case HorizontalConstraint.Right:\n placement.right = relativeRight;\n placement.width = width;\n break;\n case HorizontalConstraint.LeftRight:\n placement.left = relativeLeft;\n placement.right = relativeRight;\n break;\n case HorizontalConstraint.Center:\n const elementCenter = elementContainer ? relativeLeft + width / 2 : 0;\n const parentCenter = parentContainer ? parentContainer.width / 2 : 0;\n const distanceFromCenter = parentCenter - elementCenter;\n placement.left = distanceFromCenter;\n placement.width = width;\n break;\n case HorizontalConstraint.Scale:\n placement.left = (relativeLeft / (parentContainer?.width ?? width)) * 100;\n placement.right = (relativeRight / (parentContainer?.width ?? width)) * 100;\n break;\n }\n\n this.options.placement = placement;\n\n this.applyLayoutStylesToDiv();\n this.revId++;\n }\n\n updateData(ctx: DimensionContext) {\n if (this.item.prepareData) {\n this.data = this.item.prepareData(ctx, this.options.config);\n this.revId++; // rerender\n }\n\n const { background, border } = this.options;\n const css: CSSProperties = {};\n if (background) {\n if (background.color) {\n const color = ctx.getColor(background.color);\n css.backgroundColor = color.value();\n }\n if (background.image) {\n const image = ctx.getResource(background.image);\n if (image) {\n const v = image.value();\n if (v) {\n css.backgroundImage = `url(\"${v}\")`;\n switch (background.size ?? BackgroundImageSize.Contain) {\n case BackgroundImageSize.Contain:\n css.backgroundSize = 'contain';\n css.backgroundRepeat = 'no-repeat';\n break;\n case BackgroundImageSize.Cover:\n css.backgroundSize = 'cover';\n css.backgroundRepeat = 'no-repeat';\n break;\n case BackgroundImageSize.Original:\n css.backgroundRepeat = 'no-repeat';\n break;\n case BackgroundImageSize.Tile:\n css.backgroundRepeat = 'repeat';\n break;\n case BackgroundImageSize.Fill:\n css.backgroundSize = '100% 100%';\n break;\n }\n }\n }\n }\n }\n\n if (border && border.color && border.width) {\n const color = ctx.getColor(border.color);\n css.borderWidth = border.width;\n css.borderStyle = 'solid';\n css.borderColor = color.value();\n\n // Move the image to inside the border\n if (css.backgroundImage) {\n css.backgroundOrigin = 'padding-box';\n }\n }\n\n this.dataStyle = css;\n this.applyLayoutStylesToDiv();\n }\n\n isRoot(): this is RootElement {\n return false;\n }\n\n /** Recursively visit all nodes */\n visit(visitor: (v: ElementState) => void) {\n visitor(this);\n }\n\n onChange(options: CanvasElementOptions) {\n if (this.item.id !== options.type) {\n this.item = canvasElementRegistry.getIfExists(options.type) ?? notFoundItem;\n }\n\n // rename handling\n const oldName = this.options.name;\n const newName = options.name;\n\n this.revId++;\n this.options = { ...options };\n let trav = this.parent;\n while (trav) {\n if (trav.isRoot()) {\n trav.scene.save();\n break;\n }\n trav.revId++;\n trav = trav.parent;\n }\n\n const scene = this.getScene();\n if (oldName !== newName && scene) {\n scene.byName.delete(oldName);\n scene.byName.set(newName, this);\n }\n }\n\n getSaveModel() {\n return { ...this.options };\n }\n\n initElement = (target: HTMLDivElement) => {\n this.div = target;\n this.applyLayoutStylesToDiv();\n };\n\n applyDrag = (event: OnDrag) => {\n event.target.style.transform = event.transform;\n };\n\n // kinda like:\n // https://github.com/grafana/grafana-edge-app/blob/main/src/panels/draw/WrapItem.tsx#L44\n applyResize = (event: OnResize) => {\n const placement = this.options.placement!;\n\n const style = event.target.style;\n const deltaX = event.delta[0];\n const deltaY = event.delta[1];\n const dirLR = event.direction[0];\n const dirTB = event.direction[1];\n\n if (dirLR === 1) {\n placement.width = event.width;\n style.width = `${placement.width}px`;\n } else if (dirLR === -1) {\n placement.left! -= deltaX;\n placement.width = event.width;\n style.left = `${placement.left}px`;\n style.width = `${placement.width}px`;\n }\n\n if (dirTB === -1) {\n placement.top! -= deltaY;\n placement.height = event.height;\n style.top = `${placement.top}px`;\n style.height = `${placement.height}px`;\n } else if (dirTB === 1) {\n placement.height = event.height;\n style.height = `${placement.height}px`;\n }\n };\n\n render() {\n const { item } = this;\n return (\n \n \n \n );\n }\n}\n","import { ColorDimensionConfig, ResourceDimensionConfig } from 'app/features/dimensions/types';\n\nexport interface Placement {\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n\n width?: number;\n height?: number;\n}\n\nexport interface Constraint {\n horizontal?: HorizontalConstraint;\n vertical?: VerticalConstraint;\n}\n\nexport enum HorizontalConstraint {\n Left = 'left',\n Right = 'right',\n LeftRight = 'leftright',\n Center = 'center',\n Scale = 'scale',\n}\n\nexport enum VerticalConstraint {\n Top = 'top',\n Bottom = 'bottom',\n TopBottom = 'topbottom',\n Center = 'center',\n Scale = 'scale',\n}\n\nexport enum BackgroundImageSize {\n Original = 'original',\n Contain = 'contain',\n Cover = 'cover',\n Fill = 'fill',\n Tile = 'tile',\n}\n\nexport interface BackgroundConfig {\n color?: ColorDimensionConfig;\n image?: ResourceDimensionConfig;\n size?: BackgroundImageSize;\n}\n\nexport interface LineConfig {\n color?: ColorDimensionConfig;\n width?: number;\n}\n\nexport enum QuickPlacement {\n Top = 'top',\n Bottom = 'bottom',\n Left = 'left',\n Right = 'right',\n HorizontalCenter = 'hcenter',\n VerticalCenter = 'vcenter',\n}\n","import React, { FC, useCallback } from 'react';\n\nimport { AppEvents, StandardEditorProps, StandardEditorsRegistryItem, StringFieldConfigSettings } from '@grafana/data';\nimport { config, getBackendSrv } from '@grafana/runtime';\nimport { Button, InlineField, InlineFieldRow, JSONFormatter, StringValueEditor } from '@grafana/ui';\nimport { appEvents } from 'app/core/core';\n\nexport interface APIEditorConfig {\n endpoint: string;\n data?: string;\n}\n\nconst dummyStringSettings: StandardEditorsRegistryItem = {\n settings: {},\n} as any;\n\nexport const callApi = (api: APIEditorConfig, isTest = false) => {\n if (api) {\n getBackendSrv()\n .fetch({\n url: api.endpoint!,\n method: 'POST',\n data: api.data ?? {},\n })\n .subscribe({\n error: (error: any) => {\n if (isTest) {\n appEvents.emit(AppEvents.alertError, ['Error has occurred: ', JSON.stringify(error)]);\n console.error(error);\n }\n },\n complete: () => {\n if (isTest) {\n appEvents.emit(AppEvents.alertSuccess, ['Test successful']);\n }\n },\n });\n }\n};\n\nexport const APIEditor: FC> = (props) => {\n const { value, context, onChange } = props;\n const labelWidth = 9;\n\n const onEndpointChange = useCallback(\n (endpoint) => {\n onChange({\n ...value,\n endpoint,\n });\n },\n [onChange, value]\n );\n\n const onDataChange = useCallback(\n (data) => {\n onChange({\n ...value,\n data,\n });\n },\n [onChange, value]\n );\n\n const renderJSON = (data: string) => {\n try {\n const json = JSON.parse(data);\n return ;\n } catch (error) {\n return `Invalid JSON provided: ${error.message}`;\n }\n };\n\n const renderTestAPIButton = (api: APIEditorConfig) => {\n if (api && api.endpoint) {\n return (\n callApi(api, true)} title={'Test API'}>\n Test API\n \n );\n }\n\n return;\n };\n\n return config.disableSanitizeHtml ? (\n <>\n \n \n \n \n \n \n \n \n \n \n {renderTestAPIButton(value)}\n \n {renderJSON(value?.data ?? '{}')}\n >\n ) : (\n <>Must enable disableSanitizeHtml feature flag to access>\n );\n};\n","import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin';\nimport { BackgroundImageSize, CanvasElementOptions } from 'app/features/canvas';\nimport { ColorDimensionEditor, ResourceDimensionEditor } from 'app/features/dimensions/editors';\n\ninterface OptionSuppliers {\n addBackground: PanelOptionsSupplier;\n addBorder: PanelOptionsSupplier;\n}\n\nexport const optionBuilder: OptionSuppliers = {\n addBackground: (builder, context) => {\n const category = ['Background'];\n builder\n .addCustomEditor({\n category,\n id: 'background.color',\n path: 'background.color',\n name: 'Color',\n editor: ColorDimensionEditor,\n settings: {},\n defaultValue: {\n // Configured values\n fixed: '',\n },\n })\n .addCustomEditor({\n category,\n id: 'background.image',\n path: 'background.image',\n name: 'Image',\n editor: ResourceDimensionEditor,\n settings: {\n resourceType: 'image',\n },\n })\n .addRadio({\n category,\n path: 'background.size',\n name: 'Image size',\n settings: {\n options: [\n { value: BackgroundImageSize.Original, label: 'Original' },\n { value: BackgroundImageSize.Contain, label: 'Contain' },\n { value: BackgroundImageSize.Cover, label: 'Cover' },\n { value: BackgroundImageSize.Fill, label: 'Fill' },\n { value: BackgroundImageSize.Tile, label: 'Tile' },\n ],\n },\n defaultValue: BackgroundImageSize.Cover,\n });\n },\n\n addBorder: (builder, context) => {\n const category = ['Border'];\n builder.addSliderInput({\n category,\n path: 'border.width',\n name: 'Width',\n defaultValue: 2,\n settings: {\n min: 0,\n max: 20,\n },\n });\n\n if (context.options?.border?.width) {\n builder.addCustomEditor({\n category,\n id: 'border.color',\n path: 'border.color',\n name: 'Color',\n editor: ColorDimensionEditor,\n settings: {},\n defaultValue: {\n // Configured values\n fixed: '',\n },\n });\n }\n },\n};\n"],"names":["svgStrokePathClass","css","iconItem","id","name","description","display","props","data","path","svgStyle","fill","stroke","strokeColor","strokeWidth","onClick","api","callApi","src","style","className","undefined","getNewOptions","options","placement","width","height","top","left","config","mode","ResourceDimensionMode","fixed","prepareData","ctx","cfg","getResource","value","isString","getPublicOrAbsoluteUrl","getColor","color","registerOptionsUI","builder","category","addCustomEditor","editor","ResourceDimensionEditor","settings","resourceType","ColorDimensionEditor","defaultValue","addSliderInput","min","max","showIf","Boolean","APIEditor","NotFoundDisplay","PureComponent","render","this","JSON","stringify","notFoundItem","defaultSize","ButtonDisplay","Button","type","text","buttonItem","getText","TextDimensionEditor","droneFrontItem","styles","useStyles2","getStyles","droneFrontTransformStyle","rollAngle","droneFront","xmlns","xmlnsXlink","viewBox","transform","x1","x2","y1","y2","d","cx","cy","r","getScalar","ScalarDimensionEditor","theme","droneSideItem","droneSidePitchTransformStyle","pitchAngle","droneSide","droneTopItem","fRightRotorAnimation","fRightRotorRPM","Math","abs","fLeftRotorAnimation","fLeftRotorRPM","bRightRotorAnimation","bRightRotorRPM","bLeftRotorAnimation","bLeftRotorRPM","droneTopTransformStyle","yawAngle","xmlSpace","fillRule","propeller","propellerCW","animation","propellerCCW","Align","VAlign","TextBoxDisplay","container","span","stylesFactory","valign","align","size","textBoxItem","background","Left","Middle","Center","addRadio","label","Right","Top","Bottom","addNumberInput","placeholder","windTurbineItem","windTurbineAnimation","rpm","preserveAspectRatio","points","blade","href","x","y","DEFAULT_CANVAS_ELEMENT_CONFIG","canvasElementRegistry","Registry","counter","ElementState","constructor","item","parent","target","div","applyLayoutStylesToDiv","event","deltaX","delta","deltaY","dirLR","direction","dirTB","fallbackName","Date","now","constraint","vertical","VerticalConstraint","horizontal","HorizontalConstraint","scene","getScene","newName","getNextElementName","byName","set","trav","isRoot","getName","position","minWidth","minHeight","translate","bottom","right","sizeStyle","key","dataStyle","setPlacementFromConstraint","elementContainer","parentContainer","getBoundingClientRect","parentElement","relativeTop","round","relativeBottom","relativeLeft","relativeRight","elementCenter","distanceFromCenter","revId","updateData","border","backgroundColor","image","v","backgroundImage","BackgroundImageSize","backgroundSize","backgroundRepeat","borderWidth","borderStyle","borderColor","backgroundOrigin","visit","visitor","onChange","oldName","save","delete","getSaveModel","ref","initElement","UID","QuickPlacement","dummyStringSettings","isTest","getBackendSrv","fetch","url","endpoint","method","subscribe","error","appEvents","AppEvents","console","complete","context","onEndpointChange","useCallback","onDataChange","InlineFieldRow","InlineField","labelWidth","grow","StringValueEditor","title","renderTestAPIButton","json","parse","JSONFormatter","message","renderJSON","optionBuilder","addBackground","addBorder"],"sourceRoot":""}
{JSON.stringify(config, null, 2)}