diff --git a/felsokning/app/src/alva/komponenter.tsx b/felsokning/app/src/alva/komponenter.tsx index 7409ef8..03390b3 100644 --- a/felsokning/app/src/alva/komponenter.tsx +++ b/felsokning/app/src/alva/komponenter.tsx @@ -147,6 +147,31 @@ export function Block({ children, rubrik, beteckning }: { children: ReactNode; r ); } +/** + * Demonstrationsmärkning. + * + * QUALITY-AUDIT-2 · m-9. Inloggningen ser ut som en inloggning men + * autentiserar ingenting, och kontoansökan skickar ingenting. Två + * personer i rad har försökt använda dem på riktigt — vilket är precis + * vad fyndet förutsade: en yta som ser färdig ut planerar man efter. + * + * Integrationssidan märker redan en profil `draft` tills den körts mot + * leverantören, med motiveringen att en lista där allt ser färdigt ut är + * den snabbaste vägen till ett misslyckat införande. Samma måttstock + * gäller här. Rutan säger vad som INTE sker, inte vad som kommer att ske + * någon gång — ett löfte vore samma fel i ny form. + */ +export function Demonstration({ children }: { children: ReactNode }) { + return ( +
+ Demonstration +

+ {children} +

+
+ ); +} + // ---- Fasindikator ----------------------------------------------------- /** diff --git a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts index 209abbe..86a5922 100644 --- a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts +++ b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts @@ -238,3 +238,41 @@ describe("ALVA:s snitt följer med i bygget", () => { expect(typsnitt).not.toMatch(/url\(\s*["']?https?:/); }); }); + +// ---- Obackade ytor måste märkas ---------------------------------------- +// +// QUALITY-AUDIT-2 · m-9. Inloggningen autentiserar ingenting och +// kontoansökan skickar ingenting, men bägge ser ut som att de gör det. +// Två personer i rad försökte använda dem på riktigt innan de frågade — +// vilket är precis vad fyndet förutsade: en yta som ser färdig ut +// planerar man efter. +// +// Integrationssidan märker redan en profil `draft` tills den körts mot +// leverantören, med motiveringen att en lista där allt ser färdigt ut är +// den snabbaste vägen till ett misslyckat införande. Testet håller +// samma måttstock mot resten av ytan. +describe("ytor utan verklig funktion är märkta som demonstration", () => { + const sida = (namn: string) => filer.find(([n]) => n.endsWith(`pages/alva/${namn}`))![1]; + + it.each(["LoggaIn.tsx", "Ansokan.tsx", "Portal.tsx"])("%s bär en demonstrationsruta", (namn) => { + expect(sida(namn)).toContain(""); + }); + + it("ansökans kvittens är märkt, inte bara formuläret", () => { + // Kvittenssidan med sin referens är det som mest liknar ett verkligt + // besked, och därför den som vilseleder mest om den står omärkt. + expect(sida("Ansokan.tsx").match(//g)).toHaveLength(2); + }); + + it("rutan säger vad som inte sker, inte vad som ska komma", () => { + // Ett löfte om framtida funktion vore samma fel i ny form. + const komponenter = filer.find(([n]) => n.endsWith("alva/komponenter.tsx"))![1]; + const ruta = komponenter.match(/export function Demonstration[\s\S]*?\n}/)?.[0] ?? ""; + expect(ruta).toContain("Demonstration"); + for (const löfte of ["coming soon", "snart", "will be available", "in a future"]) { + for (const namn of ["LoggaIn.tsx", "Ansokan.tsx", "Portal.tsx"]) { + expect(sida(namn).toLowerCase(), `${namn}: ${löfte}`).not.toContain(löfte); + } + } + }); +}); diff --git a/felsokning/app/src/pages/alva/Ansokan.tsx b/felsokning/app/src/pages/alva/Ansokan.tsx index eb2a848..0222218 100644 --- a/felsokning/app/src/pages/alva/Ansokan.tsx +++ b/felsokning/app/src/pages/alva/Ansokan.tsx @@ -6,7 +6,7 @@ // garantitvist kan inte dela ut konton automatiskt. import { type FormEvent, useState } from "react"; -import { Block, Etikett, FARG, Knapp, Rubrik, Statusmärke } from "@/alva/komponenter"; +import { Demonstration, Block, Etikett, FARG, Knapp, Rubrik, Statusmärke } from "@/alva/komponenter"; import { Ram } from "./Ram"; interface Falt { @@ -51,6 +51,10 @@ export default function Ansokan() {
Submitted
+ + Nothing was submitted. The reference below was generated in the browser and exists + nowhere else. +
@@ -81,6 +85,10 @@ export default function Ansokan() {
Request account
+ + This form does not submit anything. The reference it returns is generated in the browser + and is not recorded. Applications are handled outside this demonstration. +

Applications are reviewed manually. No payment is taken at this stage.

diff --git a/felsokning/app/src/pages/alva/LoggaIn.tsx b/felsokning/app/src/pages/alva/LoggaIn.tsx index f79b696..6212916 100644 --- a/felsokning/app/src/pages/alva/LoggaIn.tsx +++ b/felsokning/app/src/pages/alva/LoggaIn.tsx @@ -6,7 +6,7 @@ import { type FormEvent, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { Block, Etikett, FARG, Knapp, Rubrik } from "@/alva/komponenter"; +import { Demonstration, Block, Etikett, FARG, Knapp, Rubrik } from "@/alva/komponenter"; import { Ram } from "./Ram"; const FALT = [ @@ -37,6 +37,11 @@ export default function LoggaIn() {
Login
+ + This login authenticates nothing. Any organization and username signs in, and the password + is not checked. Real authentication exists in the platform service and is not part of this + demonstration. +
diff --git a/felsokning/app/src/pages/alva/Portal.tsx b/felsokning/app/src/pages/alva/Portal.tsx index 0ac9404..5f4a203 100644 --- a/felsokning/app/src/pages/alva/Portal.tsx +++ b/felsokning/app/src/pages/alva/Portal.tsx @@ -7,7 +7,7 @@ import { Link } from "react-router-dom"; import { PLATTFORMSVERSION, arendebeteckning } from "@/alva/system"; -import { Block, Etikett, FARG, Falt, Knapp, Rubrik, Statusmärke, Tabell } from "@/alva/komponenter"; +import { Demonstration, Block, Etikett, FARG, Falt, Knapp, Rubrik, Statusmärke, Tabell } from "@/alva/komponenter"; import { MEDDELANDE } from "@/alva/sprak"; import { Ram } from "./Ram"; @@ -27,6 +27,11 @@ export default function Portal() {
+ + The figures on this page are fixed example values, and the organization is not a real one. + Analysis is the exception: it is computed from the cases you create under Diagnostics. + +