import { format } from 'date-fns' import { ArrowUpDown } from 'lucide-react' import { useEffect, useState } from 'react' import { DatePicker } from 'components/ui/DatePicker' import { Parameter } from 'lib/sql-parameters' import { Button, Input_Shadcn_, Label_Shadcn_, Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, } from 'ui' interface ParametersPopoverProps { parameters: Parameter[] parameterValues?: Record onSubmit?: (parameters: Record) => void onChange?: (parameters: Record) => void } export const ParametersPopover = ({ parameters, parameterValues = {}, onSubmit, onChange, }: ParametersPopoverProps) => { const [tempParameters, setTempParameters] = useState>( parameters.reduce( (acc, param) => ({ ...acc, [param.name]: parameterValues[param.name] ?? param.defaultValue ?? '', }), {} ) ) // Update temp parameters when external parameters or values change useEffect(() => { setTempParameters( parameters.reduce( (acc, param) => ({ ...acc, [param.name]: parameterValues[param.name] ?? param.defaultValue ?? '', }), {} ) ) }, [parameters, parameterValues]) const handleParameterChange = (name: string, value: string) => { const newParameters = { ...tempParameters, [name]: value, } setTempParameters(newParameters) onChange?.(newParameters) } const renderInput = (param: Parameter) => { const currentValue = tempParameters[param.name] ?? parameterValues[param.name] ?? '' if (param.type === 'date') { // Check if the current value is a valid date const isValidDate = currentValue && !isNaN(new Date(currentValue).getTime()) if (isValidDate) { return ( { if (date && date.to) { handleParameterChange(param.name, date.to) } else { handleParameterChange(param.name, '') } }} > {currentValue ? format(new Date(currentValue), 'dd MMM') : 'Pick a date'} ) } // Fallback to regular input if date is invalid return ( handleParameterChange(param.name, e.target.value)} /> ) } if (param.type === 'enum' && param.possibleValues) { return ( handleParameterChange(param.name, value)} > {param.possibleValues.map((value) => ( {value} ))} ) } return ( handleParameterChange(param.name, e.target.value)} /> ) } return ( )} ) }