@tantainnovative/ndpr-toolkit 1.0.0
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/README.md +412 -0
- package/dist/components/breach/BreachNotificationManager.d.ts +62 -0
- package/dist/components/breach/BreachReportForm.d.ts +66 -0
- package/dist/components/breach/BreachRiskAssessment.d.ts +50 -0
- package/dist/components/breach/RegulatoryReportGenerator.d.ts +94 -0
- package/dist/components/consent/ConsentBanner.d.ts +79 -0
- package/dist/components/consent/ConsentManager.d.ts +73 -0
- package/dist/components/consent/ConsentStorage.d.ts +41 -0
- package/dist/components/dpia/DPIAQuestionnaire.d.ts +70 -0
- package/dist/components/dpia/DPIAReport.d.ts +40 -0
- package/dist/components/dpia/StepIndicator.d.ts +64 -0
- package/dist/components/dsr/DSRDashboard.d.ts +58 -0
- package/dist/components/dsr/DSRRequestForm.d.ts +74 -0
- package/dist/components/dsr/DSRTracker.d.ts +56 -0
- package/dist/components/policy/PolicyExporter.d.ts +65 -0
- package/dist/components/policy/PolicyGenerator.d.ts +54 -0
- package/dist/components/policy/PolicyPreview.d.ts +71 -0
- package/dist/hooks/useBreach.d.ts +97 -0
- package/dist/hooks/useConsent.d.ts +63 -0
- package/dist/hooks/useDPIA.d.ts +92 -0
- package/dist/hooks/useDSR.d.ts +72 -0
- package/dist/hooks/usePrivacyPolicy.d.ts +87 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/setupTests.d.ts +2 -0
- package/dist/types/breach.d.ts +239 -0
- package/dist/types/consent.d.ts +95 -0
- package/dist/types/dpia.d.ts +196 -0
- package/dist/types/dsr.d.ts +162 -0
- package/dist/types/privacy.d.ts +204 -0
- package/dist/utils/breach.d.ts +14 -0
- package/dist/utils/consent.d.ts +10 -0
- package/dist/utils/dpia.d.ts +12 -0
- package/dist/utils/dsr.d.ts +11 -0
- package/dist/utils/privacy.d.ts +12 -0
- package/package.json +71 -0
package/README.md
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# NDPR Toolkit
|
|
2
|
+
|
|
3
|
+
A comprehensive toolkit for implementing NDPR-compliant features in web applications, aligned with the Nigerian Data Protection Regulation (NDPR) and Data Protection Act (DPA).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The NDPR Toolkit provides a set of React components, hooks, and utilities to help Nigerian businesses implement NDPR-compliant features in their web applications with minimal development effort. This toolkit is designed to be flexible, customizable, and easy to integrate into existing applications.
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/ndpr-toolkit)
|
|
10
|
+
[](https://github.com/tantainnovative/ndpr-toolkit/blob/main/LICENSE)
|
|
11
|
+
|
|
12
|
+
> **NDPR Toolkit is actively maintained and regularly updated to ensure compliance with the latest Nigerian data protection regulations.**
|
|
13
|
+
|
|
14
|
+
## Features
|
|
15
|
+
|
|
16
|
+
- **Consent Management**: Components for collecting, storing, and managing user consent in compliance with NDPR requirements
|
|
17
|
+
- **Data Subject Rights Portal**: Complete system for handling data subject access requests and other rights
|
|
18
|
+
- **DPIA Questionnaire**: Interactive questionnaire for conducting Data Protection Impact Assessments
|
|
19
|
+
- **Breach Notification System**: Comprehensive tools for managing, assessing, and reporting data breaches within required timeframes
|
|
20
|
+
- **Privacy Policy Generator**: Customizable tool for creating NDPR-compliant privacy policies with variable support
|
|
21
|
+
|
|
22
|
+
### 🆕 Latest Features
|
|
23
|
+
|
|
24
|
+
- **Variable Support in Privacy Policies**: Create dynamic privacy policies with variable placeholders that can be easily updated when your organization information changes
|
|
25
|
+
- **Enhanced DSR Types**: Improved type definitions for Data Subject Requests with standardized enums for request types and statuses
|
|
26
|
+
- **ConsentStorage Component**: A flexible component for handling the storage and retrieval of consent settings with support for multiple storage mechanisms
|
|
27
|
+
- **Comprehensive Documentation**: Detailed API references for all components and utilities
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install ndpr-toolkit
|
|
33
|
+
# or
|
|
34
|
+
yarn add ndpr-toolkit
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
### Consent Management
|
|
40
|
+
|
|
41
|
+
```jsx
|
|
42
|
+
import { ConsentBanner, ConsentManager, ConsentStorage, useConsent } from 'ndpr-toolkit';
|
|
43
|
+
|
|
44
|
+
function MyApp() {
|
|
45
|
+
return (
|
|
46
|
+
<ConsentManager
|
|
47
|
+
options={[
|
|
48
|
+
{
|
|
49
|
+
id: 'necessary',
|
|
50
|
+
label: 'Necessary Cookies',
|
|
51
|
+
description: 'Essential cookies for the website to function.',
|
|
52
|
+
required: true
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: 'analytics',
|
|
56
|
+
label: 'Analytics Cookies',
|
|
57
|
+
description: 'Cookies that help us understand how you use our website.',
|
|
58
|
+
required: false
|
|
59
|
+
}
|
|
60
|
+
]}
|
|
61
|
+
storageKey="my-app-consent"
|
|
62
|
+
autoLoad={true}
|
|
63
|
+
autoSave={true}
|
|
64
|
+
>
|
|
65
|
+
<AppContent />
|
|
66
|
+
<ConsentBanner
|
|
67
|
+
position="bottom"
|
|
68
|
+
privacyPolicyUrl="/privacy-policy"
|
|
69
|
+
showPreferences={true}
|
|
70
|
+
onSave={(consents) => console.log('Consent saved:', consents)}
|
|
71
|
+
/>
|
|
72
|
+
</ConsentManager>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function AppContent() {
|
|
77
|
+
// Use the useConsent hook to manage consent state
|
|
78
|
+
const { consents, hasConsented, updateConsent } = useConsent();
|
|
79
|
+
|
|
80
|
+
// Check if user has given consent for analytics
|
|
81
|
+
if (hasConsented('analytics')) {
|
|
82
|
+
// Initialize analytics
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<div>
|
|
87
|
+
{/* Your app content */}
|
|
88
|
+
</div>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Privacy Policy Generator
|
|
94
|
+
|
|
95
|
+
```jsx
|
|
96
|
+
import { PolicyGenerator, PolicyPreview, PolicyExporter, usePrivacyPolicy } from 'ndpr-toolkit';
|
|
97
|
+
|
|
98
|
+
function PrivacyPolicyPage() {
|
|
99
|
+
const { policy, updateVariableValue, generatePolicy } = usePrivacyPolicy();
|
|
100
|
+
const [generatedPolicy, setGeneratedPolicy] = useState(null);
|
|
101
|
+
|
|
102
|
+
// Define your variables
|
|
103
|
+
const variables = {
|
|
104
|
+
organizationName: 'Acme Corporation',
|
|
105
|
+
websiteUrl: 'https://acme.com',
|
|
106
|
+
contactEmail: 'privacy@acme.com',
|
|
107
|
+
lastUpdated: new Date().toLocaleDateString()
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<div>
|
|
112
|
+
{!generatedPolicy ? (
|
|
113
|
+
<PolicyGenerator
|
|
114
|
+
templates={[
|
|
115
|
+
{
|
|
116
|
+
id: 'standard',
|
|
117
|
+
name: 'Standard Privacy Policy',
|
|
118
|
+
description: 'A comprehensive privacy policy suitable for most websites and applications.',
|
|
119
|
+
sections: [
|
|
120
|
+
{
|
|
121
|
+
id: 'introduction',
|
|
122
|
+
title: 'Introduction',
|
|
123
|
+
template: 'This Privacy Policy explains how {{organizationName}} collects, uses, and protects your personal data when you visit {{websiteUrl}}.',
|
|
124
|
+
required: true,
|
|
125
|
+
included: true
|
|
126
|
+
},
|
|
127
|
+
// More sections...
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
]}
|
|
131
|
+
variables={variables}
|
|
132
|
+
onComplete={(data) => {
|
|
133
|
+
// Generate policy with variables
|
|
134
|
+
const result = generatePolicyText(data.sections, variables);
|
|
135
|
+
setGeneratedPolicy({
|
|
136
|
+
title: `Privacy Policy for ${variables.organizationName}`,
|
|
137
|
+
content: result.fullText,
|
|
138
|
+
lastUpdated: new Date()
|
|
139
|
+
});
|
|
140
|
+
}}
|
|
141
|
+
/>
|
|
142
|
+
) : (
|
|
143
|
+
<>
|
|
144
|
+
<PolicyPreview
|
|
145
|
+
policy={generatedPolicy}
|
|
146
|
+
variables={variables}
|
|
147
|
+
onVariableChange={(newVariables) => {
|
|
148
|
+
// Update variables and regenerate policy
|
|
149
|
+
}}
|
|
150
|
+
/>
|
|
151
|
+
|
|
152
|
+
<PolicyExporter
|
|
153
|
+
policy={generatedPolicy}
|
|
154
|
+
formats={['html', 'pdf', 'markdown']}
|
|
155
|
+
filename="privacy-policy"
|
|
156
|
+
/>
|
|
157
|
+
</>
|
|
158
|
+
)}
|
|
159
|
+
</div>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Component Categories
|
|
165
|
+
|
|
166
|
+
### Consent Management
|
|
167
|
+
- `ConsentBanner`: Cookie consent banner with customizable options
|
|
168
|
+
- `ConsentManager`: Component for managing consent preferences
|
|
169
|
+
- `ConsentStorage`: Storage mechanism for consent settings with support for localStorage, sessionStorage, and cookies
|
|
170
|
+
- `useConsent`: Hook for managing consent state
|
|
171
|
+
|
|
172
|
+
### Data Subject Rights
|
|
173
|
+
- `DSRRequestForm`: Form for submitting data subject rights requests
|
|
174
|
+
- `DSRDashboard`: Admin dashboard for managing DSR requests
|
|
175
|
+
- `DSRTracker`: Component for tracking the status of DSR requests
|
|
176
|
+
- `useDSR`: Hook for managing DSR state
|
|
177
|
+
- Types: `DSRType`, `DSRStatus`, `DSRRequest` for type-safe implementation
|
|
178
|
+
|
|
179
|
+
### DPIA (Data Protection Impact Assessment)
|
|
180
|
+
- `DPIAQuestionnaire`: Interactive questionnaire for conducting DPIAs
|
|
181
|
+
- `DPIAReport`: Component for generating DPIA reports
|
|
182
|
+
- `StepIndicator`: Progress indicator for multi-step processes
|
|
183
|
+
- `useDPIA`: Hook for managing DPIA state
|
|
184
|
+
- Types: `DPIAQuestion`, `DPIASection`, `DPIARisk`, `DPIAResult` for structured assessments
|
|
185
|
+
|
|
186
|
+
### Breach Notification
|
|
187
|
+
- `BreachReportForm`: Form for reporting data breaches
|
|
188
|
+
- `BreachRiskAssessment`: Tool for assessing breach risk and severity
|
|
189
|
+
- `BreachNotificationManager`: Component for managing breach notifications
|
|
190
|
+
- `RegulatoryReportGenerator`: Tool for generating regulatory reports for NITDA
|
|
191
|
+
- `useBreach`: Hook for managing breach notification state
|
|
192
|
+
- Types: `BreachReport`, `RiskAssessment`, `NotificationRequirement` for compliance with 72-hour notification requirements
|
|
193
|
+
|
|
194
|
+
### Privacy Policy
|
|
195
|
+
- `PolicyGenerator`: Component for generating privacy policies
|
|
196
|
+
- `PolicyPreview`: Preview component for privacy policies
|
|
197
|
+
- `PolicyExporter`: Tool for exporting privacy policies to different formats
|
|
198
|
+
- `generatePolicyText`: Utility for creating dynamic policies with variable support
|
|
199
|
+
- `usePrivacyPolicy`: Hook for managing privacy policy state
|
|
200
|
+
|
|
201
|
+
## Implementation Guides
|
|
202
|
+
|
|
203
|
+
### Setting Up Consent Management
|
|
204
|
+
|
|
205
|
+
```jsx
|
|
206
|
+
// 1. Wrap your application with ConsentManager
|
|
207
|
+
import { ConsentManager } from 'ndpr-toolkit';
|
|
208
|
+
|
|
209
|
+
function App() {
|
|
210
|
+
return (
|
|
211
|
+
<ConsentManager
|
|
212
|
+
options={[
|
|
213
|
+
{ id: 'necessary', label: 'Necessary', description: '...', required: true },
|
|
214
|
+
{ id: 'analytics', label: 'Analytics', description: '...', required: false },
|
|
215
|
+
{ id: 'marketing', label: 'Marketing', description: '...', required: false }
|
|
216
|
+
]}
|
|
217
|
+
storageKey="my-app-consent"
|
|
218
|
+
autoLoad={true}
|
|
219
|
+
autoSave={true}
|
|
220
|
+
>
|
|
221
|
+
<YourApp />
|
|
222
|
+
</ConsentManager>
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// 2. Add the ConsentBanner to your layout
|
|
227
|
+
import { ConsentBanner } from 'ndpr-toolkit';
|
|
228
|
+
|
|
229
|
+
function Layout({ children }) {
|
|
230
|
+
return (
|
|
231
|
+
<>
|
|
232
|
+
{children}
|
|
233
|
+
<ConsentBanner
|
|
234
|
+
position="bottom"
|
|
235
|
+
privacyPolicyUrl="/privacy-policy"
|
|
236
|
+
showPreferences={true}
|
|
237
|
+
/>
|
|
238
|
+
</>
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// 3. Use the consent values in your components
|
|
243
|
+
import { useConsent } from 'ndpr-toolkit';
|
|
244
|
+
|
|
245
|
+
function AnalyticsComponent() {
|
|
246
|
+
const { hasConsented } = useConsent();
|
|
247
|
+
|
|
248
|
+
useEffect(() => {
|
|
249
|
+
if (hasConsented('analytics')) {
|
|
250
|
+
// Initialize analytics
|
|
251
|
+
}
|
|
252
|
+
}, [hasConsented]);
|
|
253
|
+
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Implementing a Data Subject Rights Portal
|
|
259
|
+
|
|
260
|
+
```jsx
|
|
261
|
+
import { DSRRequestForm, useDSR } from 'ndpr-toolkit';
|
|
262
|
+
|
|
263
|
+
// 1. Create a form for data subjects to submit requests
|
|
264
|
+
function DSRPortal() {
|
|
265
|
+
const { submitRequest } = useDSR();
|
|
266
|
+
|
|
267
|
+
const handleSubmit = (formData) => {
|
|
268
|
+
const request = submitRequest({
|
|
269
|
+
type: formData.type,
|
|
270
|
+
subject: {
|
|
271
|
+
name: formData.name,
|
|
272
|
+
email: formData.email,
|
|
273
|
+
phone: formData.phone
|
|
274
|
+
},
|
|
275
|
+
details: formData.details
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// Show confirmation with tracking ID
|
|
279
|
+
alert(`Your request has been submitted. Your tracking ID is: ${request.id}`);
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
return (
|
|
283
|
+
<DSRRequestForm
|
|
284
|
+
onSubmit={handleSubmit}
|
|
285
|
+
requestTypes={[
|
|
286
|
+
{ id: 'access', label: 'Access my data' },
|
|
287
|
+
{ id: 'rectification', label: 'Correct my data' },
|
|
288
|
+
{ id: 'erasure', label: 'Delete my data' },
|
|
289
|
+
{ id: 'restriction', label: 'Restrict processing of my data' },
|
|
290
|
+
{ id: 'portability', label: 'Data portability' },
|
|
291
|
+
{ id: 'objection', label: 'Object to processing' }
|
|
292
|
+
]}
|
|
293
|
+
/>
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// 2. Create an admin dashboard for managing requests
|
|
298
|
+
import { DSRDashboard } from 'ndpr-toolkit';
|
|
299
|
+
|
|
300
|
+
function AdminDashboard() {
|
|
301
|
+
const { requests, updateRequest, deleteRequest } = useDSR();
|
|
302
|
+
|
|
303
|
+
return (
|
|
304
|
+
<DSRDashboard
|
|
305
|
+
requests={requests}
|
|
306
|
+
onUpdateRequest={updateRequest}
|
|
307
|
+
onDeleteRequest={deleteRequest}
|
|
308
|
+
/>
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Setting Up a Breach Notification System
|
|
314
|
+
|
|
315
|
+
```jsx
|
|
316
|
+
import { BreachReportForm, BreachRiskAssessment, useBreach } from 'ndpr-toolkit';
|
|
317
|
+
|
|
318
|
+
// 1. Create a form for reporting breaches
|
|
319
|
+
function BreachReporting() {
|
|
320
|
+
const { submitBreachReport } = useBreach();
|
|
321
|
+
|
|
322
|
+
const handleSubmit = (formData) => {
|
|
323
|
+
const report = submitBreachReport({
|
|
324
|
+
title: formData.title,
|
|
325
|
+
description: formData.description,
|
|
326
|
+
category: formData.category,
|
|
327
|
+
discoveredAt: Date.now(),
|
|
328
|
+
reporter: {
|
|
329
|
+
name: formData.reporterName,
|
|
330
|
+
email: formData.reporterEmail,
|
|
331
|
+
department: formData.department
|
|
332
|
+
},
|
|
333
|
+
affectedSystems: formData.systems,
|
|
334
|
+
dataTypes: formData.dataTypes,
|
|
335
|
+
status: 'ongoing'
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Redirect to risk assessment
|
|
339
|
+
navigate(`/breach/${report.id}/assess`);
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
return (
|
|
343
|
+
<BreachReportForm
|
|
344
|
+
onSubmit={handleSubmit}
|
|
345
|
+
categories={[
|
|
346
|
+
{ id: 'unauthorized-access', label: 'Unauthorized Access' },
|
|
347
|
+
{ id: 'data-loss', label: 'Data Loss' },
|
|
348
|
+
{ id: 'system-compromise', label: 'System Compromise' }
|
|
349
|
+
]}
|
|
350
|
+
/>
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// 2. Create a risk assessment component
|
|
355
|
+
function RiskAssessment({ breachId }) {
|
|
356
|
+
const { performRiskAssessment, determineNotificationRequirements } = useBreach();
|
|
357
|
+
|
|
358
|
+
const handleAssessment = (assessmentData) => {
|
|
359
|
+
const assessment = performRiskAssessment({
|
|
360
|
+
breachId,
|
|
361
|
+
assessor: {
|
|
362
|
+
name: 'Jane Smith',
|
|
363
|
+
role: 'Data Protection Officer',
|
|
364
|
+
email: 'jane@example.com'
|
|
365
|
+
},
|
|
366
|
+
...assessmentData
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
const requirements = determineNotificationRequirements({
|
|
370
|
+
breachId,
|
|
371
|
+
riskAssessmentId: assessment.id
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// Show notification requirements
|
|
375
|
+
if (requirements.nitdaNotificationRequired) {
|
|
376
|
+
// Deadline is 72 hours from discovery
|
|
377
|
+
const deadline = new Date(requirements.nitdaNotificationDeadline);
|
|
378
|
+
alert(`NITDA notification required by ${deadline.toLocaleString()}`);
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
return (
|
|
383
|
+
<BreachRiskAssessment
|
|
384
|
+
breachId={breachId}
|
|
385
|
+
onComplete={handleAssessment}
|
|
386
|
+
/>
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## Documentation
|
|
392
|
+
|
|
393
|
+
For detailed documentation, visit [https://ndpr-toolkit.tantainnovative.com/docs](https://ndpr-toolkit.tantainnovative.com/docs)
|
|
394
|
+
|
|
395
|
+
### API Reference
|
|
396
|
+
|
|
397
|
+
Detailed API documentation is available for all components:
|
|
398
|
+
|
|
399
|
+
- [Consent Management](https://ndpr-toolkit.tantainnovative.com/docs/components/consent-management)
|
|
400
|
+
- [Data Subject Rights](https://ndpr-toolkit.tantainnovative.com/docs/components/data-subject-rights)
|
|
401
|
+
- [DPIA Questionnaire](https://ndpr-toolkit.tantainnovative.com/docs/components/dpia-questionnaire)
|
|
402
|
+
- [Breach Notification](https://ndpr-toolkit.tantainnovative.com/docs/components/breach-notification)
|
|
403
|
+
- [Privacy Policy Generator](https://ndpr-toolkit.tantainnovative.com/docs/components/privacy-policy-generator)
|
|
404
|
+
- [React Hooks](https://ndpr-toolkit.tantainnovative.com/docs/components/hooks)
|
|
405
|
+
|
|
406
|
+
## Contributing
|
|
407
|
+
|
|
408
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
409
|
+
|
|
410
|
+
## License
|
|
411
|
+
|
|
412
|
+
MIT © Tanta Innovative
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BreachReport, RiskAssessment, RegulatoryNotification } from '../../types/breach';
|
|
3
|
+
export interface BreachNotificationManagerProps {
|
|
4
|
+
/**
|
|
5
|
+
* List of breach reports to manage
|
|
6
|
+
*/
|
|
7
|
+
breachReports: BreachReport[];
|
|
8
|
+
/**
|
|
9
|
+
* List of risk assessments
|
|
10
|
+
*/
|
|
11
|
+
riskAssessments: RiskAssessment[];
|
|
12
|
+
/**
|
|
13
|
+
* List of regulatory notifications
|
|
14
|
+
*/
|
|
15
|
+
regulatoryNotifications: RegulatoryNotification[];
|
|
16
|
+
/**
|
|
17
|
+
* Callback function called when a breach is selected
|
|
18
|
+
*/
|
|
19
|
+
onSelectBreach?: (breachId: string) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Callback function called when a risk assessment is requested
|
|
22
|
+
*/
|
|
23
|
+
onRequestAssessment?: (breachId: string) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Callback function called when a notification is requested
|
|
26
|
+
*/
|
|
27
|
+
onRequestNotification?: (breachId: string) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Title displayed on the manager
|
|
30
|
+
* @default "Breach Notification Manager"
|
|
31
|
+
*/
|
|
32
|
+
title?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Description text displayed on the manager
|
|
35
|
+
* @default "Manage data breach notifications and track compliance with NDPR requirements."
|
|
36
|
+
*/
|
|
37
|
+
description?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Custom CSS class for the manager
|
|
40
|
+
*/
|
|
41
|
+
className?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Custom CSS class for the buttons
|
|
44
|
+
*/
|
|
45
|
+
buttonClassName?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Whether to show the breach details
|
|
48
|
+
* @default true
|
|
49
|
+
*/
|
|
50
|
+
showBreachDetails?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Whether to show the notification timeline
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
showNotificationTimeline?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Whether to show the deadline alerts
|
|
58
|
+
* @default true
|
|
59
|
+
*/
|
|
60
|
+
showDeadlineAlerts?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export declare const BreachNotificationManager: React.FC<BreachNotificationManagerProps>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BreachCategory } from '../../types/breach';
|
|
3
|
+
export interface BreachReportFormProps {
|
|
4
|
+
/**
|
|
5
|
+
* Available breach categories
|
|
6
|
+
*/
|
|
7
|
+
categories: BreachCategory[];
|
|
8
|
+
/**
|
|
9
|
+
* Callback function called when form is submitted
|
|
10
|
+
*/
|
|
11
|
+
onSubmit: (formData: any) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Title displayed on the form
|
|
14
|
+
* @default "Report a Data Breach"
|
|
15
|
+
*/
|
|
16
|
+
title?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Description text displayed on the form
|
|
19
|
+
* @default "Use this form to report a suspected or confirmed data breach. All fields marked with * are required."
|
|
20
|
+
*/
|
|
21
|
+
formDescription?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Text for the submit button
|
|
24
|
+
* @default "Submit Report"
|
|
25
|
+
*/
|
|
26
|
+
submitButtonText?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Custom CSS class for the form
|
|
29
|
+
*/
|
|
30
|
+
className?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Custom CSS class for the submit button
|
|
33
|
+
*/
|
|
34
|
+
buttonClassName?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Whether to show a confirmation message after submission
|
|
37
|
+
* @default true
|
|
38
|
+
*/
|
|
39
|
+
showConfirmation?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Confirmation message to display after submission
|
|
42
|
+
* @default "Your breach report has been submitted successfully. The data protection team has been notified."
|
|
43
|
+
*/
|
|
44
|
+
confirmationMessage?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Whether to allow file attachments
|
|
47
|
+
* @default true
|
|
48
|
+
*/
|
|
49
|
+
allowAttachments?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Maximum number of attachments allowed
|
|
52
|
+
* @default 5
|
|
53
|
+
*/
|
|
54
|
+
maxAttachments?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Maximum file size for attachments (in bytes)
|
|
57
|
+
* @default 5242880 (5MB)
|
|
58
|
+
*/
|
|
59
|
+
maxFileSize?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Allowed file types for attachments
|
|
62
|
+
* @default ['.pdf', '.jpg', '.jpeg', '.png', '.doc', '.docx', '.xls', '.xlsx', '.txt']
|
|
63
|
+
*/
|
|
64
|
+
allowedFileTypes?: string[];
|
|
65
|
+
}
|
|
66
|
+
export declare const BreachReportForm: React.FC<BreachReportFormProps>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BreachReport, RiskAssessment } from '../../types/breach';
|
|
3
|
+
export interface BreachRiskAssessmentProps {
|
|
4
|
+
/**
|
|
5
|
+
* The breach data to assess
|
|
6
|
+
*/
|
|
7
|
+
breachData: BreachReport;
|
|
8
|
+
/**
|
|
9
|
+
* Initial assessment data (if editing an existing assessment)
|
|
10
|
+
*/
|
|
11
|
+
initialAssessment?: Partial<RiskAssessment>;
|
|
12
|
+
/**
|
|
13
|
+
* Callback function called when assessment is completed
|
|
14
|
+
*/
|
|
15
|
+
onComplete: (assessment: RiskAssessment) => void;
|
|
16
|
+
/**
|
|
17
|
+
* Title displayed on the assessment form
|
|
18
|
+
* @default "Breach Risk Assessment"
|
|
19
|
+
*/
|
|
20
|
+
title?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Description text displayed on the assessment form
|
|
23
|
+
* @default "Assess the risk level of this data breach to determine notification requirements."
|
|
24
|
+
*/
|
|
25
|
+
description?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Text for the submit button
|
|
28
|
+
* @default "Complete Assessment"
|
|
29
|
+
*/
|
|
30
|
+
submitButtonText?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Custom CSS class for the form
|
|
33
|
+
*/
|
|
34
|
+
className?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Custom CSS class for the submit button
|
|
37
|
+
*/
|
|
38
|
+
buttonClassName?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Whether to show the breach summary
|
|
41
|
+
* @default true
|
|
42
|
+
*/
|
|
43
|
+
showBreachSummary?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Whether to show notification requirements after assessment
|
|
46
|
+
* @default true
|
|
47
|
+
*/
|
|
48
|
+
showNotificationRequirements?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare const BreachRiskAssessment: React.FC<BreachRiskAssessmentProps>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BreachReport, RiskAssessment, RegulatoryNotification } from '../../types/breach';
|
|
3
|
+
export interface OrganizationInfo {
|
|
4
|
+
/**
|
|
5
|
+
* Name of the organization
|
|
6
|
+
*/
|
|
7
|
+
name: string;
|
|
8
|
+
/**
|
|
9
|
+
* Registration number or business ID
|
|
10
|
+
*/
|
|
11
|
+
registrationNumber?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Physical address of the organization
|
|
14
|
+
*/
|
|
15
|
+
address: string;
|
|
16
|
+
/**
|
|
17
|
+
* Website URL
|
|
18
|
+
*/
|
|
19
|
+
website?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Name of the Data Protection Officer
|
|
22
|
+
*/
|
|
23
|
+
dpoName: string;
|
|
24
|
+
/**
|
|
25
|
+
* Email of the Data Protection Officer
|
|
26
|
+
*/
|
|
27
|
+
dpoEmail: string;
|
|
28
|
+
/**
|
|
29
|
+
* Phone number of the Data Protection Officer
|
|
30
|
+
*/
|
|
31
|
+
dpoPhone?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RegulatoryReportGeneratorProps {
|
|
34
|
+
/**
|
|
35
|
+
* The breach data to include in the report
|
|
36
|
+
*/
|
|
37
|
+
breachData: BreachReport;
|
|
38
|
+
/**
|
|
39
|
+
* The risk assessment data
|
|
40
|
+
*/
|
|
41
|
+
assessmentData?: RiskAssessment;
|
|
42
|
+
/**
|
|
43
|
+
* Organization information to include in the report
|
|
44
|
+
*/
|
|
45
|
+
organizationInfo: OrganizationInfo;
|
|
46
|
+
/**
|
|
47
|
+
* Callback function called when the report is generated
|
|
48
|
+
*/
|
|
49
|
+
onGenerate: (report: RegulatoryNotification) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Title displayed on the generator form
|
|
52
|
+
* @default "Generate NITDA Notification Report"
|
|
53
|
+
*/
|
|
54
|
+
title?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Description text displayed on the generator form
|
|
57
|
+
* @default "Generate a report for submission to NITDA in compliance with the NDPR breach notification requirements."
|
|
58
|
+
*/
|
|
59
|
+
description?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Text for the generate button
|
|
62
|
+
* @default "Generate Report"
|
|
63
|
+
*/
|
|
64
|
+
generateButtonText?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Custom CSS class for the form
|
|
67
|
+
*/
|
|
68
|
+
className?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Custom CSS class for the buttons
|
|
71
|
+
*/
|
|
72
|
+
buttonClassName?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Whether to show a preview of the generated report
|
|
75
|
+
* @default true
|
|
76
|
+
*/
|
|
77
|
+
showPreview?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Whether to allow editing the report content
|
|
80
|
+
* @default true
|
|
81
|
+
*/
|
|
82
|
+
allowEditing?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Whether to allow downloading the report
|
|
85
|
+
* @default true
|
|
86
|
+
*/
|
|
87
|
+
allowDownload?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Format for downloading the report
|
|
90
|
+
* @default "pdf"
|
|
91
|
+
*/
|
|
92
|
+
downloadFormat?: 'pdf' | 'docx' | 'html';
|
|
93
|
+
}
|
|
94
|
+
export declare const RegulatoryReportGenerator: React.FC<RegulatoryReportGeneratorProps>;
|