import { setToken } from './lib/api.mjs'; import './components/wo-list.mjs'; import './components/wo-form.mjs'; // ── Keycloak init ───────────────────────────────────────────────────────────── const keycloak = new Keycloak({ url: window.KEYCLOAK_URL || 'http://localhost:8180', realm: window.KEYCLOAK_REALM || 'workorders', clientId: window.KEYCLOAK_CLIENT_ID || 'workorders-app', }); keycloak.init({ onLoad: 'login-required', pkceMethod: 'S256', checkLoginIframe: false, }) .then(authenticated => { if (!authenticated) { keycloak.login(); return; } setToken(keycloak.token); // Refresh token before it expires setInterval(async () => { try { await keycloak.updateToken(60); setToken(keycloak.token); } catch { keycloak.login(); } }, 30_000); window.addEventListener('auth:expired', () => keycloak.login()); renderApp(keycloak); }) .catch(() => document.getElementById('app').innerHTML = '
Failed to connect to authentication server.
'); // ── App shell ───────────────────────────────────────────────────────────────── function renderApp(kc) { const app = document.getElementById('app'); const userName = kc.tokenParsed?.name || kc.tokenParsed?.preferred_username || 'User'; // Nav const nav = document.createElement('nav'); nav.innerHTML = ` Work Orders `; document.body.insertBefore(nav, app); nav.querySelector('#logout').addEventListener('click', () => kc.logout()); showList(); app.addEventListener('wo:select', e => showDetail(e.detail.id)); app.addEventListener('wo:cancel', () => showList()); app.addEventListener('wo:saved', () => showList()); document.addEventListener('keydown', e => { if (e.key === 'Escape') showList(); }); } function showList() { const app = document.getElementById('app'); app.innerHTML = `