import { cx } from '@emotion/css'; import React, { useCallback, useEffect, useState } from 'react'; import { Button, Icon, Modal, useStyles2 } from '@grafana/ui'; import Datasource from '../../datasource'; import { ResourcePickerQueryType } from '../../resourcePicker/resourcePickerData'; import { AzureQueryEditorFieldProps, AzureMetricResource } from '../../types'; import { Field } from '../Field'; import ResourcePicker from '../ResourcePicker'; import getStyles from '../ResourcePicker/styles'; import { ResourceRowType } from '../ResourcePicker/types'; import { parseResourceDetails, setResource } from '../ResourcePicker/utils'; interface ResourceFieldProps extends AzureQueryEditorFieldProps { selectableEntryTypes: ResourceRowType[]; queryType: ResourcePickerQueryType; resource: T; inlineField?: boolean; labelWidth?: number; } const ResourceField: React.FC> = ({ query, datasource, onQueryChange, selectableEntryTypes, queryType, resource, inlineField, labelWidth, }) => { const styles = useStyles2(getStyles); const [pickerIsOpen, setPickerIsOpen] = useState(false); const handleOpenPicker = useCallback(() => { setPickerIsOpen(true); }, []); const closePicker = useCallback(() => { setPickerIsOpen(false); }, []); const handleApply = useCallback( (resource: string | AzureMetricResource | undefined) => { onQueryChange(setResource(query, resource)); closePicker(); }, [closePicker, onQueryChange, query] ); return ( <> ); }; interface ResourceLabelProps { resource: T; datasource: Datasource; } const ResourceLabel = ({ resource, datasource }: ResourceLabelProps) => { const [resourceComponents, setResourceComponents] = useState(parseResourceDetails(resource ?? '')); useEffect(() => { if (resource && parseResourceDetails(resource)) { typeof resource === 'string' ? datasource.resourcePickerData.getResourceURIDisplayProperties(resource).then(setResourceComponents) : setResourceComponents(resource); } else { setResourceComponents({}); } }, [datasource.resourcePickerData, resource]); if (!resource || (typeof resource === 'object' && !resource.subscription)) { return <>Select a resource; } if (resourceComponents) { return ; } return <>{resource}; }; interface FormattedResourceProps { resource: AzureMetricResource; } const FormattedResource = ({ resource }: FormattedResourceProps) => { const styles = useStyles2(getStyles); if (resource.resourceName) { return ( {resource.resourceName.split('/')[0]} ); } if (resource.resourceGroup) { return ( {resource.resourceGroup} ); } return ( {resource.subscription} ); }; export default ResourceField;