diff --git a/routes/sources.js b/routes/sources.js index 6376264..f09d77e 100644 --- a/routes/sources.js +++ b/routes/sources.js @@ -280,6 +280,22 @@ module.exports = function(pool) { }); // deregister a source — does not drop existing forecast tables + router.get('/dim-period/cols', async (req, res) => { + try { + const result = await pool.query(` + SELECT column_name + FROM information_schema.columns + WHERE table_schema = 'pf' AND table_name = 'dim_period' + AND column_name NOT IN ('sdat', 'edat', 'drange', 'ndays') + ORDER BY ordinal_position + `); + res.json(result.rows.map(r => r.column_name)); + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } + }); + router.delete('/sources/:id', async (req, res) => { try { const result = await pool.query( diff --git a/ui/src/views/Setup.jsx b/ui/src/views/Setup.jsx index 52480ae..c60273e 100644 --- a/ui/src/views/Setup.jsx +++ b/ui/src/views/Setup.jsx @@ -24,9 +24,11 @@ export default function Setup({ refreshSources }) { const [saving, setSaving] = useState(false) const [generating, setGenerating] = useState(false) const [msg, setMsg] = useState(null) + const [dimPeriodCols, setDimPeriodCols] = useState([]) useEffect(() => { fetch('/api/tables').then(r => r.json()).then(setTables).catch(console.error) + fetch('/api/dim-period/cols').then(r => r.json()).then(setDimPeriodCols).catch(console.error) loadSources() }, []) @@ -324,14 +326,15 @@ export default function Setup({ refreshSources }) { />