@redacto.io/consent-sdk-react 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/LICENSE +176 -0
  3. package/dist/index.js +231 -96
  4. package/dist/index.mjs +231 -96
  5. package/dist/privacy-center.d.mts +649 -0
  6. package/dist/privacy-center.d.ts +649 -0
  7. package/dist/privacy-center.js +20824 -0
  8. package/dist/privacy-center.mjs +20789 -0
  9. package/package.json +47 -3
  10. package/src/RedactoNoticeConsent/RedactoNoticeConsent.tsx +6 -4
  11. package/src/RedactoNoticeConsent/api/index.ts +2 -0
  12. package/src/RedactoNoticeConsent/api/types.ts +2 -0
  13. package/src/RedactoNoticeConsent/components/DigiLockerCallback.tsx +128 -62
  14. package/src/RedactoNoticeConsent/language-codes.ts +97 -0
  15. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.tsx +0 -3
  16. package/src/RedactoNoticeConsentInline/api/index.ts +0 -1
  17. package/src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx +19 -0
  18. package/src/RedactoPrivacyCenter/PrivacyCenterCaseDetailsPage.tsx +154 -0
  19. package/src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx +17 -0
  20. package/src/RedactoPrivacyCenter/PrivacyCenterFormPage.tsx +79 -0
  21. package/src/RedactoPrivacyCenter/PrivacyCenterHomePage.tsx +30 -0
  22. package/src/RedactoPrivacyCenter/PrivacyCenterLayout.tsx +173 -0
  23. package/src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx +55 -0
  24. package/src/RedactoPrivacyCenter/api/actions.ts +476 -0
  25. package/src/RedactoPrivacyCenter/api/client.ts +524 -0
  26. package/src/RedactoPrivacyCenter/api/config.ts +33 -0
  27. package/src/RedactoPrivacyCenter/api/fetcher.ts +181 -0
  28. package/src/RedactoPrivacyCenter/api/upload.ts +93 -0
  29. package/src/RedactoPrivacyCenter/assets/character.svg +31 -0
  30. package/src/RedactoPrivacyCenter/assets/fileAttach.svg +9 -0
  31. package/src/RedactoPrivacyCenter/assets/greenTick.svg +4 -0
  32. package/src/RedactoPrivacyCenter/assets/mail.svg +3 -0
  33. package/src/RedactoPrivacyCenter/assets/poweredByRedacto.svg +9 -0
  34. package/src/RedactoPrivacyCenter/assets/sentImg.svg +9 -0
  35. package/src/RedactoPrivacyCenter/assets/uploadFileIcon.svg +9 -0
  36. package/src/RedactoPrivacyCenter/components/ActivitiesList.tsx +272 -0
  37. package/src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx +38 -0
  38. package/src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx +31 -0
  39. package/src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx +73 -0
  40. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx +87 -0
  41. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx +95 -0
  42. package/src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx +147 -0
  43. package/src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx +171 -0
  44. package/src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx +23 -0
  45. package/src/RedactoPrivacyCenter/components/CaseDetails/useFileUpload.ts +116 -0
  46. package/src/RedactoPrivacyCenter/components/CaseDetails/useMessagePolling.ts +36 -0
  47. package/src/RedactoPrivacyCenter/components/CaseDetails/utils.ts +56 -0
  48. package/src/RedactoPrivacyCenter/components/CaseDetailsModal.tsx +469 -0
  49. package/src/RedactoPrivacyCenter/components/CaseHistory.tsx +426 -0
  50. package/src/RedactoPrivacyCenter/components/ConsentManager.tsx +732 -0
  51. package/src/RedactoPrivacyCenter/components/ConsentManagerColumns.tsx +238 -0
  52. package/src/RedactoPrivacyCenter/components/ConsentManagerConstants.ts +7 -0
  53. package/src/RedactoPrivacyCenter/components/ConsentManagerTableSkeleton.tsx +155 -0
  54. package/src/RedactoPrivacyCenter/components/DataRequest/CorrectionDataSection.tsx +189 -0
  55. package/src/RedactoPrivacyCenter/components/DataRequest/GrievanceDataSection.tsx +118 -0
  56. package/src/RedactoPrivacyCenter/components/DataRequest/NominationDataSection.tsx +66 -0
  57. package/src/RedactoPrivacyCenter/components/DataRequest/PurposeSelectionSection.tsx +304 -0
  58. package/src/RedactoPrivacyCenter/components/Form.tsx +1596 -0
  59. package/src/RedactoPrivacyCenter/components/GrievanceTable.tsx +174 -0
  60. package/src/RedactoPrivacyCenter/components/GrievanceTablePagination.tsx +337 -0
  61. package/src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx +330 -0
  62. package/src/RedactoPrivacyCenter/components/Pagination.tsx +140 -0
  63. package/src/RedactoPrivacyCenter/components/PrivacyCenterLayout.tsx +304 -0
  64. package/src/RedactoPrivacyCenter/components/RequestSubmit.tsx +232 -0
  65. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/SideBarPC.tsx +475 -0
  66. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/SideMenuPC.tsx +408 -0
  67. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/constants.tsx +42 -0
  68. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/menuItemsPC.tsx +1 -0
  69. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/types.ts +40 -0
  70. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/utils.ts +38 -0
  71. package/src/RedactoPrivacyCenter/components/ThemeTransitionOverlay.tsx +85 -0
  72. package/src/RedactoPrivacyCenter/components/activitiesColumns.tsx +141 -0
  73. package/src/RedactoPrivacyCenter/components/caseHistoryColumns.tsx +159 -0
  74. package/src/RedactoPrivacyCenter/components/constant.ts +16 -0
  75. package/src/RedactoPrivacyCenter/components/types.ts +76 -0
  76. package/src/RedactoPrivacyCenter/components/utils.tsx +10 -0
  77. package/src/RedactoPrivacyCenter/config/routes.ts +9 -0
  78. package/src/RedactoPrivacyCenter/config/table.ts +25 -0
  79. package/src/RedactoPrivacyCenter/context/AuthContext.tsx +137 -0
  80. package/src/RedactoPrivacyCenter/context/BaseUrlContext.tsx +41 -0
  81. package/src/RedactoPrivacyCenter/context/LocaleContext.tsx +11 -0
  82. package/src/RedactoPrivacyCenter/context/NavigationContext.tsx +96 -0
  83. package/src/RedactoPrivacyCenter/context/OrganizationContext.tsx +30 -0
  84. package/src/RedactoPrivacyCenter/context/PageChromeContext.tsx +60 -0
  85. package/src/RedactoPrivacyCenter/context/theme.tsx +127 -0
  86. package/src/RedactoPrivacyCenter/context/types.ts +14 -0
  87. package/src/RedactoPrivacyCenter/lib/api.ts +566 -0
  88. package/src/RedactoPrivacyCenter/lib/consent-manager/utils.tsx +63 -0
  89. package/src/RedactoPrivacyCenter/lib/constants.ts +161 -0
  90. package/src/RedactoPrivacyCenter/lib/i18n.ts +81 -0
  91. package/src/RedactoPrivacyCenter/lib/locales.ts +105 -0
  92. package/src/RedactoPrivacyCenter/lib/queries.ts +134 -0
  93. package/src/RedactoPrivacyCenter/lib/types.ts +531 -0
  94. package/src/RedactoPrivacyCenter/lib/useCurrentLanguage.ts +37 -0
  95. package/src/RedactoPrivacyCenter/lib/utils.ts +626 -0
  96. package/src/RedactoPrivacyCenter/locales/as/translation.json +280 -0
  97. package/src/RedactoPrivacyCenter/locales/bho/translation.json +280 -0
  98. package/src/RedactoPrivacyCenter/locales/bn/translation.json +280 -0
  99. package/src/RedactoPrivacyCenter/locales/brx/translation.json +280 -0
  100. package/src/RedactoPrivacyCenter/locales/doi/translation.json +280 -0
  101. package/src/RedactoPrivacyCenter/locales/en/translation.json +255 -0
  102. package/src/RedactoPrivacyCenter/locales/gom/translation.json +280 -0
  103. package/src/RedactoPrivacyCenter/locales/gu/translation.json +280 -0
  104. package/src/RedactoPrivacyCenter/locales/hi/translation.json +280 -0
  105. package/src/RedactoPrivacyCenter/locales/kn/translation.json +280 -0
  106. package/src/RedactoPrivacyCenter/locales/ks/translation.json +280 -0
  107. package/src/RedactoPrivacyCenter/locales/mai/translation.json +280 -0
  108. package/src/RedactoPrivacyCenter/locales/ml/translation.json +280 -0
  109. package/src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json +280 -0
  110. package/src/RedactoPrivacyCenter/locales/mr/translation.json +280 -0
  111. package/src/RedactoPrivacyCenter/locales/ne/translation.json +280 -0
  112. package/src/RedactoPrivacyCenter/locales/or/translation.json +280 -0
  113. package/src/RedactoPrivacyCenter/locales/pa/translation.json +280 -0
  114. package/src/RedactoPrivacyCenter/locales/sa/translation.json +280 -0
  115. package/src/RedactoPrivacyCenter/locales/sat/translation.json +280 -0
  116. package/src/RedactoPrivacyCenter/locales/sd/translation.json +280 -0
  117. package/src/RedactoPrivacyCenter/locales/ta/translation.json +280 -0
  118. package/src/RedactoPrivacyCenter/locales/te/translation.json +280 -0
  119. package/src/RedactoPrivacyCenter/locales/ur/translation.json +280 -0
  120. package/src/RedactoPrivacyCenter/styles/base.css +117 -0
  121. package/src/RedactoPrivacyCenter/styles/injectStyles.ts +1725 -0
  122. package/src/RedactoPrivacyCenter/styles/pcStyles.ts +813 -0
  123. package/src/RedactoPrivacyCenter/styles/responsive.ts +138 -0
  124. package/src/RedactoPrivacyCenter/styles/variables.css +133 -0
  125. package/src/RedactoPrivacyCenter/table/AdvancedTable.tsx +367 -0
  126. package/src/RedactoPrivacyCenter/table/AdvancedTablePagination.tsx +476 -0
  127. package/src/RedactoPrivacyCenter/table/index.ts +2 -0
  128. package/src/RedactoPrivacyCenter/types/images.d.ts +29 -0
  129. package/src/RedactoPrivacyCenter/ui/Footer.tsx +75 -0
  130. package/src/RedactoPrivacyCenter/ui/FormBlockWrapper.tsx +54 -0
  131. package/src/RedactoPrivacyCenter/ui/PCAccordion.tsx +93 -0
  132. package/src/RedactoPrivacyCenter/ui/PCActionIcon.tsx +47 -0
  133. package/src/RedactoPrivacyCenter/ui/PCAvatar.tsx +69 -0
  134. package/src/RedactoPrivacyCenter/ui/PCBadge.tsx +48 -0
  135. package/src/RedactoPrivacyCenter/ui/PCButton.tsx +77 -0
  136. package/src/RedactoPrivacyCenter/ui/PCCheckbox.tsx +55 -0
  137. package/src/RedactoPrivacyCenter/ui/PCCollapse.tsx +107 -0
  138. package/src/RedactoPrivacyCenter/ui/PCEmpty.tsx +35 -0
  139. package/src/RedactoPrivacyCenter/ui/PCInput.tsx +132 -0
  140. package/src/RedactoPrivacyCenter/ui/PCLoader.tsx +31 -0
  141. package/src/RedactoPrivacyCenter/ui/PCModal.tsx +106 -0
  142. package/src/RedactoPrivacyCenter/ui/PCPopover.tsx +173 -0
  143. package/src/RedactoPrivacyCenter/ui/PCSelect.tsx +387 -0
  144. package/src/RedactoPrivacyCenter/ui/PCTable.tsx +149 -0
  145. package/src/RedactoPrivacyCenter/ui/PCText.tsx +41 -0
  146. package/src/RedactoPrivacyCenter/ui/PCTextarea.tsx +43 -0
  147. package/src/RedactoPrivacyCenter/ui/PCTitle.tsx +37 -0
  148. package/src/RedactoPrivacyCenter/ui/PCTooltip.tsx +119 -0
  149. package/src/RedactoPrivacyCenter/ui/SimpleBar.tsx +25 -0
  150. package/src/RedactoPrivacyCenter/ui/StatusBadge.tsx +53 -0
  151. package/src/RedactoPrivacyCenter/ui/ThemeToggle.tsx +72 -0
  152. package/src/RedactoPrivacyCenter/ui/index.ts +18 -0
  153. package/src/RedactoPrivacyCenter/utils/cn.ts +28 -0
  154. package/src/RedactoPrivacyCenter/utils/date.ts +48 -0
  155. package/src/RedactoPrivacyCenter/utils/status.ts +111 -0
  156. package/src/RedactoPrivacyCenter/utils/toast.ts +130 -0
  157. package/src/privacy-center.ts +108 -0
  158. package/tsconfig.json +2 -0
  159. package/tsup.config.ts +16 -1
  160. package/.turbo/turbo-build.log +0 -21
