import './FunnelStep.styles.scss'; import { Button, Divider, Dropdown, Form, Space, Switch, Tooltip } from 'antd'; import { MenuProps } from 'antd/lib'; import { FilterSelect } from 'components/CeleryOverview/CeleryOverviewConfigOptions/CeleryOverviewConfigOptions'; import { QueryParams } from 'constants/query'; import { initialQueriesMap } from 'constants/queryBuilder'; import QueryBuilderSearchV2 from 'container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2'; import { ChevronDown, GripVertical, HardHat, PencilLine } from 'lucide-react'; import { LatencyPointers } from 'pages/TracesFunnelDetails/constants'; import { useFunnelContext } from 'pages/TracesFunnels/FunnelContext'; import { useMemo, useState } from 'react'; import { FunnelStepData } from 'types/api/traceFunnels'; import { DataSource } from 'types/common/queryBuilder'; import FunnelStepPopover from './FunnelStepPopover'; interface FunnelStepProps { stepData: FunnelStepData; index: number; stepsCount: number; } function FunnelStep({ stepData, index, stepsCount, }: FunnelStepProps): JSX.Element { const { handleStepChange: onStepChange, handleStepRemoval: onStepRemove, } = useFunnelContext(); const [form] = Form.useForm(); const currentQuery = initialQueriesMap[DataSource.TRACES]; const [isPopoverOpen, setIsPopoverOpen] = useState(false); const [isAddDetailsModalOpen, setIsAddDetailsModalOpen] = useState( false, ); const latencyPointerItems: MenuProps['items'] = LatencyPointers.map( (option) => ({ key: option.value, label: option.key, style: option.value === stepData.latency_pointer ? { backgroundColor: 'var(--bg-slate-100)' } : {}, }), ); const updatedCurrentQuery = useMemo( () => ({ ...currentQuery, builder: { ...currentQuery.builder, queryData: [ { ...currentQuery.builder.queryData[0], dataSource: DataSource.TRACES, filters: stepData.filters ?? { op: 'AND', items: [], }, }, ], }, }), [stepData.filters, currentQuery], ); const query = updatedCurrentQuery?.builder?.queryData[0] || null; return (
{stepData.name ? (
{stepData.name}
) : (
Step {index + 1}
)} {!!stepData.description && (
{stepData.description}
)}
{ onStepChange(index, { service_name: (v ?? '') as string }); }} />
onStepChange(index, { span_name: (v ?? '') as string }) } />
Where
onStepChange(index, { filters: query })} hasPopupContainer={false} placeholder="Search for filters..." suffixIcon={} rootClassName="traces-funnel-where-filter" />
onStepChange(index, { has_errors: !stepData.has_errors }) } />
Errors
Latency pointer
onStepChange(index, { latency_pointer: key as FunnelStepData['latency_pointer'], }), }} trigger={['click']} > { LatencyPointers.find( (option) => option.value === stepData.latency_pointer, )?.key }
); } export default FunnelStep;