@redacto.io/consent-sdk-react 10.0.0-beta.1 → 10.0.0-beta.12

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 (258) hide show
  1. package/NOTICE.md +17 -0
  2. package/README.md +145 -3
  3. package/dist/chunk-FEGTW73Q.mjs +182 -0
  4. package/dist/{chunk-6A665OPR.mjs → chunk-OGL6OC3A.mjs} +4 -0
  5. package/dist/fonts.d.mts +35 -0
  6. package/dist/fonts.d.ts +35 -0
  7. package/dist/fonts.js +183 -0
  8. package/dist/fonts.mjs +10 -0
  9. package/dist/index.d.mts +44 -5
  10. package/dist/index.d.ts +44 -5
  11. package/dist/index.js +950 -476
  12. package/dist/index.mjs +572 -314
  13. package/dist/montserrat.generated-NBTECYRW.mjs +22 -0
  14. package/dist/privacy-center.d.mts +55 -12
  15. package/dist/privacy-center.d.ts +55 -12
  16. package/dist/privacy-center.js +848 -950
  17. package/dist/privacy-center.mjs +698 -802
  18. package/dist/types-6Aj7faxL.d.mts +57 -0
  19. package/dist/types-6Aj7faxL.d.ts +57 -0
  20. package/package.json +10 -1
  21. package/.turbo/turbo-build.log +0 -22
  22. package/.turbo/turbo-test.log +0 -203
  23. package/.turbo/turbo-verify-pack.log +0 -6
  24. package/CHANGELOG.md +0 -274
  25. package/src/RedactoNoticeAssisted/RedactoNoticeAssisted.test.tsx +0 -847
  26. package/src/RedactoNoticeAssisted/RedactoNoticeAssisted.tsx +0 -2133
  27. package/src/RedactoNoticeAssisted/api/index.ts +0 -269
  28. package/src/RedactoNoticeAssisted/api/types.ts +0 -180
  29. package/src/RedactoNoticeAssisted/assets/redacto-logo.png +0 -0
  30. package/src/RedactoNoticeAssisted/constants.ts +0 -51
  31. package/src/RedactoNoticeAssisted/i18n.ts +0 -1463
  32. package/src/RedactoNoticeAssisted/index.ts +0 -1
  33. package/src/RedactoNoticeAssisted/injectStyles.ts +0 -251
  34. package/src/RedactoNoticeAssisted/styles.ts +0 -730
  35. package/src/RedactoNoticeAssisted/types.ts +0 -24
  36. package/src/RedactoNoticeAssisted/useMediaQuery.ts +0 -36
  37. package/src/RedactoNoticeConsent/RedactoNoticeConsent.test.tsx +0 -1152
  38. package/src/RedactoNoticeConsent/RedactoNoticeConsent.tsx +0 -4258
  39. package/src/RedactoNoticeConsent/api/index.ts +0 -573
  40. package/src/RedactoNoticeConsent/api/types.ts +0 -490
  41. package/src/RedactoNoticeConsent/assets/redacto-logo.png +0 -0
  42. package/src/RedactoNoticeConsent/components/DigiLockerCallback.tsx +0 -602
  43. package/src/RedactoNoticeConsent/components/index.ts +0 -7
  44. package/src/RedactoNoticeConsent/constants.ts +0 -20
  45. package/src/RedactoNoticeConsent/index.ts +0 -1
  46. package/src/RedactoNoticeConsent/injectStyles.ts +0 -151
  47. package/src/RedactoNoticeConsent/language-codes.ts +0 -97
  48. package/src/RedactoNoticeConsent/services/storage.ts +0 -122
  49. package/src/RedactoNoticeConsent/styles.ts +0 -409
  50. package/src/RedactoNoticeConsent/types.ts +0 -54
  51. package/src/RedactoNoticeConsent/useMediaQuery.ts +0 -36
  52. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.test.tsx +0 -369
  53. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.tsx +0 -629
  54. package/src/RedactoNoticeConsentInline/api/index.ts +0 -106
  55. package/src/RedactoNoticeConsentInline/api/types.ts +0 -183
  56. package/src/RedactoNoticeConsentInline/assets/redacto-logo.png +0 -0
  57. package/src/RedactoNoticeConsentInline/index.ts +0 -1
  58. package/src/RedactoNoticeConsentInline/injectStyles.ts +0 -40
  59. package/src/RedactoNoticeConsentInline/styles.ts +0 -397
  60. package/src/RedactoNoticeConsentInline/types.ts +0 -51
  61. package/src/RedactoNoticeConsentInline/useMediaQuery.ts +0 -36
  62. package/src/RedactoPrivacyCenter/NotificationsPage.tsx +0 -182
  63. package/src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx +0 -19
  64. package/src/RedactoPrivacyCenter/PrivacyCenterCaseDetailsPage.tsx +0 -156
  65. package/src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx +0 -17
  66. package/src/RedactoPrivacyCenter/PrivacyCenterFormPage.tsx +0 -79
  67. package/src/RedactoPrivacyCenter/PrivacyCenterHomePage.tsx +0 -36
  68. package/src/RedactoPrivacyCenter/PrivacyCenterLayout.tsx +0 -177
  69. package/src/RedactoPrivacyCenter/PrivacyCenterMyReceiptPage.tsx +0 -26
  70. package/src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx +0 -58
  71. package/src/RedactoPrivacyCenter/api/actions.ts +0 -680
  72. package/src/RedactoPrivacyCenter/api/client.ts +0 -906
  73. package/src/RedactoPrivacyCenter/api/config.ts +0 -33
  74. package/src/RedactoPrivacyCenter/api/fetcher.ts +0 -260
  75. package/src/RedactoPrivacyCenter/api/orgBranding.ts +0 -16
  76. package/src/RedactoPrivacyCenter/api/upload.ts +0 -93
  77. package/src/RedactoPrivacyCenter/assets/character.svg +0 -31
  78. package/src/RedactoPrivacyCenter/assets/fileAttach.svg +0 -9
  79. package/src/RedactoPrivacyCenter/assets/greenTick.svg +0 -4
  80. package/src/RedactoPrivacyCenter/assets/mail.svg +0 -3
  81. package/src/RedactoPrivacyCenter/assets/poweredByRedacto.svg +0 -9
  82. package/src/RedactoPrivacyCenter/assets/sentImg.svg +0 -9
  83. package/src/RedactoPrivacyCenter/assets/uploadFileIcon.svg +0 -9
  84. package/src/RedactoPrivacyCenter/components/ActivitiesList.tsx +0 -252
  85. package/src/RedactoPrivacyCenter/components/ActivityTimeline.tsx +0 -239
  86. package/src/RedactoPrivacyCenter/components/AppShell/AppShell.tsx +0 -240
  87. package/src/RedactoPrivacyCenter/components/AppShell/MobileNavDrawer.tsx +0 -218
  88. package/src/RedactoPrivacyCenter/components/AppShell/NavItem.tsx +0 -205
  89. package/src/RedactoPrivacyCenter/components/AppShell/PageHeader.tsx +0 -107
  90. package/src/RedactoPrivacyCenter/components/AppShell/SidebarNav.tsx +0 -100
  91. package/src/RedactoPrivacyCenter/components/AppShell/TopAppBar.tsx +0 -339
  92. package/src/RedactoPrivacyCenter/components/AppShell/UserMenu.tsx +0 -243
  93. package/src/RedactoPrivacyCenter/components/AppShell/hooks/useIsTruncated.ts +0 -28
  94. package/src/RedactoPrivacyCenter/components/AppShell/hooks/useKeyboardShortcut.ts +0 -40
  95. package/src/RedactoPrivacyCenter/components/AppShell/hooks/useSidebarState.ts +0 -62
  96. package/src/RedactoPrivacyCenter/components/AppShell/usePrivacyCenterExitAction.ts +0 -36
  97. package/src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx +0 -38
  98. package/src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx +0 -31
  99. package/src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx +0 -79
  100. package/src/RedactoPrivacyCenter/components/CaseDetails/FinalizedTooltipWrapper.tsx +0 -25
  101. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx +0 -96
  102. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx +0 -97
  103. package/src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx +0 -156
  104. package/src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx +0 -171
  105. package/src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx +0 -23
  106. package/src/RedactoPrivacyCenter/components/CaseDetails/useFileUpload.ts +0 -116
  107. package/src/RedactoPrivacyCenter/components/CaseDetails/useMessagePolling.ts +0 -43
  108. package/src/RedactoPrivacyCenter/components/CaseDetails/utils.ts +0 -71
  109. package/src/RedactoPrivacyCenter/components/CaseDetailsModal.tsx +0 -469
  110. package/src/RedactoPrivacyCenter/components/CaseHistory.tsx +0 -426
  111. package/src/RedactoPrivacyCenter/components/ConsentManager.tsx +0 -1198
  112. package/src/RedactoPrivacyCenter/components/ConsentManagerCells.tsx +0 -201
  113. package/src/RedactoPrivacyCenter/components/ConsentManagerColumns.tsx +0 -138
  114. package/src/RedactoPrivacyCenter/components/ConsentManagerConstants.ts +0 -7
  115. package/src/RedactoPrivacyCenter/components/ConsentManagerExpandedRow.tsx +0 -179
  116. package/src/RedactoPrivacyCenter/components/ConsentManagerGroupedColumns.tsx +0 -318
  117. package/src/RedactoPrivacyCenter/components/ConsentManagerProductCards.tsx +0 -333
  118. package/src/RedactoPrivacyCenter/components/ConsentManagerPurposeCards.tsx +0 -102
  119. package/src/RedactoPrivacyCenter/components/ConsentManagerTableSkeleton.tsx +0 -159
  120. package/src/RedactoPrivacyCenter/components/DataRequest/CorrectionDataSection.tsx +0 -189
  121. package/src/RedactoPrivacyCenter/components/DataRequest/GrievanceDataSection.tsx +0 -118
  122. package/src/RedactoPrivacyCenter/components/DataRequest/NominationDataSection.tsx +0 -66
  123. package/src/RedactoPrivacyCenter/components/DataRequest/ProductSelectionSection.tsx +0 -222
  124. package/src/RedactoPrivacyCenter/components/DataRequest/PurposeSelectionSection.tsx +0 -331
  125. package/src/RedactoPrivacyCenter/components/Form.tsx +0 -1796
  126. package/src/RedactoPrivacyCenter/components/GrievanceTable.tsx +0 -174
  127. package/src/RedactoPrivacyCenter/components/GrievanceTablePagination.tsx +0 -337
  128. package/src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx +0 -334
  129. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationBell.tsx +0 -173
  130. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationCTAButton.tsx +0 -18
  131. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationDropdown.tsx +0 -54
  132. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationDropdownItem.tsx +0 -57
  133. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationIcon.tsx +0 -19
  134. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationListPanel.tsx +0 -92
  135. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationRefreshButton.tsx +0 -20
  136. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx +0 -58
  137. package/src/RedactoPrivacyCenter/components/NotificationHub/StatCard.tsx +0 -10
  138. package/src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts +0 -112
  139. package/src/RedactoPrivacyCenter/components/NotificationHub/utils.ts +0 -27
  140. package/src/RedactoPrivacyCenter/components/Pagination.tsx +0 -140
  141. package/src/RedactoPrivacyCenter/components/PrivacyCenterEmptyState.tsx +0 -76
  142. package/src/RedactoPrivacyCenter/components/PrivacyCenterSessionExpired.tsx +0 -97
  143. package/src/RedactoPrivacyCenter/components/ReceiptsList.tsx +0 -454
  144. package/src/RedactoPrivacyCenter/components/RequestSubmit.tsx +0 -270
  145. package/src/RedactoPrivacyCenter/components/SelectUser.tsx +0 -83
  146. package/src/RedactoPrivacyCenter/components/SelectUserGate.tsx +0 -193
  147. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/constants.tsx +0 -25
  148. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/types.ts +0 -21
  149. package/src/RedactoPrivacyCenter/components/caseHistoryColumns.tsx +0 -159
  150. package/src/RedactoPrivacyCenter/components/constant.ts +0 -52
  151. package/src/RedactoPrivacyCenter/components/groupHelpers.ts +0 -119
  152. package/src/RedactoPrivacyCenter/components/receiptColumns.tsx +0 -203
  153. package/src/RedactoPrivacyCenter/components/types.ts +0 -123
  154. package/src/RedactoPrivacyCenter/components/utils.tsx +0 -10
  155. package/src/RedactoPrivacyCenter/config/routes.ts +0 -9
  156. package/src/RedactoPrivacyCenter/config/table.ts +0 -25
  157. package/src/RedactoPrivacyCenter/context/AuthContext.tsx +0 -160
  158. package/src/RedactoPrivacyCenter/context/BaseUrlContext.tsx +0 -47
  159. package/src/RedactoPrivacyCenter/context/BrandingContext.tsx +0 -52
  160. package/src/RedactoPrivacyCenter/context/DataAvailabilityContext.session-expired.test.tsx +0 -92
  161. package/src/RedactoPrivacyCenter/context/DataAvailabilityContext.tsx +0 -181
  162. package/src/RedactoPrivacyCenter/context/LocaleContext.tsx +0 -11
  163. package/src/RedactoPrivacyCenter/context/NavigationContext.tsx +0 -96
  164. package/src/RedactoPrivacyCenter/context/OrganizationContext.tsx +0 -30
  165. package/src/RedactoPrivacyCenter/context/PageChromeContext.tsx +0 -80
  166. package/src/RedactoPrivacyCenter/context/ProfileSwitchContext.tsx +0 -15
  167. package/src/RedactoPrivacyCenter/context/types.ts +0 -19
  168. package/src/RedactoPrivacyCenter/lib/api.ts +0 -756
  169. package/src/RedactoPrivacyCenter/lib/consent-manager/utils.tsx +0 -67
  170. package/src/RedactoPrivacyCenter/lib/constants.ts +0 -277
  171. package/src/RedactoPrivacyCenter/lib/i18n.ts +0 -81
  172. package/src/RedactoPrivacyCenter/lib/locales.ts +0 -105
  173. package/src/RedactoPrivacyCenter/lib/queries.ts +0 -141
  174. package/src/RedactoPrivacyCenter/lib/types.ts +0 -868
  175. package/src/RedactoPrivacyCenter/lib/useCurrentLanguage.ts +0 -37
  176. package/src/RedactoPrivacyCenter/lib/utils.refresh-circuit.test.ts +0 -127
  177. package/src/RedactoPrivacyCenter/lib/utils.refresh-storage.test.ts +0 -85
  178. package/src/RedactoPrivacyCenter/lib/utils.session-expired.test.ts +0 -109
  179. package/src/RedactoPrivacyCenter/lib/utils.ts +0 -783
  180. package/src/RedactoPrivacyCenter/locales/as/translation.json +0 -340
  181. package/src/RedactoPrivacyCenter/locales/bho/translation.json +0 -340
  182. package/src/RedactoPrivacyCenter/locales/bn/translation.json +0 -340
  183. package/src/RedactoPrivacyCenter/locales/brx/translation.json +0 -340
  184. package/src/RedactoPrivacyCenter/locales/doi/translation.json +0 -340
  185. package/src/RedactoPrivacyCenter/locales/en/translation.json +0 -354
  186. package/src/RedactoPrivacyCenter/locales/gom/translation.json +0 -340
  187. package/src/RedactoPrivacyCenter/locales/gu/translation.json +0 -340
  188. package/src/RedactoPrivacyCenter/locales/hi/translation.json +0 -343
  189. package/src/RedactoPrivacyCenter/locales/kn/translation.json +0 -340
  190. package/src/RedactoPrivacyCenter/locales/ks/translation.json +0 -340
  191. package/src/RedactoPrivacyCenter/locales/mai/translation.json +0 -340
  192. package/src/RedactoPrivacyCenter/locales/ml/translation.json +0 -340
  193. package/src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json +0 -340
  194. package/src/RedactoPrivacyCenter/locales/mr/translation.json +0 -340
  195. package/src/RedactoPrivacyCenter/locales/ne/translation.json +0 -340
  196. package/src/RedactoPrivacyCenter/locales/or/translation.json +0 -340
  197. package/src/RedactoPrivacyCenter/locales/pa/translation.json +0 -340
  198. package/src/RedactoPrivacyCenter/locales/sa/translation.json +0 -340
  199. package/src/RedactoPrivacyCenter/locales/sat/translation.json +0 -340
  200. package/src/RedactoPrivacyCenter/locales/sd/translation.json +0 -340
  201. package/src/RedactoPrivacyCenter/locales/ta/translation.json +0 -340
  202. package/src/RedactoPrivacyCenter/locales/te/translation.json +0 -340
  203. package/src/RedactoPrivacyCenter/locales/ur/translation.json +0 -340
  204. package/src/RedactoPrivacyCenter/styles/applyBrandingTheme.ts +0 -66
  205. package/src/RedactoPrivacyCenter/styles/base.css +0 -117
  206. package/src/RedactoPrivacyCenter/styles/injectStyles.ts +0 -3103
  207. package/src/RedactoPrivacyCenter/styles/pcStyles.ts +0 -814
  208. package/src/RedactoPrivacyCenter/styles/responsive.ts +0 -138
  209. package/src/RedactoPrivacyCenter/styles/variables.css +0 -96
  210. package/src/RedactoPrivacyCenter/table/AdvancedTable.tsx +0 -387
  211. package/src/RedactoPrivacyCenter/table/AdvancedTablePagination.tsx +0 -468
  212. package/src/RedactoPrivacyCenter/table/index.ts +0 -2
  213. package/src/RedactoPrivacyCenter/types/images.d.ts +0 -29
  214. package/src/RedactoPrivacyCenter/ui/Footer.tsx +0 -69
  215. package/src/RedactoPrivacyCenter/ui/FormBlockWrapper.tsx +0 -54
  216. package/src/RedactoPrivacyCenter/ui/PCAccordion.tsx +0 -93
  217. package/src/RedactoPrivacyCenter/ui/PCActionIcon.tsx +0 -47
  218. package/src/RedactoPrivacyCenter/ui/PCAvatar.tsx +0 -69
  219. package/src/RedactoPrivacyCenter/ui/PCBadge.tsx +0 -48
  220. package/src/RedactoPrivacyCenter/ui/PCButton.tsx +0 -77
  221. package/src/RedactoPrivacyCenter/ui/PCCheckbox.tsx +0 -55
  222. package/src/RedactoPrivacyCenter/ui/PCCollapse.tsx +0 -107
  223. package/src/RedactoPrivacyCenter/ui/PCEmpty.tsx +0 -35
  224. package/src/RedactoPrivacyCenter/ui/PCInput.tsx +0 -132
  225. package/src/RedactoPrivacyCenter/ui/PCLoader.tsx +0 -31
  226. package/src/RedactoPrivacyCenter/ui/PCModal.tsx +0 -106
  227. package/src/RedactoPrivacyCenter/ui/PCPopover.tsx +0 -206
  228. package/src/RedactoPrivacyCenter/ui/PCSelect.tsx +0 -433
  229. package/src/RedactoPrivacyCenter/ui/PCTable.tsx +0 -149
  230. package/src/RedactoPrivacyCenter/ui/PCText.tsx +0 -41
  231. package/src/RedactoPrivacyCenter/ui/PCTextarea.tsx +0 -43
  232. package/src/RedactoPrivacyCenter/ui/PCTitle.tsx +0 -37
  233. package/src/RedactoPrivacyCenter/ui/PCTooltip.tsx +0 -121
  234. package/src/RedactoPrivacyCenter/ui/SimpleBar.tsx +0 -25
  235. package/src/RedactoPrivacyCenter/ui/StatusBadge.tsx +0 -53
  236. package/src/RedactoPrivacyCenter/ui/index.ts +0 -18
  237. package/src/RedactoPrivacyCenter/utils/cn.ts +0 -28
  238. package/src/RedactoPrivacyCenter/utils/date.ts +0 -48
  239. package/src/RedactoPrivacyCenter/utils/status.ts +0 -111
  240. package/src/RedactoPrivacyCenter/utils/toast.ts +0 -130
  241. package/src/index.ts +0 -19
  242. package/src/privacy-center.ts +0 -113
  243. package/src/shared/api-errors.ts +0 -180
  244. package/src/types/css.d.ts +0 -4
  245. package/src/types/images.d.ts +0 -19
  246. package/src/types/react-jsx.d.ts +0 -26
  247. package/tests/DataAvailabilityContext.test.tsx +0 -123
  248. package/tests/Form.test.tsx +0 -1287
  249. package/tests/ProductSelectionSection.test.tsx +0 -328
  250. package/tests/RequestSubmit.test.tsx +0 -135
  251. package/tests/consentClient.test.ts +0 -171
  252. package/tests/manageConsentServer.test.ts +0 -38
  253. package/tests/mocks.ts +0 -257
  254. package/tests/resolveContactFromJwt.test.ts +0 -44
  255. package/tests/setup.ts +0 -16
  256. package/tsconfig.json +0 -16
  257. package/tsup.config.ts +0 -31
  258. package/vitest.config.ts +0 -16
