import React, { FC, useCallback, useState } from 'react'; import { FieldNamePickerConfigSettings, GrafanaTheme2, StandardEditorProps, StandardEditorsRegistryItem, } from '@grafana/data'; import { InlineField, InlineFieldRow, RadioButtonGroup, Button, Modal, Input, useStyles2 } from '@grafana/ui'; import SVG from 'react-inlinesvg'; import { css } from '@emotion/css'; import { ResourceDimensionConfig, ResourceDimensionMode, ResourceDimensionOptions } from '../types'; import { FieldNamePicker } from '../../../../../packages/grafana-ui/src/components/MatchersUI/FieldNamePicker'; import { ResourcePicker } from './ResourcePicker'; import { getPublicOrAbsoluteUrl, ResourceFolderName } from '..'; const resourceOptions = [ { label: 'Fixed', value: ResourceDimensionMode.Fixed, description: 'Fixed value' }, { label: 'Field', value: ResourceDimensionMode.Field, description: 'Use a string field result' }, // { label: 'Mapping', value: ResourceDimensionMode.Mapping, description: 'Map the results of a value to an svg' }, ]; const dummyFieldSettings: StandardEditorsRegistryItem = { settings: {}, } as any; export const ResourceDimensionEditor: FC< StandardEditorProps > = (props) => { const { value, context, onChange, item } = props; const labelWidth = 9; const [isOpen, setOpen] = useState(false); const styles = useStyles2(getStyles); const onModeChange = useCallback( (mode) => { onChange({ ...value, mode, }); }, [onChange, value] ); const onFieldChange = useCallback( (field) => { onChange({ ...value, field, }); }, [onChange, value] ); const onFixedChange = useCallback( (fixed?: string) => { onChange({ ...value, fixed: fixed ?? '', }); setOpen(false); }, [onChange, value] ); const onClear = (event: React.MouseEvent) => { event.stopPropagation(); onChange({ mode: ResourceDimensionMode.Fixed, fixed: '', field: '' }); }; const openModal = useCallback(() => { setOpen(true); }, []); const mode = value?.mode ?? ResourceDimensionMode.Fixed; const showSourceRadio = item.settings?.showSourceRadio ?? true; const mediaType = item.settings?.resourceType ?? 'icon'; const folderName = item.settings?.folderName ?? ResourceFolderName.Icon; let srcPath = ''; if (mediaType === 'icon') { if (value?.fixed) { srcPath = getPublicOrAbsoluteUrl(value.fixed); } else if (item.settings?.placeholderValue) { srcPath = getPublicOrAbsoluteUrl(item.settings.placeholderValue); } } return ( <> {isOpen && ( setOpen(false)} closeOnEscape> )} {showSourceRadio && ( )} {mode !== ResourceDimensionMode.Fixed && ( )} {mode === ResourceDimensionMode.Fixed && ( } suffix={