@tantainnovative/ndpr-toolkit 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +20 -0
- package/.eslintrc.json +10 -0
- package/.github/workflows/ci.yml +36 -0
- package/.github/workflows/nextjs.yml +104 -0
- package/.husky/commit-msg +4 -0
- package/.husky/pre-commit +4 -0
- package/.lintstagedrc.js +4 -0
- package/.nvmrc +1 -0
- package/.versionrc +17 -0
- package/CHANGELOG.md +16 -0
- package/CLAUDE.md +90 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +87 -0
- package/README.md +84 -447
- package/RELEASE-NOTES-v1.0.0.md +140 -0
- package/RELEASE-NOTES-v1.0.1.md +69 -0
- package/SECURITY.md +21 -0
- package/commitlint.config.js +36 -0
- package/components.json +21 -0
- package/eslint.config.mjs +16 -0
- package/jest.config.js +31 -0
- package/jest.setup.js +15 -0
- package/next.config.js +15 -0
- package/next.config.ts +62 -0
- package/package.json +70 -52
- package/packages/ndpr-toolkit/README.md +467 -0
- package/packages/ndpr-toolkit/jest.config.js +23 -0
- package/packages/ndpr-toolkit/package-lock.json +8197 -0
- package/packages/ndpr-toolkit/package.json +71 -0
- package/packages/ndpr-toolkit/rollup.config.js +34 -0
- package/packages/ndpr-toolkit/src/__tests__/components/consent/ConsentBanner.test.tsx +119 -0
- package/packages/ndpr-toolkit/src/__tests__/components/consent/ConsentManager.test.tsx +122 -0
- package/packages/ndpr-toolkit/src/__tests__/components/consent/ConsentStorage.test.tsx +270 -0
- package/packages/ndpr-toolkit/src/__tests__/components/dsr/DSRDashboard.test.tsx +199 -0
- package/packages/ndpr-toolkit/src/__tests__/components/dsr/DSRRequestForm.test.tsx +224 -0
- package/packages/ndpr-toolkit/src/__tests__/components/dsr/DSRTracker.test.tsx +104 -0
- package/packages/ndpr-toolkit/src/__tests__/hooks/useConsent.test.tsx +161 -0
- package/packages/ndpr-toolkit/src/__tests__/hooks/useDSR.test.tsx +330 -0
- package/packages/ndpr-toolkit/src/__tests__/utils/breach.test.ts +149 -0
- package/packages/ndpr-toolkit/src/__tests__/utils/consent.test.ts +88 -0
- package/packages/ndpr-toolkit/src/__tests__/utils/dpia.test.ts +160 -0
- package/packages/ndpr-toolkit/src/__tests__/utils/dsr.test.ts +110 -0
- package/packages/ndpr-toolkit/src/__tests__/utils/privacy.test.ts +97 -0
- package/packages/ndpr-toolkit/src/components/breach/BreachNotificationManager.tsx +701 -0
- package/packages/ndpr-toolkit/src/components/breach/BreachReportForm.tsx +631 -0
- package/packages/ndpr-toolkit/src/components/breach/BreachRiskAssessment.tsx +569 -0
- package/packages/ndpr-toolkit/src/components/breach/RegulatoryReportGenerator.tsx +496 -0
- package/packages/ndpr-toolkit/src/components/consent/ConsentBanner.tsx +270 -0
- package/packages/ndpr-toolkit/src/components/consent/ConsentManager.tsx +217 -0
- package/packages/ndpr-toolkit/src/components/consent/ConsentStorage.tsx +206 -0
- package/packages/ndpr-toolkit/src/components/dpia/DPIAQuestionnaire.tsx +342 -0
- package/packages/ndpr-toolkit/src/components/dpia/DPIAReport.tsx +373 -0
- package/packages/ndpr-toolkit/src/components/dpia/StepIndicator.tsx +174 -0
- package/packages/ndpr-toolkit/src/components/dsr/DSRDashboard.tsx +717 -0
- package/packages/ndpr-toolkit/src/components/dsr/DSRRequestForm.tsx +476 -0
- package/packages/ndpr-toolkit/src/components/dsr/DSRTracker.tsx +620 -0
- package/packages/ndpr-toolkit/src/components/policy/PolicyExporter.tsx +541 -0
- package/packages/ndpr-toolkit/src/components/policy/PolicyGenerator.tsx +454 -0
- package/packages/ndpr-toolkit/src/components/policy/PolicyPreview.tsx +333 -0
- package/packages/ndpr-toolkit/src/hooks/useBreach.ts +409 -0
- package/packages/ndpr-toolkit/src/hooks/useConsent.ts +263 -0
- package/packages/ndpr-toolkit/src/hooks/useDPIA.ts +457 -0
- package/packages/ndpr-toolkit/src/hooks/useDSR.ts +236 -0
- package/packages/ndpr-toolkit/src/hooks/usePrivacyPolicy.ts +428 -0
- package/{dist/index.d.ts → packages/ndpr-toolkit/src/index.ts} +13 -0
- package/packages/ndpr-toolkit/src/setupTests.ts +5 -0
- package/packages/ndpr-toolkit/src/types/breach.ts +283 -0
- package/packages/ndpr-toolkit/src/types/consent.ts +111 -0
- package/packages/ndpr-toolkit/src/types/dpia.ts +236 -0
- package/packages/ndpr-toolkit/src/types/dsr.ts +192 -0
- package/packages/ndpr-toolkit/src/types/index.ts +42 -0
- package/packages/ndpr-toolkit/src/types/privacy.ts +246 -0
- package/packages/ndpr-toolkit/src/utils/breach.ts +122 -0
- package/packages/ndpr-toolkit/src/utils/consent.ts +51 -0
- package/packages/ndpr-toolkit/src/utils/dpia.ts +104 -0
- package/packages/ndpr-toolkit/src/utils/dsr.ts +77 -0
- package/packages/ndpr-toolkit/src/utils/privacy.ts +100 -0
- package/packages/ndpr-toolkit/tsconfig.json +23 -0
- package/postcss.config.mjs +5 -0
- package/public/NDPR TOOLKIT.svg +1 -0
- package/public/favicon/android-chrome-192x192.png +0 -0
- package/public/favicon/android-chrome-512x512.png +0 -0
- package/public/favicon/apple-touch-icon.png +0 -0
- package/public/favicon/favicon-16x16.png +0 -0
- package/public/favicon/favicon-32x32.png +0 -0
- package/public/favicon/site.webmanifest +1 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/ndpr-toolkit-logo.svg +108 -0
- package/public/next.svg +1 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/src/__tests__/example.test.ts +13 -0
- package/src/__tests__/requestService.test.ts +57 -0
- package/src/app/accessibility.css +70 -0
- package/src/app/docs/components/DocLayout.tsx +267 -0
- package/src/app/docs/components/breach-notification/page.tsx +797 -0
- package/src/app/docs/components/consent-management/page.tsx +576 -0
- package/src/app/docs/components/data-subject-rights/page.tsx +511 -0
- package/src/app/docs/components/dpia-questionnaire/layout.tsx +15 -0
- package/src/app/docs/components/dpia-questionnaire/metadata.ts +31 -0
- package/src/app/docs/components/dpia-questionnaire/page.tsx +666 -0
- package/src/app/docs/components/hooks/page.tsx +305 -0
- package/src/app/docs/components/page.tsx +84 -0
- package/src/app/docs/components/privacy-policy-generator/page.tsx +634 -0
- package/src/app/docs/guides/breach-notification-process/components/BestPractices.tsx +123 -0
- package/src/app/docs/guides/breach-notification-process/components/ImplementationSteps.tsx +328 -0
- package/src/app/docs/guides/breach-notification-process/components/Introduction.tsx +28 -0
- package/src/app/docs/guides/breach-notification-process/components/NotificationTimeline.tsx +91 -0
- package/src/app/docs/guides/breach-notification-process/components/Resources.tsx +118 -0
- package/src/app/docs/guides/breach-notification-process/page.tsx +39 -0
- package/src/app/docs/guides/conducting-dpia/page.tsx +593 -0
- package/src/app/docs/guides/data-subject-requests/page.tsx +666 -0
- package/src/app/docs/guides/managing-consent/page.tsx +738 -0
- package/src/app/docs/guides/ndpr-compliance-checklist/components/ComplianceChecklist.tsx +296 -0
- package/src/app/docs/guides/ndpr-compliance-checklist/components/ImplementationTools.tsx +145 -0
- package/src/app/docs/guides/ndpr-compliance-checklist/components/Introduction.tsx +33 -0
- package/src/app/docs/guides/ndpr-compliance-checklist/components/KeyRequirements.tsx +99 -0
- package/src/app/docs/guides/ndpr-compliance-checklist/components/Resources.tsx +159 -0
- package/src/app/docs/guides/ndpr-compliance-checklist/page.tsx +38 -0
- package/src/app/docs/guides/page.tsx +67 -0
- package/src/app/docs/layout.tsx +15 -0
- package/src/app/docs/metadata.ts +31 -0
- package/src/app/docs/page.tsx +572 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +123 -0
- package/src/app/layout.tsx +37 -0
- package/src/app/ndpr-demos/breach/page.tsx +354 -0
- package/src/app/ndpr-demos/consent/page.tsx +366 -0
- package/src/app/ndpr-demos/dpia/page.tsx +495 -0
- package/src/app/ndpr-demos/dsr/page.tsx +280 -0
- package/src/app/ndpr-demos/page.tsx +73 -0
- package/src/app/ndpr-demos/policy/page.tsx +771 -0
- package/src/app/page.tsx +452 -0
- package/src/components/ErrorBoundary.tsx +90 -0
- package/src/components/breach-notification/BreachNotificationForm.tsx +479 -0
- package/src/components/consent/ConsentBanner.tsx +159 -0
- package/src/components/data-subject-rights/DataSubjectRequestForm.tsx +419 -0
- package/src/components/docs/DocLayout.tsx +289 -0
- package/src/components/docs/index.ts +2 -0
- package/src/components/dpia/DPIAQuestionnaire.tsx +483 -0
- package/src/components/privacy-policy/PolicyGenerator.tsx +1062 -0
- package/src/components/privacy-policy/data.ts +98 -0
- package/src/components/privacy-policy/shared/CheckboxField.tsx +38 -0
- package/src/components/privacy-policy/shared/CheckboxGroup.tsx +85 -0
- package/src/components/privacy-policy/shared/FormField.tsx +79 -0
- package/src/components/privacy-policy/shared/StepIndicator.tsx +86 -0
- package/src/components/privacy-policy/steps/CustomSectionsStep.tsx +335 -0
- package/src/components/privacy-policy/steps/DataCollectionStep.tsx +231 -0
- package/src/components/privacy-policy/steps/DataSharingStep.tsx +418 -0
- package/src/components/privacy-policy/steps/OrganizationInfoStep.tsx +202 -0
- package/src/components/privacy-policy/steps/PolicyPreviewStep.tsx +172 -0
- package/src/components/ui/Badge.tsx +46 -0
- package/src/components/ui/Button.tsx +59 -0
- package/src/components/ui/Card.tsx +92 -0
- package/src/components/ui/Checkbox.tsx +57 -0
- package/src/components/ui/FormField.tsx +50 -0
- package/src/components/ui/Input.tsx +38 -0
- package/src/components/ui/Loading.tsx +201 -0
- package/src/components/ui/Select.tsx +42 -0
- package/src/components/ui/TextArea.tsx +38 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/switch.tsx +31 -0
- package/src/components/ui/tabs.tsx +66 -0
- package/src/hooks/useConsent.ts +64 -0
- package/src/hooks/useLoadingState.ts +85 -0
- package/src/lib/consentService.ts +137 -0
- package/src/lib/dpiaQuestions.ts +148 -0
- package/src/lib/requestService.ts +75 -0
- package/src/lib/sanitize.ts +108 -0
- package/src/lib/storage.ts +222 -0
- package/src/lib/utils.ts +6 -0
- package/src/types/html-to-docx.d.ts +30 -0
- package/src/types/index.ts +72 -0
- package/tailwind.config.ts +65 -0
- package/tsconfig.json +41 -0
- package/dist/components/breach/BreachNotificationManager.d.ts +0 -62
- package/dist/components/breach/BreachReportForm.d.ts +0 -66
- package/dist/components/breach/BreachRiskAssessment.d.ts +0 -50
- package/dist/components/breach/RegulatoryReportGenerator.d.ts +0 -94
- package/dist/components/consent/ConsentBanner.d.ts +0 -79
- package/dist/components/consent/ConsentManager.d.ts +0 -73
- package/dist/components/consent/ConsentStorage.d.ts +0 -41
- package/dist/components/dpia/DPIAQuestionnaire.d.ts +0 -70
- package/dist/components/dpia/DPIAReport.d.ts +0 -40
- package/dist/components/dpia/StepIndicator.d.ts +0 -64
- package/dist/components/dsr/DSRDashboard.d.ts +0 -58
- package/dist/components/dsr/DSRRequestForm.d.ts +0 -74
- package/dist/components/dsr/DSRTracker.d.ts +0 -56
- package/dist/components/policy/PolicyExporter.d.ts +0 -65
- package/dist/components/policy/PolicyGenerator.d.ts +0 -54
- package/dist/components/policy/PolicyPreview.d.ts +0 -71
- package/dist/hooks/useBreach.d.ts +0 -97
- package/dist/hooks/useConsent.d.ts +0 -63
- package/dist/hooks/useDPIA.d.ts +0 -92
- package/dist/hooks/useDSR.d.ts +0 -72
- package/dist/hooks/usePrivacyPolicy.d.ts +0 -87
- package/dist/index.esm.js +0 -2
- package/dist/index.esm.js.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/setupTests.d.ts +0 -2
- package/dist/types/breach.d.ts +0 -239
- package/dist/types/consent.d.ts +0 -95
- package/dist/types/dpia.d.ts +0 -196
- package/dist/types/dsr.d.ts +0 -162
- package/dist/types/privacy.d.ts +0 -204
- package/dist/utils/breach.d.ts +0 -14
- package/dist/utils/consent.d.ts +0 -10
- package/dist/utils/dpia.d.ts +0 -12
- package/dist/utils/dsr.d.ts +0 -11
- package/dist/utils/privacy.d.ts +0 -12
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React, { useState, useEffect } from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
|
6
|
+
import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@/components/ui/Card';
|
|
7
|
+
import { DSRRequestForm, DSRDashboard, DSRTracker, DSRRequest, DSRStatus, DSRType, RequestType } from '@tantainnovative/ndpr-toolkit';
|
|
8
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
|
|
10
|
+
export default function DSRDemoPage() {
|
|
11
|
+
const [requests, setRequests] = useState<DSRRequest[]>([]);
|
|
12
|
+
const [activeTab, setActiveTab] = useState('request-form');
|
|
13
|
+
const [isClient, setIsClient] = useState(false);
|
|
14
|
+
|
|
15
|
+
// Define request types
|
|
16
|
+
const requestTypes: RequestType[] = [
|
|
17
|
+
{
|
|
18
|
+
id: 'access',
|
|
19
|
+
name: 'Access Request',
|
|
20
|
+
description: 'Request to access your personal data',
|
|
21
|
+
estimatedCompletionTime: 30,
|
|
22
|
+
requiresAdditionalInfo: false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'erasure',
|
|
26
|
+
name: 'Erasure Request',
|
|
27
|
+
description: 'Request to delete your personal data',
|
|
28
|
+
estimatedCompletionTime: 45,
|
|
29
|
+
requiresAdditionalInfo: false
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'rectification',
|
|
33
|
+
name: 'Rectification Request',
|
|
34
|
+
description: 'Request to correct your personal data',
|
|
35
|
+
estimatedCompletionTime: 15,
|
|
36
|
+
requiresAdditionalInfo: true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'restriction',
|
|
40
|
+
name: 'Restriction Request',
|
|
41
|
+
description: 'Request to restrict processing of your personal data',
|
|
42
|
+
estimatedCompletionTime: 20,
|
|
43
|
+
requiresAdditionalInfo: true
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
// This effect runs only on the client side after hydration
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
setIsClient(true);
|
|
50
|
+
|
|
51
|
+
// Load sample data for demo purposes
|
|
52
|
+
const sampleRequests: DSRRequest[] = [
|
|
53
|
+
{
|
|
54
|
+
id: uuidv4(),
|
|
55
|
+
type: 'access' as DSRType,
|
|
56
|
+
status: 'pending' as DSRStatus,
|
|
57
|
+
createdAt: Date.now() - 3 * 24 * 60 * 60 * 1000, // 3 days ago
|
|
58
|
+
updatedAt: Date.now() - 3 * 24 * 60 * 60 * 1000,
|
|
59
|
+
dueDate: Date.now() + 12 * 24 * 60 * 60 * 1000, // Due in 12 days
|
|
60
|
+
subject: {
|
|
61
|
+
name: 'John Doe',
|
|
62
|
+
email: 'john@example.com',
|
|
63
|
+
phone: '1234567890'
|
|
64
|
+
},
|
|
65
|
+
description: 'I want to access all my personal data stored in your systems.'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: uuidv4(),
|
|
69
|
+
type: 'erasure' as DSRType,
|
|
70
|
+
status: 'inProgress' as DSRStatus,
|
|
71
|
+
createdAt: Date.now() - 5 * 24 * 60 * 60 * 1000, // 5 days ago
|
|
72
|
+
updatedAt: Date.now() - 2 * 24 * 60 * 60 * 1000, // 2 days ago
|
|
73
|
+
dueDate: Date.now() + 5 * 24 * 60 * 60 * 1000, // Due in 5 days
|
|
74
|
+
subject: {
|
|
75
|
+
name: 'Jane Smith',
|
|
76
|
+
email: 'jane@example.com'
|
|
77
|
+
},
|
|
78
|
+
description: 'Please delete all my personal data from your systems.'
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: uuidv4(),
|
|
82
|
+
type: 'rectification' as DSRType,
|
|
83
|
+
status: 'completed' as DSRStatus,
|
|
84
|
+
createdAt: Date.now() - 10 * 24 * 60 * 60 * 1000, // 10 days ago
|
|
85
|
+
updatedAt: Date.now() - 1 * 24 * 60 * 60 * 1000, // 1 day ago
|
|
86
|
+
completedAt: Date.now() - 1 * 24 * 60 * 60 * 1000,
|
|
87
|
+
dueDate: Date.now() - 2 * 24 * 60 * 60 * 1000, // Due 2 days ago (but completed)
|
|
88
|
+
subject: {
|
|
89
|
+
name: 'Bob Johnson',
|
|
90
|
+
email: 'bob@example.com'
|
|
91
|
+
},
|
|
92
|
+
description: 'My address is incorrect. Please update it to 123 Main St.'
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: uuidv4(),
|
|
96
|
+
type: 'restriction' as DSRType,
|
|
97
|
+
status: 'pending' as DSRStatus,
|
|
98
|
+
createdAt: Date.now() - 15 * 24 * 60 * 60 * 1000, // 15 days ago
|
|
99
|
+
updatedAt: Date.now() - 15 * 24 * 60 * 60 * 1000,
|
|
100
|
+
dueDate: Date.now() - 5 * 24 * 60 * 60 * 1000, // Due 5 days ago (overdue)
|
|
101
|
+
subject: {
|
|
102
|
+
name: 'Alice Williams',
|
|
103
|
+
email: 'alice@example.com',
|
|
104
|
+
phone: '9876543210'
|
|
105
|
+
},
|
|
106
|
+
description: 'I want to restrict processing of my personal data for marketing purposes.'
|
|
107
|
+
}
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
setRequests(sampleRequests);
|
|
111
|
+
}, []);
|
|
112
|
+
|
|
113
|
+
interface SubmitData {
|
|
114
|
+
requestType: string;
|
|
115
|
+
dataSubject: {
|
|
116
|
+
fullName: string;
|
|
117
|
+
email: string;
|
|
118
|
+
phone?: string;
|
|
119
|
+
};
|
|
120
|
+
additionalInfo?: {
|
|
121
|
+
description?: string;
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const handleSubmitRequest = (data: Record<string, unknown>) => {
|
|
126
|
+
const req = data as unknown as SubmitData;
|
|
127
|
+
console.log('Received form data:', data);
|
|
128
|
+
|
|
129
|
+
// Calculate due date based on request type (30 days for access, 15 days for erasure, etc.)
|
|
130
|
+
let dueDays = 30; // Default to 30 days
|
|
131
|
+
if (req.requestType === 'erasure') dueDays = 15;
|
|
132
|
+
if (req.requestType === 'rectification') dueDays = 10;
|
|
133
|
+
if (req.requestType === 'restriction') dueDays = 20;
|
|
134
|
+
|
|
135
|
+
const newRequest: DSRRequest = {
|
|
136
|
+
id: uuidv4(),
|
|
137
|
+
type: req.requestType as DSRType,
|
|
138
|
+
status: 'pending' as DSRStatus,
|
|
139
|
+
createdAt: Date.now(),
|
|
140
|
+
updatedAt: Date.now(),
|
|
141
|
+
dueDate: Date.now() + (dueDays * 24 * 60 * 60 * 1000), // Set due date based on request type
|
|
142
|
+
subject: {
|
|
143
|
+
name: req.dataSubject.fullName,
|
|
144
|
+
email: req.dataSubject.email,
|
|
145
|
+
phone: req.dataSubject.phone
|
|
146
|
+
},
|
|
147
|
+
description: req.additionalInfo?.description || 'No description provided'
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
setRequests((prev) => [newRequest, ...prev]);
|
|
151
|
+
setActiveTab('dashboard');
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const handleUpdateStatus = (requestId: string, status: DSRStatus) => {
|
|
155
|
+
setRequests((prev) =>
|
|
156
|
+
prev.map((request) => {
|
|
157
|
+
if (request.id === requestId) {
|
|
158
|
+
return {
|
|
159
|
+
...request,
|
|
160
|
+
status,
|
|
161
|
+
updatedAt: Date.now(),
|
|
162
|
+
...(status === 'completed' ? { completedAt: Date.now() } : {})
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return request;
|
|
166
|
+
})
|
|
167
|
+
);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const handleSelectRequest = (requestId: string) => {
|
|
171
|
+
// In a real application, you might want to show detailed information
|
|
172
|
+
// about the selected request or perform other actions
|
|
173
|
+
console.log(`Request selected: ${requestId}`);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
if (!isClient) {
|
|
177
|
+
return <div>Loading...</div>;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return (
|
|
181
|
+
<div className="container mx-auto py-10">
|
|
182
|
+
<div className="mb-6">
|
|
183
|
+
<Link href="/ndpr-demos" className="text-blue-600 hover:underline">
|
|
184
|
+
← Back to NDPR Demos
|
|
185
|
+
</Link>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<h1 className="text-3xl font-bold mb-8">Data Subject Rights Demo</h1>
|
|
189
|
+
|
|
190
|
+
<Tabs value={activeTab} onValueChange={setActiveTab}>
|
|
191
|
+
<TabsList className="mb-6">
|
|
192
|
+
<TabsTrigger value="request-form">DSR Request Form</TabsTrigger>
|
|
193
|
+
<TabsTrigger value="dashboard">DSR Dashboard</TabsTrigger>
|
|
194
|
+
<TabsTrigger value="tracker">DSR Tracker</TabsTrigger>
|
|
195
|
+
</TabsList>
|
|
196
|
+
|
|
197
|
+
<TabsContent value="request-form" className="mt-6">
|
|
198
|
+
<Card>
|
|
199
|
+
<CardHeader>
|
|
200
|
+
<CardTitle>Data Subject Request Form</CardTitle>
|
|
201
|
+
<CardDescription>
|
|
202
|
+
This form allows data subjects to submit requests to exercise their rights under NDPR.
|
|
203
|
+
</CardDescription>
|
|
204
|
+
</CardHeader>
|
|
205
|
+
<CardContent>
|
|
206
|
+
<DSRRequestForm
|
|
207
|
+
requestTypes={requestTypes}
|
|
208
|
+
onSubmit={handleSubmitRequest}
|
|
209
|
+
title="Submit a Data Subject Request"
|
|
210
|
+
description="Use this form to submit a request regarding your personal data."
|
|
211
|
+
submitButtonText="Submit Request"
|
|
212
|
+
/>
|
|
213
|
+
</CardContent>
|
|
214
|
+
</Card>
|
|
215
|
+
</TabsContent>
|
|
216
|
+
|
|
217
|
+
<TabsContent value="dashboard" className="mt-6">
|
|
218
|
+
<Card>
|
|
219
|
+
<CardHeader>
|
|
220
|
+
<CardTitle>Data Subject Request Dashboard</CardTitle>
|
|
221
|
+
<CardDescription>
|
|
222
|
+
This dashboard allows administrators to manage and respond to data subject requests.
|
|
223
|
+
</CardDescription>
|
|
224
|
+
</CardHeader>
|
|
225
|
+
<CardContent>
|
|
226
|
+
<DSRDashboard
|
|
227
|
+
requests={requests}
|
|
228
|
+
onUpdateStatus={handleUpdateStatus}
|
|
229
|
+
onSelectRequest={handleSelectRequest}
|
|
230
|
+
title="DSR Management Dashboard"
|
|
231
|
+
description="Track and manage data subject requests in compliance with NDPR requirements."
|
|
232
|
+
showRequestDetails={true}
|
|
233
|
+
showRequestTimeline={true}
|
|
234
|
+
showDeadlineAlerts={true}
|
|
235
|
+
/>
|
|
236
|
+
</CardContent>
|
|
237
|
+
</Card>
|
|
238
|
+
</TabsContent>
|
|
239
|
+
|
|
240
|
+
<TabsContent value="tracker" className="mt-6">
|
|
241
|
+
<Card>
|
|
242
|
+
<CardHeader>
|
|
243
|
+
<CardTitle>Data Subject Request Tracker</CardTitle>
|
|
244
|
+
<CardDescription>
|
|
245
|
+
This component provides a simplified view for tracking DSR requests.
|
|
246
|
+
</CardDescription>
|
|
247
|
+
</CardHeader>
|
|
248
|
+
<CardContent>
|
|
249
|
+
<DSRTracker
|
|
250
|
+
requests={requests}
|
|
251
|
+
onSelectRequest={handleSelectRequest}
|
|
252
|
+
title="DSR Request Tracker"
|
|
253
|
+
description="Track the status of data subject requests"
|
|
254
|
+
/>
|
|
255
|
+
</CardContent>
|
|
256
|
+
</Card>
|
|
257
|
+
</TabsContent>
|
|
258
|
+
</Tabs>
|
|
259
|
+
|
|
260
|
+
<div className="mt-10 p-4 bg-gray-100 rounded-lg">
|
|
261
|
+
<h2 className="text-xl font-semibold mb-2">Implementation Notes</h2>
|
|
262
|
+
<p className="mb-4">
|
|
263
|
+
This demo showcases the DSR components from the NDPR Toolkit:
|
|
264
|
+
</p>
|
|
265
|
+
<ul className="list-disc pl-5 space-y-2">
|
|
266
|
+
<li><code>DSRRequestForm</code>: For collecting and validating data subject requests</li>
|
|
267
|
+
<li><code>DSRDashboard</code>: For managing and processing requests</li>
|
|
268
|
+
<li><code>DSRTracker</code>: For tracking request status and metrics</li>
|
|
269
|
+
</ul>
|
|
270
|
+
<p className="mt-4">
|
|
271
|
+
For detailed documentation, see the{' '}
|
|
272
|
+
<Link href="/docs/components/data-subject-rights" className="text-blue-600 hover:underline">
|
|
273
|
+
DSR documentation
|
|
274
|
+
</Link>
|
|
275
|
+
.
|
|
276
|
+
</p>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@/components/ui/Card';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export default function NDPRDemosPage() {
|
|
9
|
+
const demos = [
|
|
10
|
+
{
|
|
11
|
+
title: 'Data Subject Rights',
|
|
12
|
+
description: 'Demos for DSR request forms, dashboard, and tracking components',
|
|
13
|
+
href: '/ndpr-demos/dsr'
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
title: 'Consent Management',
|
|
17
|
+
description: 'Demos for consent banner, manager, and storage components',
|
|
18
|
+
href: '/ndpr-demos/consent'
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
title: 'DPIA Tools',
|
|
22
|
+
description: 'Demos for Data Protection Impact Assessment components',
|
|
23
|
+
href: '/ndpr-demos/dpia'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
title: 'Breach Management',
|
|
27
|
+
description: 'Demos for data breach notification and management components',
|
|
28
|
+
href: '/ndpr-demos/breach'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: 'Privacy Policy',
|
|
32
|
+
description: 'Demos for privacy policy generation and management',
|
|
33
|
+
href: '/ndpr-demos/policy'
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div className="container mx-auto py-10">
|
|
39
|
+
<h1 className="text-3xl font-bold mb-8">NDPR Toolkit Demos</h1>
|
|
40
|
+
<p className="text-lg mb-6">
|
|
41
|
+
These demos showcase the components and functionality of the NDPR Toolkit package.
|
|
42
|
+
Each demo demonstrates how to use the toolkit in a real-world application.
|
|
43
|
+
</p>
|
|
44
|
+
|
|
45
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
46
|
+
{demos.map((demo, index) => (
|
|
47
|
+
<Link key={index} href={demo.href} className="no-underline">
|
|
48
|
+
<Card className="h-full hover:shadow-lg transition-shadow">
|
|
49
|
+
<CardHeader>
|
|
50
|
+
<CardTitle>{demo.title}</CardTitle>
|
|
51
|
+
<CardDescription>{demo.description}</CardDescription>
|
|
52
|
+
</CardHeader>
|
|
53
|
+
<CardContent>
|
|
54
|
+
<div className="text-sm text-blue-600">View Demo →</div>
|
|
55
|
+
</CardContent>
|
|
56
|
+
</Card>
|
|
57
|
+
</Link>
|
|
58
|
+
))}
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div className="mt-10 p-4 bg-gray-100 rounded-lg">
|
|
62
|
+
<h2 className="text-xl font-semibold mb-2">Documentation</h2>
|
|
63
|
+
<p>
|
|
64
|
+
For detailed documentation on how to use the NDPR Toolkit, please visit the{' '}
|
|
65
|
+
<Link href="/docs" className="text-blue-600 hover:underline">
|
|
66
|
+
documentation pages
|
|
67
|
+
</Link>
|
|
68
|
+
.
|
|
69
|
+
</p>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
}
|