import {useSortable} from '@dnd-kit/sortable'; import styled from '@emotion/styled'; import {Button, ButtonProps} from 'sentry/components/button'; import {CompactSelect} from 'sentry/components/compactSelect'; import DropdownButton from 'sentry/components/dropdownButton'; import {IconAdd} from 'sentry/icons'; import {t} from 'sentry/locale'; import {trackAnalytics} from 'sentry/utils/analytics'; import {hasDDMExperimentalFeature, hasDDMFeature} from 'sentry/utils/metrics/features'; import useOrganization from 'sentry/utils/useOrganization'; import {DataSet} from 'sentry/views/dashboards/widgetBuilder/utils'; import {DisplayType} from './types'; import WidgetWrapper from './widgetWrapper'; export const ADD_WIDGET_BUTTON_DRAG_ID = 'add-widget-button'; const initialStyles = { x: 0, y: 0, scaleX: 1, scaleY: 1, }; type Props = { onAddWidget: (dataset: DataSet) => void; }; function AddWidget({onAddWidget}: Props) { const {setNodeRef, transform} = useSortable({ disabled: true, id: ADD_WIDGET_BUTTON_DRAG_ID, transition: null, }); const organization = useOrganization(); return ( {hasDDMExperimentalFeature(organization) ? ( ) : ( onAddWidget(DataSet.EVENTS)}> } aria-label={t('Add widget')} /> )} ); } const AddButton = styled(Button)` border: none; &, &:focus, &:active, &:hover { background: transparent; box-shadow: none; } `; export default AddWidget; export function AddWidgetButton({onAddWidget, ...buttonProps}: Props & ButtonProps) { const organization = useOrganization(); const datasetChoices = new Map(); datasetChoices.set(DataSet.EVENTS, t('Errors and Transactions')); datasetChoices.set(DataSet.ISSUES, t('Issues (States, Assignment, Time, etc.)')); if (organization.features.includes('dashboards-rh-widget')) { datasetChoices.set(DataSet.RELEASES, t('Releases (Sessions, Crash rates)')); } if (hasDDMFeature(organization)) { datasetChoices.set(DataSet.METRICS, t('Custom Metrics')); } return ( ({ label, value, }))} trigger={triggerProps => ( } > {t('Add Widget')} )} onChange={({value: dataset}) => { trackAnalytics('dashboards_views.widget_library.opened', { organization, }); onAddWidget(dataset as DataSet); }} /> ); } const InnerWrapper = styled('div')<{onClick?: () => void}>` width: 100%; height: 110px; border: 2px dashed ${p => p.theme.border}; border-radius: ${p => p.theme.borderRadius}; display: flex; align-items: center; justify-content: center; cursor: ${p => (p.onClick ? 'pointer' : '')}; `;