diff --git a/ui/src/views/Forecast.jsx b/ui/src/views/Forecast.jsx index 59e8d0f..1530b5c 100644 --- a/ui/src/views/Forecast.jsx +++ b/ui/src/views/Forecast.jsx @@ -933,12 +933,24 @@ export default function Forecast({ sources = [], sourceId, versions = [], versio } async function syncOrderExpressions() { + dbgOrder('enter') const viewer = viewerRef.current - if (!viewer) return + if (!viewer) { dbgOrder('exit: no viewer'); return } const version = versions.find(v => String(v.id) === String(versionId)) const wanted = buildOrderExpressions(version?.bucket_order, logMeta) + dbgOrder('inputs', { + versionId, + versionFound: !!version, + bucket_order: version?.bucket_order ?? null, + logMetaCount: Object.keys(logMeta || {}).length, + seqs: Object.entries(logMeta || {}) + .filter(([, m]) => m.seq != null) + .map(([id, m]) => `${id}=${m.seq}`), + wanted: Object.keys(wanted), + }) const { table: _t, ...cfg } = await viewer.save() + dbgOrder('saved config read', { existing: Object.keys(cfg.expressions || {}) }) const current = cfg.expressions || {} const managed = Object.values(ORDER_EXPR_NAMES) @@ -958,8 +970,10 @@ export default function Forecast({ sources = [], sourceId, versions = [], versio .map(([id, m]) => `${id}:${m.tag || m.note}=${m.seq}`), }) } + else dbgOrder('exit: already applied', Object.keys(next)) return } + dbgOrder('applying', Object.keys(next)) // An expression the pivot is using cannot simply vanish; drop it from the // axes first or restore() rejects the config.