import { useEffect, useState } from 'react' import DateTimeField from '@/components/common/DateTimeField' import { Button } from '@/components/ui/button' import { countsEventTypes, countsFieldLabel, countsFilterFields, readCountsJSON, useCountsDefinition } from '@/lib/countsDefinitions' import useDialogue from '@/lib/dialogues/useDialogue' import { inputClass } from '@/lib/utils' import { useUITranslation } from '@/lib/useUITranslation' import type { DialogueFormControls } from '@/lib/dialogues/useDialogue' import type { CountsCondition, CountsDefinition } from '@/lib/countsDefinitions' const ConditionEditor = ( { definition, initial, controls, save }: { definition: CountsDefinition; initial?: CountsCondition controls: DialogueFormControls save: (condition: CountsCondition) => void }, ) => { const { label, message } = useUITranslation ('counts') const fields = countsFilterFields (definition) const [field, setField] = useState (initial?.field ?? 'resource_id') const [operator, setOperator] = useState (initial?.operator ?? 'eq') const operators = definition.fields.find (item => item.key === field)?.operators ?? [] useEffect (() => { controls.setActions ([{ label: label (initial == null ? 'add' : 'shared:actions.edit'), onSelect: () => save ({ ...initial, field, operator }) }]) }, [controls, field, operator, initial, label, save]) return
} const CountsAdditionalConditions = ({ params, update }: { params: URLSearchParams update: (key: string, value: string) => void }, ) => { const { label, message } = useUITranslation ('counts') const definition = useCountsDefinition () const dialogue = useDialogue () const conditions = readCountsJSON (params, 'conditions', []) const write = (next: CountsCondition[]) => update ('conditions', JSON.stringify (next)) const edit = (index?: number) => { const initial = index == null ? undefined : conditions[index] const save = (condition: CountsCondition) => { write (index == null ? [...conditions, condition] : conditions.map ((item, position) => position === index ? condition : item)) } dialogue.form ({ title: label ('additionalConditions'), footerLayout: 'inline', body: controls => }) } const patch = (index: number, change: Partial) => write ( conditions.map ((item, position) => position === index ? { ...item, ...change } : item)) return
{label ('additionalConditions')} {conditions.map ((condition, index) => { const datetime = countsFilterFields (definition)[condition.field] === 'datetime' return
{(condition.operator === 'range' ? ['value', 'end'] as const : ['value'] as const) .map (key => condition.field === 'event_type' ? ( ) : (datetime ? patch (index, { [key]: value ?? '' })}/> : ( patch (index, { [key]: event.target.value })}/>)))}
})}
} export default CountsAdditionalConditions