stocks / static /settings.html
Arrechenash's picture
Initial Commit
3aed849
Raw
History Blame Contribute Delete
4.87 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Settings | LT</title>
<link rel="stylesheet" href="/static/css/common.css">
<link rel="stylesheet" href="/static/css/analyze.css">
</head>
<body data-page="settings">
<nav class="main-nav" id="main-nav"></nav>
<div class="page-wrapper">
<!-- Data Sync -->
<div class="control-panel control-panel--compact u-mt-lg">
<div class="control-panel__main">
<div class="card-title">Data Sync</div>
<div class="card-subtitle u-mb-md">
Sync market data from Alpaca and upload to HuggingFace Dataset.
</div>
<div id="sync-status" class="u-mb-md" style="display:flex;gap:var(--space-md);flex-wrap:wrap;">
<div class="badge badge-neutral" id="hf-repo">--</div>
<div class="badge badge-neutral" id="hf-token">--</div>
<div class="badge badge-neutral" id="hf-last-sync">--</div>
</div>
<div class="action-row">
<button id="btn-sync-now" class="btn btn-primary">Sync Now</button>
<button id="btn-push-config" class="btn btn-secondary">Push Config</button>
<button id="btn-restore-config" class="btn btn-secondary">Restore Config</button>
</div>
<div id="sync-log" class="u-mt-md" style="font-family:var(--font-mono,monospace);font-size:var(--font-sm);color:var(--text-secondary,#999);min-height:1.5em;"></div>
</div>
</div>
</div>
<script>
// ── Sync Status ──
async function loadStatus() {
try {
const resp = await fetch('/api/hf/status');
const data = await resp.json();
document.getElementById('hf-repo').textContent = 'Repo: ' + data.repo;
document.getElementById('hf-token').textContent = data.token_set ? 'Token: set' : 'Token: missing';
document.getElementById('hf-token').className = data.token_set ? 'badge badge-positive' : 'badge badge-negative';
document.getElementById('hf-last-sync').textContent = 'Last sync: ' + (data.last_sync || 'Never');
} catch (err) {
document.getElementById('sync-log').textContent = 'Error loading status: ' + err.message;
}
}
function setLog(msg) {
document.getElementById('sync-log').textContent = msg;
}
// ── Sync Now ──
document.getElementById('btn-sync-now').onclick = async () => {
const btn = document.getElementById('btn-sync-now');
btn.disabled = true;
setLog('Starting full sync...');
try {
const resp = await fetch('/api/hf/sync', { method: 'POST' });
const data = await resp.json();
setLog('Sync started. Runs in background β€” check logs for progress.');
} catch (err) {
setLog('Error: ' + err.message);
} finally {
btn.disabled = false;
}
};
// ── Push Config ──
document.getElementById('btn-push-config').onclick = async () => {
const btn = document.getElementById('btn-push-config');
btn.disabled = true;
setLog('Pushing config to HF...');
try {
const resp = await fetch('/api/hf/push-config', { method: 'POST' });
const data = await resp.json();
setLog(data.success ? 'Config pushed successfully.' : 'Push failed.');
} catch (err) {
setLog('Error: ' + err.message);
} finally {
btn.disabled = false;
}
};
// ── Restore Config ──
document.getElementById('btn-restore-config').onclick = async () => {
const btn = document.getElementById('btn-restore-config');
btn.disabled = true;
setLog('Restoring config from HF...');
try {
const resp = await fetch('/api/hf/restore-config', { method: 'POST' });
const data = await resp.json();
setLog(data.success ? 'Config restored. Reload page to see changes.' : 'Restore failed.');
} catch (err) {
setLog('Error: ' + err.message);
} finally {
btn.disabled = false;
}
};
// Init
loadStatus();
</script>
<script src="/static/js/common.js"></script>
<script src="/static/js/analyze-modal.js"></script>
<script src="/static/js/nav.js"></script>
</body>
</html>