adobe-to-docusign-migrator/web/static/js/app.js

110 lines
3.8 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();
});
// ── 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();
});