From 77b9b590b37297bff946696b120f021ad256585f Mon Sep 17 00:00:00 2001 From: chattie Date: Wed, 19 Aug 2026 19:33:26 +0200 Subject: [PATCH] feat(F-077): completed feature --- backlog/features.json | 12 +-- .../src/app/(dashboard)/products/page.tsx | 22 +++++- project/apps/admin/tsconfig.tsbuildinfo | 2 +- work/artifacts/F-077/architect.md | 64 ++++++++++++++++ work/artifacts/F-077/implementer.md | 30 ++++++++ work/artifacts/F-077/leader-close.json | 15 ++++ work/artifacts/F-077/qa.json | 14 ++++ work/artifacts/F-077/reviewer.json | 17 +++++ work/artifacts/F-077/security.json | 13 ++++ work/current.md | 2 +- work/runtime-status.json | 76 +++++++++---------- 11 files changed, 219 insertions(+), 48 deletions(-) create mode 100644 work/artifacts/F-077/architect.md create mode 100644 work/artifacts/F-077/implementer.md create mode 100644 work/artifacts/F-077/leader-close.json create mode 100644 work/artifacts/F-077/qa.json create mode 100644 work/artifacts/F-077/reviewer.json create mode 100644 work/artifacts/F-077/security.json diff --git a/backlog/features.json b/backlog/features.json index dd1d3aa..eb86475 100644 --- a/backlog/features.json +++ b/backlog/features.json @@ -3658,13 +3658,15 @@ "No XSS risk from rendering", "verify.sh is green" ], - "status": "pending", + "status": "done", "created_at": "2026-08-19", "gates": { - "reviewer": false, - "security": false, - "qa": false - } + "reviewer": true, + "security": true, + "qa": true, + "close": true + }, + "completed_at": "2026-08-19T17:33:25Z" } ] } diff --git a/project/apps/admin/src/app/(dashboard)/products/page.tsx b/project/apps/admin/src/app/(dashboard)/products/page.tsx index 627ece2..ecfb710 100644 --- a/project/apps/admin/src/app/(dashboard)/products/page.tsx +++ b/project/apps/admin/src/app/(dashboard)/products/page.tsx @@ -12,6 +12,19 @@ function formatPrice(cents?: number) { return `€${(cents / 100).toFixed(2)}`; } +/** Renders HTML safely: strips dangerous tags while preserving safe formatting. */ +function renderHtml(html: string): string { + if (!html) return ''; + return html + .replace(/)<[^<]*)*<\/script>/gi, '') + .replace(/\son\w+="[^"]*"/gi, '') + .replace(/\son\w+='[^']*'/gi, '') + .replace(/javascript:/gi, '') + .replace(/