feat: jobs system with dedicated nav page and run history
Replaces ad-hoc Tailscale config tracking with a proper jobs system. Jobs get their own nav page (master/detail layout), a dedicated DB table, and full run history persisted forever. Tailscale connection settings move from the Settings modal into the Jobs page. Registry pattern makes adding future jobs straightforward. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
12
js/app.js
12
js/app.js
@@ -11,12 +11,19 @@ function navigate(page, vmid) {
|
||||
document.getElementById('page-detail').classList.add('active');
|
||||
history.pushState({ page: 'instance', vmid }, '', `/instance/${vmid}`);
|
||||
renderDetailPage(vmid);
|
||||
} else if (page === 'jobs') {
|
||||
document.getElementById('page-jobs').classList.add('active');
|
||||
history.pushState({ page: 'jobs' }, '', '/jobs');
|
||||
renderJobsPage();
|
||||
}
|
||||
}
|
||||
|
||||
function handleRoute() {
|
||||
const m = window.location.pathname.match(/^\/instance\/(\d+)/);
|
||||
if (m) {
|
||||
if (window.location.pathname === '/jobs') {
|
||||
document.getElementById('page-jobs').classList.add('active');
|
||||
renderJobsPage();
|
||||
} else if (m) {
|
||||
document.getElementById('page-detail').classList.add('active');
|
||||
renderDetailPage(parseInt(m[1], 10));
|
||||
} else {
|
||||
@@ -30,6 +37,9 @@ window.addEventListener('popstate', e => {
|
||||
if (e.state?.page === 'instance') {
|
||||
document.getElementById('page-detail').classList.add('active');
|
||||
renderDetailPage(e.state.vmid);
|
||||
} else if (e.state?.page === 'jobs') {
|
||||
document.getElementById('page-jobs').classList.add('active');
|
||||
renderJobsPage();
|
||||
} else {
|
||||
document.getElementById('page-dashboard').classList.add('active');
|
||||
renderDashboard();
|
||||
|
||||
Reference in New Issue
Block a user