async function renderScheduler() { const content = document.getElementById('pageContent'); content.innerHTML = `
`; try { const jobs = await api.getJobs(); const container = document.getElementById('jobList'); if (jobs.length === 0) { container.innerHTML = '
No scheduled jobs
Create your first scheduled job to automate workflows
'; return; } container.innerHTML = `
${jobs.map(j => ` `).join('')}
NameSkillCronStatusLast Run
${j.name} ${j.skill} ${j.cron} ${j.enabled ? 'Active' : 'Paused'} ${j.last_run ? formatDate(j.last_run) : 'Never'}
${jobs.length} job${jobs.length !== 1 ? 's' : ''}
`; } catch (err) { document.getElementById('jobList').innerHTML = `
${escapeHtml(err.message)}
`; } } async function showAddJob() { let skills = []; try { const s = await api.getSkills(); skills = s; } catch {} showModal('Add Scheduled Job', `
Format: minute hour day month weekday
`, ` `); } async function createJob() { const name = document.getElementById('jobName').value.trim(); const skill = document.getElementById('jobSkill').value; const cron = document.getElementById('jobCron').value.trim(); if (!name || !skill || !cron) { showToast('All fields required', 'warning'); return; } try { await api.createJob({ name, skill, cron }); closeModal(); showToast('Job created', 'success'); renderScheduler(); } catch (err) { showToast(`Error: ${err.message}`, 'error'); } } async function deleteJob(id) { if (!confirm('Delete this scheduled job?')) return; try { await api.deleteJob(id); showToast('Job deleted', 'success'); renderScheduler(); } catch (err) { showToast(`Error: ${err.message}`, 'error'); } }