Skip to content

Commit 288e05d

Browse files
update in codebase
1 parent fee1df9 commit 288e05d

10 files changed

Lines changed: 229 additions & 113 deletions

File tree

frontend/src/components/admin/CacheManagement.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,28 @@ import { useToast } from '@/components/ui/Toast'
66

77
export function CacheManagement() {
88
const [loading, setLoading] = useState(false)
9-
const [done, setDone] = useState(false)
9+
const [done, setDone] = useState(false)
1010
const toast = useToast()
1111

1212
const handleClear = async () => {
1313
try {
1414
setLoading(true)
1515
const r = await adminApi.clearCache()
1616
toast.success('Cache cleared', r.message ?? 'Redis cache flushed successfully.')
17-
setDone(true)
18-
setTimeout(() => setDone(false), 3000)
17+
setDone(true); setTimeout(() => setDone(false), 3000)
1918
} catch {
2019
toast.warning('Offline', 'Simulating cache clear — backend unreachable.')
21-
setDone(true)
22-
setTimeout(() => setDone(false), 3000)
20+
setDone(true); setTimeout(() => setDone(false), 3000)
2321
} finally { setLoading(false) }
2422
}
2523

2624
return (
27-
<div className="bg-white dark:bg-[#131D2E] border border-slate-200 dark:border-slate-700/50 rounded-xl p-5">
25+
<div className="bg-white dark:bg-[#131D2E] border border-slate-200/80 dark:border-[var(--border)] rounded-xl p-5">
2826
<div className="flex items-center gap-2 mb-3">
2927
<Trash2 className="h-4 w-4 text-red-400" />
30-
<h3 className="text-sm font-semibold text-slate-900 dark:text-white">Cache Management</h3>
28+
<h3 className="text-sm font-semibold text-[var(--text-1)]">Cache Management</h3>
3129
</div>
32-
<p className="text-xs text-slate-500 mb-4 leading-relaxed">
30+
<p className="text-xs text-[var(--text-2)] mb-4 leading-relaxed">
3331
Flush all Redis cache entries. The next API requests will fetch fresh data from external sources.
3432
</p>
3533
{done ? (

frontend/src/components/admin/ErrorLogs.tsx

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ function relTime(s: string) {
1313
}
1414

1515
export function ErrorLogs() {
16-
const [logs, setLogs] = useState<Record<string, unknown>[]>([])
16+
const [logs, setLogs] = useState<Record<string, unknown>[]>([])
1717
const [loading, setLoading] = useState(true)
1818

1919
useEffect(() => {
@@ -28,35 +28,44 @@ export function ErrorLogs() {
2828
}, [])
2929

3030
return (
31-
<div className="bg-white dark:bg-[#131D2E] border border-slate-200 dark:border-slate-700/50 rounded-xl overflow-hidden">
32-
<div className="flex items-center justify-between px-5 py-3.5 border-b border-slate-200 dark:border-slate-700/50">
31+
<div className="bg-white dark:bg-[#131D2E] border border-slate-200/80 dark:border-[var(--border)] rounded-xl overflow-hidden">
32+
<div className="flex items-center justify-between px-5 py-3.5 border-b border-slate-200 dark:border-[var(--border)]">
3333
<div className="flex items-center gap-2">
34-
<FileText className="h-4 w-4 text-purple-500 dark:text-purple-400" />
35-
<h3 className="text-sm font-semibold text-slate-900 dark:text-white">Recent Error Logs</h3>
34+
{/* Purple for AI/special features per spec */}
35+
<FileText className="h-4 w-4 text-purple-400" />
36+
<h3 className="text-sm font-semibold text-[var(--text-1)]">Recent Error Logs</h3>
3637
</div>
3738
{!loading && <Badge variant="slate">{logs.length} entries</Badge>}
3839
</div>
40+
3941
<div className="p-4">
4042
{loading ? (
41-
<div className="space-y-3">{[...Array(4)].map((_, i) => <Skeleton key={i} className="h-14 rounded-lg" />)}</div>
43+
<div className="space-y-3">
44+
{[...Array(4)].map((_, i) => <Skeleton key={i} className="h-14 rounded-lg" />)}
45+
</div>
4246
) : logs.length === 0 ? (
4347
<div className="flex items-center gap-2 text-sm text-emerald-600 dark:text-emerald-400 py-4">
4448
<CheckCircle2 className="h-4 w-4" />No error logs — system is running cleanly
4549
</div>
4650
) : (
4751
<div className="space-y-2 max-h-[420px] overflow-y-auto">
4852
{logs.map((log, i) => {
49-
const ts = log.timestamp as string | undefined
50-
const msg = log.message as string | undefined
53+
const ts = log.timestamp as string | undefined
54+
const msg = log.message as string | undefined
5155
const rid = log.requestId as string | undefined
5256
return (
57+
/* Error log entry — red border per spec */
5358
<div key={i} className="p-3 rounded-xl border border-red-500/15 bg-red-500/5 font-mono text-xs">
5459
<div className="flex items-center justify-between gap-2 mb-1.5">
5560
<Badge variant="red">ERROR</Badge>
56-
{ts && <span className="flex items-center gap-1 text-slate-500"><Clock className="h-2.5 w-2.5" />{relTime(ts)}</span>}
61+
{ts && (
62+
<span className="flex items-center gap-1 text-[var(--text-3)]">
63+
<Clock className="h-2.5 w-2.5" />{relTime(ts)}
64+
</span>
65+
)}
5766
</div>
58-
{msg && <p className="text-slate-700 dark:text-slate-300 break-all leading-relaxed">{msg}</p>}
59-
{rid && <p className="text-slate-500 mt-1">ID: {rid}</p>}
67+
{msg && <p className="text-[var(--text-2)] break-all leading-relaxed">{msg}</p>}
68+
{rid && <p className="text-[var(--text-3)] mt-1">ID: {rid}</p>}
6069
</div>
6170
)
6271
})}

frontend/src/components/admin/SecurityWarning.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import { ShieldAlert } from 'lucide-react'
33

44
export function SecurityWarning() {
55
return (
6+
/* Warning banner per spec */
67
<div className="flex items-start gap-3 p-4 rounded-xl bg-amber-500/10 border border-amber-500/20 mb-5">
78
<ShieldAlert className="h-4 w-4 text-amber-400 mt-0.5 shrink-0" />
8-
<p className="text-sm text-amber-300">
9+
<p className="text-sm text-amber-700 dark:text-amber-300">
910
Admin endpoints are not yet protected by authentication. Do not expose in production.
1011
</p>
1112
</div>

frontend/src/components/markets/MarketQueryForm.tsx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import { Search, Zap } from 'lucide-react'
33
import { Button } from '@/components/ui/Button'
44

55
const FRED_SERIES = [
6-
{ value: 'GDP', label: 'GDP' }, { value: 'UNRATE', label: 'Unemployment' },
7-
{ value: 'CPIAUCSL', label: 'CPI / Inflation' }, { value: 'FEDFUNDS', label: 'Fed Funds Rate' },
8-
{ value: 'DGS10', label: '10-Year Treasury' },
6+
{ value: 'GDP', label: 'GDP' },
7+
{ value: 'UNRATE', label: 'Unemployment' },
8+
{ value: 'CPIAUCSL', label: 'CPI / Inflation' },
9+
{ value: 'FEDFUNDS', label: 'Fed Funds Rate' },
10+
{ value: 'DGS10', label: '10-Year Treasury' },
911
]
1012

1113
interface MarketQueryFormProps {
@@ -14,18 +16,26 @@ interface MarketQueryFormProps {
1416
onCurrency: (v: string) => void; onFred: (v: string) => void; onFetch: () => void
1517
}
1618

17-
const inputCls = 'w-full h-9 bg-slate-100 dark:bg-slate-800/60 border border-slate-300 dark:border-slate-700 hover:border-slate-400 dark:hover:border-slate-600 focus:border-blue-500 focus:outline-none rounded-lg px-3 text-sm text-slate-900 dark:text-white placeholder:text-slate-400 dark:placeholder:text-slate-500 transition-colors'
18-
const labelCls = 'block text-xs font-medium text-slate-600 dark:text-slate-400 mb-1.5 uppercase tracking-wide'
19+
const inputCls = 'w-full h-9 bg-slate-50 dark:bg-[var(--bg-input)] border border-slate-200 dark:border-[var(--border)] hover:border-slate-300 dark:hover:border-[var(--border-md)] focus:border-[var(--accent)] focus:outline-none focus:ring-1 focus:ring-blue-500/30 rounded-lg px-3 text-sm text-[var(--text-1)] placeholder:text-[var(--text-3)] transition-all duration-150'
20+
const labelCls = 'block text-xs font-medium text-[var(--text-2)] mb-1.5 uppercase tracking-wider'
1921

20-
export function MarketQueryForm({ symbol, crypto, currency, fredSeries, loading, onSymbol, onCrypto, onCurrency, onFred, onFetch }: MarketQueryFormProps) {
22+
export function MarketQueryForm({
23+
symbol, crypto, currency, fredSeries, loading,
24+
onSymbol, onCrypto, onCurrency, onFred, onFetch,
25+
}: MarketQueryFormProps) {
2126
return (
22-
<div className="bg-white dark:bg-[#131D2E] border border-slate-200 dark:border-slate-700/50 rounded-xl p-5">
27+
<div className="bg-white dark:bg-[#131D2E] border border-slate-200/80 dark:border-[var(--border)] rounded-xl p-5">
2328
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-4">
2429
<div>
2530
<label className={labelCls}>Stock Symbol</label>
2631
<div className="relative">
27-
<Search className="absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-slate-400" />
28-
<input value={symbol} onChange={e => onSymbol(e.target.value.toUpperCase())} placeholder="AAPL, TSLA…" className={inputCls + ' pl-8'} />
32+
<Search className="absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-[var(--text-3)]" />
33+
<input
34+
value={symbol}
35+
onChange={e => onSymbol(e.target.value.toUpperCase())}
36+
placeholder="AAPL, TSLA…"
37+
className={inputCls + ' pl-8'}
38+
/>
2939
</div>
3040
</div>
3141
<div>
@@ -43,7 +53,9 @@ export function MarketQueryForm({ symbol, crypto, currency, fredSeries, loading,
4353
</select>
4454
</div>
4555
</div>
46-
<Button onClick={onFetch} loading={loading} icon={<Zap className="h-3.5 w-3.5" />}>Fetch Live Data</Button>
56+
<Button onClick={onFetch} loading={loading} icon={<Zap className="h-3.5 w-3.5" />}>
57+
Fetch Live Data
58+
</Button>
4759
</div>
4860
)
4961
}

0 commit comments

Comments
 (0)