import { useFlag, useParams } from 'common' import dayjs from 'dayjs' import { Check, ChevronDown } from 'lucide-react' import { useState } from 'react' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' import { DatabaseParametersSubMenu } from '@/components/interfaces/QuerySources/DatabaseParametersSubMenu' import { LogsCustomRangeDialog } from '@/components/interfaces/QuerySources/LogsCustomRangeDialog' import { LogsTimeRangeSubMenu } from '@/components/interfaces/QuerySources/LogsTimeRangeSubMenu' import { QuerySourceIcon } from '@/components/interfaces/QuerySources/QuerySourceIcon' import { maybeShowUpgradePromptIfNotEntitled } from '@/components/interfaces/Settings/Logs/Logs.utils' import UpgradePrompt from '@/components/interfaces/Settings/Logs/UpgradePrompt' import { createDefaultCellSource, QUERY_SOURCE_LABELS, QUERY_SOURCES, type CellSource, } from '@/data/query-sources/query-source-registry' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' export type ExplorerQuerySourceMenuProps = { source: CellSource onSourceChange: (source: CellSource) => void } /** * Source binding and parameter controls shared by standalone Explorer queries * and notebook query-cell toolbars. The consumer owns the binding; this menu * only emits complete, validated-by-construction `CellSource` values. */ export const ExplorerQuerySourceMenu = ({ source, onSourceChange, }: ExplorerQuerySourceMenuProps) => { const { ref } = useParams() const isLogsSourceEnabled = useFlag('sqlEditorLogsSource') const isOtelLogsEnabled = useFlag('otelLegacyLogs') const [isCustomRangeOpen, setIsCustomRangeOpen] = useState(false) const [showUpgradePrompt, setShowUpgradePrompt] = useState(false) const { getEntitlementNumericValue } = useCheckEntitlements('log.retention_days') const entitledToLogDays = getEntitlementNumericValue() const availableSources = QUERY_SOURCES.filter( (candidate) => candidate.type !== 'logs' || (isLogsSourceEnabled && isOtelLogsEnabled) || source.type === 'logs' ) const applyCustomRange = ({ from, to }: { from: Date; to: Date }) => { const fromIso = dayjs(from).startOf('day').toISOString() if (maybeShowUpgradePromptIfNotEntitled(fromIso, entitledToLogDays)) { setShowUpgradePrompt(true) return } onSourceChange({ id: 'logs', type: 'logs', parameters: { time_range: { type: 'absolute', from: fromIso, to: dayjs(to).endOf('day').toISOString(), }, }, }) } return ( <> {availableSources.map((candidate) => ( { event.preventDefault() if (candidate.id !== source.id) { onSourceChange(createDefaultCellSource(candidate.id)) } }} > {QUERY_SOURCE_LABELS[candidate.id]} {source.id === candidate.id && } ))} {source.type === 'database' ? ( onSourceChange({ id: 'database', type: 'database', parameters: { identifier }, }) } /> ) : ( onSourceChange({ id: 'logs', type: 'logs', parameters: { time_range: timeRange }, }) } onOpenCustomRange={() => setIsCustomRangeOpen(true)} onShowUpgrade={() => setShowUpgradePrompt(true)} /> )} {source.type === 'logs' && ( <> )} ) }