import { BarChart2, Settings2, Table } from 'lucide-react' import { useEffect, useEffectEvent, useMemo } from 'react' import { Checkbox, Popover, PopoverContent, PopoverSeparator, PopoverTrigger, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ExplorerToolbarAction } from '../ExplorerToolbar' import { type QueryChartConfig, type QueryDisplay, type QueryResult } from '../types' import { checkHasNonPositiveValues } from '@/components/ui/QueryBlock/QueryBlock.utils' interface DisplaySettingsButtonProps { display: QueryDisplay result?: QueryResult columns: string[] disabled: boolean onChange: (display: QueryDisplay) => void } // [Joshen] TODO support multiple y axis charts // [Joshen] TODO onUpdateChartConfig can likely be shifted into the notebook-state // so this component doesn't need to know about other cells export const DisplaySettingsButton = ({ display, result, columns, disabled, onChange, }: DisplaySettingsButtonProps) => { const { view, chart } = display const { type = 'bar', x_column, y_columns = [], cumulative = false, show_labels = false, scale = 'linear', } = chart ?? {} const hasNonPositiveValues = useMemo( () => checkHasNonPositiveValues(result?.rows ?? [], y_columns[0]), [result, y_columns] ) const canToggleLogScale = useMemo(() => { if (y_columns.length === 0 || !result || (result.rows ?? []).length === 0) return false return !hasNonPositiveValues }, [hasNonPositiveValues, result, y_columns.length]) const onChangeView = (view: 'table' | 'chart') => { onChange({ ...display, view }) } const onUpdateChartConfig = (payload: Partial) => { onChange({ ...display, chart: { type: chart?.type ?? 'bar', x_column: chart?.x_column ?? '', y_columns: chart?.y_columns ?? [], cumulative: chart?.cumulative ?? false, scale: chart?.scale ?? 'linear', show_labels: chart?.show_labels ?? false, ...payload, }, }) } const resetToLinearScale = useEffectEvent(() => { onUpdateChartConfig({ scale: 'linear' }) }) useEffect(() => { if (hasNonPositiveValues && scale === 'log') { resetToLinearScale() } }, [hasNonPositiveValues, scale]) return ( } tooltip="Result settings" />

Result display settings

{ if (value === 'table' || value === 'chart') onChangeView(value) }} variant="outline" type="single" >

Table

Chart

{view === 'chart' && ( <> { if (value === 'bar' || value === 'line') onUpdateChartConfig({ type: value }) }} variant="outline" type="single" > Bar Line
onUpdateChartConfig({ cumulative: Boolean(cumulative) }) } /> onUpdateChartConfig({ show_labels: Boolean(show_labels) }) } />
)} ) }