@tantainnovative/ndpr-toolkit 2.1.1 → 2.2.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 +56 -0
- package/dist/{breach-6z0r-KuE.d.mts → breach-B_-6lDqS.d.mts} +1 -1
- package/dist/{breach-BFfnvtRk.d.ts → breach-CzXqSsaY.d.ts} +1 -1
- package/dist/{breach-BtFbDOmV.d.mts → breach-Eu9byel8.d.mts} +1 -1
- package/dist/{breach-BtFbDOmV.d.ts → breach-Eu9byel8.d.ts} +1 -1
- package/dist/breach.d.mts +81 -5
- package/dist/breach.d.ts +81 -5
- package/dist/breach.js +1 -1
- package/dist/breach.mjs +1 -1
- package/dist/chunk-4RGDNVR5.mjs +72 -0
- package/dist/chunk-6LM3RAFO.js +7 -0
- package/dist/chunk-7DNQSOER.js +2 -0
- package/dist/chunk-A7DRHSDQ.mjs +2 -0
- package/dist/chunk-FC6EG34C.js +72 -0
- package/dist/chunk-FDB6KZUD.mjs +2 -0
- package/dist/chunk-FZUCKGIM.mjs +7 -0
- package/dist/chunk-G3JNFZPT.js +2 -0
- package/dist/chunk-HXCRMA4J.mjs +2 -0
- package/dist/chunk-IC7VOOKJ.mjs +2 -0
- package/dist/chunk-ICUZG6CD.mjs +2 -0
- package/dist/chunk-IW5PHOG7.mjs +7 -0
- package/dist/chunk-JKEAPTYP.js +7 -0
- package/dist/chunk-N52S64SU.js +2 -0
- package/dist/chunk-SKAMVXBI.mjs +94 -0
- package/dist/chunk-VURIXCGY.js +2 -0
- package/dist/chunk-VXRY3V42.js +94 -0
- package/dist/chunk-YBPHGEL2.js +2 -0
- package/dist/consent.d.mts +68 -2
- package/dist/consent.d.ts +68 -2
- package/dist/consent.js +1 -1
- package/dist/consent.mjs +1 -1
- package/dist/core.d.mts +10 -10
- package/dist/core.d.ts +10 -10
- package/dist/{cross-border-BrIy1ieh.d.ts → cross-border-BMcqLvjC.d.mts} +1 -1
- package/dist/{cross-border-BrIy1ieh.d.mts → cross-border-BMcqLvjC.d.ts} +1 -1
- package/dist/cross-border-entry-BfF7jw5o.d.mts +84 -0
- package/dist/cross-border-entry-CtX8_o-_.d.ts +84 -0
- package/dist/cross-border.d.mts +4 -58
- package/dist/cross-border.d.ts +4 -58
- package/dist/cross-border.js +1 -1
- package/dist/cross-border.mjs +1 -1
- package/dist/{dpia-vWfE_9bO.d.mts → dpia-5OQVA1R_.d.mts} +1 -1
- package/dist/{dpia-vWfE_9bO.d.ts → dpia-5OQVA1R_.d.ts} +1 -1
- package/dist/{dpia-fdtTd2DI.d.ts → dpia-B0Pok5us.d.ts} +1 -1
- package/dist/{dpia-B9ZZJG5a.d.mts → dpia-CUfOmzvX.d.mts} +1 -1
- package/dist/dpia.d.mts +105 -5
- package/dist/dpia.d.ts +105 -5
- package/dist/dpia.js +1 -1
- package/dist/dpia.mjs +1 -1
- package/dist/{dsr-pQzQ3H1O.d.mts → dsr-Cm9lzWG7.d.mts} +1 -1
- package/dist/{dsr-pQzQ3H1O.d.ts → dsr-Cm9lzWG7.d.ts} +1 -1
- package/dist/{dsr-whPkiI0_.d.mts → dsr-D_eTNc4S.d.mts} +1 -1
- package/dist/{dsr-jq5NUEdz.d.ts → dsr-pNtVb1BK.d.ts} +1 -1
- package/dist/dsr.d.mts +66 -5
- package/dist/dsr.d.ts +66 -5
- package/dist/dsr.js +1 -1
- package/dist/dsr.mjs +1 -1
- package/dist/hooks.d.mts +13 -13
- package/dist/hooks.d.ts +13 -13
- package/dist/index.d.mts +24 -24
- package/dist/index.d.ts +24 -24
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{lawful-basis-v04AhbK2.d.ts → lawful-basis-BEyI0kGg.d.ts} +2 -2
- package/dist/{lawful-basis-D-oXFizg.d.mts → lawful-basis-C2eGaoHM.d.mts} +2 -2
- package/dist/{lawful-basis-CWtvDG1x.d.mts → lawful-basis-Cv1VmDLn.d.mts} +1 -1
- package/dist/{lawful-basis-CWtvDG1x.d.ts → lawful-basis-Cv1VmDLn.d.ts} +1 -1
- package/dist/lawful-basis-entry-BeSX7u0U.d.ts +81 -0
- package/dist/lawful-basis-entry-CMPPM9Rh.d.mts +81 -0
- package/dist/lawful-basis.d.mts +5 -55
- package/dist/lawful-basis.d.ts +5 -55
- package/dist/lawful-basis.js +1 -1
- package/dist/lawful-basis.mjs +1 -1
- package/dist/policy-dmsRlqgM.d.ts +283 -0
- package/dist/policy-kZN23hrR.d.mts +283 -0
- package/dist/policy.d.mts +3 -193
- package/dist/policy.d.ts +3 -193
- package/dist/policy.js +1 -1
- package/dist/policy.mjs +1 -1
- package/dist/{ropa-Rb4dsFSz.d.mts → ropa-DP7pPPql.d.mts} +2 -2
- package/dist/{ropa-BebGfqKQ.d.ts → ropa-Li6UlL5H.d.ts} +2 -2
- package/dist/ropa-entry-CZJ91ymk.d.mts +71 -0
- package/dist/ropa-entry-DIEQ9WFs.d.ts +71 -0
- package/dist/ropa.d.mts +5 -45
- package/dist/ropa.d.ts +5 -45
- package/dist/ropa.js +1 -1
- package/dist/ropa.mjs +1 -1
- package/dist/unstyled.js +1 -1
- package/dist/unstyled.mjs +1 -1
- package/dist/{useBreach-WrZzJilM.d.mts → useBreach-BBSoIcZO.d.mts} +1 -1
- package/dist/{useBreach-vrh_XMpI.d.ts → useBreach-lFLbSyAN.d.ts} +1 -1
- package/dist/{useCrossBorderTransfer-TVnY8_UX.d.mts → useCrossBorderTransfer-BZVFCXfr.d.mts} +1 -1
- package/dist/{useCrossBorderTransfer-D4FQYfFt.d.ts → useCrossBorderTransfer-DmtACeqW.d.ts} +1 -1
- package/dist/{useDPIA-DFDHBLSa.d.ts → useDPIA-DBsg2yZx.d.ts} +1 -1
- package/dist/{useDPIA-FqPofFaV.d.mts → useDPIA-Da7-Q_yW.d.mts} +1 -1
- package/dist/{useDSR-DAqqOBXb.d.ts → useDSR-CYI7WCXr.d.ts} +1 -1
- package/dist/{useDSR-OXM5Q9rf.d.mts → useDSR-YYZ6FYFs.d.mts} +1 -1
- package/dist/{useLawfulBasis-RILM_xsx.d.ts → useLawfulBasis-CCWF9waR.d.ts} +2 -2
- package/dist/{useLawfulBasis-DNQ8YszQ.d.mts → useLawfulBasis-CpWuHtyh.d.mts} +2 -2
- package/dist/{useROPA-Bcs6cRdi.d.ts → useROPA-BhJ3kvHp.d.ts} +1 -1
- package/dist/{useROPA-nmcSiUYv.d.mts → useROPA-DLFdjkxP.d.mts} +1 -1
- package/package.json +33 -17
- package/dist/breach.js.map +0 -1
- package/dist/breach.mjs.map +0 -1
- package/dist/chunk-2SYNHRP6.mjs.map +0 -1
- package/dist/chunk-2XHD22J7.mjs +0 -7
- package/dist/chunk-2XHD22J7.mjs.map +0 -1
- package/dist/chunk-3YCV2BA6.js.map +0 -1
- package/dist/chunk-4A354HL3.js.map +0 -1
- package/dist/chunk-4DKT6IB6.js +0 -94
- package/dist/chunk-4DKT6IB6.js.map +0 -1
- package/dist/chunk-5ZBO2UPH.js.map +0 -1
- package/dist/chunk-6GGGTRDZ.mjs.map +0 -1
- package/dist/chunk-6JFTAYXV.mjs +0 -2
- package/dist/chunk-6JFTAYXV.mjs.map +0 -1
- package/dist/chunk-6JVYYLS7.js +0 -2
- package/dist/chunk-6JVYYLS7.js.map +0 -1
- package/dist/chunk-6SGG6WPA.mjs +0 -2
- package/dist/chunk-6SGG6WPA.mjs.map +0 -1
- package/dist/chunk-AQEGDEQM.js +0 -7
- package/dist/chunk-AQEGDEQM.js.map +0 -1
- package/dist/chunk-C2IJWCZQ.mjs +0 -2
- package/dist/chunk-C2IJWCZQ.mjs.map +0 -1
- package/dist/chunk-CMZTI7SG.js.map +0 -1
- package/dist/chunk-DB3JH4DS.mjs.map +0 -1
- package/dist/chunk-FFW7RUAG.mjs +0 -94
- package/dist/chunk-FFW7RUAG.mjs.map +0 -1
- package/dist/chunk-FK3CSFLJ.js +0 -2
- package/dist/chunk-FK3CSFLJ.js.map +0 -1
- package/dist/chunk-GIV2OHE6.mjs.map +0 -1
- package/dist/chunk-GMLNWS2N.mjs.map +0 -1
- package/dist/chunk-IQF726GS.js.map +0 -1
- package/dist/chunk-IWUUVRLJ.js.map +0 -1
- package/dist/chunk-JUN6YPLL.mjs +0 -72
- package/dist/chunk-JUN6YPLL.mjs.map +0 -1
- package/dist/chunk-L3FKTBGV.js +0 -72
- package/dist/chunk-L3FKTBGV.js.map +0 -1
- package/dist/chunk-L52PDW6O.mjs.map +0 -1
- package/dist/chunk-LI6WJ3LZ.js.map +0 -1
- package/dist/chunk-LXRXDTPI.js.map +0 -1
- package/dist/chunk-MQFZHA2D.js.map +0 -1
- package/dist/chunk-OITITR6K.mjs.map +0 -1
- package/dist/chunk-PDJGTQMY.mjs.map +0 -1
- package/dist/chunk-PGSA2O5P.mjs.map +0 -1
- package/dist/chunk-PM7CMTMB.js.map +0 -1
- package/dist/chunk-PYEX7DFR.mjs.map +0 -1
- package/dist/chunk-QKK5S54L.mjs.map +0 -1
- package/dist/chunk-RB26MIRI.js +0 -2
- package/dist/chunk-RB26MIRI.js.map +0 -1
- package/dist/chunk-RGYK4VAY.mjs.map +0 -1
- package/dist/chunk-RHWW5FDP.js +0 -16
- package/dist/chunk-RHWW5FDP.js.map +0 -1
- package/dist/chunk-RYZEIDNR.js.map +0 -1
- package/dist/chunk-SLNMKGQ2.mjs +0 -2
- package/dist/chunk-SLNMKGQ2.mjs.map +0 -1
- package/dist/chunk-SSGJREE3.js.map +0 -1
- package/dist/chunk-SWF3YVE5.js.map +0 -1
- package/dist/chunk-T44JQT2O.mjs.map +0 -1
- package/dist/chunk-TDDAYVKK.js.map +0 -1
- package/dist/chunk-TXBZPCGF.mjs.map +0 -1
- package/dist/chunk-UUWVBENC.js +0 -2
- package/dist/chunk-UUWVBENC.js.map +0 -1
- package/dist/chunk-UYP64PV7.mjs.map +0 -1
- package/dist/chunk-VMJBW3EF.mjs.map +0 -1
- package/dist/chunk-WW3X3ELF.js.map +0 -1
- package/dist/chunk-WWT2ZSNU.mjs.map +0 -1
- package/dist/chunk-XMKA6GVK.mjs +0 -16
- package/dist/chunk-XMKA6GVK.mjs.map +0 -1
- package/dist/chunk-Y34DQYS7.js.map +0 -1
- package/dist/chunk-ZU73VG3X.js.map +0 -1
- package/dist/consent.js.map +0 -1
- package/dist/consent.mjs.map +0 -1
- package/dist/core.js.map +0 -1
- package/dist/core.mjs.map +0 -1
- package/dist/cross-border.js.map +0 -1
- package/dist/cross-border.mjs.map +0 -1
- package/dist/dpia.js.map +0 -1
- package/dist/dpia.mjs.map +0 -1
- package/dist/dsr.js.map +0 -1
- package/dist/dsr.mjs.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/hooks.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/lawful-basis.js.map +0 -1
- package/dist/lawful-basis.mjs.map +0 -1
- package/dist/policy.js.map +0 -1
- package/dist/policy.mjs.map +0 -1
- package/dist/ropa.js.map +0 -1
- package/dist/ropa.mjs.map +0 -1
- package/dist/unstyled.js.map +0 -1
- package/dist/unstyled.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/components/ropa/ROPAManager.tsx"],"names":["LAWFUL_BASIS_OPTIONS","STATUS_OPTIONS","DATA_SOURCE_OPTIONS","createEmptyRecord","now","formatDate","timestamp","ROPAManager","ropa","onAddRecord","onUpdateRecord","onArchiveRecord","title","description","className","buttonClassName","viewMode","setViewMode","useState","searchTerm","setSearchTerm","statusFilter","setStatusFilter","basisFilter","setBasisFilter","editingRecord","setEditingRecord","formErrors","setFormErrors","purposesInput","setPurposesInput","dataCategoriesInput","setDataCategoriesInput","sensitiveDataInput","setSensitiveDataInput","subjectCategoriesInput","setSubjectCategoriesInput","recipientsInput","setRecipientsInput","securityMeasuresInput","setSecurityMeasuresInput","systemsUsedInput","setSystemsUsedInput","summary","useMemo","generateROPASummary","complianceGaps","identifyComplianceGaps","filteredRecords","filtered","r","term","c","useEffect","handleNewRecord","newRecord","handleEditRecord","record","__spreadValues","parseCommaSeparated","value","s","handleSaveRecord","recordToSave","__spreadProps","validation","validateProcessingRecord","handleArchiveRecord","id","handleExportCSV","csv","exportROPAToCSV","blob","url","link","handleCancelForm","updateEditingField","field","prev","updateControllerField","isReviewOverdue","renderStatusBadge","status","colorClasses","labels","React","renderBasisBadge","basis","renderOrganizationHeader","renderSummaryDashboard","option","dept","gap","g","i","renderRecordsTable","e","opt","overdue","hasGaps","renderForm","isNew","error","renderViewTabs"],"mappings":"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","file":"chunk-UUWVBENC.js","sourcesContent":["import React, { useState, useEffect, useMemo } from 'react';\nimport type { LawfulBasis } from '../../types/lawful-basis';\nimport type {\n ProcessingRecord,\n RecordOfProcessingActivities,\n ROPASummary,\n} from '../../types/ropa';\nimport type { ROPAComplianceGap } from '../../utils/ropa';\nimport {\n validateProcessingRecord,\n generateROPASummary,\n exportROPAToCSV,\n identifyComplianceGaps,\n} from '../../utils/ropa';\n\nexport interface ROPAManagerProps {\n /**\n * The full Record of Processing Activities\n */\n ropa: RecordOfProcessingActivities;\n\n /**\n * Callback when a new record is added\n */\n onAddRecord?: (record: ProcessingRecord) => void;\n\n /**\n * Callback when a record is updated\n */\n onUpdateRecord?: (id: string, updates: Partial<ProcessingRecord>) => void;\n\n /**\n * Callback when a record is archived\n */\n onArchiveRecord?: (id: string) => void;\n\n /**\n * Title displayed on the manager\n * @default \"Record of Processing Activities (ROPA)\"\n */\n title?: string;\n\n /**\n * Description text\n * @default \"Maintain a comprehensive record of all data processing activities as required by the NDPA 2023.\"\n */\n description?: string;\n\n /**\n * Custom CSS class\n */\n className?: string;\n\n /**\n * Custom CSS class for buttons\n */\n buttonClassName?: string;\n}\n\nconst LAWFUL_BASIS_OPTIONS: Array<{ value: LawfulBasis; label: string }> = [\n { value: 'consent', label: 'Consent (Section 25(1)(a))' },\n { value: 'contract', label: 'Contract (Section 25(1)(b))' },\n { value: 'legal_obligation', label: 'Legal Obligation (Section 25(1)(c))' },\n { value: 'vital_interests', label: 'Vital Interests (Section 25(1)(d))' },\n { value: 'public_interest', label: 'Public Interest (Section 25(1)(e))' },\n { value: 'legitimate_interests', label: 'Legitimate Interests (Section 25(1)(f))' },\n];\n\nconst STATUS_OPTIONS: Array<{ value: ProcessingRecord['status']; label: string }> = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'archived', label: 'Archived' },\n];\n\nconst DATA_SOURCE_OPTIONS: Array<{ value: ProcessingRecord['dataSource']; label: string }> = [\n { value: 'data_subject', label: 'Directly from Data Subject' },\n { value: 'third_party', label: 'Third Party' },\n { value: 'public_source', label: 'Public Source' },\n { value: 'other', label: 'Other' },\n];\n\ntype ViewMode = 'list' | 'form' | 'summary';\n\nfunction createEmptyRecord(): ProcessingRecord {\n const now = Date.now();\n return {\n id: `proc_${now}_${Math.random().toString(36).substring(2, 11)}`,\n name: '',\n description: '',\n controllerDetails: { name: '', contact: '', address: '' },\n lawfulBasis: 'consent',\n lawfulBasisJustification: '',\n purposes: [],\n dataCategories: [],\n dataSubjectCategories: [],\n recipients: [],\n retentionPeriod: '',\n securityMeasures: [],\n dataSource: 'data_subject',\n dpiaRequired: false,\n automatedDecisionMaking: false,\n status: 'active',\n createdAt: now,\n updatedAt: now,\n };\n}\n\nfunction formatDate(timestamp: number | undefined): string {\n if (!timestamp) return 'N/A';\n return new Date(timestamp).toLocaleDateString();\n}\n\nexport const ROPAManager: React.FC<ROPAManagerProps> = ({\n ropa,\n onAddRecord,\n onUpdateRecord,\n onArchiveRecord,\n title = 'Record of Processing Activities (ROPA)',\n description = 'Maintain a comprehensive record of all data processing activities as required by the NDPA 2023.',\n className = '',\n buttonClassName = '',\n}) => {\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [searchTerm, setSearchTerm] = useState('');\n const [statusFilter, setStatusFilter] = useState<string>('all');\n const [basisFilter, setBasisFilter] = useState<string>('all');\n const [editingRecord, setEditingRecord] = useState<ProcessingRecord | null>(null);\n const [formErrors, setFormErrors] = useState<string[]>([]);\n\n // Temporary field values for comma-separated list inputs\n const [purposesInput, setPurposesInput] = useState('');\n const [dataCategoriesInput, setDataCategoriesInput] = useState('');\n const [sensitiveDataInput, setSensitiveDataInput] = useState('');\n const [subjectCategoriesInput, setSubjectCategoriesInput] = useState('');\n const [recipientsInput, setRecipientsInput] = useState('');\n const [securityMeasuresInput, setSecurityMeasuresInput] = useState('');\n const [systemsUsedInput, setSystemsUsedInput] = useState('');\n\n const summary = useMemo(() => generateROPASummary(ropa), [ropa]);\n const complianceGaps = useMemo(() => identifyComplianceGaps(ropa), [ropa]);\n\n // Filter records\n const filteredRecords = useMemo(() => {\n let filtered = [...ropa.records];\n\n if (statusFilter !== 'all') {\n filtered = filtered.filter((r) => r.status === statusFilter);\n }\n\n if (basisFilter !== 'all') {\n filtered = filtered.filter((r) => r.lawfulBasis === basisFilter);\n }\n\n if (searchTerm) {\n const term = searchTerm.toLowerCase();\n filtered = filtered.filter(\n (r) =>\n r.name.toLowerCase().includes(term) ||\n r.description.toLowerCase().includes(term) ||\n r.dataCategories.some((c) => c.toLowerCase().includes(term)) ||\n (r.department && r.department.toLowerCase().includes(term))\n );\n }\n\n return filtered;\n }, [ropa.records, statusFilter, basisFilter, searchTerm]);\n\n // Sync form inputs when editing record changes\n useEffect(() => {\n if (editingRecord) {\n setPurposesInput(editingRecord.purposes.join(', '));\n setDataCategoriesInput(editingRecord.dataCategories.join(', '));\n setSensitiveDataInput((editingRecord.sensitiveDataCategories || []).join(', '));\n setSubjectCategoriesInput(editingRecord.dataSubjectCategories.join(', '));\n setRecipientsInput(editingRecord.recipients.join(', '));\n setSecurityMeasuresInput(editingRecord.securityMeasures.join(', '));\n setSystemsUsedInput((editingRecord.systemsUsed || []).join(', '));\n }\n }, [editingRecord?.id]);\n\n const handleNewRecord = () => {\n const newRecord = createEmptyRecord();\n // Prefill controller details from the organization\n newRecord.controllerDetails.name = ropa.organizationName;\n newRecord.controllerDetails.contact = ropa.organizationContact;\n newRecord.controllerDetails.address = ropa.organizationAddress;\n if (ropa.ndpcRegistrationNumber) {\n newRecord.controllerDetails.registrationNumber = ropa.ndpcRegistrationNumber;\n }\n if (ropa.dpoDetails) {\n newRecord.controllerDetails.dpoContact = ropa.dpoDetails.email;\n }\n setEditingRecord(newRecord);\n setFormErrors([]);\n setViewMode('form');\n };\n\n const handleEditRecord = (record: ProcessingRecord) => {\n setEditingRecord({ ...record });\n setFormErrors([]);\n setViewMode('form');\n };\n\n const parseCommaSeparated = (value: string): string[] => {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n };\n\n const handleSaveRecord = () => {\n if (!editingRecord) return;\n\n // Apply comma-separated inputs to the record\n const recordToSave: ProcessingRecord = {\n ...editingRecord,\n purposes: parseCommaSeparated(purposesInput),\n dataCategories: parseCommaSeparated(dataCategoriesInput),\n sensitiveDataCategories: parseCommaSeparated(sensitiveDataInput),\n dataSubjectCategories: parseCommaSeparated(subjectCategoriesInput),\n recipients: parseCommaSeparated(recipientsInput),\n securityMeasures: parseCommaSeparated(securityMeasuresInput),\n systemsUsed: parseCommaSeparated(systemsUsedInput),\n updatedAt: Date.now(),\n };\n\n // Remove empty sensitive data categories\n if (\n recordToSave.sensitiveDataCategories &&\n recordToSave.sensitiveDataCategories.length === 0\n ) {\n recordToSave.sensitiveDataCategories = undefined;\n }\n\n // Remove empty systems used\n if (recordToSave.systemsUsed && recordToSave.systemsUsed.length === 0) {\n recordToSave.systemsUsed = undefined;\n }\n\n const validation = validateProcessingRecord(recordToSave);\n if (!validation.valid) {\n setFormErrors(validation.errors);\n return;\n }\n\n // Check if this is a new record or an update\n const existingRecord = ropa.records.find((r) => r.id === recordToSave.id);\n if (existingRecord) {\n onUpdateRecord?.(recordToSave.id, recordToSave);\n } else {\n onAddRecord?.(recordToSave);\n }\n\n setEditingRecord(null);\n setFormErrors([]);\n setViewMode('list');\n };\n\n const handleArchiveRecord = (id: string) => {\n onArchiveRecord?.(id);\n };\n\n const handleExportCSV = () => {\n const csv = exportROPAToCSV(ropa);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `ropa_${ropa.organizationName.replace(/\\s+/g, '_').toLowerCase()}_${new Date().toISOString().slice(0, 10)}.csv`;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 100);\n };\n\n const handleCancelForm = () => {\n setEditingRecord(null);\n setFormErrors([]);\n setViewMode('list');\n };\n\n const updateEditingField = (field: string, value: any) => {\n if (!editingRecord) return;\n setEditingRecord((prev) => (prev ? { ...prev, [field]: value } : prev));\n };\n\n const updateControllerField = (field: string, value: string) => {\n if (!editingRecord) return;\n setEditingRecord((prev) =>\n prev\n ? {\n ...prev,\n controllerDetails: { ...prev.controllerDetails, [field]: value },\n }\n : prev\n );\n };\n\n const isReviewOverdue = (record: ProcessingRecord): boolean => {\n return !!record.nextReviewDate && record.nextReviewDate <= Date.now();\n };\n\n // Status badge rendering\n const renderStatusBadge = (status: ProcessingRecord['status']) => {\n const colorClasses: Record<ProcessingRecord['status'], string> = {\n active: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',\n inactive: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',\n archived: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300',\n };\n\n const labels: Record<ProcessingRecord['status'], string> = {\n active: 'Active',\n inactive: 'Inactive',\n archived: 'Archived',\n };\n\n return (\n <span className={`px-2 py-1 rounded text-xs font-medium ${colorClasses[status]}`}>\n {labels[status]}\n </span>\n );\n };\n\n // Lawful basis badge rendering\n const renderBasisBadge = (basis: LawfulBasis) => {\n const labels: Record<LawfulBasis, string> = {\n consent: 'Consent',\n contract: 'Contract',\n legal_obligation: 'Legal Obligation',\n vital_interests: 'Vital Interests',\n public_interest: 'Public Interest',\n legitimate_interests: 'Legitimate Interests',\n };\n\n return (\n <span className=\"px-2 py-1 rounded text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200\">\n {labels[basis]}\n </span>\n );\n };\n\n // Render organization header\n const renderOrganizationHeader = () => (\n <div className=\"mb-6 p-4 bg-gray-50 dark:bg-gray-700 rounded-md\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div>\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">Organization</p>\n <p className=\"text-sm font-semibold\">{ropa.organizationName}</p>\n </div>\n {ropa.dpoDetails && (\n <div>\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n Data Protection Officer\n </p>\n <p className=\"text-sm font-semibold\">{ropa.dpoDetails.name}</p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{ropa.dpoDetails.email}</p>\n </div>\n )}\n {ropa.ndpcRegistrationNumber && (\n <div>\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n NDPC Registration No.\n </p>\n <p className=\"text-sm font-semibold\">{ropa.ndpcRegistrationNumber}</p>\n </div>\n )}\n </div>\n <div className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n Version {ropa.version} | Last Updated: {formatDate(ropa.lastUpdated)}\n </div>\n </div>\n );\n\n // Render compliance summary dashboard\n const renderSummaryDashboard = () => (\n <div className=\"mb-6\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-4\">\n <div className=\"p-4 bg-blue-50 dark:bg-blue-900/20 rounded-md text-center\">\n <p className=\"text-2xl font-bold text-blue-700 dark:text-blue-300\">\n {summary.totalRecords}\n </p>\n <p className=\"text-xs text-blue-600 dark:text-blue-400\">Total Records</p>\n </div>\n <div className=\"p-4 bg-green-50 dark:bg-green-900/20 rounded-md text-center\">\n <p className=\"text-2xl font-bold text-green-700 dark:text-green-300\">\n {summary.activeRecords}\n </p>\n <p className=\"text-xs text-green-600 dark:text-green-400\">Active</p>\n </div>\n <div className=\"p-4 bg-purple-50 dark:bg-purple-900/20 rounded-md text-center\">\n <p className=\"text-2xl font-bold text-purple-700 dark:text-purple-300\">\n {summary.crossBorderRecords}\n </p>\n <p className=\"text-xs text-purple-600 dark:text-purple-400\">Cross-Border</p>\n </div>\n <div className=\"p-4 bg-orange-50 dark:bg-orange-900/20 rounded-md text-center\">\n <p className=\"text-2xl font-bold text-orange-700 dark:text-orange-300\">\n {complianceGaps.length}\n </p>\n <p className=\"text-xs text-orange-600 dark:text-orange-400\">Records with Gaps</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4 mb-4\">\n <div className=\"p-3 bg-gray-50 dark:bg-gray-700 rounded-md\">\n <p className=\"text-sm font-medium mb-2\">By Lawful Basis</p>\n {LAWFUL_BASIS_OPTIONS.map((option) => (\n <div key={option.value} className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">{option.label.split(' (')[0]}</span>\n <span className=\"font-medium\">{summary.byLawfulBasis[option.value] || 0}</span>\n </div>\n ))}\n </div>\n <div className=\"p-3 bg-gray-50 dark:bg-gray-700 rounded-md\">\n <p className=\"text-sm font-medium mb-2\">Risk Indicators</p>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Sensitive Data</span>\n <span className=\"font-medium\">{summary.sensitiveDataRecords}</span>\n </div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">DPIA Required</span>\n <span className=\"font-medium\">{summary.dpiaRequiredRecords}</span>\n </div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Automated Decisions</span>\n <span className=\"font-medium\">{summary.automatedDecisionRecords}</span>\n </div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Due for Review</span>\n <span className={`font-medium ${summary.recordsDueForReview.length > 0 ? 'text-red-600 dark:text-red-400' : ''}`}>\n {summary.recordsDueForReview.length}\n </span>\n </div>\n </div>\n {summary.topDepartments.length > 0 && (\n <div className=\"p-3 bg-gray-50 dark:bg-gray-700 rounded-md\">\n <p className=\"text-sm font-medium mb-2\">Top Departments</p>\n {summary.topDepartments.slice(0, 5).map((dept) => (\n <div key={dept.department} className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">{dept.department}</span>\n <span className=\"font-medium\">{dept.count}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {complianceGaps.length > 0 && (\n <div className=\"p-3 bg-red-50 dark:bg-red-900/20 rounded-md\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-200 mb-2\">\n Compliance Gaps Detected\n </p>\n {complianceGaps.slice(0, 5).map((gap) => (\n <div key={gap.recordId} className=\"mb-2\">\n <p className=\"text-xs font-medium text-red-700 dark:text-red-300\">{gap.recordName}</p>\n <ul className=\"list-disc list-inside\">\n {gap.gaps.map((g, i) => (\n <li key={i} className=\"text-xs text-red-600 dark:text-red-400\">\n {g}\n </li>\n ))}\n </ul>\n </div>\n ))}\n {complianceGaps.length > 5 && (\n <p className=\"text-xs text-red-600 dark:text-red-400 mt-1\">\n ...and {complianceGaps.length - 5} more record(s) with gaps.\n </p>\n )}\n </div>\n )}\n </div>\n );\n\n // Render the records table\n const renderRecordsTable = () => (\n <div>\n {/* Filters */}\n <div className=\"mb-4 grid grid-cols-1 md:grid-cols-4 gap-4\">\n <div>\n <label htmlFor=\"ropaSearch\" className=\"block text-sm font-medium mb-1\">\n Search\n </label>\n <input\n type=\"text\"\n id=\"ropaSearch\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"Search records...\"\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n <div>\n <label htmlFor=\"ropaStatusFilter\" className=\"block text-sm font-medium mb-1\">\n Status\n </label>\n <select\n id=\"ropaStatusFilter\"\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All Statuses</option>\n {STATUS_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"ropaBasisFilter\" className=\"block text-sm font-medium mb-1\">\n Lawful Basis\n </label>\n <select\n id=\"ropaBasisFilter\"\n value={basisFilter}\n onChange={(e) => setBasisFilter(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"all\">All Bases</option>\n {LAWFUL_BASIS_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label.split(' (')[0]}\n </option>\n ))}\n </select>\n </div>\n <div className=\"flex items-end space-x-2\">\n <button\n onClick={handleNewRecord}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 text-sm ${buttonClassName}`}\n >\n Add Record\n </button>\n <button\n onClick={handleExportCSV}\n className={`px-4 py-2 bg-gray-600 text-white rounded hover:bg-gray-700 text-sm ${buttonClassName}`}\n >\n Export CSV\n </button>\n </div>\n </div>\n\n {/* Table */}\n {filteredRecords.length === 0 ? (\n <p className=\"text-gray-500 dark:text-gray-400 text-sm text-center py-8\">\n No processing records found.\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm text-left\">\n <thead className=\"text-xs uppercase bg-gray-50 dark:bg-gray-700\">\n <tr>\n <th className=\"px-4 py-3\">Name</th>\n <th className=\"px-4 py-3\">Lawful Basis</th>\n <th className=\"px-4 py-3\">Data Categories</th>\n <th className=\"px-4 py-3\">Status</th>\n <th className=\"px-4 py-3\">Last Reviewed</th>\n <th className=\"px-4 py-3\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {filteredRecords.map((record) => {\n const overdue = isReviewOverdue(record);\n const hasGaps = complianceGaps.some((g) => g.recordId === record.id);\n\n return (\n <tr\n key={record.id}\n className={`border-b dark:border-gray-600 ${\n overdue\n ? 'bg-red-50 dark:bg-red-900/10'\n : hasGaps\n ? 'bg-yellow-50 dark:bg-yellow-900/10'\n : 'bg-white dark:bg-gray-800'\n } hover:bg-gray-50 dark:hover:bg-gray-700`}\n >\n <td className=\"px-4 py-3\">\n <div>\n <p className=\"font-medium\">{record.name}</p>\n {record.department && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {record.department}\n </p>\n )}\n {overdue && (\n <span className=\"text-xs text-red-600 dark:text-red-400 font-medium\">\n Review Overdue\n </span>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3\">{renderBasisBadge(record.lawfulBasis)}</td>\n <td className=\"px-4 py-3\">\n <p className=\"text-xs text-gray-600 dark:text-gray-300 max-w-xs truncate\">\n {record.dataCategories.join(', ')}\n </p>\n </td>\n <td className=\"px-4 py-3\">{renderStatusBadge(record.status)}</td>\n <td className=\"px-4 py-3 text-xs text-gray-500 dark:text-gray-400\">\n {formatDate(record.lastReviewedAt)}\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex space-x-2\">\n <button\n onClick={() => handleEditRecord(record)}\n className=\"text-blue-600 dark:text-blue-400 hover:underline text-xs\"\n >\n Edit\n </button>\n {record.status !== 'archived' && (\n <button\n onClick={() => handleArchiveRecord(record.id)}\n className=\"text-gray-600 dark:text-gray-400 hover:underline text-xs\"\n >\n Archive\n </button>\n )}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n );\n\n // Render the add/edit form\n const renderForm = () => {\n if (!editingRecord) return null;\n\n const isNew = !ropa.records.find((r) => r.id === editingRecord.id);\n\n return (\n <div>\n <div className=\"flex justify-between items-center mb-4\">\n <h3 className=\"text-lg font-medium\">\n {isNew ? 'Add Processing Record' : 'Edit Processing Record'}\n </h3>\n <button\n onClick={handleCancelForm}\n className=\"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 text-sm\"\n >\n Cancel\n </button>\n </div>\n\n {formErrors.length > 0 && (\n <div className=\"mb-4 p-3 bg-red-50 dark:bg-red-900/20 rounded-md\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-200 mb-1\">\n Please fix the following errors:\n </p>\n <ul className=\"list-disc list-inside\">\n {formErrors.map((error, i) => (\n <li key={i} className=\"text-xs text-red-600 dark:text-red-400\">\n {error}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* Basic Information */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Basic Information</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"recordName\" className=\"block text-sm font-medium mb-1\">\n Activity Name *\n </label>\n <input\n type=\"text\"\n id=\"recordName\"\n value={editingRecord.name}\n onChange={(e) => updateEditingField('name', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Customer Account Management\"\n />\n </div>\n <div>\n <label htmlFor=\"recordDepartment\" className=\"block text-sm font-medium mb-1\">\n Department\n </label>\n <input\n type=\"text\"\n id=\"recordDepartment\"\n value={editingRecord.department || ''}\n onChange={(e) => updateEditingField('department', e.target.value || undefined)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Marketing\"\n />\n </div>\n <div className=\"md:col-span-2\">\n <label htmlFor=\"recordDescription\" className=\"block text-sm font-medium mb-1\">\n Description *\n </label>\n <textarea\n id=\"recordDescription\"\n value={editingRecord.description}\n onChange={(e) => updateEditingField('description', e.target.value)}\n rows={3}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"Describe what personal data processing is performed...\"\n />\n </div>\n <div>\n <label htmlFor=\"recordStatus\" className=\"block text-sm font-medium mb-1\">\n Status *\n </label>\n <select\n id=\"recordStatus\"\n value={editingRecord.status}\n onChange={(e) =>\n updateEditingField('status', e.target.value as ProcessingRecord['status'])\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {STATUS_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </fieldset>\n\n {/* Controller Details */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Controller Details</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"controllerName\" className=\"block text-sm font-medium mb-1\">\n Controller Name *\n </label>\n <input\n type=\"text\"\n id=\"controllerName\"\n value={editingRecord.controllerDetails.name}\n onChange={(e) => updateControllerField('name', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n <div>\n <label htmlFor=\"controllerContact\" className=\"block text-sm font-medium mb-1\">\n Controller Contact *\n </label>\n <input\n type=\"text\"\n id=\"controllerContact\"\n value={editingRecord.controllerDetails.contact}\n onChange={(e) => updateControllerField('contact', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n <div className=\"md:col-span-2\">\n <label htmlFor=\"controllerAddress\" className=\"block text-sm font-medium mb-1\">\n Controller Address *\n </label>\n <input\n type=\"text\"\n id=\"controllerAddress\"\n value={editingRecord.controllerDetails.address}\n onChange={(e) => updateControllerField('address', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </fieldset>\n\n {/* Lawful Basis */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Lawful Basis (NDPA Section 25)</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"lawfulBasis\" className=\"block text-sm font-medium mb-1\">\n Lawful Basis *\n </label>\n <select\n id=\"lawfulBasis\"\n value={editingRecord.lawfulBasis}\n onChange={(e) =>\n updateEditingField('lawfulBasis', e.target.value as LawfulBasis)\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {LAWFUL_BASIS_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"lawfulBasisJustification\" className=\"block text-sm font-medium mb-1\">\n Justification *\n </label>\n <textarea\n id=\"lawfulBasisJustification\"\n value={editingRecord.lawfulBasisJustification}\n onChange={(e) =>\n updateEditingField('lawfulBasisJustification', e.target.value)\n }\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"Explain why this lawful basis applies...\"\n />\n </div>\n </div>\n </fieldset>\n\n {/* Data Details */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Data Details</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"purposes\" className=\"block text-sm font-medium mb-1\">\n Purposes * (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"purposes\"\n value={purposesInput}\n onChange={(e) => setPurposesInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Account management, Service delivery\"\n />\n </div>\n <div>\n <label htmlFor=\"dataCategories\" className=\"block text-sm font-medium mb-1\">\n Data Categories * (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"dataCategories\"\n value={dataCategoriesInput}\n onChange={(e) => setDataCategoriesInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Name, Email, Phone number\"\n />\n </div>\n <div>\n <label htmlFor=\"sensitiveData\" className=\"block text-sm font-medium mb-1\">\n Sensitive Data Categories (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"sensitiveData\"\n value={sensitiveDataInput}\n onChange={(e) => setSensitiveDataInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Health data, Biometric data\"\n />\n </div>\n <div>\n <label htmlFor=\"subjectCategories\" className=\"block text-sm font-medium mb-1\">\n Data Subject Categories * (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"subjectCategories\"\n value={subjectCategoriesInput}\n onChange={(e) => setSubjectCategoriesInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Customers, Employees\"\n />\n </div>\n <div>\n <label htmlFor=\"recipients\" className=\"block text-sm font-medium mb-1\">\n Recipients * (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"recipients\"\n value={recipientsInput}\n onChange={(e) => setRecipientsInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Payment processors, Cloud service providers\"\n />\n </div>\n <div>\n <label htmlFor=\"dataSource\" className=\"block text-sm font-medium mb-1\">\n Data Source *\n </label>\n <select\n id=\"dataSource\"\n value={editingRecord.dataSource}\n onChange={(e) =>\n updateEditingField(\n 'dataSource',\n e.target.value as ProcessingRecord['dataSource']\n )\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {DATA_SOURCE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n {editingRecord.dataSource === 'third_party' && (\n <div className=\"md:col-span-2\">\n <label\n htmlFor=\"thirdPartyDetails\"\n className=\"block text-sm font-medium mb-1\"\n >\n Third-Party Source Details *\n </label>\n <input\n type=\"text\"\n id=\"thirdPartyDetails\"\n value={editingRecord.thirdPartySourceDetails || ''}\n onChange={(e) =>\n updateEditingField('thirdPartySourceDetails', e.target.value || undefined)\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"Describe the third-party data source...\"\n />\n </div>\n )}\n </div>\n </fieldset>\n\n {/* Retention and Security */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Retention and Security</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"retentionPeriod\" className=\"block text-sm font-medium mb-1\">\n Retention Period *\n </label>\n <input\n type=\"text\"\n id=\"retentionPeriod\"\n value={editingRecord.retentionPeriod}\n onChange={(e) => updateEditingField('retentionPeriod', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., 5 years after account closure\"\n />\n </div>\n <div>\n <label htmlFor=\"retentionJustification\" className=\"block text-sm font-medium mb-1\">\n Retention Justification\n </label>\n <input\n type=\"text\"\n id=\"retentionJustification\"\n value={editingRecord.retentionJustification || ''}\n onChange={(e) =>\n updateEditingField('retentionJustification', e.target.value || undefined)\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"Why this retention period is necessary...\"\n />\n </div>\n <div className=\"md:col-span-2\">\n <label htmlFor=\"securityMeasures\" className=\"block text-sm font-medium mb-1\">\n Security Measures * (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"securityMeasures\"\n value={securityMeasuresInput}\n onChange={(e) => setSecurityMeasuresInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., Encryption at rest, Access controls, Audit logging\"\n />\n </div>\n <div>\n <label htmlFor=\"systemsUsed\" className=\"block text-sm font-medium mb-1\">\n Systems Used (comma-separated)\n </label>\n <input\n type=\"text\"\n id=\"systemsUsed\"\n value={systemsUsedInput}\n onChange={(e) => setSystemsUsedInput(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"e.g., CRM, ERP, Cloud Storage\"\n />\n </div>\n </div>\n </fieldset>\n\n {/* Risk Indicators */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Risk Indicators</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"dpiaRequired\"\n checked={editingRecord.dpiaRequired}\n onChange={(e) => updateEditingField('dpiaRequired', e.target.checked)}\n className=\"rounded border-gray-300 dark:border-gray-600\"\n />\n <label htmlFor=\"dpiaRequired\" className=\"text-sm font-medium\">\n DPIA Required\n </label>\n </div>\n {editingRecord.dpiaRequired && (\n <div>\n <label htmlFor=\"dpiaReference\" className=\"block text-sm font-medium mb-1\">\n DPIA Reference *\n </label>\n <input\n type=\"text\"\n id=\"dpiaReference\"\n value={editingRecord.dpiaReference || ''}\n onChange={(e) =>\n updateEditingField('dpiaReference', e.target.value || undefined)\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"Reference to the completed DPIA\"\n />\n </div>\n )}\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"automatedDecisionMaking\"\n checked={editingRecord.automatedDecisionMaking}\n onChange={(e) =>\n updateEditingField('automatedDecisionMaking', e.target.checked)\n }\n className=\"rounded border-gray-300 dark:border-gray-600\"\n />\n <label htmlFor=\"automatedDecisionMaking\" className=\"text-sm font-medium\">\n Automated Decision-Making\n </label>\n </div>\n {editingRecord.automatedDecisionMaking && (\n <div>\n <label\n htmlFor=\"automatedDecisionMakingDetails\"\n className=\"block text-sm font-medium mb-1\"\n >\n Automated Decision-Making Details *\n </label>\n <textarea\n id=\"automatedDecisionMakingDetails\"\n value={editingRecord.automatedDecisionMakingDetails || ''}\n onChange={(e) =>\n updateEditingField(\n 'automatedDecisionMakingDetails',\n e.target.value || undefined\n )\n }\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder=\"Describe the automated decision-making process...\"\n />\n </div>\n )}\n </div>\n </fieldset>\n\n {/* Review Schedule */}\n <fieldset className=\"border border-gray-200 dark:border-gray-600 rounded-md p-4\">\n <legend className=\"text-sm font-medium px-2\">Review Schedule</legend>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"nextReviewDate\" className=\"block text-sm font-medium mb-1\">\n Next Review Date\n </label>\n <input\n type=\"date\"\n id=\"nextReviewDate\"\n value={\n editingRecord.nextReviewDate\n ? new Date(editingRecord.nextReviewDate).toISOString().slice(0, 10)\n : ''\n }\n onChange={(e) =>\n updateEditingField(\n 'nextReviewDate',\n e.target.value ? new Date(e.target.value).getTime() : undefined\n )\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </fieldset>\n\n {/* Save / Cancel */}\n <div className=\"flex justify-end space-x-3\">\n <button\n onClick={handleCancelForm}\n className=\"px-4 py-2 border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-50 dark:hover:bg-gray-700 text-sm\"\n >\n Cancel\n </button>\n <button\n onClick={handleSaveRecord}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 text-sm ${buttonClassName}`}\n >\n {isNew ? 'Add Record' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n // View mode tabs\n const renderViewTabs = () => (\n <div className=\"flex space-x-4 mb-6 border-b border-gray-200 dark:border-gray-600\">\n <button\n onClick={() => setViewMode('list')}\n className={`pb-2 text-sm font-medium ${\n viewMode === 'list'\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400'\n : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'\n }`}\n >\n Processing Records\n </button>\n <button\n onClick={() => setViewMode('summary')}\n className={`pb-2 text-sm font-medium ${\n viewMode === 'summary'\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400'\n : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'\n }`}\n >\n Compliance Summary\n </button>\n </div>\n );\n\n return (\n <div className={`bg-white dark:bg-gray-800 p-6 rounded-lg shadow-md ${className}`}>\n <h2 className=\"text-xl font-bold mb-2\">{title}</h2>\n <p className=\"mb-6 text-gray-600 dark:text-gray-300\">{description}</p>\n\n {renderOrganizationHeader()}\n\n {viewMode !== 'form' && renderViewTabs()}\n\n {viewMode === 'list' && renderRecordsTable()}\n {viewMode === 'summary' && renderSummaryDashboard()}\n {viewMode === 'form' && renderForm()}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/utils/privacy.ts"],"names":["generatePolicyText","sectionsOrTemplate","organizationInfoOrVariables","template","variableMap","result","variableRegex","match","variable","replacement","sections","organizationInfo","sectionTexts","missingVariables","section","a","b","content","contentVariables"],"mappings":"AAQO,SAASA,EACdC,CAAAA,CACAC,CAAAA,CAKA,CAEA,GAAI,OAAOD,CAAAA,EAAuB,QAAA,CAAU,CAC1C,IAAME,EAAWF,CAAAA,CACXG,CAAAA,CAAcF,EAGhBG,CAAAA,CAASF,CAAAA,CACPG,EAAgB,kBAAA,CAClBC,CAAAA,CAGJ,KAAA,CAAQA,CAAAA,CAAQD,EAAc,IAAA,CAAKH,CAAQ,CAAA,IAAO,IAAA,EAAM,CACtD,IAAMK,CAAAA,CAAWD,CAAAA,CAAM,CAAC,EAAE,IAAA,EAAK,CACzBE,EAAcL,CAAAA,CAAYI,CAAQ,GAAK,EAAA,CAG7CH,CAAAA,CAASA,CAAAA,CAAO,OAAA,CACd,IAAI,MAAA,CAAO,CAAA,UAAA,EAAaG,CAAQ,CAAA,UAAA,CAAA,CAAc,GAAG,CAAA,CACjDC,CACF,EACF,CAEA,OAAOJ,CACT,CAAA,KAEK,CACH,IAAMK,CAAAA,CAAWT,EACXU,CAAAA,CAAmBT,CAAAA,CACnBU,CAAAA,CAAuC,GACvCC,CAAAA,CAA6B,EAAC,CAGpC,OAAAH,EACG,MAAA,CAAOI,CAAAA,EAAWA,CAAAA,CAAQ,QAAQ,EAClC,IAAA,CAAK,CAACC,EAAGC,CAAAA,GAAAA,CAAOD,CAAAA,CAAE,OAAS,CAAA,GAAMC,CAAAA,CAAE,KAAA,EAAS,CAAA,CAAE,EAC9C,OAAA,CAAQF,CAAAA,EAAW,CAElB,IAAIG,EAAUH,CAAAA,CAAQ,QAAA,EAAYA,CAAAA,CAAQ,aAAA,EAAiBA,EAAQ,cAAA,EAAkB,EAAA,CAG/ER,EAAgB,kBAAA,CAClBC,CAAAA,CAGEW,EAA6B,EAAC,CACpC,KAAA,CAAQX,CAAAA,CAAQD,EAAc,IAAA,CAAKW,CAAO,CAAA,IAAO,IAAA,EAC/CC,EAAiB,IAAA,CAAKX,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAIvCW,EAAiB,OAAA,CAAQV,CAAAA,EAAY,CACnC,IAAIC,CAAAA,CAAc,EAAA,CAGdD,CAAAA,IAAYG,IACdF,CAAAA,CAAcE,CAAAA,CAAiBH,CAAkC,CAAA,EAAe,IAI7EC,CAAAA,EACHI,CAAAA,CAAiB,IAAA,CAAKL,CAAQ,EAIhCS,CAAAA,CAAUA,CAAAA,CAAQ,QAChB,IAAI,MAAA,CAAO,aAAaT,CAAQ,CAAA,UAAA,CAAA,CAAc,GAAG,CAAA,CACjDC,CACF,EACF,CAAC,CAAA,CAGDG,CAAAA,CAAaE,EAAQ,EAAE,CAAA,CAAIG,EAC7B,CAAC,EAKI,CACL,QAAA,CAHe,OAAO,MAAA,CAAOL,CAAY,EAAE,IAAA,CAAK;;AAAA,CAAM,CAAA,CAItD,YAAA,CAAAA,CAAAA,CACA,gBAAA,CAAkB,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAIC,CAAgB,CAAC,CACxD,CACF,CACF","file":"chunk-UYP64PV7.mjs","sourcesContent":["import { PolicySection, OrganizationInfo, PolicyVariable } from '../types/privacy';\n\n/**\n * Generates policy text by replacing variables in a template with organization-specific values\n * @param sectionsOrTemplate The policy sections or template string to generate text for\n * @param organizationInfoOrVariables The organization information or variable map to use for replacement\n * @returns The generated policy text or an object with the generated text and metadata\n */\nexport function generatePolicyText(\n sectionsOrTemplate: PolicySection[] | string,\n organizationInfoOrVariables: OrganizationInfo | Record<string, string>\n): string | {\n fullText: string;\n sectionTexts: Record<string, string>;\n missingVariables: string[];\n} {\n // Check if we're using the new API (template string and variable map)\n if (typeof sectionsOrTemplate === 'string') {\n const template = sectionsOrTemplate;\n const variableMap = organizationInfoOrVariables as Record<string, string>;\n \n // Replace variables in the template\n let result = template;\n const variableRegex = /\\{\\{([^}]+)\\}\\}/g;\n let match;\n \n // Find and replace all variables in the content\n while ((match = variableRegex.exec(template)) !== null) {\n const variable = match[1].trim();\n const replacement = variableMap[variable] || '';\n \n // Replace the variable in the content\n result = result.replace(\n new RegExp(`\\\\{\\\\{\\\\s*${variable}\\\\s*\\\\}\\\\}`, 'g'), \n replacement\n );\n }\n \n return result;\n } \n // Otherwise use the original API (sections array and organization info)\n else {\n const sections = sectionsOrTemplate;\n const organizationInfo = organizationInfoOrVariables as OrganizationInfo;\n const sectionTexts: Record<string, string> = {};\n const missingVariables: string[] = [];\n \n // Process each section\n sections\n .filter(section => section.included)\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .forEach(section => {\n // Use template if available, otherwise fall back to custom/default content\n let content = section.template || section.customContent || section.defaultContent || '';\n \n // Replace variables in the content\n const variableRegex = /\\{\\{([^}]+)\\}\\}/g;\n let match;\n \n // Find all variables in the content\n const contentVariables: string[] = [];\n while ((match = variableRegex.exec(content)) !== null) {\n contentVariables.push(match[1].trim());\n }\n \n // Replace each variable with its value\n contentVariables.forEach(variable => {\n let replacement = '';\n \n // Check if the variable exists in organizationInfo\n if (variable in organizationInfo) {\n replacement = organizationInfo[variable as keyof OrganizationInfo] as string || '';\n }\n \n // If replacement is empty, add to missing variables\n if (!replacement) {\n missingVariables.push(variable);\n }\n \n // Replace the variable in the content\n content = content.replace(\n new RegExp(`\\\\{\\\\{\\\\s*${variable}\\\\s*\\\\}\\\\}`, 'g'), \n replacement\n );\n });\n \n // Store the processed section text\n sectionTexts[section.id] = content;\n });\n \n // Combine all sections into full text\n const fullText = Object.values(sectionTexts).join('\\n\\n');\n \n return {\n fullText,\n sectionTexts,\n missingVariables: Array.from(new Set(missingVariables)) // Remove duplicates\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/hooks/useCrossBorderTransfer.ts"],"names":["useCrossBorderTransfer","initialTransfers","storageKey","useLocalStorage","onAdd","onUpdate","onRemove","transfers","setTransfers","useState","useEffect","savedData","error","generateId","addTransfer","useCallback","transferData","now","newTransfer","__spreadProps","__spreadValues","prev","updateTransfer","id","updates","updatedTransfer","index","t","newTransfers","removeTransfer","found","getTransfer","getSummary","activeTransfers","allMechanisms","byMechanism","mechanism","allStatuses","byAdequacy","status","pendingApproval","_a","_b","thirtyDaysMs","dueForReview","missingTIA","highRiskTransfers","validateTransfer","transfer"],"mappings":"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","file":"chunk-VMJBW3EF.mjs","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport {\n CrossBorderTransfer,\n CrossBorderSummary,\n TransferMechanism,\n AdequacyStatus,\n} from '../types/cross-border';\nimport {\n validateTransfer as validateTransferUtil,\n TransferValidationResult,\n} from '../utils/cross-border';\n\ninterface UseCrossBorderTransferOptions {\n /**\n * Initial transfers to load\n */\n initialTransfers?: CrossBorderTransfer[];\n\n /**\n * Storage key for transfer data\n * @default \"ndpr_cross_border_transfers\"\n */\n storageKey?: string;\n\n /**\n * Whether to use local storage to persist transfers\n * @default true\n */\n useLocalStorage?: boolean;\n\n /**\n * Callback function called when a transfer is added\n */\n onAdd?: (transfer: CrossBorderTransfer) => void;\n\n /**\n * Callback function called when a transfer is updated\n */\n onUpdate?: (transfer: CrossBorderTransfer) => void;\n\n /**\n * Callback function called when a transfer is removed\n */\n onRemove?: (id: string) => void;\n}\n\ninterface UseCrossBorderTransferReturn {\n /**\n * All cross-border transfers\n */\n transfers: CrossBorderTransfer[];\n\n /**\n * Add a new cross-border transfer\n */\n addTransfer: (\n transfer: Omit<CrossBorderTransfer, 'id' | 'createdAt' | 'updatedAt'>\n ) => CrossBorderTransfer;\n\n /**\n * Update an existing cross-border transfer\n */\n updateTransfer: (\n id: string,\n updates: Partial<CrossBorderTransfer>\n ) => CrossBorderTransfer | null;\n\n /**\n * Remove a cross-border transfer\n */\n removeTransfer: (id: string) => boolean;\n\n /**\n * Get a cross-border transfer by ID\n */\n getTransfer: (id: string) => CrossBorderTransfer | null;\n\n /**\n * Get a compliance summary of all cross-border transfers\n */\n getSummary: () => CrossBorderSummary;\n\n /**\n * Validate a cross-border transfer\n */\n validateTransfer: (transfer: CrossBorderTransfer) => TransferValidationResult;\n}\n\n/**\n * Hook for managing cross-border data transfers in compliance with NDPA Part VI (Sections 41-45)\n */\nexport function useCrossBorderTransfer({\n initialTransfers = [],\n storageKey = 'ndpr_cross_border_transfers',\n useLocalStorage = true,\n onAdd,\n onUpdate,\n onRemove,\n}: UseCrossBorderTransferOptions = {}): UseCrossBorderTransferReturn {\n const [transfers, setTransfers] = useState<CrossBorderTransfer[]>(initialTransfers);\n\n // Load transfers from storage on mount\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined') {\n try {\n const savedData = localStorage.getItem(storageKey);\n if (savedData) {\n setTransfers(JSON.parse(savedData));\n }\n } catch (error) {\n console.error('Error loading cross-border transfers:', error);\n }\n }\n }, [storageKey, useLocalStorage]);\n\n // Save transfers to storage when they change\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined') {\n try {\n localStorage.setItem(storageKey, JSON.stringify(transfers));\n } catch (error) {\n console.error('Error saving cross-border transfers:', error);\n }\n }\n }, [transfers, storageKey, useLocalStorage]);\n\n // Generate a unique ID\n const generateId = (): string => {\n return 'cbt_' + Date.now() + '_' + Math.random().toString(36).substring(2, 11);\n };\n\n // Add a new transfer\n const addTransfer = useCallback(\n (\n transferData: Omit<CrossBorderTransfer, 'id' | 'createdAt' | 'updatedAt'>\n ): CrossBorderTransfer => {\n const now = Date.now();\n const newTransfer: CrossBorderTransfer = {\n ...transferData,\n id: generateId(),\n createdAt: now,\n updatedAt: now,\n };\n\n setTransfers((prev) => [...prev, newTransfer]);\n\n if (onAdd) {\n onAdd(newTransfer);\n }\n\n return newTransfer;\n },\n [onAdd]\n );\n\n // Update an existing transfer\n const updateTransfer = useCallback(\n (id: string, updates: Partial<CrossBorderTransfer>): CrossBorderTransfer | null => {\n let updatedTransfer: CrossBorderTransfer | null = null;\n\n setTransfers((prev) => {\n const index = prev.findIndex((t) => t.id === id);\n if (index === -1) {\n return prev;\n }\n\n updatedTransfer = {\n ...prev[index],\n ...updates,\n updatedAt: Date.now(),\n };\n\n const newTransfers = [...prev];\n newTransfers[index] = updatedTransfer as CrossBorderTransfer;\n return newTransfers;\n });\n\n if (updatedTransfer && onUpdate) {\n onUpdate(updatedTransfer);\n }\n\n return updatedTransfer;\n },\n [onUpdate]\n );\n\n // Remove a transfer\n const removeTransfer = useCallback(\n (id: string): boolean => {\n let found = false;\n\n setTransfers((prev) => {\n const index = prev.findIndex((t) => t.id === id);\n if (index === -1) {\n return prev;\n }\n found = true;\n return prev.filter((t) => t.id !== id);\n });\n\n if (found && onRemove) {\n onRemove(id);\n }\n\n return found;\n },\n [onRemove]\n );\n\n // Get a transfer by ID\n const getTransfer = useCallback(\n (id: string): CrossBorderTransfer | null => {\n return transfers.find((t) => t.id === id) || null;\n },\n [transfers]\n );\n\n // Get compliance summary\n const getSummary = useCallback((): CrossBorderSummary => {\n const now = Date.now();\n const activeTransfers = transfers.filter((t) => t.status === 'active');\n\n // Breakdown by mechanism\n const allMechanisms: TransferMechanism[] = [\n 'adequacy_decision',\n 'standard_clauses',\n 'binding_corporate_rules',\n 'ndpc_authorization',\n 'explicit_consent',\n 'contract_performance',\n 'public_interest',\n 'legal_claims',\n 'vital_interests',\n ];\n const byMechanism = {} as Record<TransferMechanism, number>;\n for (const mechanism of allMechanisms) {\n byMechanism[mechanism] = activeTransfers.filter(\n (t) => t.transferMechanism === mechanism\n ).length;\n }\n\n // Breakdown by adequacy\n const allStatuses: AdequacyStatus[] = ['adequate', 'inadequate', 'pending_review', 'unknown'];\n const byAdequacy = {} as Record<AdequacyStatus, number>;\n for (const status of allStatuses) {\n byAdequacy[status] = activeTransfers.filter(\n (t) => t.adequacyStatus === status\n ).length;\n }\n\n // Transfers pending NDPC approval\n const pendingApproval = transfers.filter(\n (t) => t.status === 'pending_approval' || (t.ndpcApproval?.required && !t.ndpcApproval?.approved)\n );\n\n // Transfers due for review (within the next 30 days or overdue)\n const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;\n const dueForReview = transfers.filter(\n (t) => t.reviewDate && t.reviewDate <= now + thirtyDaysMs && t.status === 'active'\n );\n\n // Transfers missing TIA\n const missingTIA = transfers.filter(\n (t) => !t.tiaCompleted && t.status === 'active'\n );\n\n // High-risk transfers\n const highRiskTransfers = transfers.filter(\n (t) => t.riskLevel === 'high' && t.status === 'active'\n );\n\n return {\n totalActiveTransfers: activeTransfers.length,\n byMechanism,\n byAdequacy,\n pendingApproval,\n dueForReview,\n missingTIA,\n highRiskTransfers,\n lastUpdated: now,\n };\n }, [transfers]);\n\n // Validate a transfer (wrapper around utility)\n const validateTransfer = useCallback(\n (transfer: CrossBorderTransfer): TransferValidationResult => {\n return validateTransferUtil(transfer);\n },\n []\n );\n\n return {\n transfers,\n addTransfer,\n updateTransfer,\n removeTransfer,\n getTransfer,\n getSummary,\n validateTransfer,\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/hooks/useDSR.ts"],"names":["useDSR","initialRequests","requestTypes","storageKey","useLocalStorage","onSubmit","onUpdate","requests","setRequests","useState","useEffect","savedRequests","error","generateId","requestData","requestType","type","estimatedCompletionDays","now","estimatedCompletionDate","_a","createdAt","restRequestData","__objRest","newRequest","__spreadValues","prevRequests","id","updates","updatedRequest","index","request","__spreadProps","newRequests","status","typeId","formattedRequest","formatDSRRequest"],"mappings":"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","file":"chunk-WW3X3ELF.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { DSRRequest, RequestStatus, RequestType } from '../types/dsr';\nimport { formatDSRRequest } from '../utils/dsr';\n\ninterface UseDSROptions {\n /**\n * Initial requests to load\n */\n initialRequests?: DSRRequest[];\n \n /**\n * Available request types\n */\n requestTypes: RequestType[];\n \n /**\n * Storage key for requests\n * @default \"ndpr_dsr_requests\"\n */\n storageKey?: string;\n \n /**\n * Whether to use local storage to persist requests\n * @default true\n */\n useLocalStorage?: boolean;\n \n /**\n * Callback function called when a request is submitted\n */\n onSubmit?: (request: DSRRequest) => void;\n \n /**\n * Callback function called when a request is updated\n */\n onUpdate?: (request: DSRRequest) => void;\n}\n\ninterface UseDSRReturn {\n /**\n * All requests\n */\n requests: DSRRequest[];\n \n /**\n * Submit a new request\n */\n submitRequest: (requestData: Omit<DSRRequest, 'id' | 'status' | 'submittedAt' | 'updatedAt' | 'estimatedCompletionDate'>) => DSRRequest;\n \n /**\n * Update an existing request\n */\n updateRequest: (id: string, updates: Partial<DSRRequest>) => DSRRequest | null;\n \n /**\n * Get a request by ID\n */\n getRequest: (id: string) => DSRRequest | null;\n \n /**\n * Get requests by status\n */\n getRequestsByStatus: (status: RequestStatus) => DSRRequest[];\n \n /**\n * Get requests by type\n */\n getRequestsByType: (type: string) => DSRRequest[];\n \n /**\n * Get the request type definition by ID\n */\n getRequestType: (typeId: string) => RequestType | undefined;\n \n /**\n * Format a request for display or submission\n */\n formatRequest: (request: DSRRequest) => Record<string, any>;\n \n /**\n * Clear all requests\n */\n clearRequests: () => void;\n}\n\n/**\n * Hook for managing Data Subject Requests in compliance with the NDPA\n */\nexport function useDSR({\n initialRequests = [],\n requestTypes,\n storageKey = \"ndpr_dsr_requests\",\n useLocalStorage = true,\n onSubmit,\n onUpdate\n}: UseDSROptions): UseDSRReturn {\n const [requests, setRequests] = useState<DSRRequest[]>(initialRequests);\n \n // Load requests from storage on mount\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined') {\n try {\n const savedRequests = localStorage.getItem(storageKey);\n if (savedRequests) {\n setRequests(JSON.parse(savedRequests));\n }\n } catch (error) {\n console.error('Error loading DSR requests:', error);\n }\n }\n }, [storageKey, useLocalStorage]);\n \n // Save requests to storage when they change\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined' && requests.length > 0) {\n try {\n localStorage.setItem(storageKey, JSON.stringify(requests));\n } catch (error) {\n console.error('Error saving DSR requests:', error);\n }\n }\n }, [requests, storageKey, useLocalStorage]);\n \n // Generate a unique ID\n const generateId = (): string => {\n return 'dsr_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n };\n \n // Submit a new request\n const submitRequest = (requestData: Omit<DSRRequest, 'id' | 'status' | 'submittedAt' | 'updatedAt' | 'estimatedCompletionDate'>): DSRRequest => {\n // Find the request type to get the estimated completion time\n const requestType = requestTypes.find(type => type.id === requestData.type);\n const estimatedCompletionDays = requestType?.estimatedCompletionTime || 30; // Default to 30 days\n \n const now = Date.now();\n const estimatedCompletionDate = now + (estimatedCompletionDays * 24 * 60 * 60 * 1000);\n \n // Extract any properties we want to override from requestData\n const { createdAt, ...restRequestData } = requestData as any;\n \n const newRequest: DSRRequest = {\n id: generateId(),\n status: 'pending',\n createdAt: now,\n updatedAt: now,\n dueDate: estimatedCompletionDate,\n ...restRequestData\n };\n \n setRequests(prevRequests => [...prevRequests, newRequest]);\n \n if (onSubmit) {\n onSubmit(newRequest);\n }\n \n return newRequest;\n };\n \n // Update an existing request\n const updateRequest = (id: string, updates: Partial<DSRRequest>): DSRRequest | null => {\n let updatedRequest: DSRRequest | null = null;\n \n setRequests(prevRequests => {\n const index = prevRequests.findIndex(request => request.id === id);\n \n if (index === -1) {\n return prevRequests;\n }\n \n const request = prevRequests[index];\n updatedRequest = {\n ...request,\n ...updates,\n updatedAt: Date.now()\n };\n \n const newRequests = [...prevRequests];\n newRequests[index] = updatedRequest as DSRRequest;\n \n return newRequests;\n });\n \n if (updatedRequest && onUpdate) {\n onUpdate(updatedRequest);\n }\n \n return updatedRequest;\n };\n \n // Get a request by ID\n const getRequest = (id: string): DSRRequest | null => {\n return requests.find(request => request.id === id) || null;\n };\n \n // Get requests by status\n const getRequestsByStatus = (status: RequestStatus): DSRRequest[] => {\n return requests.filter(request => request.status === status);\n };\n \n // Get requests by type\n const getRequestsByType = (type: string): DSRRequest[] => {\n return requests.filter(request => request.type === type);\n };\n \n // Get the request type definition by ID\n const getRequestType = (typeId: string): RequestType | undefined => {\n return requestTypes.find(type => type.id === typeId);\n };\n \n // Format a request for display or submission\n const formatRequest = (request: DSRRequest): Record<string, any> => {\n const { formattedRequest } = formatDSRRequest(request);\n return formattedRequest;\n };\n \n // Clear all requests\n const clearRequests = () => {\n setRequests([]);\n \n if (useLocalStorage && typeof window !== 'undefined') {\n localStorage.removeItem(storageKey);\n }\n };\n \n return {\n requests,\n submitRequest,\n updateRequest,\n getRequest,\n getRequestsByStatus,\n getRequestsByType,\n getRequestType,\n formatRequest,\n clearRequests\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-WWT2ZSNU.mjs"}
|
package/dist/chunk-XMKA6GVK.mjs
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import e from'react';var j=({sections:d,answers:b,onAnswerChange:g,currentSectionIndex:y,onNextSection:k,onPrevSection:h,validationErrors:N={},readOnly:o=false,className:v="",buttonClassName:c="",nextButtonText:n="Next",prevButtonText:f="Previous",submitButtonText:w="Submit",showProgress:P=true,progress:u})=>{let s=d[y],i=y===d.length-1,p=t=>t.showWhen?t.showWhen.every(x=>{let l=b[x.questionId];switch(x.operator){case "equals":return l===x.value;case "contains":return Array.isArray(l)?l.includes(x.value):false;case "greaterThan":return typeof l=="number"?l>x.value:false;case "lessThan":return typeof l=="number"?l<x.value:false;default:return true}}):true,A=t=>{if(!p(t))return null;let x=N[t.id],l=b[t.id];return e.createElement("div",{key:t.id,className:"mb-6"},e.createElement("div",{className:"mb-2"},e.createElement("label",{htmlFor:t.id,className:"block text-sm font-medium text-gray-900 dark:text-gray-100"},t.text,t.required&&e.createElement("span",{className:"text-red-500 ml-1"},"*")),t.guidance&&e.createElement("p",{className:"mt-1 text-sm text-gray-500 dark:text-gray-400"},t.guidance)),t.type==="text"&&e.createElement("input",{type:"text",id:t.id,value:l||"",onChange:a=>g(t.id,a.target.value),disabled:o,className:`w-full px-3 py-2 border rounded-md ${x?"border-red-500":"border-gray-300 dark:border-gray-600"} focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`}),t.type==="textarea"&&e.createElement("textarea",{id:t.id,value:l||"",onChange:a=>g(t.id,a.target.value),disabled:o,rows:4,className:`w-full px-3 py-2 border rounded-md ${x?"border-red-500":"border-gray-300 dark:border-gray-600"} focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`}),t.type==="select"&&t.options&&e.createElement("select",{id:t.id,value:l||"",onChange:a=>g(t.id,a.target.value),disabled:o,className:`w-full px-3 py-2 border rounded-md ${x?"border-red-500":"border-gray-300 dark:border-gray-600"} focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`},e.createElement("option",{value:""},"Select an option"),t.options.map(a=>e.createElement("option",{key:a.value,value:a.value},a.label))),t.type==="radio"&&t.options&&e.createElement("div",{className:"space-y-2"},t.options.map(a=>e.createElement("div",{key:a.value,className:"flex items-center"},e.createElement("input",{type:"radio",id:`${t.id}_${a.value}`,name:t.id,value:a.value,checked:l===a.value,onChange:()=>g(t.id,a.value),disabled:o,className:"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 dark:border-gray-600"}),e.createElement("label",{htmlFor:`${t.id}_${a.value}`,className:"ml-2 block text-sm text-gray-900 dark:text-gray-100"},a.label,a.riskLevel&&e.createElement("span",{className:`ml-2 text-xs px-2 py-1 rounded ${a.riskLevel==="low"?"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200":a.riskLevel==="medium"?"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200":"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"}`},a.riskLevel.charAt(0).toUpperCase()+a.riskLevel.slice(1)," Risk"))))),t.type==="checkbox"&&t.options&&e.createElement("div",{className:"space-y-2"},t.options.map(a=>e.createElement("div",{key:a.value,className:"flex items-center"},e.createElement("input",{type:"checkbox",id:`${t.id}_${a.value}`,value:a.value,checked:Array.isArray(l)?l.includes(a.value):false,onChange:$=>{let D=Array.isArray(l)?[...l]:[];$.target.checked?g(t.id,[...D,a.value]):g(t.id,D.filter(S=>S!==a.value));},disabled:o,className:"h-4 w-4 rounded text-blue-600 focus:ring-blue-500 border-gray-300 dark:border-gray-600"}),e.createElement("label",{htmlFor:`${t.id}_${a.value}`,className:"ml-2 block text-sm text-gray-900 dark:text-gray-100"},a.label)))),t.type==="scale"&&e.createElement("div",null,e.createElement("div",{className:"flex justify-between mb-2"},t.scaleLabels&&Object.entries(t.scaleLabels).map(([a,$])=>e.createElement("div",{key:a,className:"text-xs text-gray-500 dark:text-gray-400 text-center",style:{width:`${100/Object.keys(t.scaleLabels||{}).length}%`}},$))),e.createElement("input",{type:"range",id:t.id,min:t.minValue||1,max:t.maxValue||5,value:l||t.minValue||1,onChange:a=>g(t.id,parseInt(a.target.value,10)),disabled:o,className:"w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"}),e.createElement("div",{className:"mt-1 text-sm text-gray-500 dark:text-gray-400 text-center"},"Selected value: ",l||t.minValue||1)),x&&e.createElement("p",{className:"mt-1 text-sm text-red-500"},x))};return s?e.createElement("div",{className:`bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 ${v}`},P&&e.createElement("div",{className:"mb-6"},e.createElement("div",{className:"flex justify-between text-sm text-gray-500 dark:text-gray-400 mb-1"},e.createElement("span",null,"Section ",y+1," of ",d.length),e.createElement("span",null,u!==void 0?`${u}% Complete`:"")),e.createElement("div",{className:"w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700"},e.createElement("div",{className:"bg-blue-600 h-2.5 rounded-full",style:{width:`${u!==void 0?u:(y+1)/d.length*100}%`}}))),e.createElement("h2",{className:"text-xl font-bold mb-2 text-gray-900 dark:text-white"},s.title),s.description&&e.createElement("p",{className:"mb-6 text-gray-600 dark:text-gray-300"},s.description),e.createElement("div",{className:"space-y-6"},s.questions.map(t=>A(t))),e.createElement("div",{className:"mt-8 flex justify-between"},e.createElement("button",{type:"button",onClick:h,disabled:y===0||o,className:`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 disabled:opacity-50 disabled:cursor-not-allowed ${c}`},f),e.createElement("button",{type:"button",onClick:k,disabled:o,className:`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed ${c}`},i?w:n))):e.createElement("div",null,"No section found.")};var T=({result:d,sections:b,showFullReport:g=true,allowPrint:y=true,allowExport:k=true,onExport:h,className:N="",buttonClassName:o=""})=>{let v=s=>new Date(s).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"}),f=s=>{let i=d.answers[s];return i==null?"Not answered":typeof i=="boolean"?i?"Yes":"No":Array.isArray(i)?i.join(", "):String(i)},w=()=>{window.print();},P=s=>{h&&h(s);},u=s=>e.createElement("span",{className:`px-2 py-1 rounded text-xs font-medium ${{low:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",medium:"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",high:"bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200",critical:"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"}[s]}`},s.charAt(0).toUpperCase()+s.slice(1));return e.createElement("div",{className:`bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 print:shadow-none print:p-0 ${N}`},e.createElement("div",{className:"mb-8 border-b border-gray-200 dark:border-gray-700 pb-6 print:pb-4"},e.createElement("div",{className:"flex justify-between items-start"},e.createElement("div",null,e.createElement("h1",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-2"},"Data Protection Impact Assessment Report"),e.createElement("h2",{className:"text-xl text-gray-700 dark:text-gray-300 mb-4"},d.title)),(y||k)&&e.createElement("div",{className:"flex space-x-2 print:hidden"},y&&e.createElement("button",{onClick:w,className:`px-3 py-1 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${o}`},e.createElement("span",{className:"flex items-center"},e.createElement("svg",{className:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"})),"Print")),k&&e.createElement("div",{className:"relative inline-block"},e.createElement("button",{onClick:()=>P("pdf"),className:`px-3 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 ${o}`},e.createElement("span",{className:"flex items-center"},e.createElement("svg",{className:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})),"Export PDF"))))),e.createElement("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4"},e.createElement("div",null,e.createElement("p",{className:"text-sm text-gray-500 dark:text-gray-400"},e.createElement("span",{className:"font-medium"},"Assessor:")," ",d.assessor.name,", ",d.assessor.role),e.createElement("p",{className:"text-sm text-gray-500 dark:text-gray-400"},e.createElement("span",{className:"font-medium"},"Contact:")," ",d.assessor.email)),e.createElement("div",null,e.createElement("p",{className:"text-sm text-gray-500 dark:text-gray-400"},e.createElement("span",{className:"font-medium"},"Started:")," ",v(d.startedAt)),e.createElement("p",{className:"text-sm text-gray-500 dark:text-gray-400"},e.createElement("span",{className:"font-medium"},"Completed:")," ",d.completedAt?v(d.completedAt):"In progress"),e.createElement("p",{className:"text-sm text-gray-500 dark:text-gray-400"},e.createElement("span",{className:"font-medium"},"Next review:")," ",d.reviewDate?v(d.reviewDate):"Not scheduled")))),e.createElement("div",{className:"mb-8"},e.createElement("h2",{className:"text-xl font-bold text-gray-900 dark:text-white mb-4"},"Executive Summary"),e.createElement("div",{className:"bg-gray-50 dark:bg-gray-700 p-4 rounded-md mb-4"},e.createElement("div",{className:"flex items-center mb-2"},e.createElement("span",{className:"font-medium mr-2"},"Overall Risk Level:"),u(d.overallRiskLevel)),e.createElement("div",{className:"mb-2"},e.createElement("span",{className:"font-medium"},"Conclusion:")," ",d.conclusion),e.createElement("div",null,e.createElement("span",{className:"font-medium"},"Can Proceed:")," ",d.canProceed?"Yes":"No")),e.createElement("div",null,e.createElement("h3",{className:"font-medium text-gray-900 dark:text-white mb-2"},"Processing Activity Description"),e.createElement("p",{className:"text-gray-700 dark:text-gray-300 mb-4"},d.processingDescription),d.recommendations&&d.recommendations.length>0&&e.createElement("div",null,e.createElement("h3",{className:"font-medium text-gray-900 dark:text-white mb-2"},"Key Recommendations"),e.createElement("ul",{className:"list-disc pl-5 text-gray-700 dark:text-gray-300"},d.recommendations.map((s,i)=>e.createElement("li",{key:i},s)))))),e.createElement("div",{className:"mb-8"},e.createElement("h2",{className:"text-xl font-bold text-gray-900 dark:text-white mb-4"},"Identified Risks"),d.risks.length===0?e.createElement("p",{className:"text-gray-700 dark:text-gray-300"},"No risks identified."):e.createElement("div",{className:"overflow-x-auto"},e.createElement("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-700"},e.createElement("thead",{className:"bg-gray-50 dark:bg-gray-700"},e.createElement("tr",null,e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Risk"),e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Likelihood"),e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Impact"),e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Risk Level"),e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Mitigated"))),e.createElement("tbody",{className:"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"},d.risks.map(s=>e.createElement("tr",{key:s.id},e.createElement("td",{className:"px-6 py-4 whitespace-normal text-sm text-gray-900 dark:text-gray-100"},s.description),e.createElement("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400"},s.likelihood," / 5"),e.createElement("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400"},s.impact," / 5"),e.createElement("td",{className:"px-6 py-4 whitespace-nowrap text-sm"},u(s.level)),e.createElement("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400"},s.mitigated?e.createElement("span",{className:"text-green-600 dark:text-green-400"},"Yes"):e.createElement("span",{className:"text-red-600 dark:text-red-400"},"No")))))))),g&&e.createElement("div",null,e.createElement("h2",{className:"text-xl font-bold text-gray-900 dark:text-white mb-4"},"Full Assessment Details"),b.map(s=>{let i=s.questions.filter(p=>d.answers[p.id]!==void 0);return i.length===0?null:e.createElement("div",{key:s.id,className:"mb-6"},e.createElement("h3",{className:"text-lg font-medium text-gray-900 dark:text-white mb-2"},s.title),e.createElement("div",{className:"overflow-x-auto"},e.createElement("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-700"},e.createElement("thead",{className:"bg-gray-50 dark:bg-gray-700"},e.createElement("tr",null,e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Question"),e.createElement("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider"},"Answer"))),e.createElement("tbody",{className:"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"},i.map(p=>e.createElement("tr",{key:p.id},e.createElement("td",{className:"px-6 py-4 whitespace-normal text-sm text-gray-900 dark:text-gray-100"},p.text),e.createElement("td",{className:"px-6 py-4 whitespace-normal text-sm text-gray-500 dark:text-gray-400"},f(p.id))))))))})),e.createElement("div",{className:"mt-8 pt-4 border-t border-gray-200 dark:border-gray-700 text-sm text-gray-500 dark:text-gray-400"},e.createElement("p",null,"This DPIA was conducted in accordance with the Nigeria Data Protection Act (NDPA) 2023."),e.createElement("p",null,"DPIA Report Version: ",d.version),e.createElement("p",null,"Generated on: ",new Date().toLocaleDateString())))};var E=({steps:d,onStepClick:b,clickable:g=true,orientation:y="horizontal",className:k="",activeStepClassName:h="",completedStepClassName:N="",incompleteStepClassName:o=""})=>{let v=n=>{g&&b&&b(n);},c=y==="vertical";return e.createElement("div",{className:`${k} ${c?"flex flex-col space-y-4":"flex items-center justify-between"}`},d.map((n,f)=>{let w=f===d.length-1,P=n.active?`font-medium ${h||"text-blue-600 dark:text-blue-400"}`:n.completed?`${N||"text-green-600 dark:text-green-400"}`:`${o||"text-gray-500 dark:text-gray-400"}`;return e.createElement(e.Fragment,{key:n.id},e.createElement("div",{className:`
|
|
2
|
-
${c?"flex items-start":"flex flex-col items-center"}
|
|
3
|
-
${g?"cursor-pointer":""}
|
|
4
|
-
`,onClick:()=>v(n.id)},e.createElement("div",{className:`
|
|
5
|
-
flex items-center justify-center
|
|
6
|
-
${c?"mr-4":""}
|
|
7
|
-
`},e.createElement("div",{className:`
|
|
8
|
-
flex items-center justify-center
|
|
9
|
-
w-8 h-8 rounded-full
|
|
10
|
-
${n.active?"bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400 border-2 border-blue-600 dark:border-blue-400":n.completed?"bg-green-100 dark:bg-green-900 text-green-600 dark:text-green-400 border-2 border-green-600 dark:border-green-400":"bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400 border-2 border-gray-300 dark:border-gray-600"}
|
|
11
|
-
`},n.icon?n.icon:n.completed?e.createElement("svg",{className:"w-4 h-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},e.createElement("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"})):e.createElement("span",null,f+1))),e.createElement("div",{className:`
|
|
12
|
-
${c?"flex-1":"mt-2 text-center"}
|
|
13
|
-
`},e.createElement("div",{className:`text-sm font-medium ${P}`},n.label),n.description&&e.createElement("div",{className:"text-xs text-gray-500 dark:text-gray-400 mt-1"},n.description))),!w&&e.createElement("div",{className:`
|
|
14
|
-
${c?"ml-4 h-8 border-l-2 border-gray-300 dark:border-gray-600":"w-full border-t-2 border-gray-300 dark:border-gray-600 hidden sm:block"}
|
|
15
|
-
`}))}))};export{j as a,T as b,E as c};//# sourceMappingURL=chunk-XMKA6GVK.mjs.map
|
|
16
|
-
//# sourceMappingURL=chunk-XMKA6GVK.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/components/dpia/DPIAQuestionnaire.tsx","../packages/ndpr-toolkit/src/components/dpia/DPIAReport.tsx","../packages/ndpr-toolkit/src/components/dpia/StepIndicator.tsx"],"names":["DPIAQuestionnaire","sections","answers","onAnswerChange","currentSectionIndex","onNextSection","onPrevSection","validationErrors","readOnly","className","buttonClassName","nextButtonText","prevButtonText","submitButtonText","showProgress","progress","currentSection","isLastSection","shouldShowQuestion","question","condition","answer","renderQuestion","error","value","React","e","option","currentValues","v","scaleValue","label","DPIAReport","result","showFullReport","allowPrint","allowExport","onExport","formatDate","timestamp","getAnswerText","questionId","handlePrint","handleExport","format","renderRiskLevelBadge","level","recommendation","index","risk","section","sectionQuestions","StepIndicator","steps","onStepClick","clickable","orientation","activeStepClassName","completedStepClassName","incompleteStepClassName","handleStepClick","stepId","isVertical","step","isLast","stepClassName"],"mappings":"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","file":"chunk-XMKA6GVK.mjs","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { DPIASection, DPIAQuestion } from '../../types/dpia';\n\nexport interface DPIAQuestionnaireProps {\n /**\n * Sections of the DPIA questionnaire\n */\n sections: DPIASection[];\n \n /**\n * Current answers to the questionnaire\n */\n answers: Record<string, any>;\n \n /**\n * Callback function called when an answer is updated\n */\n onAnswerChange: (questionId: string, value: any) => void;\n \n /**\n * Current section index\n */\n currentSectionIndex: number;\n \n /**\n * Callback function called when user navigates to the next section\n */\n onNextSection?: () => void;\n \n /**\n * Callback function called when user navigates to the previous section\n */\n onPrevSection?: () => void;\n \n /**\n * Validation errors for the current section\n */\n validationErrors?: Record<string, string>;\n \n /**\n * Whether the questionnaire is in read-only mode\n * @default false\n */\n readOnly?: boolean;\n \n /**\n * Custom CSS class for the questionnaire\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n \n /**\n * Text for the next button\n * @default \"Next\"\n */\n nextButtonText?: string;\n \n /**\n * Text for the previous button\n * @default \"Previous\"\n */\n prevButtonText?: string;\n \n /**\n * Text for the submit button (shown on the last section)\n * @default \"Submit\"\n */\n submitButtonText?: string;\n \n /**\n * Whether to show a progress indicator\n * @default true\n */\n showProgress?: boolean;\n \n /**\n * Current progress percentage (0-100)\n */\n progress?: number;\n}\n\nexport const DPIAQuestionnaire: React.FC<DPIAQuestionnaireProps> = ({\n sections,\n answers,\n onAnswerChange,\n currentSectionIndex,\n onNextSection,\n onPrevSection,\n validationErrors = {},\n readOnly = false,\n className = \"\",\n buttonClassName = \"\",\n nextButtonText = \"Next\",\n prevButtonText = \"Previous\",\n submitButtonText = \"Submit\",\n showProgress = true,\n progress\n}) => {\n const currentSection = sections[currentSectionIndex];\n const isLastSection = currentSectionIndex === sections.length - 1;\n \n // Check if a question should be shown based on its conditions\n const shouldShowQuestion = (question: DPIAQuestion): boolean => {\n if (!question.showWhen) {\n return true;\n }\n \n return question.showWhen.every(condition => {\n const answer = answers[condition.questionId];\n \n switch (condition.operator) {\n case 'equals':\n return answer === condition.value;\n case 'contains':\n return Array.isArray(answer) ? answer.includes(condition.value) : false;\n case 'greaterThan':\n return typeof answer === 'number' ? answer > condition.value : false;\n case 'lessThan':\n return typeof answer === 'number' ? answer < condition.value : false;\n default:\n return true;\n }\n });\n };\n \n // Render a question based on its type\n const renderQuestion = (question: DPIAQuestion) => {\n if (!shouldShowQuestion(question)) {\n return null;\n }\n \n const error = validationErrors[question.id];\n const value = answers[question.id];\n \n return (\n <div key={question.id} className=\"mb-6\">\n <div className=\"mb-2\">\n <label htmlFor={question.id} className=\"block text-sm font-medium text-gray-900 dark:text-gray-100\">\n {question.text}\n {question.required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n {question.guidance && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{question.guidance}</p>\n )}\n </div>\n \n {question.type === 'text' && (\n <input\n type=\"text\"\n id={question.id}\n value={value || ''}\n onChange={e => onAnswerChange(question.id, e.target.value)}\n disabled={readOnly}\n className={`w-full px-3 py-2 border rounded-md ${\n error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'\n } focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`}\n />\n )}\n \n {question.type === 'textarea' && (\n <textarea\n id={question.id}\n value={value || ''}\n onChange={e => onAnswerChange(question.id, e.target.value)}\n disabled={readOnly}\n rows={4}\n className={`w-full px-3 py-2 border rounded-md ${\n error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'\n } focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`}\n />\n )}\n \n {question.type === 'select' && question.options && (\n <select\n id={question.id}\n value={value || ''}\n onChange={e => onAnswerChange(question.id, e.target.value)}\n disabled={readOnly}\n className={`w-full px-3 py-2 border rounded-md ${\n error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'\n } focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100`}\n >\n <option value=\"\">Select an option</option>\n {question.options.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {question.type === 'radio' && question.options && (\n <div className=\"space-y-2\">\n {question.options.map(option => (\n <div key={option.value} className=\"flex items-center\">\n <input\n type=\"radio\"\n id={`${question.id}_${option.value}`}\n name={question.id}\n value={option.value}\n checked={value === option.value}\n onChange={() => onAnswerChange(question.id, option.value)}\n disabled={readOnly}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 dark:border-gray-600\"\n />\n <label\n htmlFor={`${question.id}_${option.value}`}\n className=\"ml-2 block text-sm text-gray-900 dark:text-gray-100\"\n >\n {option.label}\n {option.riskLevel && (\n <span className={`ml-2 text-xs px-2 py-1 rounded ${\n option.riskLevel === 'low' ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' :\n option.riskLevel === 'medium' ? 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200' :\n 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200'\n }`}>\n {option.riskLevel.charAt(0).toUpperCase() + option.riskLevel.slice(1)} Risk\n </span>\n )}\n </label>\n </div>\n ))}\n </div>\n )}\n \n {question.type === 'checkbox' && question.options && (\n <div className=\"space-y-2\">\n {question.options.map(option => (\n <div key={option.value} className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id={`${question.id}_${option.value}`}\n value={option.value}\n checked={Array.isArray(value) ? value.includes(option.value) : false}\n onChange={e => {\n const currentValues = Array.isArray(value) ? [...value] : [];\n if (e.target.checked) {\n onAnswerChange(question.id, [...currentValues, option.value]);\n } else {\n onAnswerChange(question.id, currentValues.filter(v => v !== option.value));\n }\n }}\n disabled={readOnly}\n className=\"h-4 w-4 rounded text-blue-600 focus:ring-blue-500 border-gray-300 dark:border-gray-600\"\n />\n <label\n htmlFor={`${question.id}_${option.value}`}\n className=\"ml-2 block text-sm text-gray-900 dark:text-gray-100\"\n >\n {option.label}\n </label>\n </div>\n ))}\n </div>\n )}\n \n {question.type === 'scale' && (\n <div>\n <div className=\"flex justify-between mb-2\">\n {question.scaleLabels && Object.entries(question.scaleLabels).map(([scaleValue, label]) => (\n <div key={scaleValue} className=\"text-xs text-gray-500 dark:text-gray-400 text-center\" style={{ width: `${100 / Object.keys(question.scaleLabels || {}).length}%` }}>\n {label}\n </div>\n ))}\n </div>\n <input\n type=\"range\"\n id={question.id}\n min={question.minValue || 1}\n max={question.maxValue || 5}\n value={value || (question.minValue || 1)}\n onChange={e => onAnswerChange(question.id, parseInt(e.target.value, 10))}\n disabled={readOnly}\n className=\"w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700\"\n />\n <div className=\"mt-1 text-sm text-gray-500 dark:text-gray-400 text-center\">\n Selected value: {value || (question.minValue || 1)}\n </div>\n </div>\n )}\n \n {error && <p className=\"mt-1 text-sm text-red-500\">{error}</p>}\n </div>\n );\n };\n \n if (!currentSection) {\n return <div>No section found.</div>;\n }\n \n return (\n <div className={`bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 ${className}`}>\n {showProgress && (\n <div className=\"mb-6\">\n <div className=\"flex justify-between text-sm text-gray-500 dark:text-gray-400 mb-1\">\n <span>Section {currentSectionIndex + 1} of {sections.length}</span>\n <span>{progress !== undefined ? `${progress}% Complete` : ''}</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700\">\n <div\n className=\"bg-blue-600 h-2.5 rounded-full\"\n style={{ width: `${progress !== undefined ? progress : ((currentSectionIndex + 1) / sections.length) * 100}%` }}\n ></div>\n </div>\n </div>\n )}\n \n <h2 className=\"text-xl font-bold mb-2 text-gray-900 dark:text-white\">{currentSection.title}</h2>\n {currentSection.description && (\n <p className=\"mb-6 text-gray-600 dark:text-gray-300\">{currentSection.description}</p>\n )}\n \n <div className=\"space-y-6\">\n {currentSection.questions.map(question => renderQuestion(question))}\n </div>\n \n <div className=\"mt-8 flex justify-between\">\n <button\n type=\"button\"\n onClick={onPrevSection}\n disabled={currentSectionIndex === 0 || readOnly}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 disabled:opacity-50 disabled:cursor-not-allowed ${buttonClassName}`}\n >\n {prevButtonText}\n </button>\n \n <button\n type=\"button\"\n onClick={onNextSection}\n disabled={readOnly}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed ${buttonClassName}`}\n >\n {isLastSection ? submitButtonText : nextButtonText}\n </button>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { DPIAResult, DPIASection, DPIARisk } from '../../types/dpia';\n\nexport interface DPIAReportProps {\n /**\n * The DPIA result to display\n */\n result: DPIAResult;\n \n /**\n * The sections of the DPIA questionnaire\n */\n sections: DPIASection[];\n \n /**\n * Whether to show the full report or just a summary\n * @default true\n */\n showFullReport?: boolean;\n \n /**\n * Whether to allow printing the report\n * @default true\n */\n allowPrint?: boolean;\n \n /**\n * Whether to allow exporting the report as PDF\n * @default true\n */\n allowExport?: boolean;\n \n /**\n * Callback function called when the report is exported\n */\n onExport?: (format: 'pdf' | 'docx' | 'html') => void;\n \n /**\n * Custom CSS class for the report container\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n}\n\nexport const DPIAReport: React.FC<DPIAReportProps> = ({\n result,\n sections,\n showFullReport = true,\n allowPrint = true,\n allowExport = true,\n onExport,\n className = '',\n buttonClassName = ''\n}) => {\n // Format a date from timestamp\n const formatDate = (timestamp: number): string => {\n return new Date(timestamp).toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'long',\n year: 'numeric'\n });\n };\n \n // Get the section title by ID\n const getSectionTitle = (sectionId: string): string => {\n const section = sections.find(s => s.id === sectionId);\n return section?.title || 'Unknown Section';\n };\n \n // Get the question text by ID\n const getQuestionText = (questionId: string): string => {\n let questionText = 'Unknown Question';\n \n sections.forEach(section => {\n const question = section.questions.find(q => q.id === questionId);\n if (question) {\n questionText = question.text;\n }\n });\n \n return questionText;\n };\n \n // Get the answer text for a question\n const getAnswerText = (questionId: string): string => {\n const answer = result.answers[questionId];\n \n if (answer === undefined || answer === null) {\n return 'Not answered';\n }\n \n if (typeof answer === 'boolean') {\n return answer ? 'Yes' : 'No';\n }\n \n if (Array.isArray(answer)) {\n return answer.join(', ');\n }\n \n return String(answer);\n };\n \n // Handle print button click\n const handlePrint = () => {\n window.print();\n };\n \n // Handle export button click\n const handleExport = (format: 'pdf' | 'docx' | 'html') => {\n if (onExport) {\n onExport(format);\n }\n };\n \n // Render risk level badge\n const renderRiskLevelBadge = (level: 'low' | 'medium' | 'high' | 'critical') => {\n const colorClasses = {\n low: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',\n medium: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',\n high: 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200',\n critical: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200'\n };\n \n return (\n <span className={`px-2 py-1 rounded text-xs font-medium ${colorClasses[level]}`}>\n {level.charAt(0).toUpperCase() + level.slice(1)}\n </span>\n );\n };\n \n return (\n <div className={`bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 print:shadow-none print:p-0 ${className}`}>\n {/* Report Header */}\n <div className=\"mb-8 border-b border-gray-200 dark:border-gray-700 pb-6 print:pb-4\">\n <div className=\"flex justify-between items-start\">\n <div>\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\n Data Protection Impact Assessment Report\n </h1>\n <h2 className=\"text-xl text-gray-700 dark:text-gray-300 mb-4\">\n {result.title}\n </h2>\n </div>\n \n {(allowPrint || allowExport) && (\n <div className=\"flex space-x-2 print:hidden\">\n {allowPrint && (\n <button\n onClick={handlePrint}\n className={`px-3 py-1 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName}`}\n >\n <span className=\"flex items-center\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z\" />\n </svg>\n Print\n </span>\n </button>\n )}\n \n {allowExport && (\n <div className=\"relative inline-block\">\n <button\n onClick={() => handleExport('pdf')}\n className={`px-3 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n <span className=\"flex items-center\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n Export PDF\n </span>\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n \n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4\">\n <div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n <span className=\"font-medium\">Assessor:</span> {result.assessor.name}, {result.assessor.role}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n <span className=\"font-medium\">Contact:</span> {result.assessor.email}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n <span className=\"font-medium\">Started:</span> {formatDate(result.startedAt)}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n <span className=\"font-medium\">Completed:</span> {result.completedAt ? formatDate(result.completedAt) : 'In progress'}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n <span className=\"font-medium\">Next review:</span> {result.reviewDate ? formatDate(result.reviewDate) : 'Not scheduled'}\n </p>\n </div>\n </div>\n </div>\n \n {/* Executive Summary */}\n <div className=\"mb-8\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white mb-4\">\n Executive Summary\n </h2>\n \n <div className=\"bg-gray-50 dark:bg-gray-700 p-4 rounded-md mb-4\">\n <div className=\"flex items-center mb-2\">\n <span className=\"font-medium mr-2\">Overall Risk Level:</span>\n {renderRiskLevelBadge(result.overallRiskLevel)}\n </div>\n \n <div className=\"mb-2\">\n <span className=\"font-medium\">Conclusion:</span> {result.conclusion}\n </div>\n \n <div>\n <span className=\"font-medium\">Can Proceed:</span> {result.canProceed ? 'Yes' : 'No'}\n </div>\n </div>\n \n <div>\n <h3 className=\"font-medium text-gray-900 dark:text-white mb-2\">\n Processing Activity Description\n </h3>\n <p className=\"text-gray-700 dark:text-gray-300 mb-4\">\n {result.processingDescription}\n </p>\n \n {result.recommendations && result.recommendations.length > 0 && (\n <div>\n <h3 className=\"font-medium text-gray-900 dark:text-white mb-2\">\n Key Recommendations\n </h3>\n <ul className=\"list-disc pl-5 text-gray-700 dark:text-gray-300\">\n {result.recommendations.map((recommendation, index) => (\n <li key={index}>{recommendation}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n \n {/* Identified Risks */}\n <div className=\"mb-8\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white mb-4\">\n Identified Risks\n </h2>\n \n {result.risks.length === 0 ? (\n <p className=\"text-gray-700 dark:text-gray-300\">No risks identified.</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\n <thead className=\"bg-gray-50 dark:bg-gray-700\">\n <tr>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Risk\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Likelihood\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Impact\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Risk Level\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Mitigated\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n {result.risks.map((risk) => (\n <tr key={risk.id}>\n <td className=\"px-6 py-4 whitespace-normal text-sm text-gray-900 dark:text-gray-100\">\n {risk.description}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400\">\n {risk.likelihood} / 5\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400\">\n {risk.impact} / 5\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm\">\n {renderRiskLevelBadge(risk.level)}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400\">\n {risk.mitigated ? (\n <span className=\"text-green-600 dark:text-green-400\">Yes</span>\n ) : (\n <span className=\"text-red-600 dark:text-red-400\">No</span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n \n {/* Full Assessment Details */}\n {showFullReport && (\n <div>\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white mb-4\">\n Full Assessment Details\n </h2>\n \n {sections.map((section) => {\n const sectionQuestions = section.questions.filter(question => \n result.answers[question.id] !== undefined\n );\n \n if (sectionQuestions.length === 0) {\n return null;\n }\n \n return (\n <div key={section.id} className=\"mb-6\">\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-white mb-2\">\n {section.title}\n </h3>\n \n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\n <thead className=\"bg-gray-50 dark:bg-gray-700\">\n <tr>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Question\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Answer\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n {sectionQuestions.map((question) => (\n <tr key={question.id}>\n <td className=\"px-6 py-4 whitespace-normal text-sm text-gray-900 dark:text-gray-100\">\n {question.text}\n </td>\n <td className=\"px-6 py-4 whitespace-normal text-sm text-gray-500 dark:text-gray-400\">\n {getAnswerText(question.id)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n })}\n </div>\n )}\n \n {/* Footer */}\n <div className=\"mt-8 pt-4 border-t border-gray-200 dark:border-gray-700 text-sm text-gray-500 dark:text-gray-400\">\n <p>This DPIA was conducted in accordance with the Nigeria Data Protection Act (NDPA) 2023.</p>\n <p>DPIA Report Version: {result.version}</p>\n <p>Generated on: {new Date().toLocaleDateString()}</p>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nexport interface Step {\n /**\n * Unique identifier for the step\n */\n id: string;\n \n /**\n * Display label for the step\n */\n label: string;\n \n /**\n * Optional description for the step\n */\n description?: string;\n \n /**\n * Whether the step is completed\n */\n completed: boolean;\n \n /**\n * Whether the step is the current active step\n */\n active: boolean;\n \n /**\n * Optional icon for the step\n */\n icon?: React.ReactNode;\n}\n\nexport interface StepIndicatorProps {\n /**\n * Array of steps to display\n */\n steps: Step[];\n \n /**\n * Callback function called when a step is clicked\n */\n onStepClick?: (stepId: string) => void;\n \n /**\n * Whether the steps are clickable\n * @default true\n */\n clickable?: boolean;\n \n /**\n * Orientation of the step indicator\n * @default \"horizontal\"\n */\n orientation?: 'horizontal' | 'vertical';\n \n /**\n * Custom CSS class for the container\n */\n className?: string;\n \n /**\n * Custom CSS class for the active step\n */\n activeStepClassName?: string;\n \n /**\n * Custom CSS class for completed steps\n */\n completedStepClassName?: string;\n \n /**\n * Custom CSS class for incomplete steps\n */\n incompleteStepClassName?: string;\n}\n\nexport const StepIndicator: React.FC<StepIndicatorProps> = ({\n steps,\n onStepClick,\n clickable = true,\n orientation = 'horizontal',\n className = '',\n activeStepClassName = '',\n completedStepClassName = '',\n incompleteStepClassName = ''\n}) => {\n const handleStepClick = (stepId: string) => {\n if (clickable && onStepClick) {\n onStepClick(stepId);\n }\n };\n \n const isVertical = orientation === 'vertical';\n \n return (\n <div \n className={`${className} ${\n isVertical \n ? 'flex flex-col space-y-4' \n : 'flex items-center justify-between'\n }`}\n >\n {steps.map((step, index) => {\n const isLast = index === steps.length - 1;\n const stepClassName = step.active \n ? `font-medium ${activeStepClassName || 'text-blue-600 dark:text-blue-400'}` \n : step.completed \n ? `${completedStepClassName || 'text-green-600 dark:text-green-400'}` \n : `${incompleteStepClassName || 'text-gray-500 dark:text-gray-400'}`;\n \n return (\n <React.Fragment key={step.id}>\n <div \n className={`\n ${isVertical ? 'flex items-start' : 'flex flex-col items-center'}\n ${clickable ? 'cursor-pointer' : ''}\n `}\n onClick={() => handleStepClick(step.id)}\n >\n <div className={`\n flex items-center justify-center\n ${isVertical ? 'mr-4' : ''}\n `}>\n <div className={`\n flex items-center justify-center\n w-8 h-8 rounded-full\n ${step.active \n ? 'bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-400 border-2 border-blue-600 dark:border-blue-400' \n : step.completed \n ? 'bg-green-100 dark:bg-green-900 text-green-600 dark:text-green-400 border-2 border-green-600 dark:border-green-400' \n : 'bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400 border-2 border-gray-300 dark:border-gray-600'\n }\n `}>\n {step.icon ? (\n step.icon\n ) : step.completed ? (\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n </div>\n \n <div className={`\n ${isVertical ? 'flex-1' : 'mt-2 text-center'}\n `}>\n <div className={`text-sm font-medium ${stepClassName}`}>\n {step.label}\n </div>\n {step.description && (\n <div className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {step.description}\n </div>\n )}\n </div>\n </div>\n \n {!isLast && (\n <div className={`\n ${isVertical \n ? 'ml-4 h-8 border-l-2 border-gray-300 dark:border-gray-600' \n : 'w-full border-t-2 border-gray-300 dark:border-gray-600 hidden sm:block'}\n `} />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/utils/consent.ts"],"names":["validateConsent","settings","errors","thirteenMonthsAgo","validateConsentOptions","options","option"],"mappings":"aAOO,SAASA,CAAAA,CAAgBC,CAAAA,CAG9B,CACA,IAAMC,CAAAA,CAAmB,EAAC,CAAA,CAGtB,CAACD,CAAAA,CAAS,QAAA,EAAY,MAAA,CAAO,IAAA,CAAKA,EAAS,QAAQ,CAAA,CAAE,MAAA,GAAW,CAAA,GAClEC,CAAAA,CAAO,IAAA,CAAK,2DAA2D,CAAA,CAIpED,CAAAA,CAAS,SAAA,CAAA,CAEH,OAAOA,CAAAA,CAAS,SAAA,EAAc,QAAA,EAAY,KAAA,CAAMA,CAAAA,CAAS,SAAS,CAAA,GAC3EC,CAAAA,CAAO,IAAA,CAAK,0CAA0C,CAAA,CAFtDA,CAAAA,CAAO,IAAA,CAAK,+BAA+B,CAAA,CAMxCD,CAAAA,CAAS,OAAA,EACZC,CAAAA,CAAO,IAAA,CAAK,6BAA6B,CAAA,CAItCD,CAAAA,CAAS,QACZC,CAAAA,CAAO,IAAA,CAAK,uCAAuC,CAAA,CAIjDD,CAAAA,CAAS,aAAA,GAAkB,MAAA,EAC7BC,CAAAA,CAAO,IAAA,CAAK,qCAAqC,CAAA,CAInD,IAAMC,CAAAA,CAAoB,IAAA,CAAK,GAAA,EAAI,CAAK,IAAU,EAAA,CAAK,EAAA,CAAK,EAAA,CAAK,GAAA,CACjE,OAAIF,CAAAA,CAAS,SAAA,CAAYE,CAAAA,EACvBD,CAAAA,CAAO,IAAA,CAAK,yDAAyD,CAAA,CAGhE,CACL,KAAA,CAAOA,CAAAA,CAAO,MAAA,GAAW,EACzB,MAAA,CAAAA,CACF,CACF,CASO,SAASE,CAAAA,CAAuBC,CAAAA,CAGrC,CACA,IAAMH,CAAAA,CAAmB,EAAC,CAE1B,OAAA,CAAI,CAACG,CAAAA,EAAWA,CAAAA,CAAQ,SAAW,CAAA,GACjCH,CAAAA,CAAO,IAAA,CAAK,yCAAyC,CAAA,CAGvDG,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAS,OAAA,CAASC,CAAAA,EAAW,CAAA,CACvB,CAACA,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,CAAQ,MAAK,GAAM,EAAA,GAC/CJ,CAAAA,CAAO,IAAA,CACL,CAAA,gBAAA,EAAmBI,CAAAA,CAAO,EAAE,CAAA,4FAAA,CAC9B,EAEJ,CAAA,CAAA,CAEO,CACL,KAAA,CAAOJ,CAAAA,CAAO,MAAA,GAAW,CAAA,CACzB,MAAA,CAAAA,CACF,CACF","file":"chunk-Y34DQYS7.js","sourcesContent":["import { ConsentOption, ConsentSettings } from '../types/consent';\n\n/**\n * Validates consent settings to ensure they meet NDPA requirements\n * @param settings The consent settings to validate\n * @returns An object containing validation result and any error messages\n */\nexport function validateConsent(settings: ConsentSettings): { \n valid: boolean; \n errors: string[] \n} {\n const errors: string[] = [];\n \n // Check if consents object exists\n if (!settings.consents || Object.keys(settings.consents).length === 0) {\n errors.push('Consent settings must include at least one consent option');\n }\n \n // Check if timestamp exists and is valid\n if (!settings.timestamp) {\n errors.push('Consent timestamp is required');\n } else if (typeof settings.timestamp !== 'number' || isNaN(settings.timestamp)) {\n errors.push('Consent timestamp must be a valid number');\n }\n \n // Check if version exists\n if (!settings.version) {\n errors.push('Consent version is required');\n }\n \n // Check if method exists\n if (!settings.method) {\n errors.push('Consent collection method is required');\n }\n \n // Check if hasInteracted is defined\n if (settings.hasInteracted === undefined) {\n errors.push('User interaction status is required');\n }\n \n // Check if consent is recent enough (within last 13 months for NDPA compliance)\n const thirteenMonthsAgo = Date.now() - (13 * 30 * 24 * 60 * 60 * 1000);\n if (settings.timestamp < thirteenMonthsAgo) {\n errors.push('Consent is older than 13 months and should be refreshed');\n }\n \n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Validates that consent options meet NDPA Section 26 requirements.\n * Each consent option must specify a purpose for which data will be processed,\n * as consent must be specific and informed per the Nigeria Data Protection Act.\n * @param options The consent options to validate\n * @returns An object containing validation result and any error messages\n */\nexport function validateConsentOptions(options: ConsentOption[]): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n if (!options || options.length === 0) {\n errors.push('At least one consent option is required');\n }\n\n options?.forEach((option) => {\n if (!option.purpose || option.purpose.trim() === '') {\n errors.push(\n `Consent option \"${option.id}\" is missing a purpose. NDPA Section 26 requires consent to be specific to a stated purpose.`\n );\n }\n });\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ndpr-toolkit/src/hooks/useConsent.ts"],"names":["useConsent","options","storageOptions","version","onChange","storageKey","storageType","settings","setSettings","useState","shouldShowBanner","setShouldShowBanner","isValid","setIsValid","validationErrors","setValidationErrors","useEffect","savedSettings","savedData","consentCookie","cookie","cookieValue","error","valid","errors","validateConsent","saveSettings","newSettings","settingsString","cookieOptions","domain","path","expires","secure","sameSite","expiryDate","cookieString","updateConsent","consents","optionId","allConsents","option","rejectedConsents"],"mappings":"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","file":"chunk-ZU73VG3X.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { ConsentOption, ConsentSettings, ConsentStorageOptions } from '../types/consent';\nimport { validateConsent } from '../utils/consent';\n\ninterface UseConsentOptions {\n /**\n * Consent options to present to the user\n */\n options: ConsentOption[];\n \n /**\n * Storage options for consent settings\n */\n storageOptions?: ConsentStorageOptions;\n \n /**\n * Version of the consent form\n * @default \"1.0\"\n */\n version?: string;\n \n /**\n * Callback function called when consent settings change\n */\n onChange?: (settings: ConsentSettings) => void;\n}\n\ninterface UseConsentReturn {\n /**\n * Current consent settings\n */\n settings: ConsentSettings | null;\n \n /**\n * Whether consent has been given for a specific option\n */\n hasConsent: (optionId: string) => boolean;\n \n /**\n * Update consent settings\n */\n updateConsent: (consents: Record<string, boolean>) => void;\n \n /**\n * Accept all consent options\n */\n acceptAll: () => void;\n \n /**\n * Reject all non-required consent options\n */\n rejectAll: () => void;\n \n /**\n * Whether the consent banner should be shown\n */\n shouldShowBanner: boolean;\n \n /**\n * Whether consent settings are valid\n */\n isValid: boolean;\n \n /**\n * Validation errors (if any)\n */\n validationErrors: string[];\n \n /**\n * Reset consent settings (clear from storage)\n */\n resetConsent: () => void;\n}\n\n/**\n * Hook for managing user consent in compliance with NDPA\n */\nexport function useConsent({\n options,\n storageOptions = {},\n version = \"1.0\",\n onChange\n}: UseConsentOptions): UseConsentReturn {\n const {\n storageKey = \"ndpr_consent\",\n storageType = \"localStorage\"\n } = storageOptions;\n \n const [settings, setSettings] = useState<ConsentSettings | null>(null);\n const [shouldShowBanner, setShouldShowBanner] = useState<boolean>(true);\n const [isValid, setIsValid] = useState<boolean>(false);\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n \n // Load consent settings from storage on mount\n useEffect(() => {\n let savedSettings: ConsentSettings | null = null;\n \n try {\n if (storageType === 'localStorage' && typeof window !== 'undefined') {\n const savedData = localStorage.getItem(storageKey);\n if (savedData) {\n savedSettings = JSON.parse(savedData);\n }\n } else if (storageType === 'sessionStorage' && typeof window !== 'undefined') {\n const savedData = sessionStorage.getItem(storageKey);\n if (savedData) {\n savedSettings = JSON.parse(savedData);\n }\n } else if (storageType === 'cookie' && typeof document !== 'undefined') {\n const cookies = document.cookie.split(';');\n const consentCookie = cookies.find(cookie => cookie.trim().startsWith(`${storageKey}=`));\n if (consentCookie) {\n const cookieValue = consentCookie.split('=')[1];\n savedSettings = JSON.parse(decodeURIComponent(cookieValue));\n }\n }\n } catch (error) {\n console.error('Error loading consent settings:', error);\n }\n \n if (savedSettings) {\n setSettings(savedSettings);\n \n // Validate the saved settings\n const { valid, errors } = validateConsent(savedSettings);\n setIsValid(valid);\n setValidationErrors(errors);\n \n // Only hide banner if settings are valid and for the current version\n setShouldShowBanner(!(valid && savedSettings.version === version));\n } else {\n setShouldShowBanner(true);\n }\n }, [storageKey, storageType, version]);\n \n // Save settings to storage\n const saveSettings = (newSettings: ConsentSettings) => {\n try {\n const settingsString = JSON.stringify(newSettings);\n \n if (storageType === 'localStorage' && typeof window !== 'undefined') {\n localStorage.setItem(storageKey, settingsString);\n } else if (storageType === 'sessionStorage' && typeof window !== 'undefined') {\n sessionStorage.setItem(storageKey, settingsString);\n } else if (storageType === 'cookie' && typeof document !== 'undefined') {\n const { cookieOptions = {} } = storageOptions;\n const {\n domain,\n path = '/',\n expires = 365,\n secure = true,\n sameSite = 'Lax'\n } = cookieOptions;\n \n const expiryDate = new Date();\n expiryDate.setDate(expiryDate.getDate() + expires);\n \n let cookieString = `${storageKey}=${encodeURIComponent(settingsString)}; path=${path}; expires=${expiryDate.toUTCString()}`;\n \n if (domain) {\n cookieString += `; domain=${domain}`;\n }\n \n if (secure) {\n cookieString += '; secure';\n }\n \n cookieString += `; samesite=${sameSite}`;\n \n document.cookie = cookieString;\n }\n \n // Validate the new settings\n const { valid, errors } = validateConsent(newSettings);\n setIsValid(valid);\n setValidationErrors(errors);\n \n // Call onChange callback if provided\n if (onChange) {\n onChange(newSettings);\n }\n } catch (error) {\n console.error('Error saving consent settings:', error);\n }\n };\n \n // Update consent settings\n const updateConsent = (consents: Record<string, boolean>) => {\n const newSettings: ConsentSettings = {\n consents,\n timestamp: Date.now(),\n version,\n method: 'explicit',\n hasInteracted: true\n };\n \n setSettings(newSettings);\n saveSettings(newSettings);\n setShouldShowBanner(false);\n };\n \n // Accept all consent options\n const acceptAll = () => {\n const allConsents: Record<string, boolean> = {};\n options.forEach(option => {\n allConsents[option.id] = true;\n });\n \n updateConsent(allConsents);\n };\n \n // Reject all non-required consent options\n const rejectAll = () => {\n const rejectedConsents: Record<string, boolean> = {};\n options.forEach(option => {\n rejectedConsents[option.id] = option.required || false;\n });\n \n updateConsent(rejectedConsents);\n };\n \n // Check if consent has been given for a specific option\n const hasConsent = (optionId: string): boolean => {\n return !!settings?.consents[optionId];\n };\n \n // Reset consent settings\n const resetConsent = () => {\n if (storageType === 'localStorage' && typeof window !== 'undefined') {\n localStorage.removeItem(storageKey);\n } else if (storageType === 'sessionStorage' && typeof window !== 'undefined') {\n sessionStorage.removeItem(storageKey);\n } else if (storageType === 'cookie' && typeof document !== 'undefined') {\n const { cookieOptions = {} } = storageOptions;\n const { domain, path = '/' } = cookieOptions;\n \n let cookieString = `${storageKey}=; path=${path}; expires=Thu, 01 Jan 1970 00:00:00 GMT`;\n \n if (domain) {\n cookieString += `; domain=${domain}`;\n }\n \n document.cookie = cookieString;\n }\n \n setSettings(null);\n setShouldShowBanner(true);\n setIsValid(false);\n setValidationErrors([]);\n };\n \n return {\n settings,\n hasConsent,\n updateConsent,\n acceptAll,\n rejectAll,\n shouldShowBanner,\n isValid,\n validationErrors,\n resetConsent\n };\n}\n"]}
|
package/dist/consent.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"consent.js"}
|
package/dist/consent.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"consent.mjs"}
|
package/dist/core.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"core.js"}
|
package/dist/core.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"core.mjs"}
|
package/dist/cross-border.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"cross-border.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"cross-border.mjs"}
|
package/dist/dpia.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"dpia.js"}
|
package/dist/dpia.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"dpia.mjs"}
|
package/dist/dsr.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"dsr.js"}
|
package/dist/dsr.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"dsr.mjs"}
|
package/dist/hooks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"hooks.js"}
|
package/dist/hooks.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"hooks.mjs"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|