diff --git a/api/app/main.py b/api/app/main.py index 89c15a5..326154f 100644 --- a/api/app/main.py +++ b/api/app/main.py @@ -53,7 +53,7 @@ async def lifespan(app: FastAPI): try: config = await sqlite_service.get_scheduler_config() if config.get("enabled") == "True": - interval = int(config.get("interval_minutes", "5")) + interval = int(config.get("interval_minutes", "10")) scheduler_service.start_scheduler(interval) except Exception: pass diff --git a/api/app/routers/sync.py b/api/app/routers/sync.py index c0bea7c..ff3b7e8 100644 --- a/api/app/routers/sync.py +++ b/api/app/routers/sync.py @@ -804,8 +804,12 @@ async def update_schedule(config: ScheduleConfig): @router.get("/api/sync/schedule") async def get_schedule(): - """Get current scheduler status.""" - return scheduler_service.get_scheduler_status() + """Get current scheduler status (falls back to DB for interval).""" + status = scheduler_service.get_scheduler_status() + if status["interval_minutes"] is None: + config = await sqlite_service.get_scheduler_config() + status["interval_minutes"] = int(config.get("interval_minutes", "10")) + return status @router.get("/api/settings") diff --git a/api/app/services/scheduler_service.py b/api/app/services/scheduler_service.py index 4a9e8cc..7a54f82 100644 --- a/api/app/services/scheduler_service.py +++ b/api/app/services/scheduler_service.py @@ -15,7 +15,7 @@ def init_scheduler(): logger.info("Scheduler initialized") -def start_scheduler(interval_minutes: int = 5): +def start_scheduler(interval_minutes: int = 10): """Start the scheduler with the given interval.""" global _is_running if _scheduler is None: diff --git a/api/app/static/js/dashboard.js b/api/app/static/js/dashboard.js index 1ebf08e..1ca7d75 100644 --- a/api/app/static/js/dashboard.js +++ b/api/app/static/js/dashboard.js @@ -11,6 +11,7 @@ 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 +let _schedulerLoading = false; // prevent onchange during programmatic load // ── Init ────────────────────────────────────────── @@ -202,6 +203,7 @@ async function toggleScheduler() { } async function updateSchedulerInterval() { + if (_schedulerLoading) return; // ignore programmatic changes during load const enabled = document.getElementById('schedulerToggle').checked; if (enabled) { await toggleScheduler(); @@ -209,15 +211,16 @@ async function updateSchedulerInterval() { } async function loadSchedulerStatus() { + _schedulerLoading = true; try { const res = await fetch('/api/sync/schedule'); const data = await res.json(); document.getElementById('schedulerToggle').checked = data.enabled || false; - if (data.interval_minutes) { - document.getElementById('schedulerInterval').value = data.interval_minutes; - } + document.getElementById('schedulerInterval').value = data.interval_minutes || 10; } catch (err) { console.error('loadSchedulerStatus error:', err); + } finally { + _schedulerLoading = false; } } diff --git a/api/app/templates/dashboard.html b/api/app/templates/dashboard.html index b723f98..29db90b 100644 --- a/api/app/templates/dashboard.html +++ b/api/app/templates/dashboard.html @@ -114,5 +114,5 @@ {% endblock %} {% block scripts %} - + {% endblock %}