@@ -1,201 +0,0 @@
1
- import type { TFunction } from 'i18next';
2
- import dayjs from 'dayjs';
3
- import relativeTime from 'dayjs/plugin/relativeTime';
4
- import { Smartphone, LaptopMinimal } from 'lucide-react';
5
- import { PCText, PCTooltip } from '../ui';
6
- import { pcStyles } from '../styles/pcStyles';
7
- import { ConsentStatusEnum } from '../lib/types';
8
- import type { PurposeItem, ConsentModalRecord } from '../lib/types';
9
- import { formatDateTime } from '../lib/consent-manager/utils';
10
- import type { BadgeVariant } from './types';
11
-
12
- dayjs.extend(relativeTime);
13
- const getVar = (varName: string): string => `var(${varName})`;
14
-
15
- const statusVariantMap: Record<string, BadgeVariant> = {
16
- [ConsentStatusEnum.ACTIVE]: 'success',
17
- [ConsentStatusEnum.WITHDRAWN]: 'error',
18
- [ConsentStatusEnum.REVOKED]: 'error',
19
- [ConsentStatusEnum.EXPIRED]: 'warning',
20
- [ConsentStatusEnum.DECLINED]: 'warning',
21
- };
22
-
23
- export const getStatusVariant = (status: string): BadgeVariant =>
24
- statusVariantMap[status?.toUpperCase()] ?? 'secondary';
25
-
26
- export const getStatusLabel = (status: string, t: TFunction): string => {
27
- const normalized = status?.toUpperCase();
28
- if (normalized === ConsentStatusEnum.ACTIVE) return t('statusActive');
29
- if (normalized === ConsentStatusEnum.WITHDRAWN) return t('statusWithdrawn');
30
- if (normalized === ConsentStatusEnum.REVOKED) return t('statusRevoked');
31
- if (normalized === ConsentStatusEnum.EXPIRED) return t('statusExpired');
32
- if (normalized === ConsentStatusEnum.DECLINED) return t('statusDeclined');
33
- return status;
34
- };
35
-
36
- const statusBadgeColors: Record<BadgeVariant, { bg: string; fg: string }> = {
37
- success: { bg: 'rgba(16, 185, 129, 0.12)', fg: 'var(--pc-success)' },
38
- error: { bg: 'rgba(239, 68, 68, 0.12)', fg: 'var(--pc-error)' },
39
- warning: { bg: 'rgba(245, 158, 11, 0.12)', fg: 'var(--pc-warning)' },
40
- info: { bg: 'rgba(59, 130, 246, 0.12)', fg: 'var(--pc-info)' },
41
- secondary: { bg: 'rgba(107, 114, 128, 0.12)', fg: 'var(--pc-text-secondary)' },
42
- };
43
-
44
- export const renderStatusBadge = (status: string, t: TFunction) => {
45
- const variant = getStatusVariant(status);
46
- const colors = statusBadgeColors[variant];
47
- return (
48
- <div style={{ ...pcStyles.flex, ...pcStyles.itemsCenter, ...pcStyles.justifyStart }}>
49
- <span
50
- className="pc-status-badge"
51
- style={{
52
- display: 'inline-flex',
53
- alignItems: 'center',
54
- gap: '0.3125rem',
55
- borderRadius: '9999px',
56
- padding: '0.1875rem 0.5625rem',
57
- fontSize: '0.6875rem',
58
- fontWeight: 600,
59
- backgroundColor: colors.bg,
60
- color: colors.fg,
61
- }}
62
- >
63
- <span
64
- aria-hidden="true"
65
- style={{
66
- width: '0.375rem',
67
- height: '0.375rem',
68
- borderRadius: '9999px',
69
- backgroundColor: colors.fg,
70
- flexShrink: 0,
71
- }}
72
- />
73
- {getStatusLabel(status, t)}
74
- </span>
75
- </div>
76
- );
77
- };
78
-
79
- // Plain-string version of the given-date cell, for reuse in CSV export etc.
80
- export const getGivenDateLabel = (timestamp: string | null): string => {
81
- if (!timestamp) {
82
- return '-';
83
- }
84
- return dayjs(timestamp).format('MMM D, YYYY [at] h:mm A');
85
- };
86
-
87
- export const renderGivenDate = (
88
- timestamp: string | null,
89
- options?: { showTooltip?: boolean }
90
- ) => {
91
- if (!timestamp) {
92
- return <PCText size="sm" style={{ whiteSpace: 'normal', overflowWrap: 'anywhere' }}>-</PCText>;
93
- }
94
- const date = dayjs(timestamp);
95
- const formatted = getGivenDateLabel(timestamp);
96
- const relative = date.fromNow();
97
- const showTooltip = options?.showTooltip ?? true;
98
-
99
- const content = (
100
- <div style={{
101
- ...pcStyles.flex,
102
- ...pcStyles.flexCol,
103
- gap: '0.125rem',
104
- minWidth: 0,
105
- }}>
106
- <PCText size="sm" weight="medium" color="primary" style={{ lineHeight: 1.25, whiteSpace: 'normal', overflowWrap: 'anywhere' }}>
107
- {formatted}
108
- </PCText>
109
- <PCText size="sm" color="secondary" style={{ fontSize: '0.65625rem', lineHeight: 1.2, whiteSpace: 'normal', overflowWrap: 'anywhere' }}>
110
- {relative}
111
- </PCText>
112
- </div>
113
- );
114
-
115
- if (!showTooltip) {
116
- return content;
117
- }
118
-
119
- return (
120
- <PCTooltip content={date.format('MMMM D, YYYY [at] h:mm:ss A')} placement="top">
121
- {content}
122
- </PCTooltip>
123
- );
124
- };
125
-
126
- // Plain-string version of the valid-till cell, for reuse in CSV export etc.
127
- export const getValidTillLabel = (consent: PurposeItem, t: TFunction): string => {
128
- const { status, valid_till } = consent;
129
- const normalized = (typeof status === 'string' ? status : '').toUpperCase();
130
- const inactiveLike =
131
- normalized === ConsentStatusEnum.DECLINED ||
132
- normalized === ConsentStatusEnum.WITHDRAWN ||
133
- normalized === ConsentStatusEnum.REVOKED;
134
- if (inactiveLike) {
135
- return '-';
136
- }
137
- if (normalized === ConsentStatusEnum.ACTIVE && (valid_till === null || valid_till === undefined)) {
138
- return t('untilWithdrawalNoExpiry');
139
- }
140
- return valid_till ? formatDateTime(valid_till) : '-';
141
- };
142
-
143
- export const renderValidTill = (consent: PurposeItem, t: TFunction) => (
144
- <PCText size="sm" style={{ whiteSpace: 'normal', overflowWrap: 'anywhere' }}>
145
- {getValidTillLabel(consent, t)}
146
- </PCText>
147
- );
148
-
149
- const methodIconMap: Record<string, JSX.Element> = {
150
- MOBILE: <Smartphone size={12} style={{ color: 'var(--pc-text-secondary)' }} />,
151
- WEB: <LaptopMinimal size={12} style={{ color: 'var(--pc-text-secondary)' }} />,
152
- };
153
-
154
- export const renderMethod = (method: string) => (
155
- <div
156
- style={{
157
- display: 'inline-flex',
158
- alignItems: 'center',
159
- gap: '0.25rem',
160
- minWidth: '48px',
161
- borderRadius: getVar('--pc-border-radius-sm'),
162
- border: `1px solid ${getVar('--pc-border-color')}`,
163
- backgroundColor: getVar('--pc-bg-primary'),
164
- padding: '0.125rem 0.375rem',
165
- }}
166
- >
167
- {methodIconMap[method] ?? null}
168
- <PCText size="sm" color="secondary" style={{ fontSize: '0.6875rem', fontWeight: 600 }}>
169
- {method}
170
- </PCText>
171
- </div>
172
- );
173
-
174
- export const renderModifyButton = (
175
- consent: ConsentModalRecord,
176
- onModify: (consent: ConsentModalRecord) => void,
177
- t: TFunction
178
- ) => {
179
- const isDisabled = consent.status === ConsentStatusEnum.DECLINED;
180
- return (
181
- <button
182
- type="button"
183
- style={{
184
- fontSize: pcStyles.textSm.fontSize,
185
- fontWeight: pcStyles.fontWeightSemibold.fontWeight,
186
- cursor: isDisabled ? 'not-allowed' : 'pointer',
187
- color: isDisabled ? '#9ca3af' : getVar('--pc-primary'),
188
- background: 'none',
189
- border: 'none',
190
- padding: 0,
191
- }}
192
- onClick={(e) => {
193
- e.stopPropagation();
194
- if (!isDisabled) onModify(consent);
195
- }}
196
- disabled={isDisabled}
197
- >
198
- {t('modifyButton')}
199
- </button>
200
- );
201
- };
@@ -1,138 +0,0 @@
1
- import { useMemo } from 'react';
2
- import { useTranslation } from 'react-i18next';
3
- import { createColumnHelper } from '@tanstack/react-table';
4
- import type { DisplayPurposeRow, ConsentModalRecord } from '../lib/types';
5
- import { PCText } from '../ui';
6
- import { pcStyles } from '../styles/pcStyles';
7
- import {
8
- renderGivenDate,
9
- renderMethod,
10
- renderModifyButton,
11
- renderStatusBadge,
12
- renderValidTill,
13
- } from './ConsentManagerCells';
14
-
15
- type UseConsentManagerColumnsProps = {
16
- onOpenModal: (record: ConsentModalRecord) => void;
17
- };
18
-
19
- const columnHelper = createColumnHelper<DisplayPurposeRow>();
20
-
21
- export const useConsentManagerColumns = ({
22
- onOpenModal,
23
- }: UseConsentManagerColumnsProps) => {
24
- const { t } = useTranslation();
25
-
26
- return useMemo(
27
- () => [
28
- columnHelper.accessor('name', {
29
- id: 'purpose',
30
- size: 280,
31
- minSize: 200,
32
- header: t('purpose'),
33
- cell: (info) => (
34
- <div style={{ width: '100%', minWidth: '10rem' }}>
35
- <PCText size="sm" weight="semibold">
36
- {info.getValue()}
37
- </PCText>
38
- {info.row.original.description && (
39
- <PCText
40
- size="sm"
41
- color="secondary"
42
- style={{
43
- display: '-webkit-box',
44
- WebkitLineClamp: 1,
45
- WebkitBoxOrient: 'vertical',
46
- overflow: 'hidden',
47
- wordBreak: 'break-word',
48
- fontSize: '0.6875rem',
49
- lineHeight: 1.2,
50
- marginTop: '0.125rem',
51
- }}
52
- title={info.row.original.description ?? undefined}
53
- >
54
- {info.row.original.description}
55
- </PCText>
56
- )}
57
- </div>
58
- ),
59
- enableSorting: false,
60
- enableColumnFilter: false,
61
- }),
62
-
63
- columnHelper.accessor('product_name', {
64
- id: 'product',
65
- size: 180,
66
- minSize: 130,
67
- header: t('product'),
68
- cell: (info) => (
69
- <div style={{ width: '100%', minWidth: '8rem' }}>
70
- <PCText size="sm" weight="medium">
71
- {info.getValue() || '-'}
72
- </PCText>
73
- </div>
74
- ),
75
- enableSorting: false,
76
- enableColumnFilter: false,
77
- }),
78
-
79
- columnHelper.accessor('status', {
80
- id: 'status',
81
- size: 130,
82
- minSize: 100,
83
- header: t('status'),
84
- cell: (info) => renderStatusBadge(info.getValue(), t),
85
- enableSorting: false,
86
- enableColumnFilter: false,
87
- }),
88
-
89
- columnHelper.accessor('given_date', {
90
- id: 'given_date',
91
- size: 180,
92
- minSize: 140,
93
- header: t('givenDate'),
94
- cell: (info) => renderGivenDate(info.getValue()),
95
- enableSorting: false,
96
- enableColumnFilter: false,
97
- }),
98
-
99
- columnHelper.accessor('valid_till', {
100
- id: 'valid_till',
101
- size: 160,
102
- minSize: 120,
103
- header: t('validTill'),
104
- cell: (info) => renderValidTill(info.row.original, t),
105
- enableSorting: false,
106
- enableColumnFilter: false,
107
- }),
108
-
109
- columnHelper.accessor('method', {
110
- id: 'method',
111
- size: 120,
112
- minSize: 90,
113
- header: t('method'),
114
- cell: (info) => renderMethod(info.getValue()),
115
- enableSorting: false,
116
- enableColumnFilter: false,
117
- }),
118
-
119
- columnHelper.display({
120
- id: 'action',
121
- size: 90,
122
- minSize: 70,
123
- header: t('action'),
124
- meta: {
125
- align: 'right',
126
- },
127
- enableSorting: false,
128
- enableColumnFilter: false,
129
- cell: ({ row }) => (
130
- <div style={{ ...pcStyles.flex, ...pcStyles.justifyEnd }}>
131
- {renderModifyButton(row.original, onOpenModal, t)}
132
- </div>
133
- ),
134
- }),
135
- ],
136
- [onOpenModal, t]
137
- );
138
- };
@@ -1,7 +0,0 @@
1
- // Re-export shared table configuration
2
- export {
3
- SEARCH_DEBOUNCE_DELAY,
4
- DEFAULT_PAGE,
5
- DEFAULT_PAGE_SIZE,
6
- SKELETON_ROW_COUNT,
7
- } from '../config/table';
@@ -1,179 +0,0 @@
1
- import { useTranslation } from 'react-i18next';
2
- import { PCButton, PCText } from '../ui';
3
- import { pcStyles } from '../styles/pcStyles';
4
- import type {
5
- ConsentModalRecord,
6
- DisplayProductGroup,
7
- PurposeItem,
8
- } from '../lib/types';
9
- import {
10
- renderStatusBadge,
11
- renderGivenDate,
12
- renderValidTill,
13
- renderMethod,
14
- renderModifyButton,
15
- } from './ConsentManagerCells';
16
-
17
- const getVar = (varName: string): string => `var(${varName})`;
18
-
19
- type ConsentManagerExpandedRowProps = {
20
- group: DisplayProductGroup;
21
- onModify: (consent: ConsentModalRecord) => void;
22
- extraPurposes?: PurposeItem[];
23
- hasMore?: boolean;
24
- isLoadingMore?: boolean;
25
- onLoadMore?: (group: DisplayProductGroup) => void;
26
- };
27
-
28
- const buildModalRecord = (
29
- purpose: PurposeItem,
30
- group: DisplayProductGroup
31
- ): ConsentModalRecord => ({
32
- ...purpose,
33
- product_uuid: group.product_uuid,
34
- product_name: group.product_name,
35
- product_description: group.product_description,
36
- nominator: group.nominator,
37
- });
38
-
39
- const headerCellStyle: React.CSSProperties = {
40
- textAlign: 'left',
41
- padding: '0.4375rem 0.875rem',
42
- fontSize: '0.59375rem',
43
- fontWeight: 600,
44
- letterSpacing: '0.08em',
45
- textTransform: 'uppercase',
46
- color: getVar('--pc-text-tertiary'),
47
- borderBottom: `1px solid ${getVar('--pc-border-color')}`,
48
- whiteSpace: 'nowrap',
49
- backgroundColor: getVar('--pc-bg-secondary'),
50
- verticalAlign: 'middle',
51
- };
52
-
53
- const bodyCellStyle: React.CSSProperties = {
54
- padding: '0.5rem 0.875rem',
55
- fontSize: getVar('--pc-font-size-sm'),
56
- color: getVar('--pc-text-primary'),
57
- borderBottom: `1px solid ${getVar('--pc-border-color')}`,
58
- verticalAlign: 'middle',
59
- backgroundColor: getVar('--pc-bg-primary'),
60
- };
61
-
62
- export const ConsentManagerExpandedRow = ({
63
- group,
64
- onModify,
65
- extraPurposes,
66
- hasMore,
67
- isLoadingMore,
68
- onLoadMore,
69
- }: ConsentManagerExpandedRowProps) => {
70
- const { t } = useTranslation();
71
- const purposes: PurposeItem[] = [...group.purposes, ...(extraPurposes ?? [])];
72
-
73
- return (
74
- <div
75
- className="pc-consent-expanded-surface"
76
- style={{
77
- backgroundColor: getVar('--pc-bg-primary'),
78
- // Keep expanded section visually nested under the product cell
79
- // with extra breathing space for cleaner UI.
80
- padding: '0.25rem 1rem 0.875rem 3.5rem',
81
- }}
82
- onClick={(e) => e.stopPropagation()}
83
- >
84
- <div
85
- className="pc-consent-expanded-card"
86
- style={{
87
- border: `1px solid ${getVar('--pc-border-color')}`,
88
- borderRadius: '0.375rem',
89
- overflow: 'hidden',
90
- backgroundColor: getVar('--pc-bg-primary'),
91
- boxShadow: 'none',
92
- }}
93
- >
94
- <table style={{ width: '100%', borderCollapse: 'collapse', tableLayout: 'fixed' }}>
95
- <colgroup>
96
- <col style={{ width: '46%' }} />
97
- <col style={{ width: '4%' }} />
98
- <col style={{ width: '26%' }} />
99
- <col style={{ width: '12%' }} />
100
- <col style={{ width: '7%' }} />
101
- <col style={{ width: '5%' }} />
102
- </colgroup>
103
- <thead>
104
- <tr>
105
- <th style={headerCellStyle}>{t('purpose')}</th>
106
- <th style={headerCellStyle}>{t('status')}</th>
107
- <th style={headerCellStyle}>{t('givenDate')}</th>
108
- <th style={headerCellStyle}>{t('validTill')}</th>
109
- <th style={headerCellStyle}>{t('method')}</th>
110
- <th style={{ ...headerCellStyle, textAlign: 'right' }}>{t('action')}</th>
111
- </tr>
112
- </thead>
113
- <tbody>
114
- {purposes.map((purpose, idx) => {
115
- const isLast = idx === purposes.length - 1;
116
- const cellStyle = isLast ? { ...bodyCellStyle, borderBottom: 'none' } : bodyCellStyle;
117
- const rowKey = purpose.purpose_uuid;
118
- const modalRecord = buildModalRecord(purpose, group);
119
- return (
120
- <tr key={rowKey}>
121
- <td style={cellStyle}>
122
- <div style={{ ...pcStyles.flex, ...pcStyles.flexCol, gap: '0.125rem', minWidth: 0 }}>
123
- <PCText size="sm" weight="semibold">{purpose.name}</PCText>
124
- {purpose.description && (
125
- <PCText
126
- size="sm"
127
- color="secondary"
128
- style={{
129
- display: '-webkit-box',
130
- WebkitLineClamp: 1,
131
- WebkitBoxOrient: 'vertical',
132
- overflow: 'hidden',
133
- wordBreak: 'break-word',
134
- fontSize: '0.6875rem',
135
- lineHeight: 1.2,
136
- }}
137
- title={purpose.description ?? undefined}
138
- >
139
- {purpose.description}
140
- </PCText>
141
- )}
142
- </div>
143
- </td>
144
- <td style={cellStyle}>{renderStatusBadge(purpose.status, t)}</td>
145
- <td style={cellStyle}>{renderGivenDate(purpose.given_date, { showTooltip: false })}</td>
146
- <td style={cellStyle}>{renderValidTill(purpose, t)}</td>
147
- <td style={cellStyle}>{renderMethod(purpose.method)}</td>
148
- <td style={{ ...cellStyle, textAlign: 'right' }}>
149
- {renderModifyButton(modalRecord, onModify, t)}
150
- </td>
151
- </tr>
152
- );
153
- })}
154
- </tbody>
155
- </table>
156
- {hasMore && onLoadMore && (
157
- <div
158
- style={{
159
- display: 'flex',
160
- justifyContent: 'center',
161
- padding: '0.5rem',
162
- borderTop: `1px solid ${getVar('--pc-border-color')}`,
163
- backgroundColor: getVar('--pc-bg-primary'),
164
- }}
165
- >
166
- <PCButton
167
- size="sm"
168
- variant="outline"
169
- onClick={() => onLoadMore(group)}
170
- disabled={isLoadingMore}
171
- >
172
- {isLoadingMore ? t('loading') : t('loadMorePurposes')}
173
- </PCButton>
174
- </div>
175
- )}
176
- </div>
177
- </div>
178
- );
179
- };