diff --git a/api/app/routers/sync.py b/api/app/routers/sync.py index cd47a19..c0be7bd 100644 --- a/api/app/routers/sync.py +++ b/api/app/routers/sync.py @@ -37,6 +37,7 @@ class AppSettingsUpdate(BaseModel): gomag_api_shop: str = "" gomag_order_days_back: str = "7" gomag_limit: str = "100" + dashboard_poll_seconds: str = "5" # API endpoints @@ -600,6 +601,7 @@ async def get_app_settings(): "gomag_api_shop": s.get("gomag_api_shop", "") or config_settings.GOMAG_API_SHOP, "gomag_order_days_back": s.get("gomag_order_days_back", "") or str(config_settings.GOMAG_ORDER_DAYS_BACK), "gomag_limit": s.get("gomag_limit", "") or str(config_settings.GOMAG_LIMIT), + "dashboard_poll_seconds": s.get("dashboard_poll_seconds", "5"), } @@ -618,6 +620,7 @@ async def update_app_settings(config: AppSettingsUpdate): await sqlite_service.set_app_setting("gomag_api_shop", config.gomag_api_shop) await sqlite_service.set_app_setting("gomag_order_days_back", config.gomag_order_days_back) await sqlite_service.set_app_setting("gomag_limit", config.gomag_limit) + await sqlite_service.set_app_setting("dashboard_poll_seconds", config.dashboard_poll_seconds) return {"success": True} diff --git a/api/app/static/js/dashboard.js b/api/app/static/js/dashboard.js index 7af2b19..1936b1f 100644 --- a/api/app/static/js/dashboard.js +++ b/api/app/static/js/dashboard.js @@ -13,21 +13,32 @@ let _pollInterval = null; let _lastSyncStatus = null; let _lastRunId = null; let _currentRunId = null; +let _pollIntervalMs = 5000; // default, overridden from settings +let _knownLastRunId = null; // track last_run.run_id to detect missed syncs // ── Init ────────────────────────────────────────── -document.addEventListener('DOMContentLoaded', () => { +document.addEventListener('DOMContentLoaded', async () => { + await initPollInterval(); loadSchedulerStatus(); loadDashOrders(); startSyncPolling(); wireFilterBar(); }); +async function initPollInterval() { + try { + const data = await fetchJSON('/api/settings'); + const sec = parseInt(data.dashboard_poll_seconds) || 5; + _pollIntervalMs = sec * 1000; + } catch(e) {} +} + // ── Smart Sync Polling ──────────────────────────── function startSyncPolling() { if (_pollInterval) clearInterval(_pollInterval); - _pollInterval = setInterval(pollSyncStatus, 30000); + _pollInterval = setInterval(pollSyncStatus, _pollIntervalMs); pollSyncStatus(); // immediate first call } @@ -37,6 +48,12 @@ async function pollSyncStatus() { updateSyncPanel(data); const isRunning = data.status === 'running'; const wasRunning = _lastSyncStatus === 'running'; + + // Detect missed sync completions via last_run.run_id change + const newLastRunId = data.last_run?.run_id || null; + const missedSync = !isRunning && !wasRunning && _knownLastRunId && newLastRunId && newLastRunId !== _knownLastRunId; + _knownLastRunId = newLastRunId; + if (isRunning && !wasRunning) { // Switched to running — speed up polling clearInterval(_pollInterval); @@ -44,7 +61,10 @@ async function pollSyncStatus() { } else if (!isRunning && wasRunning) { // Sync just completed — slow down and refresh orders clearInterval(_pollInterval); - _pollInterval = setInterval(pollSyncStatus, 30000); + _pollInterval = setInterval(pollSyncStatus, _pollIntervalMs); + loadDashOrders(); + } else if (missedSync) { + // Sync completed while we weren't watching (e.g. auto-sync) — refresh orders loadDashOrders(); } _lastSyncStatus = data.status; diff --git a/api/app/static/js/settings.js b/api/app/static/js/settings.js index 611c250..dfd4bfa 100644 --- a/api/app/static/js/settings.js +++ b/api/app/static/js/settings.js @@ -69,6 +69,7 @@ async function loadSettings() { if (el('settGomagApiShop')) el('settGomagApiShop').value = data.gomag_api_shop || ''; if (el('settGomagDaysBack')) el('settGomagDaysBack').value = data.gomag_order_days_back || '7'; if (el('settGomagLimit')) el('settGomagLimit').value = data.gomag_limit || '100'; + if (el('settDashPollSeconds')) el('settDashPollSeconds').value = data.dashboard_poll_seconds || '5'; } catch (err) { console.error('loadSettings error:', err); } @@ -89,6 +90,7 @@ async function saveSettings() { gomag_api_shop: el('settGomagApiShop')?.value?.trim() || '', gomag_order_days_back: el('settGomagDaysBack')?.value?.trim() || '7', gomag_limit: el('settGomagLimit')?.value?.trim() || '100', + dashboard_poll_seconds: el('settDashPollSeconds')?.value?.trim() || '5', }; try { const res = await fetch('/api/settings', { diff --git a/api/app/templates/dashboard.html b/api/app/templates/dashboard.html index 29f9b94..06f3efc 100644 --- a/api/app/templates/dashboard.html +++ b/api/app/templates/dashboard.html @@ -17,6 +17,8 @@ + + @@ -200,5 +204,5 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/api/app/templates/settings.html b/api/app/templates/settings.html index 61f1a65..53e4bc0 100644 --- a/api/app/templates/settings.html +++ b/api/app/templates/settings.html @@ -123,6 +123,21 @@ +
+
+
+
Dashboard
+
+
+ + +
Cât de des verifică dashboard-ul starea sync-ului (implicit 5s)
+
+
+
+
+
+
@@ -131,5 +146,5 @@ {% endblock %} {% block scripts %} - + {% endblock %}