feat(ms-ai-architect): onboarding fritekst-omlegging (4 strukturerte + 16 fritekst per R4)
ONBOARDING_SCHEMA går fra 18 -> 20 felt: - 4 strukturerte: sector (select), ai_act_role (NY select), risk_level (NY select), data_classification (multiSelect) - 16 fritekst (text/textarea), alle med non-empty placeholder ai_act_role + risk_level legges i ny "regulatory"-gruppe (totalt 6 grupper). renderOnboardingField utvidet med placeholder-attr-stoette for text/textarea. Onboarding-header + tracks-card desc oppdatert "18 felles" -> "20 felles". Verify: 20 felt totalt, 4 struct (sector/ai_act_role/risk_level/data_classification), 16 free med placeholder. Tester: 215 statiske + 240 playground PASS.
This commit is contained in:
parent
502faa97d5
commit
8be04e3a21
1 changed files with 53 additions and 33 deletions
|
|
@ -1586,7 +1586,7 @@
|
|||
'<button type="button" class="tracks__card tracks__card--guided" data-action="goto-onboarding">' +
|
||||
'<span class="tracks__card-icon" aria-hidden="true">⚙︎</span>' +
|
||||
'<h3 class="tracks__card-title">Onboard / Re-onboard</h3>' +
|
||||
'<p class="tracks__card-desc">Oppdater de 18 felles feltene som forhåndsutfyller alle command-skjemaer.</p>' +
|
||||
'<p class="tracks__card-desc">Oppdater de 20 felles feltene som forhåndsutfyller alle command-skjemaer.</p>' +
|
||||
'<span class="tracks__card-meta"><span>Felles state</span><span class="tracks__card-cta">Åpne →</span></span>' +
|
||||
'</button>' +
|
||||
'<button type="button" class="tracks__card tracks__card--explore" data-action="new-project">' +
|
||||
|
|
@ -3637,20 +3637,37 @@
|
|||
// til IDB. Re-onboard er bare navigate('onboarding') igjen — skjemaet
|
||||
// pre-fylles automatisk fra eksisterende state.
|
||||
|
||||
// v1.10.0: 4 strukturerte (sector, ai_act_role, risk_level, data_classification)
|
||||
// + 16 fritekst (text/textarea med placeholder). Per R4 i plan-Revisions:
|
||||
// free-text gir presis virksomhetskontekst som kan settes inn direkte i
|
||||
// command-prompts uten å tvinge sjabloner som ikke matcher domenet.
|
||||
const ONBOARDING_SCHEMA = [
|
||||
{
|
||||
id: 'organization',
|
||||
title: 'Virksomhetsprofil',
|
||||
sub: 'Hvem er dere?',
|
||||
fields: [
|
||||
{ id: 'name', label: 'Virksomhetsnavn', type: 'text', required: true },
|
||||
{ id: 'description', label: 'Beskrivelse', type: 'textarea' },
|
||||
{ id: 'name', label: 'Virksomhetsnavn', type: 'text', required: true,
|
||||
placeholder: 'f.eks. Bærum kommune, Statens vegvesen, Helse Sør-Øst RHF' },
|
||||
{ id: 'description', label: 'Kort beskrivelse', type: 'textarea',
|
||||
placeholder: 'Hva gjør virksomheten? F.eks. "Kommune med 8 000 ansatte, ansvar for skole, helse og byggesak."' },
|
||||
{ id: 'sector', label: 'Sektor', type: 'select', required: true,
|
||||
options: ['Statlig', 'Kommunal', 'Fylkeskommune', 'Helseforetak', 'Undervisning', 'Annet'] },
|
||||
{ id: 'size', label: 'Antall ansatte', type: 'select',
|
||||
options: ['<100', '100-500', '500-2000', '2000-10000', '>10000'] },
|
||||
{ id: 'regulatory_requirements', label: 'Regulatoriske krav', type: 'multiSelect',
|
||||
options: ['Personopplysningsloven/GDPR', 'Sikkerhetsloven', 'Arkivloven', 'Forvaltningsloven', 'Offentleglova', 'Helseregisterloven', 'Annet'] }
|
||||
{ id: 'size', label: 'Antall ansatte', type: 'text',
|
||||
placeholder: 'f.eks. "1 500", "ca. 8 000", "<100"' }
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'regulatory',
|
||||
title: 'Regulatorisk grunnlag',
|
||||
sub: 'Hvilke krav styrer dere etter, og hvilken AI Act-rolle har dere?',
|
||||
fields: [
|
||||
{ id: 'regulatory_requirements', label: 'Regulatoriske krav', type: 'textarea',
|
||||
placeholder: 'f.eks. "GDPR/Personopplysningsloven, Sikkerhetsloven, Forvaltningsloven, Helseregisterloven, Arkivloven"' },
|
||||
{ id: 'ai_act_role', label: 'EU AI Act-rolle', type: 'select',
|
||||
options: ['provider', 'deployer', 'distributor', 'importer'] },
|
||||
{ id: 'risk_level', label: 'EU AI Act risikonivå', type: 'select',
|
||||
options: ['forbidden', 'high', 'limited', 'minimal'] }
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -3658,26 +3675,27 @@
|
|||
title: 'Teknologistack',
|
||||
sub: 'Hva har dere allerede?',
|
||||
fields: [
|
||||
{ id: 'cloud_platform', label: 'Skyplattform', type: 'multiSelect',
|
||||
options: ['Azure', 'M365', 'Power Platform', 'On-prem', 'Hybrid', 'Annet'] },
|
||||
{ id: 'license_type', label: 'Lisenstype', type: 'select',
|
||||
options: ['E3', 'E5', 'F1/F3', 'A3/A5', 'G3/G5', 'Annet'] },
|
||||
{ id: 'ai_services_in_use', label: 'AI-tjenester i bruk', type: 'multiSelect',
|
||||
options: ['Azure OpenAI', 'Copilot for M365', 'Copilot Studio', 'AI Builder', 'Azure AI Search', 'Azure AI Services', 'Ingen', 'Annet'] }
|
||||
{ id: 'cloud_platform', label: 'Skyplattform', type: 'textarea',
|
||||
placeholder: 'f.eks. "Azure (Norge Øst), AWS (Stockholm), on-prem datasenter Drammen"' },
|
||||
{ id: 'license_type', label: 'Lisenstype', type: 'text',
|
||||
placeholder: 'f.eks. "M365 E5", "Azure Enterprise Agreement", "Power Platform per app"' },
|
||||
{ id: 'ai_services_in_use', label: 'AI-tjenester i bruk', type: 'textarea',
|
||||
placeholder: 'f.eks. "Azure OpenAI (GPT-4o, embedding), Copilot for M365, AI Builder, Azure AI Search"' }
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'security',
|
||||
title: 'Sikkerhet og compliance',
|
||||
sub: 'Hvilke krav styrer dere etter?',
|
||||
sub: 'Hvilke data og praksiser styrer dere etter?',
|
||||
fields: [
|
||||
{ id: 'data_classification', label: 'Dataklassifisering', type: 'multiSelect',
|
||||
options: ['Åpen', 'Intern', 'Fortrolig', 'Strengt fortrolig', 'Hemmelig'] },
|
||||
{ id: 'data_residency', label: 'Dataresidens-krav', type: 'select',
|
||||
options: ['Norge', 'Norden', 'EU/EØS', 'Ingen spesifikke krav'] },
|
||||
{ id: 'dpia_practice', label: 'DPIA-praksis', type: 'select',
|
||||
options: ['Systematisk', 'Ad hoc', 'Ikke etablert', 'Usikker'] },
|
||||
{ id: 'certifications', label: 'Sertifiseringer/rammeverk', type: 'textarea' }
|
||||
{ id: 'data_residency', label: 'Dataresidens-krav', type: 'text',
|
||||
placeholder: 'f.eks. "Kun Norge", "EU/EØS", "Norden", "Ingen spesifikke krav"' },
|
||||
{ id: 'dpia_practice', label: 'DPIA-praksis', type: 'textarea',
|
||||
placeholder: 'Hvordan utløses og gjennomføres DPIA? F.eks. "Sentralt personvernombud, mal etter Datatilsynet, halvårlig revisjon."' },
|
||||
{ id: 'certifications', label: 'Sertifiseringer / rammeverk', type: 'textarea',
|
||||
placeholder: 'f.eks. "ISO 27001, Digdir Trygg-pilot, NSM grunnprinsipper for IKT-sikkerhet"' }
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -3685,12 +3703,12 @@
|
|||
title: 'Arkitekturbeslutninger',
|
||||
sub: 'Hvor vil dere?',
|
||||
fields: [
|
||||
{ id: 'preferred_platform', label: 'Foretrukket AI-plattform', type: 'select',
|
||||
options: ['Azure AI Foundry', 'Copilot Studio', 'Power Platform/AI Builder', 'Semantic Kernel', 'Ikke bestemt'] },
|
||||
{ id: 'integration_needs', label: 'Integrasjonsbehov', type: 'multiSelect',
|
||||
options: ['M365', 'SharePoint', 'Dynamics 365', 'SAP', 'Fagsystemer', 'REST API-er', 'Annet'] },
|
||||
{ id: 'annual_ai_budget', label: 'Årlig AI-budsjett', type: 'select',
|
||||
options: ['<500k', '500k-2M', '2M-10M', '>10M', 'Ikke definert'] }
|
||||
{ id: 'preferred_platform', label: 'Foretrukket AI-plattform', type: 'text',
|
||||
placeholder: 'f.eks. "Azure AI Foundry", "Copilot Studio", "Power Platform/AI Builder", "Ikke bestemt"' },
|
||||
{ id: 'integration_needs', label: 'Integrasjonsbehov', type: 'textarea',
|
||||
placeholder: 'Eksisterende systemer som trenger AI-integrasjon. F.eks. "M365, SAP S/4, fagsystem KOMTEK, REST API mot folkeregister."' },
|
||||
{ id: 'annual_ai_budget', label: 'Årlig AI-budsjett', type: 'text',
|
||||
placeholder: 'f.eks. "2 MNOK", "500k-2M", "Ikke definert"' }
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -3698,11 +3716,12 @@
|
|||
title: 'Forretningsreferanser',
|
||||
sub: 'Hvordan styrer dere?',
|
||||
fields: [
|
||||
{ id: 'governance_model', label: 'Styringsmodell for AI', type: 'select',
|
||||
options: ['Sentralisert', 'Desentralisert', 'Hybrid', 'Ikke etablert'] },
|
||||
{ id: 'doc_format_preferences', label: 'Dokumentformat', type: 'multiSelect',
|
||||
options: ['Markdown', 'Word', 'PDF', 'Confluence', 'SharePoint Wiki', 'Annet'] },
|
||||
{ id: 'reference_architecture', label: 'Referansearkitektur', type: 'textarea' }
|
||||
{ id: 'governance_model', label: 'Styringsmodell for AI', type: 'textarea',
|
||||
placeholder: 'Hvem eier AI-beslutninger? F.eks. "Sentralt AI-råd ledes av digitaliseringsdirektør, beslutninger eskalerer til CIO."' },
|
||||
{ id: 'doc_format_preferences', label: 'Dokumentformat', type: 'text',
|
||||
placeholder: 'f.eks. "Markdown + PDF", "Confluence", "SharePoint Wiki", "Word"' },
|
||||
{ id: 'reference_architecture', label: 'Referansearkitektur', type: 'textarea',
|
||||
placeholder: 'Eksisterende prinsipper, lenker til wiki/docs. F.eks. "TOGAF-tilpasset, ref Confluence /arch."' }
|
||||
]
|
||||
}
|
||||
];
|
||||
|
|
@ -3734,11 +3753,12 @@
|
|||
const dataAttrs = 'data-onboarding-field="' + escapeAttr(path) + '"';
|
||||
const requiredMark = field.required ? '<span class="required-mark" aria-hidden="true">*</span>' : '';
|
||||
const labelHtml = '<label for="' + fieldId + '" class="field-label">' + escapeHtml(field.label) + requiredMark + '</label>';
|
||||
const placeholderAttr = field.placeholder ? ' placeholder="' + escapeAttr(field.placeholder) + '"' : '';
|
||||
let inputHtml = '';
|
||||
if (field.type === 'text') {
|
||||
inputHtml = '<input type="text" id="' + fieldId + '" ' + dataAttrs + ' value="' + escapeAttr(value || '') + '" class="input">';
|
||||
inputHtml = '<input type="text" id="' + fieldId + '" ' + dataAttrs + placeholderAttr + ' value="' + escapeAttr(value || '') + '" class="input">';
|
||||
} else if (field.type === 'textarea') {
|
||||
inputHtml = '<textarea id="' + fieldId + '" ' + dataAttrs + ' class="textarea" rows="3">' + escapeHtml(value || '') + '</textarea>';
|
||||
inputHtml = '<textarea id="' + fieldId + '" ' + dataAttrs + placeholderAttr + ' class="textarea" rows="3">' + escapeHtml(value || '') + '</textarea>';
|
||||
} else if (field.type === 'select') {
|
||||
const opts = ['<option value="">(velg)</option>'].concat(field.options.map(function (o) {
|
||||
const sel = (o === value) ? ' selected' : '';
|
||||
|
|
@ -3860,7 +3880,7 @@
|
|||
'<div class="onboarding-main">' +
|
||||
'<header class="onboarding-header">' +
|
||||
'<h1>Velkommen til ms-ai-architect</h1>' +
|
||||
'<p>Fyll inn 18 felles felter — de gjenbrukes på tvers av alle commands og forhåndsutfyller skjemaer per prosjekt.</p>' +
|
||||
'<p>Fyll inn 20 felles felter — de gjenbrukes på tvers av alle commands og forhåndsutfyller skjemaer per prosjekt.</p>' +
|
||||
'</header>' +
|
||||
errorSummary +
|
||||
'<div class="onboarding-groups">' + groupsHtml + '</div>' +
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue