From 74cc5addf8a75b471e8d4a0ec576658bf44d462a Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Wed, 4 Feb 2026 16:51:06 +0100 Subject: [PATCH] Add 21 CFR Part 11 framework Signed-off-by: Bryan Frimin --- .../public/data/frameworks/21CFR-part11.json | 71 ++++++++++++++++ .../ui/src/Atoms/Frameworks/21CFRPart11.tsx | 85 +++++++++++++++++++ .../FrameworkSelector/FrameworkSelector.tsx | 7 ++ 3 files changed, 163 insertions(+) create mode 100644 apps/console/public/data/frameworks/21CFR-part11.json create mode 100644 packages/ui/src/Atoms/Frameworks/21CFRPart11.tsx diff --git a/apps/console/public/data/frameworks/21CFR-part11.json b/apps/console/public/data/frameworks/21CFR-part11.json new file mode 100644 index 000000000..54971b54e --- /dev/null +++ b/apps/console/public/data/frameworks/21CFR-part11.json @@ -0,0 +1,71 @@ +{ + "id": "21 CFR Part 11", + "name": "21 CFR Part 11", + "logo": { + "light": "", + "dark": "" + }, + "controls": [ + { + "id": "P11-001", + "name": "System Validation", + "description": "Systems are validated to ensure accuracy, reliability, consistent intended performance, and the ability to discern invalid or altered records." + }, + { + "id": "P11-002", + "name": "Audit Trails", + "description": "Secure, computer-generated, time-stamped audit trails independently record operator entries and actions." + }, + { + "id": "P11-003", + "name": "Record Retention", + "description": "Electronic records are protected to enable accurate and ready retrieval throughout the records retention period." + }, + { + "id": "P11-004", + "name": "Access Controls", + "description": "System access is limited to authorized individuals with unique user IDs." + }, + { + "id": "P11-005", + "name": "Electronic Signatures", + "description": "Electronic signatures are unique to an individual and verifiable." + }, + { + "id": "P11-006", + "name": "Signature Linking", + "description": "Electronic signatures are permanently linked to their respective electronic records." + }, + { + "id": "P11-007", + "name": "Signature Integrity", + "description": "Electronic signatures cannot be excised, copied, or transferred to falsify an electronic record." + }, + { + "id": "P11-008", + "name": "Signature Binding Enforcement", + "description": "System enforces technical and procedural controls to maintain binding between record content and signature." + }, + { + "id": "P11-009", + "name": "Operational Checks", + "description": "Operational system checks enforce permitted sequencing of steps and events." + }, + { + "id": "P11-010", + "name": "Authority Checks", + "description": "Authority checks ensure only authorized individuals can use the system or sign records." + }, + { + "id": "P11-011", + "name": "Device Checks", + "description": "Device checks determine the validity of the source of data input." + }, + { + "id": "P11-012", + "name": "Training", + "description": "Personnel have education, training, and experience to perform assigned tasks." + } + ] + } + \ No newline at end of file diff --git a/packages/ui/src/Atoms/Frameworks/21CFRPart11.tsx b/packages/ui/src/Atoms/Frameworks/21CFRPart11.tsx new file mode 100644 index 000000000..969446399 --- /dev/null +++ b/packages/ui/src/Atoms/Frameworks/21CFRPart11.tsx @@ -0,0 +1,85 @@ +export function TwentyOneCFRPart11(props: { className?: string }) { + const { className } = props; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/packages/ui/src/Molecules/FrameworkSelector/FrameworkSelector.tsx b/packages/ui/src/Molecules/FrameworkSelector/FrameworkSelector.tsx index 2f0c6ac3d..b0cde42ee 100644 --- a/packages/ui/src/Molecules/FrameworkSelector/FrameworkSelector.tsx +++ b/packages/ui/src/Molecules/FrameworkSelector/FrameworkSelector.tsx @@ -2,6 +2,7 @@ import { useTranslate } from "@probo/i18n"; import { Button } from "../../Atoms/Button/Button"; import { Dropdown, DropdownItem } from "../../Atoms/Dropdown/Dropdown"; +import { TwentyOneCFRPart11 } from "../../Atoms/Frameworks/21CFRPart11"; import { CCPA } from "../../Atoms/Frameworks/CCPA"; import { DORA } from "../../Atoms/Frameworks/DORA"; import { GDPR } from "../../Atoms/Frameworks/GDPR"; @@ -70,6 +71,12 @@ const availableFrameworks = [ description: "Information technology, artificial intelligence, management system", }, + { + id: "21CFR-part11", + name: "21 CFR Part 11", + logo: , + description: "21 CFR Part 11", + }, ]; type Framework = (typeof availableFrameworks)[number];