@@ -0,0 +1,469 @@
1
+ import { useTranslation } from 'react-i18next';
2
+ import { PCModal, PCTitle, PCText, PCButton, PCBadge, PCTable } from '../ui';
3
+ import { pcStyles } from '../styles/pcStyles';
4
+ import { formatDate } from './utils';
5
+ import type { CaseDetailsModalProps } from './types';
6
+
7
+ const getVar = (varName: string): string => `var(${varName})`;
8
+ const getCaseStatusVariant = (status: string): 'success' | 'error' | 'warning' | 'info' | 'secondary' => {
9
+ const n = status.toLowerCase().replace(/_/g, '');
10
+ if (n === 'completed') return 'success';
11
+ if (n === 'rejected' || n === 'declined') return 'error';
12
+ if (n === 'processing' || n === 'inprogress' || n === 'expired') return 'warning';
13
+ if (n === 'initiated') return 'info';
14
+ return 'secondary';
15
+ };
16
+ const formatCaseStatus = (s: string) =>
17
+ s.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
18
+
19
+ export default function CaseDetailsModal({
20
+ isOpen,
21
+ onClose,
22
+ selectedCase,
23
+ }: CaseDetailsModalProps) {
24
+ const { t } = useTranslation();
25
+
26
+ if (!selectedCase) return null;
27
+
28
+ const { request_details } = selectedCase;
29
+
30
+ return (
31
+ <PCModal
32
+ isOpen={isOpen}
33
+ onClose={onClose}
34
+ closeAriaLabel={t('closeModal')}
35
+ size="lg"
36
+ title={
37
+ <div style={{ minWidth: 0, flex: 1, paddingRight: getVar('--pc-spacing-sm') }}>
38
+ <PCTitle as="h4" style={{ fontSize: pcStyles.textBase.fontSize, color: getVar('--pc-text-primary') }}>
39
+ {t('caseDetails')}
40
+ </PCTitle>
41
+ <PCText
42
+ size="xs"
43
+ color="secondary"
44
+ style={{
45
+ marginTop: pcStyles.mtXs.marginTop,
46
+ wordBreak: 'break-all',
47
+ }}
48
+ >
49
+ {t('caseID')}: <span style={{ fontWeight: pcStyles.fontWeightMedium.fontWeight, color: getVar('--pc-text-primary') }}>
50
+ {selectedCase.case_id}
51
+ </span>
52
+ </PCText>
53
+ </div>
54
+ }
55
+ >
56
+ <div style={{ ...pcStyles.flex, ...pcStyles.flexCol, height: '100%' }}>
57
+ <div
58
+ className="pc-case-details-content"
59
+ style={{
60
+ ...pcStyles.flex,
61
+ ...pcStyles.flexCol,
62
+ gap: pcStyles.gapLg.gap,
63
+ padding: pcStyles.pLg.padding,
64
+ ...pcStyles.overflowYAuto,
65
+ maxHeight: 'calc(80vh - 140px)',
66
+ }}
67
+ >
68
+ {/* Basic Information Grid */}
69
+ <div
70
+ className="pc-case-details-grid"
71
+ style={{
72
+ display: 'grid',
73
+ gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))',
74
+ gap: pcStyles.gapMd.gap,
75
+ }}
76
+ >
77
+ <div>
78
+ <PCText
79
+ size="xs"
80
+ weight="medium"
81
+ color="secondary"
82
+ style={{ marginBottom: pcStyles.mbXs.marginBottom }}
83
+ >
84
+ {t('requestType')}
85
+ </PCText>
86
+ <PCText
87
+ size="sm"
88
+ weight="medium"
89
+ style={{
90
+ textTransform: 'capitalize',
91
+ color: getVar('--pc-text-primary'),
92
+ }}
93
+ >
94
+ {selectedCase.request_type_display || selectedCase.request_type.replace('_', ' ')}
95
+ </PCText>
96
+ </div>
97
+ <div>
98
+ <PCText
99
+ size="xs"
100
+ weight="medium"
101
+ color="secondary"
102
+ style={{ marginBottom: pcStyles.mbXs.marginBottom }}
103
+ >
104
+ {t('status')}
105
+ </PCText>
106
+ <PCBadge
107
+ variant={getCaseStatusVariant(selectedCase.status)}
108
+ size="sm"
109
+ className="pc-status-badge"
110
+ >
111
+ {selectedCase.status_display || formatCaseStatus(selectedCase.status)}
112
+ </PCBadge>
113
+ </div>
114
+ <div>
115
+ <PCText
116
+ size="xs"
117
+ weight="medium"
118
+ color="secondary"
119
+ style={{ marginBottom: pcStyles.mbXs.marginBottom }}
120
+ >
121
+ {t('createdAt')}
122
+ </PCText>
123
+ <PCText
124
+ size="sm"
125
+ weight="medium"
126
+ style={{ color: getVar('--pc-text-primary') }}
127
+ >
128
+ {formatDate(selectedCase.created_at)}
129
+ </PCText>
130
+ </div>
131
+ {selectedCase.completed_at && (
132
+ <div>
133
+ <PCText
134
+ size="xs"
135
+ weight="medium"
136
+ color="secondary"
137
+ style={{ marginBottom: pcStyles.mbXs.marginBottom }}
138
+ >
139
+ {t('completedAt')}
140
+ </PCText>
141
+ <PCText
142
+ size="sm"
143
+ weight="medium"
144
+ style={{ color: getVar('--pc-text-primary') }}
145
+ >
146
+ {formatDate(selectedCase.completed_at)}
147
+ </PCText>
148
+ </div>
149
+ )}
150
+ </div>
151
+
152
+ {/* Description Section */}
153
+ {(selectedCase.description_display || selectedCase.description) && (
154
+ <div
155
+ style={{
156
+ backgroundColor: getVar('--pc-bg-secondary'),
157
+ padding: pcStyles.pMd.padding,
158
+ borderRadius: pcStyles.borderRadiusLg,
159
+ border: `1px solid ${getVar('--pc-border-color')}`,
160
+ }}
161
+ >
162
+ <PCText
163
+ size="sm"
164
+ weight="semibold"
165
+ style={{
166
+ marginBottom: pcStyles.mbSm.marginBottom,
167
+ color: getVar('--pc-text-primary'),
168
+ }}
169
+ >
170
+ {t('description')}
171
+ </PCText>
172
+ <PCText
173
+ size="sm"
174
+ color="secondary"
175
+ style={{ lineHeight: '1.6' }}
176
+ >
177
+ {selectedCase.description_display || selectedCase.description}
178
+ </PCText>
179
+ </div>
180
+ )}
181
+
182
+ {/* Request Specifics Section */}
183
+ {request_details && (
184
+ <div style={{ ...pcStyles.flex, ...pcStyles.flexCol, gap: pcStyles.gapLg.gap }}>
185
+ <PCTitle
186
+ as="h6"
187
+ style={{
188
+ fontSize: pcStyles.textSm.fontSize,
189
+ fontWeight: pcStyles.fontWeightBold.fontWeight,
190
+ textTransform: 'uppercase',
191
+ letterSpacing: '0.05em',
192
+ color: getVar('--pc-text-secondary'),
193
+ marginBottom: pcStyles.mbXs.marginBottom,
194
+ }}
195
+ >
196
+ {t('requestSpecifics')}
197
+ </PCTitle>
198
+
199
+ {/* Purposes Section */}
200
+ {request_details.purposes && request_details.purposes.length > 0 && (
201
+ <div>
202
+ <PCText
203
+ weight="semibold"
204
+ style={{
205
+ marginBottom: pcStyles.mbMd.marginBottom,
206
+ color: getVar('--pc-text-primary'),
207
+ }}
208
+ >
209
+ {t('purposesInvolved')}
210
+ </PCText>
211
+ <ul
212
+ style={{
213
+ listStyleType: 'none',
214
+ paddingLeft: 0,
215
+ ...pcStyles.flex,
216
+ ...pcStyles.flexCol,
217
+ gap: pcStyles.gapMd.gap,
218
+ }}
219
+ >
220
+ {request_details.purposes.map((p: any, idx: number) => (
221
+ <li
222
+ key={idx}
223
+ style={{
224
+ padding: pcStyles.pMd.padding,
225
+ backgroundColor: getVar('--pc-bg-secondary'),
226
+ borderRadius: pcStyles.borderRadiusMd,
227
+ border: `1px solid ${getVar('--pc-border-color')}`,
228
+ }}
229
+ >
230
+ <div
231
+ style={{
232
+ fontWeight: pcStyles.fontWeightSemibold.fontWeight,
233
+ color: getVar('--pc-text-primary'),
234
+ marginBottom: pcStyles.mbXs.marginBottom,
235
+ }}
236
+ >
237
+ {p.purpose?.name}
238
+ </div>
239
+ {p.purpose?.description && (
240
+ <div
241
+ style={{
242
+ color: getVar('--pc-text-secondary'),
243
+ fontSize: pcStyles.textSm.fontSize,
244
+ marginBottom: pcStyles.mbSm.marginBottom,
245
+ lineHeight: '1.5',
246
+ }}
247
+ >
248
+ {p.purpose.description}
249
+ </div>
250
+ )}
251
+ {p.purpose?.data_elements && p.purpose.data_elements.some((de: any) => de.selected) && (
252
+ <div
253
+ style={{
254
+ marginTop: pcStyles.mtSm.marginTop,
255
+ ...pcStyles.flex,
256
+ flexWrap: 'wrap',
257
+ gap: pcStyles.gapSm.gap
258
+ }}
259
+ >
260
+ {p.purpose.data_elements
261
+ .filter((de: any) => de.selected)
262
+ .map((de: any, dIdx: number) => (
263
+ <PCBadge key={dIdx} variant="secondary" size="sm" className="pc-status-badge">
264
+ {de.name}
265
+ </PCBadge>
266
+ ))}
267
+ </div>
268
+ )}
269
+ </li>
270
+ ))}
271
+ </ul>
272
+ </div>
273
+ )}
274
+
275
+ {/* Correction Data Table */}
276
+ {request_details.correction_data && request_details.correction_data.length > 0 && (
277
+ <div>
278
+ <PCText
279
+ weight="semibold"
280
+ style={{
281
+ marginBottom: pcStyles.mbMd.marginBottom,
282
+ fontSize: pcStyles.textSm.fontSize,
283
+ color: getVar('--pc-text-primary'),
284
+ }}
285
+ >
286
+ {t('dataToCorrect')}
287
+ </PCText>
288
+ <div style={{ ...pcStyles.overflowXAuto }}>
289
+ <div
290
+ style={{
291
+ minWidth: '100%',
292
+ border: `1px solid ${getVar('--pc-border-color')}`,
293
+ borderRadius: pcStyles.borderRadiusLg,
294
+ overflow: 'hidden',
295
+ backgroundColor: getVar('--pc-bg-primary'),
296
+ }}
297
+ >
298
+ <PCTable style={{ width: '100%', fontSize: pcStyles.textXs.fontSize }}>
299
+ <PCTable.Header style={{ backgroundColor: getVar('--pc-bg-secondary') }}>
300
+ <PCTable.Row>
301
+ <PCTable.Head
302
+ style={{
303
+ padding: '0.75rem 1rem',
304
+ whiteSpace: 'nowrap',
305
+ color: getVar('--pc-text-secondary'),
306
+ fontWeight: pcStyles.fontWeightSemibold.fontWeight,
307
+ fontSize: pcStyles.textSm.fontSize,
308
+ }}
309
+ >
310
+ {t('field')}
311
+ </PCTable.Head>
312
+ <PCTable.Head
313
+ style={{
314
+ padding: '0.75rem 1rem',
315
+ whiteSpace: 'nowrap',
316
+ color: getVar('--pc-text-secondary'),
317
+ fontWeight: pcStyles.fontWeightSemibold.fontWeight,
318
+ fontSize: pcStyles.textSm.fontSize,
319
+ }}
320
+ >
321
+ {t('currentValue')}
322
+ </PCTable.Head>
323
+ <PCTable.Head
324
+ style={{
325
+ padding: '0.75rem 1rem',
326
+ whiteSpace: 'nowrap',
327
+ color: getVar('--pc-text-secondary'),
328
+ fontWeight: pcStyles.fontWeightSemibold.fontWeight,
329
+ fontSize: pcStyles.textSm.fontSize,
330
+ }}
331
+ >
332
+ {t('newValue')}
333
+ </PCTable.Head>
334
+ </PCTable.Row>
335
+ </PCTable.Header>
336
+ <PCTable.Body>
337
+ {request_details.correction_data.map((item: any, idx: number) => (
338
+ <PCTable.Row
339
+ key={idx}
340
+ style={{
341
+ borderBottom: `1px solid ${getVar('--pc-border-color')}`,
342
+ }}
343
+ >
344
+ <PCTable.Cell
345
+ style={{
346
+ padding: '0.75rem 1rem',
347
+ fontWeight: pcStyles.fontWeightMedium.fontWeight,
348
+ color: getVar('--pc-text-primary'),
349
+ }}
350
+ >
351
+ {item.name}
352
+ </PCTable.Cell>
353
+ <PCTable.Cell
354
+ style={{
355
+ padding: '0.75rem 1rem',
356
+ color: getVar('--pc-text-secondary'),
357
+ wordBreak: 'break-word',
358
+ }}
359
+ >
360
+ {item.curr_value || '-'}
361
+ </PCTable.Cell>
362
+ <PCTable.Cell
363
+ style={{
364
+ padding: '0.75rem 1rem',
365
+ color: getVar('--pc-text-secondary'),
366
+ wordBreak: 'break-word',
367
+ }}
368
+ >
369
+ {item.new_value || '-'}
370
+ </PCTable.Cell>
371
+ </PCTable.Row>
372
+ ))}
373
+ </PCTable.Body>
374
+ </PCTable>
375
+ </div>
376
+ </div>
377
+ </div>
378
+ )}
379
+
380
+ {/* Nomination Data */}
381
+ {request_details.nomination_data && (
382
+ <div>
383
+ <PCText
384
+ weight="semibold"
385
+ style={{
386
+ marginBottom: pcStyles.mbMd.marginBottom,
387
+ color: getVar('--pc-text-primary'),
388
+ }}
389
+ >
390
+ {t('nomination')}
391
+ </PCText>
392
+ <div
393
+ style={{
394
+ backgroundColor: getVar('--pc-bg-secondary'),
395
+ padding: pcStyles.pMd.padding,
396
+ borderRadius: pcStyles.borderRadiusMd,
397
+ border: `1px solid ${getVar('--pc-border-color')}`,
398
+ ...pcStyles.flex,
399
+ ...pcStyles.flexCol,
400
+ gap: pcStyles.gapSm.gap,
401
+ }}
402
+ >
403
+ <div>
404
+ <PCText size="xs" weight="medium" color="secondary">
405
+ {t('nomineeEmail')}
406
+ </PCText>
407
+ <PCText size="sm" style={{ color: getVar('--pc-text-primary') }}>
408
+ {request_details.nomination_data.nominee_email || '-'}
409
+ </PCText>
410
+ </div>
411
+ <div>
412
+ <PCText size="xs" weight="medium" color="secondary">
413
+ {t('nomineeMobile')}
414
+ </PCText>
415
+ <PCText size="sm" style={{ color: getVar('--pc-text-primary') }}>
416
+ {request_details.nomination_data.nominee_mobile || '-'}
417
+ </PCText>
418
+ </div>
419
+ </div>
420
+ </div>
421
+ )}
422
+
423
+ {/* Grievance Types */}
424
+ {request_details.grievance_types && request_details.grievance_types.length > 0 && (
425
+ <div>
426
+ <PCText
427
+ weight="semibold"
428
+ style={{
429
+ marginBottom: pcStyles.mbMd.marginBottom,
430
+ color: getVar('--pc-text-primary'),
431
+ }}
432
+ >
433
+ {t('grievanceTypes')}
434
+ </PCText>
435
+ <div style={{ ...pcStyles.flex, flexWrap: 'wrap', gap: pcStyles.gapSm.gap }}>
436
+ {request_details.grievance_types.map((g: any, idx: number) => (
437
+ <PCBadge key={idx} variant="secondary" size="sm" className="pc-status-badge">
438
+ {g.grievance?.replace('_', ' ')}
439
+ </PCBadge>
440
+ ))}
441
+ </div>
442
+ </div>
443
+ )}
444
+ </div>
445
+ )}
446
+ </div>
447
+
448
+ {/* Footer */}
449
+ <div
450
+ style={{
451
+ padding: `${getVar('--pc-spacing-md')} ${getVar('--pc-spacing-lg')}`,
452
+ ...pcStyles.flex,
453
+ ...pcStyles.justifyEnd,
454
+ backgroundColor: 'transparent',
455
+ marginTop: 'auto',
456
+ }}
457
+ >
458
+ <PCButton
459
+ variant="outline"
460
+ onClick={onClose}
461
+ size="sm"
462
+ >
463
+ {t('close')}
464
+ </PCButton>
465
+ </div>
466
+ </div>
467
+ </PCModal>
468
+ );
469
+ }