@tantainnovative/ndpr-toolkit 3.6.1 → 3.10.1
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/CHANGELOG.md +230 -0
- package/README.md +146 -1
- package/dist/chunk-2MIQXECH.mjs +3 -0
- package/dist/chunk-3GRGYT3P.js +1 -0
- package/dist/chunk-5IOC3VAW.js +1 -0
- package/dist/chunk-ATFUSHC2.mjs +2 -0
- package/dist/{chunk-SJRIOZ4K.mjs → chunk-EFIWANHF.mjs} +1 -1
- package/dist/chunk-GQYBS3A7.mjs +0 -0
- package/dist/chunk-HXWHL4BD.js +3 -0
- package/dist/chunk-OZCNFB5C.js +1 -0
- package/dist/chunk-R7545FP4.mjs +1 -0
- package/dist/chunk-UKLU6BQF.mjs +1 -0
- package/dist/{chunk-I2LMQWK3.js → chunk-W7OLQRJP.js} +2 -2
- package/dist/{chunk-RXZFYBUJ.js → chunk-XS3Z4UT7.js} +1 -1
- package/dist/core.d.mts +70 -0
- package/dist/core.d.ts +70 -0
- package/dist/core.js +1 -1
- package/dist/core.mjs +1 -1
- package/dist/cross-border-lite.d.mts +141 -0
- package/dist/cross-border-lite.d.ts +141 -0
- package/dist/cross-border-lite.js +2 -0
- package/dist/cross-border-lite.mjs +2 -0
- package/dist/dsr.js +1 -1
- package/dist/dsr.mjs +1 -1
- package/dist/headless.d.mts +2391 -0
- package/dist/headless.d.ts +2391 -0
- package/dist/headless.js +2 -0
- package/dist/headless.mjs +2 -0
- package/dist/hooks.d.mts +10 -0
- package/dist/hooks.d.ts +10 -0
- package/dist/hooks.js +1 -1
- package/dist/hooks.mjs +1 -1
- package/dist/index.d.mts +133 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lawful-basis-lite.d.mts +153 -0
- package/dist/lawful-basis-lite.d.ts +153 -0
- package/dist/lawful-basis-lite.js +2 -0
- package/dist/lawful-basis-lite.mjs +2 -0
- package/dist/policy.d.mts +86 -0
- package/dist/policy.d.ts +86 -0
- package/dist/policy.js +1 -1
- package/dist/policy.mjs +1 -1
- package/dist/presets-dsr.d.mts +25 -0
- package/dist/presets-dsr.d.ts +25 -0
- package/dist/presets-dsr.js +1 -1
- package/dist/presets-dsr.mjs +1 -1
- package/dist/presets-policy.d.mts +71 -0
- package/dist/presets-policy.d.ts +71 -0
- package/dist/presets-policy.js +1 -1
- package/dist/presets-policy.mjs +1 -1
- package/dist/presets.d.mts +96 -0
- package/dist/presets.d.ts +96 -0
- package/dist/presets.js +1 -1
- package/dist/presets.mjs +1 -1
- package/dist/ropa-lite.d.mts +218 -0
- package/dist/ropa-lite.d.ts +218 -0
- package/dist/ropa-lite.js +2 -0
- package/dist/ropa-lite.mjs +2 -0
- package/dist/server.d.mts +70 -0
- package/dist/server.d.ts +70 -0
- package/dist/server.js +1 -1
- package/dist/server.mjs +1 -1
- package/package.json +3 -2
- package/dist/chunk-BNHQFZHL.mjs +0 -2
- package/dist/chunk-O6CUBNXK.mjs +0 -3
- package/dist/chunk-RV2VMWZJ.mjs +0 -1
- package/dist/chunk-UI536RU2.js +0 -3
- package/dist/chunk-W7RBGZCC.js +0 -1
package/dist/presets-policy.d.ts
CHANGED
|
@@ -39,6 +39,35 @@ export declare interface NDPRPrivacyPolicyProps {
|
|
|
39
39
|
onComplete?: (policy: PrivacyPolicy) => void;
|
|
40
40
|
classNames?: Record<string, string>;
|
|
41
41
|
unstyled?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Pre-fill the policy wizard with a sector-specific starter template.
|
|
44
|
+
*
|
|
45
|
+
* Pass one of `'saas' | 'ecommerce' | 'school' | 'healthcare' |
|
|
46
|
+
* 'procurement'` and the wizard opens already populated with the data
|
|
47
|
+
* categories, lawful-basis defaults, sensitive-data / children /
|
|
48
|
+
* cross-border / automated-decisions flags that org type usually needs.
|
|
49
|
+
* The user can still flip every flag and rewrite every section.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* <NDPRPrivacyPolicy
|
|
53
|
+
* template="healthcare"
|
|
54
|
+
* templateOverrides={{ orgName: 'Lagos Heart Centre' }}
|
|
55
|
+
* />
|
|
56
|
+
*
|
|
57
|
+
* @see templateContextFor in `/server` or `/core` for the underlying
|
|
58
|
+
* factory if you'd rather build the context yourself.
|
|
59
|
+
*/
|
|
60
|
+
template?: OrgPolicyTemplateId;
|
|
61
|
+
/**
|
|
62
|
+
* Organisation-level overrides applied on top of the chosen template.
|
|
63
|
+
* Ignored when `template` is unset.
|
|
64
|
+
*/
|
|
65
|
+
templateOverrides?: OrgPolicyTemplateOverrides;
|
|
66
|
+
/**
|
|
67
|
+
* Pass a fully-constructed `TemplateContext` to skip the template
|
|
68
|
+
* lookup entirely. Takes precedence over `template` if both are set.
|
|
69
|
+
*/
|
|
70
|
+
initialContext?: TemplateContext;
|
|
42
71
|
}
|
|
43
72
|
|
|
44
73
|
/**
|
|
@@ -65,6 +94,48 @@ declare interface OrganizationInfo {
|
|
|
65
94
|
ndpcRegistrationNumber?: string;
|
|
66
95
|
}
|
|
67
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Org-specific privacy-policy templates — pre-filled `TemplateContext`
|
|
99
|
+
* factories for the most common Nigerian app shapes.
|
|
100
|
+
*
|
|
101
|
+
* Each template returns a fully-populated `TemplateContext` with:
|
|
102
|
+
* - industry set to the matching `Industry` value
|
|
103
|
+
* - the data categories the sector typically collects (selected: true)
|
|
104
|
+
* - the processing purposes that match the business model
|
|
105
|
+
* - sensitive-data / children / cross-border / automated-decisions flags
|
|
106
|
+
* set to the defaults that org type usually needs (a school will have
|
|
107
|
+
* children data, a hospital will have sensitive data, etc.)
|
|
108
|
+
*
|
|
109
|
+
* Templates are guidance starters. The wizard still walks the user through
|
|
110
|
+
* every step — they can flip any flag, add/remove categories, or rewrite
|
|
111
|
+
* any section before the policy is finalised. The legal-notice footer the
|
|
112
|
+
* toolkit ships everywhere applies to the generated output.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* import { templateContextFor } from '@tantainnovative/ndpr-toolkit/server';
|
|
116
|
+
* const ctx = templateContextFor('ecommerce', { orgName: 'Acme NG' });
|
|
117
|
+
* const draft = assemblePolicy(ctx);
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
/** Identifiers for the bundled org templates. */
|
|
121
|
+
declare type OrgPolicyTemplateId = 'saas' | 'ecommerce' | 'school' | 'healthcare' | 'procurement';
|
|
122
|
+
|
|
123
|
+
/** Optional overrides applied on top of a template's defaults. */
|
|
124
|
+
declare interface OrgPolicyTemplateOverrides {
|
|
125
|
+
/** Organisation name (e.g. "Acme Nigeria Ltd"). Default: empty. */
|
|
126
|
+
orgName?: string;
|
|
127
|
+
/** Public website URL. */
|
|
128
|
+
website?: string;
|
|
129
|
+
/** Privacy contact email. */
|
|
130
|
+
privacyEmail?: string;
|
|
131
|
+
/** Postal address. */
|
|
132
|
+
address?: string;
|
|
133
|
+
/** DPO name. Required for DCPMI under NDPA Section 32. */
|
|
134
|
+
dpoName?: string;
|
|
135
|
+
/** DPO email. Required for the NDPC breach-notification contact. */
|
|
136
|
+
dpoEmail?: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
68
139
|
/** Organisation size tiers — affects complexity of generated language. */
|
|
69
140
|
declare type OrgSize = 'startup' | 'midsize' | 'enterprise';
|
|
70
141
|
|
package/dist/presets-policy.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var chunk5IOC3VAW_js=require('./chunk-5IOC3VAW.js');require('./chunk-W7OLQRJP.js'),require('./chunk-3GRGYT3P.js'),require('./chunk-HXWHL4BD.js'),require('./chunk-N3MQQUQP.js'),require('./chunk-Q64735OC.js'),require('./chunk-ZVOIR4QH.js'),require('./chunk-AME4HJR4.js'),require('./chunk-VWED6UTN.js'),require('./chunk-RFPLZDIO.js');Object.defineProperty(exports,"NDPRPrivacyPolicy",{enumerable:true,get:function(){return chunk5IOC3VAW_js.a}});
|
package/dist/presets-policy.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export{a as NDPRPrivacyPolicy}from'./chunk-
|
|
2
|
+
export{a as NDPRPrivacyPolicy}from'./chunk-R7545FP4.mjs';import'./chunk-ATFUSHC2.mjs';import'./chunk-UKLU6BQF.mjs';import'./chunk-2MIQXECH.mjs';import'./chunk-AOHKVFAS.mjs';import'./chunk-RMQ7OLNY.mjs';import'./chunk-ITCY2Z66.mjs';import'./chunk-SFGW37LE.mjs';import'./chunk-DBZSN4WP.mjs';import'./chunk-ZJYULEER.mjs';
|
package/dist/presets.d.mts
CHANGED
|
@@ -674,6 +674,35 @@ export declare interface NDPRPrivacyPolicyProps {
|
|
|
674
674
|
onComplete?: (policy: PrivacyPolicy) => void;
|
|
675
675
|
classNames?: Record<string, string>;
|
|
676
676
|
unstyled?: boolean;
|
|
677
|
+
/**
|
|
678
|
+
* Pre-fill the policy wizard with a sector-specific starter template.
|
|
679
|
+
*
|
|
680
|
+
* Pass one of `'saas' | 'ecommerce' | 'school' | 'healthcare' |
|
|
681
|
+
* 'procurement'` and the wizard opens already populated with the data
|
|
682
|
+
* categories, lawful-basis defaults, sensitive-data / children /
|
|
683
|
+
* cross-border / automated-decisions flags that org type usually needs.
|
|
684
|
+
* The user can still flip every flag and rewrite every section.
|
|
685
|
+
*
|
|
686
|
+
* @example
|
|
687
|
+
* <NDPRPrivacyPolicy
|
|
688
|
+
* template="healthcare"
|
|
689
|
+
* templateOverrides={{ orgName: 'Lagos Heart Centre' }}
|
|
690
|
+
* />
|
|
691
|
+
*
|
|
692
|
+
* @see templateContextFor in `/server` or `/core` for the underlying
|
|
693
|
+
* factory if you'd rather build the context yourself.
|
|
694
|
+
*/
|
|
695
|
+
template?: OrgPolicyTemplateId;
|
|
696
|
+
/**
|
|
697
|
+
* Organisation-level overrides applied on top of the chosen template.
|
|
698
|
+
* Ignored when `template` is unset.
|
|
699
|
+
*/
|
|
700
|
+
templateOverrides?: OrgPolicyTemplateOverrides;
|
|
701
|
+
/**
|
|
702
|
+
* Pass a fully-constructed `TemplateContext` to skip the template
|
|
703
|
+
* lookup entirely. Takes precedence over `template` if both are set.
|
|
704
|
+
*/
|
|
705
|
+
initialContext?: TemplateContext;
|
|
677
706
|
}
|
|
678
707
|
|
|
679
708
|
export declare const NDPRROPA: React__default.FC<NDPRROPAProps>;
|
|
@@ -732,6 +761,31 @@ export declare interface NDPRSubjectRightsProps {
|
|
|
732
761
|
error?: unknown;
|
|
733
762
|
response?: Response;
|
|
734
763
|
}) => void;
|
|
764
|
+
/**
|
|
765
|
+
* Called when a `submitTo` POST succeeds (2xx response). Receives the
|
|
766
|
+
* `Response` object, the submitted `DSRFormSubmission` payload, and the
|
|
767
|
+
* parsed JSON body if the server returned valid JSON. Use this to
|
|
768
|
+
* display a server-generated reference number, redirect the user, or
|
|
769
|
+
* trigger analytics.
|
|
770
|
+
*
|
|
771
|
+
* The `body` field is `undefined` if the response had no body or the
|
|
772
|
+
* body was not valid JSON. It is typed `unknown` to force consumers to
|
|
773
|
+
* narrow it themselves before reading fields.
|
|
774
|
+
*
|
|
775
|
+
* @example
|
|
776
|
+
* <NDPRSubjectRights
|
|
777
|
+
* submitTo="/api/dsr"
|
|
778
|
+
* onSubmitSuccess={({ response, data, body }) => {
|
|
779
|
+
* const ref = (body as { referenceId?: string })?.referenceId;
|
|
780
|
+
* if (ref) router.push(`/dsr-confirmation?ref=${ref}`);
|
|
781
|
+
* }}
|
|
782
|
+
* />
|
|
783
|
+
*/
|
|
784
|
+
onSubmitSuccess?: (ctx: {
|
|
785
|
+
response: Response;
|
|
786
|
+
data: DSRFormSubmission;
|
|
787
|
+
body?: unknown;
|
|
788
|
+
}) => void;
|
|
735
789
|
}
|
|
736
790
|
|
|
737
791
|
/**
|
|
@@ -758,6 +812,48 @@ declare interface OrganizationInfo {
|
|
|
758
812
|
ndpcRegistrationNumber?: string;
|
|
759
813
|
}
|
|
760
814
|
|
|
815
|
+
/**
|
|
816
|
+
* Org-specific privacy-policy templates — pre-filled `TemplateContext`
|
|
817
|
+
* factories for the most common Nigerian app shapes.
|
|
818
|
+
*
|
|
819
|
+
* Each template returns a fully-populated `TemplateContext` with:
|
|
820
|
+
* - industry set to the matching `Industry` value
|
|
821
|
+
* - the data categories the sector typically collects (selected: true)
|
|
822
|
+
* - the processing purposes that match the business model
|
|
823
|
+
* - sensitive-data / children / cross-border / automated-decisions flags
|
|
824
|
+
* set to the defaults that org type usually needs (a school will have
|
|
825
|
+
* children data, a hospital will have sensitive data, etc.)
|
|
826
|
+
*
|
|
827
|
+
* Templates are guidance starters. The wizard still walks the user through
|
|
828
|
+
* every step — they can flip any flag, add/remove categories, or rewrite
|
|
829
|
+
* any section before the policy is finalised. The legal-notice footer the
|
|
830
|
+
* toolkit ships everywhere applies to the generated output.
|
|
831
|
+
*
|
|
832
|
+
* @example
|
|
833
|
+
* import { templateContextFor } from '@tantainnovative/ndpr-toolkit/server';
|
|
834
|
+
* const ctx = templateContextFor('ecommerce', { orgName: 'Acme NG' });
|
|
835
|
+
* const draft = assemblePolicy(ctx);
|
|
836
|
+
*/
|
|
837
|
+
|
|
838
|
+
/** Identifiers for the bundled org templates. */
|
|
839
|
+
declare type OrgPolicyTemplateId = 'saas' | 'ecommerce' | 'school' | 'healthcare' | 'procurement';
|
|
840
|
+
|
|
841
|
+
/** Optional overrides applied on top of a template's defaults. */
|
|
842
|
+
declare interface OrgPolicyTemplateOverrides {
|
|
843
|
+
/** Organisation name (e.g. "Acme Nigeria Ltd"). Default: empty. */
|
|
844
|
+
orgName?: string;
|
|
845
|
+
/** Public website URL. */
|
|
846
|
+
website?: string;
|
|
847
|
+
/** Privacy contact email. */
|
|
848
|
+
privacyEmail?: string;
|
|
849
|
+
/** Postal address. */
|
|
850
|
+
address?: string;
|
|
851
|
+
/** DPO name. Required for DCPMI under NDPA Section 32. */
|
|
852
|
+
dpoName?: string;
|
|
853
|
+
/** DPO email. Required for the NDPC breach-notification contact. */
|
|
854
|
+
dpoEmail?: string;
|
|
855
|
+
}
|
|
856
|
+
|
|
761
857
|
/** Organisation size tiers — affects complexity of generated language. */
|
|
762
858
|
declare type OrgSize = 'startup' | 'midsize' | 'enterprise';
|
|
763
859
|
|
package/dist/presets.d.ts
CHANGED
|
@@ -674,6 +674,35 @@ export declare interface NDPRPrivacyPolicyProps {
|
|
|
674
674
|
onComplete?: (policy: PrivacyPolicy) => void;
|
|
675
675
|
classNames?: Record<string, string>;
|
|
676
676
|
unstyled?: boolean;
|
|
677
|
+
/**
|
|
678
|
+
* Pre-fill the policy wizard with a sector-specific starter template.
|
|
679
|
+
*
|
|
680
|
+
* Pass one of `'saas' | 'ecommerce' | 'school' | 'healthcare' |
|
|
681
|
+
* 'procurement'` and the wizard opens already populated with the data
|
|
682
|
+
* categories, lawful-basis defaults, sensitive-data / children /
|
|
683
|
+
* cross-border / automated-decisions flags that org type usually needs.
|
|
684
|
+
* The user can still flip every flag and rewrite every section.
|
|
685
|
+
*
|
|
686
|
+
* @example
|
|
687
|
+
* <NDPRPrivacyPolicy
|
|
688
|
+
* template="healthcare"
|
|
689
|
+
* templateOverrides={{ orgName: 'Lagos Heart Centre' }}
|
|
690
|
+
* />
|
|
691
|
+
*
|
|
692
|
+
* @see templateContextFor in `/server` or `/core` for the underlying
|
|
693
|
+
* factory if you'd rather build the context yourself.
|
|
694
|
+
*/
|
|
695
|
+
template?: OrgPolicyTemplateId;
|
|
696
|
+
/**
|
|
697
|
+
* Organisation-level overrides applied on top of the chosen template.
|
|
698
|
+
* Ignored when `template` is unset.
|
|
699
|
+
*/
|
|
700
|
+
templateOverrides?: OrgPolicyTemplateOverrides;
|
|
701
|
+
/**
|
|
702
|
+
* Pass a fully-constructed `TemplateContext` to skip the template
|
|
703
|
+
* lookup entirely. Takes precedence over `template` if both are set.
|
|
704
|
+
*/
|
|
705
|
+
initialContext?: TemplateContext;
|
|
677
706
|
}
|
|
678
707
|
|
|
679
708
|
export declare const NDPRROPA: React__default.FC<NDPRROPAProps>;
|
|
@@ -732,6 +761,31 @@ export declare interface NDPRSubjectRightsProps {
|
|
|
732
761
|
error?: unknown;
|
|
733
762
|
response?: Response;
|
|
734
763
|
}) => void;
|
|
764
|
+
/**
|
|
765
|
+
* Called when a `submitTo` POST succeeds (2xx response). Receives the
|
|
766
|
+
* `Response` object, the submitted `DSRFormSubmission` payload, and the
|
|
767
|
+
* parsed JSON body if the server returned valid JSON. Use this to
|
|
768
|
+
* display a server-generated reference number, redirect the user, or
|
|
769
|
+
* trigger analytics.
|
|
770
|
+
*
|
|
771
|
+
* The `body` field is `undefined` if the response had no body or the
|
|
772
|
+
* body was not valid JSON. It is typed `unknown` to force consumers to
|
|
773
|
+
* narrow it themselves before reading fields.
|
|
774
|
+
*
|
|
775
|
+
* @example
|
|
776
|
+
* <NDPRSubjectRights
|
|
777
|
+
* submitTo="/api/dsr"
|
|
778
|
+
* onSubmitSuccess={({ response, data, body }) => {
|
|
779
|
+
* const ref = (body as { referenceId?: string })?.referenceId;
|
|
780
|
+
* if (ref) router.push(`/dsr-confirmation?ref=${ref}`);
|
|
781
|
+
* }}
|
|
782
|
+
* />
|
|
783
|
+
*/
|
|
784
|
+
onSubmitSuccess?: (ctx: {
|
|
785
|
+
response: Response;
|
|
786
|
+
data: DSRFormSubmission;
|
|
787
|
+
body?: unknown;
|
|
788
|
+
}) => void;
|
|
735
789
|
}
|
|
736
790
|
|
|
737
791
|
/**
|
|
@@ -758,6 +812,48 @@ declare interface OrganizationInfo {
|
|
|
758
812
|
ndpcRegistrationNumber?: string;
|
|
759
813
|
}
|
|
760
814
|
|
|
815
|
+
/**
|
|
816
|
+
* Org-specific privacy-policy templates — pre-filled `TemplateContext`
|
|
817
|
+
* factories for the most common Nigerian app shapes.
|
|
818
|
+
*
|
|
819
|
+
* Each template returns a fully-populated `TemplateContext` with:
|
|
820
|
+
* - industry set to the matching `Industry` value
|
|
821
|
+
* - the data categories the sector typically collects (selected: true)
|
|
822
|
+
* - the processing purposes that match the business model
|
|
823
|
+
* - sensitive-data / children / cross-border / automated-decisions flags
|
|
824
|
+
* set to the defaults that org type usually needs (a school will have
|
|
825
|
+
* children data, a hospital will have sensitive data, etc.)
|
|
826
|
+
*
|
|
827
|
+
* Templates are guidance starters. The wizard still walks the user through
|
|
828
|
+
* every step — they can flip any flag, add/remove categories, or rewrite
|
|
829
|
+
* any section before the policy is finalised. The legal-notice footer the
|
|
830
|
+
* toolkit ships everywhere applies to the generated output.
|
|
831
|
+
*
|
|
832
|
+
* @example
|
|
833
|
+
* import { templateContextFor } from '@tantainnovative/ndpr-toolkit/server';
|
|
834
|
+
* const ctx = templateContextFor('ecommerce', { orgName: 'Acme NG' });
|
|
835
|
+
* const draft = assemblePolicy(ctx);
|
|
836
|
+
*/
|
|
837
|
+
|
|
838
|
+
/** Identifiers for the bundled org templates. */
|
|
839
|
+
declare type OrgPolicyTemplateId = 'saas' | 'ecommerce' | 'school' | 'healthcare' | 'procurement';
|
|
840
|
+
|
|
841
|
+
/** Optional overrides applied on top of a template's defaults. */
|
|
842
|
+
declare interface OrgPolicyTemplateOverrides {
|
|
843
|
+
/** Organisation name (e.g. "Acme Nigeria Ltd"). Default: empty. */
|
|
844
|
+
orgName?: string;
|
|
845
|
+
/** Public website URL. */
|
|
846
|
+
website?: string;
|
|
847
|
+
/** Privacy contact email. */
|
|
848
|
+
privacyEmail?: string;
|
|
849
|
+
/** Postal address. */
|
|
850
|
+
address?: string;
|
|
851
|
+
/** DPO name. Required for DCPMI under NDPA Section 32. */
|
|
852
|
+
dpoName?: string;
|
|
853
|
+
/** DPO email. Required for the NDPC breach-notification contact. */
|
|
854
|
+
dpoEmail?: string;
|
|
855
|
+
}
|
|
856
|
+
|
|
761
857
|
/** Organisation size tiers — affects complexity of generated language. */
|
|
762
858
|
declare type OrgSize = 'startup' | 'midsize' | 'enterprise';
|
|
763
859
|
|
package/dist/presets.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var chunkV3RYHNHN_js=require('./chunk-V3RYHNHN.js'),chunkXS3Z4UT7_js=require('./chunk-XS3Z4UT7.js'),chunk5IOC3VAW_js=require('./chunk-5IOC3VAW.js');require('./chunk-W7OLQRJP.js');var chunkNUWVPRNI_js=require('./chunk-NUWVPRNI.js'),chunkS6COXIZA_js=require('./chunk-S6COXIZA.js'),chunkPZRQWPWD_js=require('./chunk-PZRQWPWD.js'),chunkI3Y4LOSL_js=require('./chunk-I3Y4LOSL.js'),chunk5GVMKUMP_js=require('./chunk-5GVMKUMP.js');require('./chunk-3GRGYT3P.js'),require('./chunk-HXWHL4BD.js'),require('./chunk-N3MQQUQP.js');var chunkQPRYXVH2_js=require('./chunk-QPRYXVH2.js');require('./chunk-Q64735OC.js'),require('./chunk-YFBDJ4FH.js'),require('./chunk-WZYCBW2R.js'),require('./chunk-4CVBQC66.js'),require('./chunk-732C2EVN.js'),require('./chunk-L2VO3MEJ.js'),require('./chunk-W47OSMT6.js'),require('./chunk-UXUMYP4L.js');var chunkWDDCKYWA_js=require('./chunk-WDDCKYWA.js');require('./chunk-ZVOIR4QH.js'),require('./chunk-AME4HJR4.js'),require('./chunk-VWED6UTN.js');var chunkRFPLZDIO_js=require('./chunk-RFPLZDIO.js'),jsxRuntime=require('react/jsx-runtime'),react=require('react');var L=[{id:"unauthorized_access",name:"Unauthorized Access",description:"Unauthorized access to personal data",defaultSeverity:"high"},{id:"data_loss",name:"Data Loss",description:"Loss of personal data",defaultSeverity:"high"},{id:"data_theft",name:"Data Theft",description:"Theft of personal data",defaultSeverity:"critical"},{id:"system_breach",name:"System Breach",description:"Breach of system containing personal data",defaultSeverity:"critical"},{id:"accidental_disclosure",name:"Accidental Disclosure",description:"Unintended disclosure of personal data",defaultSeverity:"medium"}],I=({categories:c=L,adapter:s,classNames:u,unstyled:p,onSubmit:o=()=>{}})=>jsxRuntime.jsx(chunkS6COXIZA_js.a,{categories:c,onSubmit:d=>{s&&s.save(d),o(d);},classNames:u,unstyled:p});var k=[{id:"project_overview",title:"Project Overview",description:"Provide basic details about the processing activity being assessed.",order:0,questions:[{id:"project_name",text:"What is the name of the project or processing activity?",type:"text",required:true},{id:"project_description",text:"Describe the nature and purpose of the processing.",guidance:"Include what personal data will be collected, why it is needed, and how it will be used.",type:"textarea",required:true},{id:"data_controller",text:"Who is the data controller responsible for this processing?",type:"text",required:true}]},{id:"necessity",title:"Necessity & Proportionality",description:"Assess whether the processing is necessary and proportionate to the purposes.",order:1,questions:[{id:"lawful_basis",text:"What is the lawful basis for processing under the NDPA 2023?",type:"select",required:true,options:[{value:"consent",label:"Consent (Section 25(1)(a))"},{value:"contract",label:"Contract (Section 25(1)(b))"},{value:"legal_obligation",label:"Legal Obligation (Section 25(1)(c))"},{value:"vital_interests",label:"Vital Interests (Section 25(1)(d))"},{value:"public_task",label:"Public Task (Section 25(1)(e))"},{value:"legitimate_interests",label:"Legitimate Interests (Section 25(1)(f))"}]},{id:"data_minimisation",text:"Is the processing limited to what is necessary for the specified purpose?",type:"radio",required:true,options:[{value:"yes",label:"Yes \u2014 only minimum data is collected",riskLevel:"low"},{value:"partial",label:"Partially \u2014 some additional data may be collected",riskLevel:"medium"},{value:"no",label:"No \u2014 more data is collected than strictly necessary",riskLevel:"high"}]}]},{id:"risk_identification",title:"Risk Identification",description:"Identify and assess risks to data subjects arising from the processing.",order:2,questions:[{id:"sensitive_data",text:"Does the processing involve sensitive personal data (e.g., health, biometric, financial, children's data)?",type:"radio",required:true,options:[{value:"no",label:"No sensitive data",riskLevel:"low"},{value:"yes_protected",label:"Yes, with appropriate safeguards",riskLevel:"medium"},{value:"yes_unprotected",label:"Yes, without adequate safeguards",riskLevel:"high"}]},{id:"scale",text:"What is the scale of processing?",type:"radio",required:true,options:[{value:"small",label:"Small scale (fewer than 1,000 individuals)",riskLevel:"low"},{value:"medium",label:"Medium scale (1,000 to 100,000 individuals)",riskLevel:"medium"},{value:"large",label:"Large scale (over 100,000 individuals)",riskLevel:"high"}]},{id:"cross_border",text:"Will data be transferred outside Nigeria?",type:"radio",required:true,options:[{value:"no",label:"No international transfers",riskLevel:"low"},{value:"adequate",label:"Yes, to countries with adequate protection",riskLevel:"medium"},{value:"inadequate",label:"Yes, to countries without adequate protection",riskLevel:"high"}]}]},{id:"mitigation",title:"Risk Mitigation & Measures",description:"Document the measures taken to address identified risks.",order:3,questions:[{id:"security_measures",text:"What technical and organisational security measures are in place?",guidance:"Include encryption, access controls, pseudonymisation, staff training, etc.",type:"textarea",required:true},{id:"retention_period",text:"What is the data retention period?",guidance:"Specify how long data will be kept and the criteria used to determine this.",type:"text",required:true},{id:"dpo_consulted",text:"Has the Data Protection Officer (DPO) been consulted on this assessment?",type:"radio",required:false,options:[{value:"yes",label:"Yes",riskLevel:"low"},{value:"no",label:"No",riskLevel:"medium"},{value:"na",label:"Not applicable \u2014 no DPO appointed",riskLevel:"medium"}]}]}],_=({sections:c=k,adapter:s,classNames:u,unstyled:p,onComplete:o=()=>{}})=>{let[n,d]=react.useState({}),[m,f]=react.useState(0),P=(a,C)=>{d(S=>chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},S),{[a]:C}));},e=()=>{m<c.length-1?f(a=>a+1):(s&&s.save(n),o(n));},t=()=>{m>0&&f(a=>a-1);},r=Math.round((m+1)/c.length*100);return jsxRuntime.jsx(chunkWDDCKYWA_js.a,{sections:c,answers:n,onAnswerChange:P,currentSectionIndex:m,onNextSection:e,onPrevSection:t,progress:r,classNames:u,unstyled:p})};var F=({initialActivities:c=[],adapter:s,classNames:u,unstyled:p})=>{let[o,n]=react.useState(()=>{if(s){let e=s.load();if(e&&!(e instanceof Promise))return e}return c}),d=e=>{s&&s.save(e);};return jsxRuntime.jsx(chunkPZRQWPWD_js.a,{activities:o,onAddActivity:e=>{let t=Date.now(),r=chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},e),{id:`activity-${t}`,createdAt:t,updatedAt:t}),a=[...o,r];n(a),d(a);},onUpdateActivity:(e,t)=>{let r=o.map(a=>a.id===e?chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a(chunkRFPLZDIO_js.a({},a),t),{updatedAt:Date.now()}):a);n(r),d(r);},onArchiveActivity:e=>{let t=o.map(r=>r.id===e?chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},r),{status:"inactive",updatedAt:Date.now()}):r);n(t),d(t);},classNames:u,unstyled:p})};var W=({initialTransfers:c=[],adapter:s,classNames:u,unstyled:p})=>{let[o,n]=react.useState(()=>{if(s){let e=s.load();if(e&&!(e instanceof Promise))return e}return c}),d=e=>{s&&s.save(e);};return jsxRuntime.jsx(chunkI3Y4LOSL_js.a,{transfers:o,onAddTransfer:e=>{let t=Date.now(),r=chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},e),{id:`transfer-${t}`,createdAt:t,updatedAt:t}),a=[...o,r];n(a),d(a);},onUpdateTransfer:(e,t)=>{let r=o.map(a=>a.id===e?chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a(chunkRFPLZDIO_js.a({},a),t),{updatedAt:Date.now()}):a);n(r),d(r);},onRemoveTransfer:e=>{let t=o.filter(r=>r.id!==e);n(t),d(t);},classNames:u,unstyled:p})};var j={id:"ndpr-ropa-default",organizationName:"Your Organisation",organizationContact:"",organizationAddress:"",records:[],lastUpdated:Date.now(),version:"1.0"},V=({initialData:c,adapter:s,classNames:u,unstyled:p})=>{let[o,n]=react.useState(c!=null?c:j);react.useEffect(()=>{if(!s)return;let e=false;return chunkRFPLZDIO_js.d(null,null,function*(){let r=yield s.load();!e&&r&&n(r);}),()=>{e=true;}},[s]);let d=e=>{s&&s.save(e);};return jsxRuntime.jsx(chunk5GVMKUMP_js.a,{ropa:o,onAddRecord:e=>{let t=chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},o),{records:[...o.records,e],lastUpdated:Date.now()});n(t),d(t);},onUpdateRecord:(e,t)=>{let r=chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},o),{records:o.records.map(a=>a.id===e?chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a(chunkRFPLZDIO_js.a({},a),t),{updatedAt:Date.now()}):a),lastUpdated:Date.now()});n(r),d(r);},onArchiveRecord:e=>{let t=chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},o),{records:o.records.map(r=>r.id===e?chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},r),{status:"archived",updatedAt:Date.now()}):r),lastUpdated:Date.now()});n(t),d(t);},classNames:u,unstyled:p})};var G=u=>{var p=u,{input:c}=p,s=chunkRFPLZDIO_js.c(p,["input"]);let o=chunkQPRYXVH2_js.a(c);return jsxRuntime.jsx(chunkNUWVPRNI_js.a,chunkRFPLZDIO_js.a({report:o},s))};Object.defineProperty(exports,"NDPRConsent",{enumerable:true,get:function(){return chunkV3RYHNHN_js.a}});Object.defineProperty(exports,"NDPRSubjectRights",{enumerable:true,get:function(){return chunkXS3Z4UT7_js.a}});Object.defineProperty(exports,"NDPRPrivacyPolicy",{enumerable:true,get:function(){return chunk5IOC3VAW_js.a}});exports.NDPRBreachReport=I;exports.NDPRComplianceDashboard=G;exports.NDPRCrossBorder=W;exports.NDPRDPIA=_;exports.NDPRLawfulBasis=F;exports.NDPRROPA=V;
|
package/dist/presets.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export{a as
|
|
2
|
+
export{a as NDPRConsent}from'./chunk-LTPSN2SU.mjs';export{a as NDPRSubjectRights}from'./chunk-EFIWANHF.mjs';export{a as NDPRPrivacyPolicy}from'./chunk-R7545FP4.mjs';import'./chunk-ATFUSHC2.mjs';import {a as a$7}from'./chunk-ZIZL37BG.mjs';import {a}from'./chunk-ZHFLBL63.mjs';import {a as a$2}from'./chunk-COD3RMTL.mjs';import {a as a$4}from'./chunk-GTYXVAJX.mjs';import {a as a$5}from'./chunk-EXEXUAF6.mjs';import'./chunk-UKLU6BQF.mjs';import'./chunk-2MIQXECH.mjs';import'./chunk-AOHKVFAS.mjs';import {a as a$6}from'./chunk-EFIBHKQE.mjs';import'./chunk-RMQ7OLNY.mjs';import'./chunk-7BJXI2HI.mjs';import'./chunk-LWIKDDSU.mjs';import'./chunk-XP5PL6K7.mjs';import'./chunk-BFAX7JQA.mjs';import'./chunk-YTU4FNM2.mjs';import'./chunk-XJO4DH3L.mjs';import'./chunk-EWVK45Z3.mjs';import {a as a$1}from'./chunk-ZQZJNKVB.mjs';import'./chunk-ITCY2Z66.mjs';import'./chunk-SFGW37LE.mjs';import'./chunk-DBZSN4WP.mjs';import {b,a as a$3,d,c}from'./chunk-ZJYULEER.mjs';import {jsx}from'react/jsx-runtime';import {useState,useEffect}from'react';var L=[{id:"unauthorized_access",name:"Unauthorized Access",description:"Unauthorized access to personal data",defaultSeverity:"high"},{id:"data_loss",name:"Data Loss",description:"Loss of personal data",defaultSeverity:"high"},{id:"data_theft",name:"Data Theft",description:"Theft of personal data",defaultSeverity:"critical"},{id:"system_breach",name:"System Breach",description:"Breach of system containing personal data",defaultSeverity:"critical"},{id:"accidental_disclosure",name:"Accidental Disclosure",description:"Unintended disclosure of personal data",defaultSeverity:"medium"}],I=({categories:c=L,adapter:s,classNames:u,unstyled:p,onSubmit:o=()=>{}})=>jsx(a,{categories:c,onSubmit:d=>{s&&s.save(d),o(d);},classNames:u,unstyled:p});var k=[{id:"project_overview",title:"Project Overview",description:"Provide basic details about the processing activity being assessed.",order:0,questions:[{id:"project_name",text:"What is the name of the project or processing activity?",type:"text",required:true},{id:"project_description",text:"Describe the nature and purpose of the processing.",guidance:"Include what personal data will be collected, why it is needed, and how it will be used.",type:"textarea",required:true},{id:"data_controller",text:"Who is the data controller responsible for this processing?",type:"text",required:true}]},{id:"necessity",title:"Necessity & Proportionality",description:"Assess whether the processing is necessary and proportionate to the purposes.",order:1,questions:[{id:"lawful_basis",text:"What is the lawful basis for processing under the NDPA 2023?",type:"select",required:true,options:[{value:"consent",label:"Consent (Section 25(1)(a))"},{value:"contract",label:"Contract (Section 25(1)(b))"},{value:"legal_obligation",label:"Legal Obligation (Section 25(1)(c))"},{value:"vital_interests",label:"Vital Interests (Section 25(1)(d))"},{value:"public_task",label:"Public Task (Section 25(1)(e))"},{value:"legitimate_interests",label:"Legitimate Interests (Section 25(1)(f))"}]},{id:"data_minimisation",text:"Is the processing limited to what is necessary for the specified purpose?",type:"radio",required:true,options:[{value:"yes",label:"Yes \u2014 only minimum data is collected",riskLevel:"low"},{value:"partial",label:"Partially \u2014 some additional data may be collected",riskLevel:"medium"},{value:"no",label:"No \u2014 more data is collected than strictly necessary",riskLevel:"high"}]}]},{id:"risk_identification",title:"Risk Identification",description:"Identify and assess risks to data subjects arising from the processing.",order:2,questions:[{id:"sensitive_data",text:"Does the processing involve sensitive personal data (e.g., health, biometric, financial, children's data)?",type:"radio",required:true,options:[{value:"no",label:"No sensitive data",riskLevel:"low"},{value:"yes_protected",label:"Yes, with appropriate safeguards",riskLevel:"medium"},{value:"yes_unprotected",label:"Yes, without adequate safeguards",riskLevel:"high"}]},{id:"scale",text:"What is the scale of processing?",type:"radio",required:true,options:[{value:"small",label:"Small scale (fewer than 1,000 individuals)",riskLevel:"low"},{value:"medium",label:"Medium scale (1,000 to 100,000 individuals)",riskLevel:"medium"},{value:"large",label:"Large scale (over 100,000 individuals)",riskLevel:"high"}]},{id:"cross_border",text:"Will data be transferred outside Nigeria?",type:"radio",required:true,options:[{value:"no",label:"No international transfers",riskLevel:"low"},{value:"adequate",label:"Yes, to countries with adequate protection",riskLevel:"medium"},{value:"inadequate",label:"Yes, to countries without adequate protection",riskLevel:"high"}]}]},{id:"mitigation",title:"Risk Mitigation & Measures",description:"Document the measures taken to address identified risks.",order:3,questions:[{id:"security_measures",text:"What technical and organisational security measures are in place?",guidance:"Include encryption, access controls, pseudonymisation, staff training, etc.",type:"textarea",required:true},{id:"retention_period",text:"What is the data retention period?",guidance:"Specify how long data will be kept and the criteria used to determine this.",type:"text",required:true},{id:"dpo_consulted",text:"Has the Data Protection Officer (DPO) been consulted on this assessment?",type:"radio",required:false,options:[{value:"yes",label:"Yes",riskLevel:"low"},{value:"no",label:"No",riskLevel:"medium"},{value:"na",label:"Not applicable \u2014 no DPO appointed",riskLevel:"medium"}]}]}],_=({sections:c=k,adapter:s,classNames:u,unstyled:p,onComplete:o=()=>{}})=>{let[n,d]=useState({}),[m,f]=useState(0),P=(a,C)=>{d(S=>b(a$3({},S),{[a]:C}));},e=()=>{m<c.length-1?f(a=>a+1):(s&&s.save(n),o(n));},t=()=>{m>0&&f(a=>a-1);},r=Math.round((m+1)/c.length*100);return jsx(a$1,{sections:c,answers:n,onAnswerChange:P,currentSectionIndex:m,onNextSection:e,onPrevSection:t,progress:r,classNames:u,unstyled:p})};var F=({initialActivities:c=[],adapter:s,classNames:u,unstyled:p})=>{let[o,n]=useState(()=>{if(s){let e=s.load();if(e&&!(e instanceof Promise))return e}return c}),d=e=>{s&&s.save(e);};return jsx(a$2,{activities:o,onAddActivity:e=>{let t=Date.now(),r=b(a$3({},e),{id:`activity-${t}`,createdAt:t,updatedAt:t}),a=[...o,r];n(a),d(a);},onUpdateActivity:(e,t)=>{let r=o.map(a=>a.id===e?b(a$3(a$3({},a),t),{updatedAt:Date.now()}):a);n(r),d(r);},onArchiveActivity:e=>{let t=o.map(r=>r.id===e?b(a$3({},r),{status:"inactive",updatedAt:Date.now()}):r);n(t),d(t);},classNames:u,unstyled:p})};var W=({initialTransfers:c=[],adapter:s,classNames:u,unstyled:p})=>{let[o,n]=useState(()=>{if(s){let e=s.load();if(e&&!(e instanceof Promise))return e}return c}),d=e=>{s&&s.save(e);};return jsx(a$4,{transfers:o,onAddTransfer:e=>{let t=Date.now(),r=b(a$3({},e),{id:`transfer-${t}`,createdAt:t,updatedAt:t}),a=[...o,r];n(a),d(a);},onUpdateTransfer:(e,t)=>{let r=o.map(a=>a.id===e?b(a$3(a$3({},a),t),{updatedAt:Date.now()}):a);n(r),d(r);},onRemoveTransfer:e=>{let t=o.filter(r=>r.id!==e);n(t),d(t);},classNames:u,unstyled:p})};var j={id:"ndpr-ropa-default",organizationName:"Your Organisation",organizationContact:"",organizationAddress:"",records:[],lastUpdated:Date.now(),version:"1.0"},V=({initialData:c,adapter:s,classNames:u,unstyled:p})=>{let[o,n]=useState(c!=null?c:j);useEffect(()=>{if(!s)return;let e=false;return d(null,null,function*(){let r=yield s.load();!e&&r&&n(r);}),()=>{e=true;}},[s]);let d$1=e=>{s&&s.save(e);};return jsx(a$5,{ropa:o,onAddRecord:e=>{let t=b(a$3({},o),{records:[...o.records,e],lastUpdated:Date.now()});n(t),d$1(t);},onUpdateRecord:(e,t)=>{let r=b(a$3({},o),{records:o.records.map(a=>a.id===e?b(a$3(a$3({},a),t),{updatedAt:Date.now()}):a),lastUpdated:Date.now()});n(r),d$1(r);},onArchiveRecord:e=>{let t=b(a$3({},o),{records:o.records.map(r=>r.id===e?b(a$3({},r),{status:"archived",updatedAt:Date.now()}):r),lastUpdated:Date.now()});n(t),d$1(t);},classNames:u,unstyled:p})};var G=u=>{var p=u,{input:c$1}=p,s=c(p,["input"]);let o=a$6(c$1);return jsx(a$7,a$3({report:o},s))};export{I as NDPRBreachReport,G as NDPRComplianceDashboard,W as NDPRCrossBorder,_ as NDPRDPIA,F as NDPRLawfulBasis,V as NDPRROPA};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generates a summary of the Record of Processing Activities.
|
|
5
|
+
* Provides statistics and identifies records that are due for review.
|
|
6
|
+
*
|
|
7
|
+
* @param ropa - The full Record of Processing Activities
|
|
8
|
+
* @returns Summary statistics for the ROPA
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateROPASummary(ropa: RecordOfProcessingActivities): ROPASummary;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Identifies compliance gaps in the Record of Processing Activities.
|
|
14
|
+
* Finds records that are missing required information per NDPA 2023.
|
|
15
|
+
*
|
|
16
|
+
* @param ropa - The full Record of Processing Activities
|
|
17
|
+
* @returns Array of compliance gaps grouped by record
|
|
18
|
+
*/
|
|
19
|
+
export declare function identifyComplianceGaps(ropa: RecordOfProcessingActivities): ROPAComplianceGap[];
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Lawful Basis types aligned with NDPA 2023 Part III (Sections 24-28)
|
|
23
|
+
* Every processing activity must have a documented lawful basis
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* The six lawful bases for processing personal data per NDPA Section 25(1)
|
|
27
|
+
*/
|
|
28
|
+
declare type LawfulBasis = 'consent' | 'contract' | 'legal_obligation' | 'vital_interests' | 'public_interest' | 'legitimate_interests';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Record of Processing Activities (ROPA) types aligned with NDPA 2023
|
|
32
|
+
* Data controllers must maintain comprehensive records of all processing activities
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Represents a single processing record in the ROPA
|
|
37
|
+
*/
|
|
38
|
+
export declare interface ProcessingRecord {
|
|
39
|
+
/** Unique identifier */
|
|
40
|
+
id: string;
|
|
41
|
+
/** Name of the processing activity */
|
|
42
|
+
name: string;
|
|
43
|
+
/** Detailed description of the processing */
|
|
44
|
+
description: string;
|
|
45
|
+
/** Data controller details */
|
|
46
|
+
controllerDetails: {
|
|
47
|
+
name: string;
|
|
48
|
+
contact: string;
|
|
49
|
+
address: string;
|
|
50
|
+
registrationNumber?: string;
|
|
51
|
+
dpoContact?: string;
|
|
52
|
+
};
|
|
53
|
+
/** Joint controller details (if applicable) */
|
|
54
|
+
jointControllerDetails?: {
|
|
55
|
+
name: string;
|
|
56
|
+
contact: string;
|
|
57
|
+
address: string;
|
|
58
|
+
responsibilities: string;
|
|
59
|
+
};
|
|
60
|
+
/** Data processor details (if processing is outsourced) */
|
|
61
|
+
processorDetails?: {
|
|
62
|
+
name: string;
|
|
63
|
+
contact: string;
|
|
64
|
+
address: string;
|
|
65
|
+
contractReference?: string;
|
|
66
|
+
};
|
|
67
|
+
/** Lawful basis for the processing */
|
|
68
|
+
lawfulBasis: LawfulBasis;
|
|
69
|
+
/** Justification for the chosen lawful basis */
|
|
70
|
+
lawfulBasisJustification: string;
|
|
71
|
+
/** Purposes of the processing */
|
|
72
|
+
purposes: string[];
|
|
73
|
+
/** Categories of personal data processed */
|
|
74
|
+
dataCategories: string[];
|
|
75
|
+
/** Categories of sensitive personal data (if any) */
|
|
76
|
+
sensitiveDataCategories?: string[];
|
|
77
|
+
/** Categories of data subjects */
|
|
78
|
+
dataSubjectCategories: string[];
|
|
79
|
+
/** Recipients or categories of recipients */
|
|
80
|
+
recipients: string[];
|
|
81
|
+
/** Cross-border transfer details */
|
|
82
|
+
crossBorderTransfers?: Array<{
|
|
83
|
+
destinationCountry: string;
|
|
84
|
+
countryCode?: string;
|
|
85
|
+
safeguards: string;
|
|
86
|
+
transferMechanism: string;
|
|
87
|
+
}>;
|
|
88
|
+
/** Data retention period */
|
|
89
|
+
retentionPeriod: string;
|
|
90
|
+
/** Justification for the retention period */
|
|
91
|
+
retentionJustification?: string;
|
|
92
|
+
/** Technical and organizational security measures */
|
|
93
|
+
securityMeasures: string[];
|
|
94
|
+
/** Data source (directly from data subject or from third party) */
|
|
95
|
+
dataSource: 'data_subject' | 'third_party' | 'public_source' | 'other';
|
|
96
|
+
/** Third-party source details (if dataSource is 'third_party') */
|
|
97
|
+
thirdPartySourceDetails?: string;
|
|
98
|
+
/** Whether a DPIA is required for this processing */
|
|
99
|
+
dpiaRequired: boolean;
|
|
100
|
+
/** Reference to the DPIA (if conducted) */
|
|
101
|
+
dpiaReference?: string;
|
|
102
|
+
/** Whether automated decision-making is involved */
|
|
103
|
+
automatedDecisionMaking: boolean;
|
|
104
|
+
/** Details of automated decision-making (if applicable) */
|
|
105
|
+
automatedDecisionMakingDetails?: string;
|
|
106
|
+
/** Status of the processing record */
|
|
107
|
+
status: 'active' | 'inactive' | 'archived';
|
|
108
|
+
/** Department or business unit responsible */
|
|
109
|
+
department?: string;
|
|
110
|
+
/** System or application used for processing */
|
|
111
|
+
systemsUsed?: string[];
|
|
112
|
+
/** Timestamp when the record was created */
|
|
113
|
+
createdAt: number;
|
|
114
|
+
/** Timestamp when the record was last updated */
|
|
115
|
+
updatedAt: number;
|
|
116
|
+
/** Timestamp when the record was last reviewed */
|
|
117
|
+
lastReviewedAt?: number;
|
|
118
|
+
/** Next review date */
|
|
119
|
+
nextReviewDate?: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Represents a complete Record of Processing Activities
|
|
124
|
+
*/
|
|
125
|
+
export declare interface RecordOfProcessingActivities {
|
|
126
|
+
/** Unique identifier */
|
|
127
|
+
id: string;
|
|
128
|
+
/** Organization name */
|
|
129
|
+
organizationName: string;
|
|
130
|
+
/** Organization contact information */
|
|
131
|
+
organizationContact: string;
|
|
132
|
+
/** Organization address */
|
|
133
|
+
organizationAddress: string;
|
|
134
|
+
/** Data Protection Officer details */
|
|
135
|
+
dpoDetails?: {
|
|
136
|
+
name: string;
|
|
137
|
+
email: string;
|
|
138
|
+
phone?: string;
|
|
139
|
+
};
|
|
140
|
+
/** NDPC registration number */
|
|
141
|
+
ndpcRegistrationNumber?: string;
|
|
142
|
+
/** All processing records */
|
|
143
|
+
records: ProcessingRecord[];
|
|
144
|
+
/** Timestamp when the ROPA was last updated */
|
|
145
|
+
lastUpdated: number;
|
|
146
|
+
/** Version of the ROPA */
|
|
147
|
+
version: string;
|
|
148
|
+
/** Export format options */
|
|
149
|
+
exportFormats?: ('pdf' | 'csv' | 'json' | 'xlsx')[];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Compliance gap found in a processing record
|
|
154
|
+
*/
|
|
155
|
+
export declare interface ROPAComplianceGap {
|
|
156
|
+
recordId: string;
|
|
157
|
+
recordName: string;
|
|
158
|
+
gaps: string[];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export declare const ROPAManagerLite: React__default.FC<ROPAManagerLiteProps>;
|
|
162
|
+
|
|
163
|
+
export declare interface ROPAManagerLiteClassNames {
|
|
164
|
+
root?: string;
|
|
165
|
+
header?: string;
|
|
166
|
+
title?: string;
|
|
167
|
+
summary?: string;
|
|
168
|
+
summaryCard?: string;
|
|
169
|
+
table?: string;
|
|
170
|
+
tableHeader?: string;
|
|
171
|
+
tableRow?: string;
|
|
172
|
+
statusBadge?: string;
|
|
173
|
+
complianceScore?: string;
|
|
174
|
+
gapAlert?: string;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export declare interface ROPAManagerLiteProps {
|
|
178
|
+
records: ProcessingRecord[];
|
|
179
|
+
title?: string;
|
|
180
|
+
description?: string;
|
|
181
|
+
className?: string;
|
|
182
|
+
classNames?: ROPAManagerLiteClassNames;
|
|
183
|
+
unstyled?: boolean;
|
|
184
|
+
showSummary?: boolean;
|
|
185
|
+
showComplianceGaps?: boolean;
|
|
186
|
+
onRecordClick?: (record: ProcessingRecord) => void;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Summary statistics for the ROPA
|
|
191
|
+
*/
|
|
192
|
+
export declare interface ROPASummary {
|
|
193
|
+
/** Total number of processing records */
|
|
194
|
+
totalRecords: number;
|
|
195
|
+
/** Active processing records */
|
|
196
|
+
activeRecords: number;
|
|
197
|
+
/** Records by lawful basis */
|
|
198
|
+
byLawfulBasis: Record<LawfulBasis, number>;
|
|
199
|
+
/** Records involving sensitive data */
|
|
200
|
+
sensitiveDataRecords: number;
|
|
201
|
+
/** Records involving cross-border transfers */
|
|
202
|
+
crossBorderRecords: number;
|
|
203
|
+
/** Records requiring DPIA */
|
|
204
|
+
dpiaRequiredRecords: number;
|
|
205
|
+
/** Records involving automated decision-making */
|
|
206
|
+
automatedDecisionRecords: number;
|
|
207
|
+
/** Records due for review */
|
|
208
|
+
recordsDueForReview: ProcessingRecord[];
|
|
209
|
+
/** Departments with most processing activities */
|
|
210
|
+
topDepartments: Array<{
|
|
211
|
+
department: string;
|
|
212
|
+
count: number;
|
|
213
|
+
}>;
|
|
214
|
+
/** Last updated timestamp */
|
|
215
|
+
lastUpdated: number;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export { }
|