115 lines
3.9 KiB
JavaScript
115 lines
3.9 KiB
JavaScript
// Main app entry point — wires together router, auth, state, and nav badges
|
|
|
|
import * as router from './router.js';
|
|
import { refreshAuth, renderAuthChips } from './auth.js';
|
|
import { state, subscribe } from './state.js';
|
|
import { getActive, initProject } from './project.js';
|
|
|
|
// ── Route registrations (lazy-loaded views) ───────────────────────────────
|
|
|
|
router.register('#/templates', async (param) => {
|
|
const { renderTemplates, renderTemplateDetail } = await import('./templates.js');
|
|
if (param) {
|
|
await renderTemplateDetail(param);
|
|
} else {
|
|
await renderTemplates();
|
|
}
|
|
});
|
|
|
|
router.register('#/results', async () => {
|
|
const { renderResults } = await import('./migration.js');
|
|
renderResults();
|
|
});
|
|
|
|
router.register('#/issues', async () => {
|
|
const { renderIssues } = await import('./issues.js');
|
|
renderIssues();
|
|
});
|
|
|
|
router.register('#/verify', async () => {
|
|
const { renderVerification } = await import('./verification.js');
|
|
await renderVerification();
|
|
});
|
|
|
|
router.register('#/history', async () => {
|
|
const { renderHistory } = await import('./history.js');
|
|
await renderHistory();
|
|
});
|
|
|
|
router.register('#/settings', async () => {
|
|
const { renderSettings } = await import('./settings.js');
|
|
renderSettings();
|
|
});
|
|
|
|
router.register('#/help', async () => {
|
|
const { renderHelp } = await import('./help.js');
|
|
renderHelp();
|
|
});
|
|
|
|
// ── Nav badge subscriptions ───────────────────────────────────────────────
|
|
|
|
subscribe('issueCount', count => {
|
|
const badge = document.getElementById('nav-badge-issues');
|
|
if (badge) {
|
|
badge.dataset.count = count;
|
|
badge.textContent = count;
|
|
}
|
|
});
|
|
|
|
subscribe('templates', templates => {
|
|
const caveats = (templates || []).filter(t =>
|
|
(!t.blockers || t.blockers.length === 0) &&
|
|
t.warnings && t.warnings.length > 0
|
|
).length;
|
|
const badge = document.getElementById('nav-badge-caveats');
|
|
if (badge) {
|
|
badge.dataset.count = caveats;
|
|
badge.textContent = caveats;
|
|
}
|
|
});
|
|
|
|
// ── Project switcher wiring ───────────────────────────────────────────────
|
|
|
|
function syncProjectDisplay() {
|
|
const project = getActive();
|
|
const iconEl = document.getElementById('nav-project-icon');
|
|
const nameEl = document.getElementById('nav-project-name');
|
|
const custName = document.getElementById('nav-customer-name');
|
|
const custSub = document.getElementById('nav-customer-sub');
|
|
|
|
if (project) {
|
|
const initials = project.name.slice(0, 2).toUpperCase();
|
|
if (iconEl) { iconEl.textContent = initials; }
|
|
if (nameEl) { nameEl.textContent = project.name; nameEl.classList.remove('no-project'); }
|
|
if (custName) { custName.textContent = project.name; }
|
|
if (custSub) { custSub.textContent = `Created ${new Date(project.createdAt).toLocaleDateString()}`; }
|
|
} else {
|
|
if (iconEl) { iconEl.textContent = '?'; }
|
|
if (nameEl) { nameEl.textContent = 'New Project'; nameEl.classList.add('no-project'); }
|
|
if (custName) { custName.textContent = '—'; }
|
|
if (custSub) { custSub.textContent = ''; }
|
|
}
|
|
}
|
|
|
|
// ── Init ─────────────────────────────────────────────────────────────────
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
// Init project context
|
|
initProject(syncProjectDisplay);
|
|
|
|
// Wire project switcher button
|
|
const switcher = document.getElementById('nav-project-switcher');
|
|
if (switcher) {
|
|
switcher.addEventListener('click', async () => {
|
|
const { showProjectModal } = await import('./project.js');
|
|
showProjectModal(syncProjectDisplay);
|
|
});
|
|
}
|
|
|
|
// Auth chips
|
|
await refreshAuth();
|
|
|
|
// Start router
|
|
router.init();
|
|
});
|