import { css } from '@emotion/css'; import { useDialog } from '@react-aria/dialog'; import { FocusScope } from '@react-aria/focus'; import { useOverlay } from '@react-aria/overlays'; import React, { createRef, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { getBackendSrv } from '@grafana/runtime'; import { Button, ButtonGroup, useStyles2 } from '@grafana/ui'; import { config } from 'app/core/config'; import { MediaType, PickerTabType, ResourceFolderName } from '../types'; import { FileUploader } from './FileUploader'; import { FolderPickerTab } from './FolderPickerTab'; import { URLPickerTab } from './URLPickerTab'; interface Props { value?: string; //img/icons/unicons/0-plus.svg onChange: (value?: string) => void; mediaType: MediaType; folderName: ResourceFolderName; } interface ErrorResponse { message: string; } export const ResourcePickerPopover = (props: Props) => { const { value, onChange, mediaType, folderName } = props; const styles = useStyles2(getStyles); const onClose = () => { onChange(value); }; const ref = createRef(); const { dialogProps } = useDialog({}, ref); const { overlayProps } = useOverlay({ onClose, isDismissable: true, isOpen: true }, ref); const [newValue, setNewValue] = useState(value ?? ''); const [activePicker, setActivePicker] = useState(PickerTabType.Folder); const [formData, setFormData] = useState(new FormData()); const [upload, setUpload] = useState(false); const [error, setError] = useState({ message: '' }); const getTabClassName = (tabName: PickerTabType) => { return `${styles.resourcePickerPopoverTab} ${activePicker === tabName && styles.resourcePickerPopoverActiveTab}`; }; const renderFolderPicker = () => ( ); const renderURLPicker = () => ; const renderUploader = () => ( ); const renderPicker = () => { switch (activePicker) { case PickerTabType.Folder: return renderFolderPicker(); case PickerTabType.URL: return renderURLPicker(); case PickerTabType.Upload: return renderUploader(); default: return renderFolderPicker(); } }; return (
{config.featureToggles['storageLocalUpload'] ? ( ) : ( '' )}
{renderPicker()}
); }; const getStyles = (theme: GrafanaTheme2) => ({ resourcePickerPopover: css` border-radius: ${theme.shape.borderRadius()}; box-shadow: ${theme.shadows.z3}; background: ${theme.colors.background.primary}; border: 1px solid ${theme.colors.border.medium}; `, resourcePickerPopoverTab: css` width: 50%; text-align: center; padding: ${theme.spacing(1, 0)}; background: ${theme.colors.background.secondary}; color: ${theme.colors.text.secondary}; font-size: ${theme.typography.bodySmall.fontSize}; cursor: pointer; border: none; &:focus:not(:focus-visible) { outline: none; box-shadow: none; } :focus-visible { position: relative; } `, resourcePickerPopoverActiveTab: css` color: ${theme.colors.text.primary}; font-weight: ${theme.typography.fontWeightMedium}; background: ${theme.colors.background.primary}; `, resourcePickerPopoverContent: css` width: 315px; font-size: ${theme.typography.bodySmall.fontSize}; min-height: 184px; padding: ${theme.spacing(1)}; display: flex; flex-direction: column; `, resourcePickerPopoverTabs: css` display: flex; width: 100%; border-radius: ${theme.shape.borderRadius()} ${theme.shape.borderRadius()} 0 0; `, buttonGroup: css` align-self: center; flex-direction: row; `, button: css` margin: 12px 20px 5px; `, });