diff --git a/ui/src/index.css b/ui/src/index.css index 2d76230..f9799ec 100644 --- a/ui/src/index.css +++ b/ui/src/index.css @@ -89,5 +89,6 @@ body { margin: 0; background-color: var(--bg-primary); color: var(--text-primary .dark ::selection { background-color: var(--accent-bg); color: var(--text-primary); } .dark input { background-color: var(--bg-secondary); color: var(--text-primary); border-color: var(--border-color); } .dark select { background-color: var(--bg-secondary); color: var(--text-primary); border-color: var(--border-color); } +.dark select option { background-color: var(--bg-secondary); color: var(--text-primary); } .dark textarea { background-color: var(--bg-secondary); color: var(--text-primary); border-color: var(--border-color); } .dark .bg-transparent { background-color: transparent; } diff --git a/ui/src/views/Setup.jsx b/ui/src/views/Setup.jsx index c60273e..60c8177 100644 --- a/ui/src/views/Setup.jsx +++ b/ui/src/views/Setup.jsx @@ -1,4 +1,5 @@ -import { useState, useEffect } from 'react' +import { useState, useEffect, useRef } from 'react' +import useTheme from '../theme.jsx' const ROLES = ['ignore', 'dimension', 'value', 'units', 'date', 'filter'] @@ -12,6 +13,7 @@ const ROLE_STYLE = { } export default function Setup({ refreshSources }) { + const { dark } = useTheme() const [tables, setTables] = useState([]) const [sources, setSources] = useState([]) const [selectedSource, setSelectedSource] = useState(null) @@ -25,6 +27,8 @@ export default function Setup({ refreshSources }) { const [generating, setGenerating] = useState(false) const [msg, setMsg] = useState(null) const [dimPeriodCols, setDimPeriodCols] = useState([]) + const [openPeriodIdx, setOpenPeriodIdx] = useState(null) + const periodDropRef = useRef(null) useEffect(() => { fetch('/api/tables').then(r => r.json()).then(setTables).catch(console.error) @@ -32,6 +36,16 @@ export default function Setup({ refreshSources }) { loadSources() }, []) + useEffect(() => { + if (openPeriodIdx === null) return + function handleClick(e) { + if (periodDropRef.current && !periodDropRef.current.contains(e.target)) + setOpenPeriodIdx(null) + } + document.addEventListener('mousedown', handleClick) + return () => document.removeEventListener('mousedown', handleClick) + }, [openPeriodIdx]) + function loadSources() { fetch('/api/sources').then(r => r.json()).then(data => { setSources(data) @@ -325,16 +339,38 @@ export default function Setup({ refreshSources }) { className="border border-transparent hover:border-gray-200 focus:border-gray-300 rounded px-1.5 py-0.5 w-full outline-none bg-transparent disabled:opacity-20 disabled:cursor-default" /> -