@jmruthers/pace-core 0.6.5 → 0.6.7

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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -1,268 +0,0 @@
1
- ---
2
- description: Enforce testing framework consistency and standards for consuming apps
3
- globs: ["**/*.{test,spec}.{ts,tsx}"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Testing Standards Guide
9
-
10
- This guide ensures consistent, high-quality testing across consuming apps in the PACE suite.
11
-
12
- ## MUST: Meet Coverage Requirements
13
-
14
- **MUST achieve minimum coverage:**
15
- - ≥90% coverage for utils & hooks
16
- - ≥70% coverage for components
17
-
18
- **Verify coverage:**
19
- ```bash
20
- npm run test:coverage
21
- ```
22
-
23
- ## MUST: Use React Testing Library
24
-
25
- **MUST use React Testing Library + userEvent for all component tests.**
26
-
27
- ```tsx
28
- // ✅ CORRECT: React Testing Library + userEvent
29
- import { render, screen } from '@testing-library/react';
30
- import userEvent from '@testing-library/user-event';
31
- test('button clicks work', async () => {
32
- const user = userEvent.setup();
33
- const handleClick = vi.fn();
34
- render(<Button onClick={handleClick}>Click me</Button>);
35
- await user.click(screen.getByRole('button', { name: /click me/i }));
36
- expect(handleClick).toHaveBeenCalledTimes(1);
37
- });
38
-
39
- // ❌ WRONG: Enzyme or other testing libraries
40
- ```
41
-
42
- ## MUST: Colocate Tests
43
-
44
- **Tests MUST be colocated with source files:**
45
-
46
- ```
47
- src/
48
- ├── components/
49
- │ └── EventCard/
50
- │ ├── EventCard.tsx
51
- │ └── EventCard.test.tsx
52
- ├── hooks/
53
- │ ├── useEventData.ts
54
- │ └── useEventData.test.ts
55
- └── utils/
56
- ├── formatEvent.ts
57
- └── formatEvent.test.ts
58
- ```
59
-
60
- ## MUST: Use Vitest
61
-
62
- **MUST use Vitest for all testing:**
63
-
64
- ```typescript
65
- // vitest.config.ts
66
- import { defineConfig } from 'vitest/config';
67
-
68
- export default defineConfig({
69
- test: {
70
- environment: 'jsdom',
71
- setupFiles: ['./vitest.setup.ts'],
72
- coverage: {
73
- provider: 'v8',
74
- reporter: ['text', 'json', 'html'],
75
- thresholds: {
76
- lines: 80,
77
- functions: 80,
78
- branches: 80,
79
- statements: 80,
80
- },
81
- },
82
- },
83
- });
84
- ```
85
-
86
- ## MUST: Test User Behavior, Not Implementation
87
-
88
- **Tests MUST focus on what users see and do:**
89
-
90
- ```tsx
91
- // ❌ WRONG: Testing implementation (component.state.count)
92
- test('calls setState', () => { const component = render(<Counter />); expect(component.state.count).toBe(0); });
93
-
94
- // ✅ CORRECT: Testing user behavior (what user sees and does)
95
- test('displays count and increments on button click', async () => {
96
- const user = userEvent.setup();
97
- render(<Counter />);
98
- expect(screen.getByText('Count: 0')).toBeInTheDocument();
99
- await user.click(screen.getByRole('button', { name: /increment/i }));
100
- expect(screen.getByText('Count: 1')).toBeInTheDocument();
101
- });
102
- ```
103
-
104
- ## MUST: Use Accessible Queries
105
-
106
- **MUST prefer accessible queries (byRole, byLabelText, etc.):**
107
-
108
- ```tsx
109
- // ✅ CORRECT: Accessible queries (byRole, byLabelText, byText)
110
- screen.getByRole('button', { name: /submit/i });
111
- screen.getByLabelText(/email address/i);
112
-
113
- // ❌ AVOID: Non-accessible queries (getByTestId, getByClassName - use as last resort)
114
- ```
115
-
116
- ## SHOULD: Test Critical Paths
117
-
118
- **SHOULD test:**
119
- - User workflows and interactions
120
- - Error handling and edge cases
121
- - Form validation
122
- - Permission checks (RBAC)
123
- - Data loading states
124
- - Error states
125
-
126
- ## SHOULD: Use Descriptive Test Names
127
-
128
- **Test names SHOULD describe behavior:**
129
-
130
- ```tsx
131
- // ❌ WRONG - Vague
132
- test('button works', () => { ... });
133
-
134
- // ✅ CORRECT - Descriptive
135
- test('increments counter when increment button is clicked', () => { ... });
136
- test('displays error message when API call fails', () => { ... });
137
- ```
138
-
139
- ## SHOULD: Group Related Tests
140
-
141
- **SHOULD use `describe` blocks to group related tests:**
142
-
143
- ```tsx
144
- describe('EventCard', () => {
145
- describe('rendering', () => {
146
- test('displays event title', () => { ... });
147
- test('displays event date', () => { ... });
148
- });
149
-
150
- describe('interactions', () => {
151
- test('calls onEdit when edit button clicked', () => { ... });
152
- test('calls onDelete when delete button clicked', () => { ... });
153
- });
154
- });
155
- ```
156
-
157
- ## MUST: Avoid Unnecessary Mocks
158
-
159
- **MUST NOT mock unless necessary:**
160
-
161
- ```tsx
162
- // ❌ WRONG: Unnecessary mock (global.fetch = mockFetch)
163
- // ✅ CORRECT: Use real implementation or MSW
164
- import { server } from './mocks/server';
165
- server.use(rest.get('/api/events', (req, res, ctx) => res(ctx.json([{ id: '1', name: 'Event' }]))));
166
- ```
167
-
168
- ## MUST: Test Async Code Properly
169
-
170
- **MUST handle async operations correctly:**
171
-
172
- ```tsx
173
- // ✅ CORRECT: Async testing with waitFor
174
- test('loads and displays events', async () => {
175
- render(<EventList />);
176
- expect(screen.getByText(/loading/i)).toBeInTheDocument();
177
- await waitFor(() => expect(screen.getByText('Event 1')).toBeInTheDocument());
178
- expect(screen.queryByText(/loading/i)).not.toBeInTheDocument();
179
- });
180
- ```
181
-
182
- ## MUST: Clean Up After Tests
183
-
184
- **MUST clean up resources:**
185
-
186
- ```tsx
187
- // ✅ CORRECT: Cleanup after tests
188
- afterEach(() => { cleanup(); vi.clearAllMocks(); });
189
- ```
190
-
191
- ## SHOULD: Use Test Utilities
192
-
193
- **SHOULD create reusable test utilities:**
194
-
195
- ```tsx
196
- // ✅ CORRECT: Reusable test utilities
197
- export function renderWithProviders(ui: React.ReactElement) {
198
- return render(<UnifiedAuthProvider supabaseClient={mockSupabase} appName="Test App">{ui}</UnifiedAuthProvider>);
199
- }
200
- // Usage: renderWithProviders(<MyComponent />);
201
- ```
202
-
203
- ## MUST: Include Timeout Parameters
204
-
205
- **Tests MUST include timeout parameters to prevent hanging:**
206
-
207
- ```tsx
208
- // ✅ CORRECT: Include timeout parameters to prevent hanging
209
- test('async operation completes', async () => {
210
- await waitFor(() => expect(screen.getByText('Loaded')).toBeInTheDocument(), { timeout: 5000 });
211
- }, { timeout: 10000 });
212
- ```
213
-
214
- ## Testing Checklist
215
-
216
- Before committing tests, verify:
217
- - [ ] Coverage meets requirements (≥90% utils, ≥70% components)
218
- - [ ] Using React Testing Library + userEvent
219
- - [ ] Tests are colocated with source files
220
- - [ ] Testing user behavior, not implementation
221
- - [ ] Using accessible queries (byRole, byLabelText)
222
- - [ ] Test names are descriptive
223
- - [ ] Related tests grouped with describe
224
- - [ ] No unnecessary mocks
225
- - [ ] Async code tested properly
226
- - [ ] Cleanup after tests
227
- - [ ] Timeout parameters included
228
-
229
- ## Test Structure Template
230
-
231
- ```tsx
232
- import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
233
- import { render, screen, waitFor } from '@testing-library/react';
234
- import userEvent from '@testing-library/user-event';
235
- import { ComponentName } from './ComponentName';
236
-
237
- describe('ComponentName', () => {
238
- beforeEach(() => {
239
- // Setup
240
- });
241
-
242
- afterEach(() => {
243
- // Cleanup
244
- vi.clearAllMocks();
245
- });
246
-
247
- describe('rendering', () => {
248
- test('renders correctly', () => {
249
- render(<ComponentName />);
250
- // Assertions
251
- });
252
- });
253
-
254
- describe('interactions', () => {
255
- test('handles user interaction', async () => {
256
- const user = userEvent.setup();
257
- render(<ComponentName />);
258
- // Test interaction
259
- });
260
- });
261
- });
262
- ```
263
-
264
- ## Reference
265
-
266
- - React Testing Library: https://testing-library.com/react
267
- - Vitest: https://vitest.dev
268
- - Testing Standards: See `06-testing-and-docs-standard.md` in pace-core docs
@@ -1,246 +0,0 @@
1
- ---
2
- description: Standardized templates for bug reports and feature requests for pace-core
3
- globs: []
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Bug Reports and Feature Requests Guide
9
-
10
- This guide provides standardized templates for reporting bugs and requesting features in pace-core. This is a reference guide - Cursor will use this for context when helping with issue reporting.
11
-
12
- ## Identifying Issues
13
-
14
- ### Is This a pace-core Issue?
15
-
16
- **Before reporting, determine if the issue is in pace-core or your consuming app:**
17
-
18
- 1. **Check pace-core documentation** - Is the behavior documented?
19
- 2. **Check pace-core source** - Can you find the relevant code?
20
- 3. **Test in isolation** - Can you reproduce with minimal pace-core usage?
21
- 4. **Check similar issues** - Has this been reported before?
22
-
23
- **If the issue is in your consuming app:**
24
- - Fix it locally
25
- - Don't file a pace-core issue
26
-
27
- **If the issue is in pace-core:**
28
- - Use the templates below to file an issue
29
-
30
- ## Bug Report Template
31
-
32
- ### Required Information
33
-
34
- ```markdown
35
- ## Bug Description
36
- [Clear, concise description of the bug]
37
-
38
- ## Expected Behavior
39
- [What should happen]
40
-
41
- ## Actual Behavior
42
- [What actually happens]
43
-
44
- ## Steps to Reproduce
45
- 1. [First step]
46
- 2. [Second step]
47
- 3. [Third step]
48
- ...
49
-
50
- ## Minimal Reproduction
51
- [Link to minimal reproduction or code snippet]
52
-
53
- ## Environment
54
- - pace-core version: [e.g., 0.5.193]
55
- - React version: [e.g., 19.2.3]
56
- - Node version: [e.g., 20.10.0]
57
- - Browser: [e.g., Chrome 120]
58
- - OS: [e.g., macOS 14.2]
59
-
60
- ## Code Example
61
- \`\`\`tsx
62
- // Minimal code that reproduces the issue
63
- import { Component } from '@jmruthers/pace-core';
64
-
65
- function App() {
66
- return <Component />;
67
- }
68
- \`\`\`
69
-
70
- ## Error Messages
71
- [Any error messages or console output]
72
-
73
- ## Additional Context
74
- [Screenshots, videos, or other relevant information]
75
- ```
76
-
77
- ### Example Bug Report
78
-
79
- ```markdown
80
- ## Bug Description
81
- DataTable component throws error when `rbac` prop is missing, but error message is unclear.
82
-
83
- ## Expected Behavior
84
- DataTable should either:
85
- 1. Work without rbac prop (if not required), OR
86
- 2. Show clear error message explaining rbac is required
87
-
88
- ## Actual Behavior
89
- DataTable throws: "Cannot read property 'pageId' of undefined" with no context about missing rbac prop.
90
-
91
- ## Steps to Reproduce
92
- 1. Import DataTable from pace-core
93
- 2. Use DataTable without rbac prop
94
- 3. See error in console
95
-
96
- ## Minimal Reproduction
97
- \`\`\`tsx
98
- import { DataTable } from '@jmruthers/pace-core';
99
-
100
- function App() {
101
- return (
102
- <DataTable
103
- data={[]}
104
- columns={[]}
105
- // Missing rbac prop
106
- />
107
- );
108
- }
109
- \`\`\`
110
-
111
- ## Environment
112
- - pace-core version: 0.5.193
113
- - React version: 19.2.3
114
- - Node version: 20.10.0
115
- - Browser: Chrome 120
116
- - OS: macOS 14.2
117
-
118
- ## Error Messages
119
- ```
120
- Uncaught TypeError: Cannot read property 'pageId' of undefined
121
- at DataTable (DataTable.tsx:123)
122
- ```
123
-
124
- ## Additional Context
125
- The error occurs immediately on render. The documentation mentions rbac is required, but the error doesn't reference this.
126
- ```
127
-
128
- ## Feature Request Template
129
-
130
- ### Required Information
131
-
132
- ```markdown
133
- ## Feature Description
134
- [Clear, concise description of the feature]
135
-
136
- ## Problem Statement
137
- [What problem does this solve? Why is it needed?]
138
-
139
- ## Proposed Solution
140
- [How should this work? What would the API look like?]
141
-
142
- ## Use Case
143
- [Real-world scenario where this would be useful]
144
-
145
- ## Alternatives Considered
146
- [Other approaches you've considered]
147
-
148
- ## Code Example
149
- \`\`\`tsx
150
- // How you would use this feature
151
- import { NewFeature } from '@jmruthers/pace-core';
152
-
153
- function App() {
154
- return <NewFeature prop="value" />;
155
- }
156
- \`\`\`
157
-
158
- ## Additional Context
159
- [Screenshots, mockups, or other relevant information]
160
- ```
161
-
162
- ### Example Feature Request
163
-
164
- ```markdown
165
- ## Feature Description
166
- Add `onRowDoubleClick` prop to DataTable component for double-click row interactions.
167
-
168
- ## Problem Statement
169
- Currently, DataTable only supports single-click row selection. Many users expect double-click to open/edit a row, which is a common pattern in data tables.
170
-
171
- ## Proposed Solution
172
- Add optional `onRowDoubleClick` callback prop:
173
- - Fires when user double-clicks a row
174
- - Receives row data and event
175
- - Works alongside existing selection behavior
176
-
177
- ## Use Case
178
- In an event management app, users want to double-click an event row to open the event details modal, while single-click selects the row for bulk operations.
179
-
180
- ## Alternatives Considered
181
- 1. Using `onRowClick` and detecting double-clicks - but this conflicts with selection
182
- 2. Custom row component - but this loses DataTable features
183
- 3. External double-click handler - but this is less integrated
184
-
185
- ## Code Example
186
- \`\`\`tsx
187
- import { DataTable } from '@jmruthers/pace-core';
188
-
189
- function EventList() {
190
- const handleRowDoubleClick = (row: Event) => {
191
- openEventDetails(row.id);
192
- };
193
-
194
- return (
195
- <DataTable
196
- data={events}
197
- columns={columns}
198
- rbac={{ pageName: 'events' }}
199
- onRowDoubleClick={handleRowDoubleClick}
200
- />
201
- );
202
- }
203
- \`\`\`
204
-
205
- ## Additional Context
206
- This is a common pattern in enterprise data tables. Many similar libraries support this.
207
- ```
208
-
209
- ## Where to File Issues
210
-
211
- **File issues in the pace-core repository:**
212
- - GitHub Issues: [Repository URL]
213
- - Include all required information from templates
214
- - Use appropriate labels if available
215
-
216
- ## Before Filing
217
-
218
- **Check:**
219
- - [ ] Issue hasn't been reported already
220
- - [ ] You're using the latest pace-core version
221
- - [ ] Issue is actually in pace-core (not your app)
222
- - [ ] You've checked documentation
223
- - [ ] You have a minimal reproduction
224
- - [ ] You've included all required information
225
-
226
- ## After Filing
227
-
228
- **Be prepared to:**
229
- - Provide additional information if requested
230
- - Test fixes in development versions
231
- - Verify the fix works in your app
232
- - Close the issue if resolved
233
-
234
- ## Tips for Effective Reports
235
-
236
- 1. **Be specific** - Vague descriptions waste time
237
- 2. **Include reproduction** - Minimal code that shows the issue
238
- 3. **Check existing issues** - Don't duplicate reports
239
- 4. **Be patient** - Maintainers are volunteers
240
- 5. **Be respectful** - Constructive feedback helps
241
-
242
- ## Reference
243
-
244
- - pace-core Documentation: `packages/core/docs/`
245
- - pace-core Source: `packages/core/src/`
246
- - GitHub Issues: [Repository URL]