diff --git a/plugins/ms-ai-architect/playground/ms-ai-architect-v3.html b/plugins/ms-ai-architect/playground/ms-ai-architect-v3.html index bdcbe6f..35ef621 100644 --- a/plugins/ms-ai-architect/playground/ms-ai-architect-v3.html +++ b/plugins/ms-ai-architect/playground/ms-ai-architect-v3.html @@ -1179,22 +1179,174 @@ scheduleRender(); } - // Stubber for surfaces som fylles i Steps 6, 7, 9. Holder renderActive - // total uten å kreve at de finnes. + // Topbar — gjenbrukes på home, catalog, project. Onboarding viser ingen topbar + // (full-fokus førstegangs-flyt). Eksport/import-knapper wires opp til + // __exportState/__importState fra Step 3. + function renderTopbar(crumb) { + const orgName = (store.state.shared.organization && store.state.shared.organization.name) || ''; + const crumbHtml = (orgName || crumb) + ? '' + (orgName ? escapeHtml(orgName) : '') + (orgName && crumb ? ' · ' : '') + (crumb || '') + '' + : ''; + return ( + '
' + + '
' + + '' + + 'ms-ai-architect' + + crumbHtml + + '
' + + '' + + '
' + ); + } + + // ============================================================ + // HOME SURFACE (Step 6) + // ============================================================ + // + // 3 entry-tracks (.tracks med .tracks__card--guided/explore/expert) som + // første-valg på home. Under: prosjekt-liste i .fleet-grid med .fleet-tile + // per prosjekt. Tom-state: .guide-panel--info. "Nytt prosjekt"-knapp + // åpner modal (modal-handler i Step 7 — Step 6 har stub). + + function projectReportCount(p) { + if (!p || !p.reports) return 0; + let count = 0; + for (const k in p.reports) { + if (p.reports[k] && p.reports[k].parsed) count++; + } + return count; + } + + function projectMeterBand(filled, total) { + if (total === 0) return '4'; // tom = "krever oppmerksomhet" + const pct = filled / total; + if (pct >= 0.8) return '1'; + if (pct >= 0.5) return '2'; + if (pct >= 0.2) return '3'; + return '4'; + } + function renderHomeSurface() { const root = getSurfaceEl('home'); if (!root) return; - root.innerHTML = '

Hjem-skjerm fylles i Step 6.

'; + + const projects = store.state.projects || []; + const reportTotal = CATALOG.commands.filter(function (c) { return c.produces_report; }).length; + + const tracksHtml = ( + '
' + + '' + + '' + + '' + + '
' + ); + + const projectListHtml = (function () { + if (projects.length === 0) { + return ( + '
' + + '' + + '
' + + '

Du har ingen prosjekter ennå

' + + '

Opprett ditt første for å starte ROS-, DPIA- og AI Act-arbeid. Felles felter du fylte ut i onboarding gjenbrukes automatisk.

' + + '
' + + '' + + '
' + + '
' + + '
' + ); + } + const tiles = projects.map(function (p) { + const filled = projectReportCount(p); + const band = projectMeterBand(filled, reportTotal); + const pct = reportTotal ? Math.round(100 * filled / reportTotal) : 0; + const scenarios = Array.isArray(p.scenarios) ? p.scenarios : []; + const chip = scenarios.length > 0 + ? '' + escapeHtml(scenarios[0]) + (scenarios.length > 1 ? ' +' + (scenarios.length - 1) : '') + '' + : 'Uten scenario'; + return ( + '' + ); + }).join(''); + return '
' + tiles + '
'; + })(); + + const orgName = (store.state.shared.organization && store.state.shared.organization.name) || ''; + const heroHtml = ( + '
' + + '

' + (orgName ? 'Hei, ' + escapeHtml(orgName) : 'ms-ai-architect') + '

' + + '

' + (orgName + ? 'Velg hvor du vil starte. Felles state er aktiv og forhåndsutfyller skjemaer.' + : 'Single-file arkitektur-rådgivning for Microsoft AI-stakken. Start med onboarding for å aktivere felles state.' + ) + '

' + + '
' + ); + + const projectsSection = ( + '
' + + '
' + + '

Mine prosjekter

' + + '' + + '
' + + projectListHtml + + (projects.length > 0 ? '
' : '') + + '
' + ); + + root.innerHTML = ( + renderTopbar('Hjem') + + '
' + + heroHtml + + tracksHtml + + projectsSection + + '
' + ); } + + // Stub for project + catalog som fylles i Steps 7, 9. function renderProjectSurface() { const root = getSurfaceEl('project'); if (!root) return; - root.innerHTML = '

Prosjekt-overflate fylles i Step 7.

'; + root.innerHTML = renderTopbar('Prosjekt') + '

Prosjekt-detaljvisning fylles i Step 7.

'; } function renderCatalogStub() { const root = getSurfaceEl('catalog'); if (!root) return; - root.innerHTML = '

Command-katalog fylles i Step 9.

'; + root.innerHTML = renderTopbar('Katalog') + '

Command-katalog fylles i Step 9.

'; } // ============================================================ @@ -1593,6 +1745,57 @@ if (input) input.focus(); }; + // ============================================================ + // NAV + EXPORT/IMPORT ACTIONS (Step 6) + // ============================================================ + + ACTIONS['goto-home'] = function () { navigate('home'); }; + ACTIONS['goto-catalog'] = function () { navigate('catalog'); }; + ACTIONS['goto-onboarding'] = function () { navigate('onboarding'); }; + + ACTIONS['open-project'] = function (ev, el) { + const id = el.dataset.projectId; + if (!id) return; + store.state.activeProjectId = id; + navigate('project'); + }; + + // Stub — Step 7 erstatter med modal-åpning. + ACTIONS['new-project'] = function () { + console.log('[playground v3] new-project: modal kommer i Step 7'); + }; + + ACTIONS['export-state'] = function () { + try { exportState(); } + catch (err) { console.error('[playground v3] export feilet:', err); alert('Eksport feilet: ' + err.message); } + }; + + ACTIONS['import-state'] = function (ev, el) { + const topbar = el.closest('.topbar'); + if (!topbar) return; + const input = topbar.querySelector('[data-import-input]'); + if (!input) return; + input.value = ''; // tillat samme fil to ganger + input.click(); + }; + + // File-input change handler (én gang for hele dokumentet — input genereres + // fortløpende via renderTopbar, men endringen bobler). + document.addEventListener('change', function (ev) { + if (!ev.target.matches || !ev.target.matches('[data-import-input]')) return; + const file = ev.target.files && ev.target.files[0]; + if (!file) return; + importState(file) + .then(function () { + scheduleRender(); + alert('Import fullført. Nåværende state er erstattet av filens innhold.'); + }) + .catch(function (err) { + console.error('[playground v3] import feilet:', err); + alert('Import feilet: ' + err.message); + }); + }); + // Eksponer for Verify-asserts og Steps 6-9. window.__navigate = navigate; window.__scheduleRender = scheduleRender;