import { useState, useRef } from 'react' import { api } from '../api' export default function Remap() { const [search, setSearch] = useState('') const [results, setResults] = useState(null) const [searching, setSearching] = useState(false) const [selected, setSelected] = useState(null) // { col, val } const [matches, setMatches] = useState(null) // individual mappings const [loadingMatches, setLoadingMatches] = useState(false) const [toVal, setToVal] = useState('') const [applying, setApplying] = useState(false) const [msg, setMsg] = useState(null) // { text, ok } const searchRef = useRef() async function handleSearch(e) { e.preventDefault() const q = search.trim() if (!q) return setSearching(true) setResults(null) setSelected(null) setMatches(null) setMsg(null) try { const rows = await api.searchMappingOutputs(q) setResults(rows) } catch (err) { setMsg({ text: err.message, ok: false }) } finally { setSearching(false) } } async function handleSelect(row) { setSelected(row) setToVal(row.val) setMatches(null) setMsg(null) setLoadingMatches(true) try { const rows = await api.getMappingsByOutputField(row.col, row.val) setMatches(rows) } catch (err) { setMsg({ text: err.message, ok: false }) } finally { setLoadingMatches(false) } } async function handleApply() { if (!selected || !toVal.trim() || toVal === selected.val) return setApplying(true) setMsg(null) try { const { updated } = await api.remapOutputField(selected.col, selected.val, toVal.trim()) setMsg({ text: `Updated ${updated} mapping${updated !== 1 ? 's' : ''}.`, ok: true }) // Refresh match list to show new values const rows = await api.getMappingsByOutputField(selected.col, toVal.trim()) setMatches(rows) setSelected({ ...selected, val: toVal.trim() }) // Re-run search to refresh counts const refreshed = await api.searchMappingOutputs(search.trim()) setResults(refreshed) } catch (err) { setMsg({ text: err.message, ok: false }) } finally { setApplying(false) } } return (
No matching output values found.
) : ( <>| Field | Value | Mappings |
|---|---|---|
| {r.col} | {r.val} | {r.mapping_count} |
Loading…
) : matches && matches.length > 0 && (| Source | Rule | Input | Output |
|---|---|---|---|
| {m.source_name} | {m.rule_name} | {typeof m.input_value === 'string' ? m.input_value : JSON.stringify(m.input_value)} | {Object.entries(m.output).map(([k, v]) => ( {k}: {v}{' '} ))} |