@jmruthers/pace-core 0.5.74 → 0.5.76

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 (369) hide show
  1. package/dist/DataTable-4GAVPIEG.js +120 -0
  2. package/dist/{PublicLoadingSpinner-DLpF5bbs.d.ts → PublicLoadingSpinner-BiNER8F5.d.ts} +30 -19
  3. package/dist/RBACService-C4udt_Zp.d.ts +528 -0
  4. package/dist/{UnifiedAuthProvider-K4NRGXL4.js → UnifiedAuthProvider-3NKDOSOK.js} +6 -4
  5. package/dist/UnifiedAuthProvider-Bj6YCf7c.d.ts +113 -0
  6. package/dist/chunk-5F3NDPJV.js +232 -0
  7. package/dist/chunk-5F3NDPJV.js.map +1 -0
  8. package/dist/chunk-A4FUBC7B.js +17 -0
  9. package/dist/chunk-A4FUBC7B.js.map +1 -0
  10. package/dist/{chunk-SMJZMKYN.js → chunk-A6HBIY5P.js} +2 -11
  11. package/dist/{chunk-SMJZMKYN.js.map → chunk-A6HBIY5P.js.map} +1 -1
  12. package/dist/{chunk-LVQ26TCN.js → chunk-AFGTSUAD.js} +43 -127
  13. package/dist/chunk-AFGTSUAD.js.map +1 -0
  14. package/dist/{chunk-BKVGJVUR.js → chunk-K34IM5CT.js} +497 -33
  15. package/dist/chunk-K34IM5CT.js.map +1 -0
  16. package/dist/{chunk-UJMCGBLS.js → chunk-KHJS6VIA.js} +203 -41
  17. package/dist/chunk-KHJS6VIA.js.map +1 -0
  18. package/dist/{chunk-ORSMVXO2.js → chunk-KK73ZB4E.js} +9 -14
  19. package/dist/chunk-KK73ZB4E.js.map +1 -0
  20. package/dist/{chunk-VKOCWWVY.js → chunk-L3RV2ALE.js} +1 -6
  21. package/dist/{chunk-VKOCWWVY.js.map → chunk-L3RV2ALE.js.map} +1 -1
  22. package/dist/chunk-LW7MMEAQ.js +59 -0
  23. package/dist/chunk-LW7MMEAQ.js.map +1 -0
  24. package/dist/{chunk-IHMMNKNA.js → chunk-M5IWZRBT.js} +5118 -1864
  25. package/dist/chunk-M5IWZRBT.js.map +1 -0
  26. package/dist/{chunk-DG5Z55HH.js → chunk-NTNILOBC.js} +7 -9
  27. package/dist/chunk-NTNILOBC.js.map +1 -0
  28. package/dist/chunk-PYUXFQJ3.js +11 -0
  29. package/dist/chunk-PYUXFQJ3.js.map +1 -0
  30. package/dist/chunk-URUTVZ7N.js +27 -0
  31. package/dist/chunk-URUTVZ7N.js.map +1 -0
  32. package/dist/chunk-WN6XJWOS.js +2468 -0
  33. package/dist/chunk-WN6XJWOS.js.map +1 -0
  34. package/dist/{chunk-3SP4P7NS.js → chunk-XLZ7U46Z.js} +59 -1
  35. package/dist/chunk-XLZ7U46Z.js.map +1 -0
  36. package/dist/{chunk-H2TNUICK.js → chunk-Y6TXWPJO.js} +50 -50
  37. package/dist/chunk-Y6TXWPJO.js.map +1 -0
  38. package/dist/{chunk-YNUBMSMV.js → chunk-YCKPEMJA.js} +186 -263
  39. package/dist/chunk-YCKPEMJA.js.map +1 -0
  40. package/dist/components.d.ts +4 -5
  41. package/dist/components.js +35 -41
  42. package/dist/components.js.map +1 -1
  43. package/dist/hooks.d.ts +20 -43
  44. package/dist/hooks.js +13 -12
  45. package/dist/hooks.js.map +1 -1
  46. package/dist/index.d.ts +156 -10
  47. package/dist/index.js +193 -96
  48. package/dist/index.js.map +1 -1
  49. package/dist/{organisation-t-vvQC3g.d.ts → organisation-BtshODVF.d.ts} +4 -3
  50. package/dist/providers.d.ts +27 -38
  51. package/dist/providers.js +33 -23
  52. package/dist/rbac/index.d.ts +114 -5
  53. package/dist/rbac/index.js +15 -15
  54. package/dist/styles/index.js +2 -2
  55. package/dist/theming/runtime.js +1 -3
  56. package/dist/types.d.ts +3 -3
  57. package/dist/types.js +1 -1
  58. package/dist/types.js.map +1 -1
  59. package/dist/{unified-CMPjE_fv.d.ts → unified-CM7T0aTK.d.ts} +1 -1
  60. package/dist/useInactivityTracker-MRUU55XI.js +10 -0
  61. package/dist/{usePublicRouteParams-Ua1Vz-HG.d.ts → usePublicRouteParams-B-CumWRc.d.ts} +3 -3
  62. package/dist/utils.js +7 -9
  63. package/dist/utils.js.map +1 -1
  64. package/dist/validation.d.ts +1 -1
  65. package/docs/TERMINOLOGY.md +231 -0
  66. package/docs/api/classes/ColumnFactory.md +1 -1
  67. package/docs/api/classes/ErrorBoundary.md +1 -1
  68. package/docs/api/classes/InvalidScopeError.md +1 -1
  69. package/docs/api/classes/MissingUserContextError.md +1 -1
  70. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  71. package/docs/api/classes/PermissionDeniedError.md +1 -1
  72. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  73. package/docs/api/classes/RBACAuditManager.md +1 -1
  74. package/docs/api/classes/RBACCache.md +1 -1
  75. package/docs/api/classes/RBACEngine.md +1 -1
  76. package/docs/api/classes/RBACError.md +1 -1
  77. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  78. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  79. package/docs/api/classes/StorageUtils.md +1 -1
  80. package/docs/api/enums/FileCategory.md +1 -1
  81. package/docs/api/interfaces/AggregateConfig.md +1 -1
  82. package/docs/api/interfaces/ButtonProps.md +3 -3
  83. package/docs/api/interfaces/CardProps.md +2 -2
  84. package/docs/api/interfaces/ColorPalette.md +1 -1
  85. package/docs/api/interfaces/ColorShade.md +1 -1
  86. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  87. package/docs/api/interfaces/DataTableAction.md +1 -1
  88. package/docs/api/interfaces/DataTableColumn.md +1 -1
  89. package/docs/api/interfaces/DataTableProps.md +1 -1
  90. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  91. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  92. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  93. package/docs/api/interfaces/EventLogoProps.md +2 -2
  94. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  95. package/docs/api/interfaces/FileMetadata.md +1 -1
  96. package/docs/api/interfaces/FileReference.md +1 -1
  97. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  98. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  99. package/docs/api/interfaces/FileUploadProps.md +1 -1
  100. package/docs/api/interfaces/FooterProps.md +1 -1
  101. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  102. package/docs/api/interfaces/InputProps.md +2 -2
  103. package/docs/api/interfaces/LabelProps.md +1 -1
  104. package/docs/api/interfaces/LoginFormProps.md +1 -1
  105. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  106. package/docs/api/interfaces/NavigationContextType.md +1 -1
  107. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  108. package/docs/api/interfaces/NavigationItem.md +1 -1
  109. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  110. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  111. package/docs/api/interfaces/Organisation.md +1 -1
  112. package/docs/api/interfaces/OrganisationContextType.md +28 -17
  113. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  114. package/docs/api/interfaces/OrganisationProviderProps.md +2 -2
  115. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  116. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  117. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  118. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  119. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  120. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  121. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  122. package/docs/api/interfaces/PaletteData.md +1 -1
  123. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  124. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  125. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  126. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +2 -2
  127. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  128. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  129. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  130. package/docs/api/interfaces/RBACConfig.md +1 -1
  131. package/docs/api/interfaces/RBACContextType.md +5 -11
  132. package/docs/api/interfaces/RBACLogger.md +1 -1
  133. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  134. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  135. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  136. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  137. package/docs/api/interfaces/RouteConfig.md +1 -1
  138. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  139. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  140. package/docs/api/interfaces/StorageConfig.md +1 -1
  141. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  142. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  143. package/docs/api/interfaces/StorageListOptions.md +1 -1
  144. package/docs/api/interfaces/StorageListResult.md +1 -1
  145. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  146. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  147. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  148. package/docs/api/interfaces/StyleImport.md +1 -1
  149. package/docs/api/interfaces/SwitchProps.md +1 -1
  150. package/docs/api/interfaces/ToastActionElement.md +1 -1
  151. package/docs/api/interfaces/ToastProps.md +1 -1
  152. package/docs/api/interfaces/UnifiedAuthContextType.md +524 -440
  153. package/docs/api/interfaces/UnifiedAuthProviderProps.md +14 -14
  154. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  155. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  156. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  157. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  158. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  159. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  160. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  161. package/docs/api/interfaces/UseResolvedScopeOptions.md +47 -0
  162. package/docs/api/interfaces/UseResolvedScopeReturn.md +47 -0
  163. package/docs/api/interfaces/UserEventAccess.md +11 -11
  164. package/docs/api/interfaces/UserMenuProps.md +1 -1
  165. package/docs/api/interfaces/UserProfile.md +1 -1
  166. package/docs/api/modules.md +234 -61
  167. package/docs/api-reference/providers.md +26 -7
  168. package/docs/architecture/services.md +30 -32
  169. package/docs/best-practices/README.md +20 -0
  170. package/docs/best-practices/accessibility.md +566 -0
  171. package/docs/best-practices/performance-expansion.md +473 -0
  172. package/docs/breaking-changes.md +2 -5
  173. package/docs/core-concepts/authentication.md +15 -7
  174. package/docs/documentation-index.md +1 -1
  175. package/docs/documentation-templates.md +539 -0
  176. package/docs/getting-started/quick-start.md +16 -66
  177. package/docs/implementation-guides/component-styling.md +410 -0
  178. package/docs/implementation-guides/data-tables.md +1 -1
  179. package/docs/migration/service-architecture.md +121 -260
  180. package/docs/rbac/README-rbac-rls-integration.md +48 -38
  181. package/docs/style-guide.md +39 -0
  182. package/{src/rbac/examples → examples/RBAC}/CompleteRBACExample.tsx +3 -2
  183. package/{src/rbac/examples → examples/RBAC}/EventBasedApp.tsx +5 -4
  184. package/{src/components/examples → examples/RBAC}/PermissionExample.tsx +7 -6
  185. package/examples/RBAC/__tests__/PermissionExample.test.tsx +150 -0
  186. package/examples/RBAC/index.ts +13 -0
  187. package/examples/README.md +37 -0
  188. package/examples/index.ts +22 -0
  189. package/{src/examples → examples/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
  190. package/{src/examples → examples/public-pages}/PublicEventPage.tsx +1 -1
  191. package/{src/examples → examples/public-pages}/PublicPageApp.tsx +1 -1
  192. package/{src/examples → examples/public-pages}/PublicPageUsageExample.tsx +1 -1
  193. package/examples/public-pages/__tests__/PublicPageUsageExample.test.tsx +159 -0
  194. package/examples/public-pages/index.ts +14 -0
  195. package/package.json +22 -18
  196. package/src/__tests__/TEST_GUIDE_CURSOR.md +940 -9
  197. package/src/__tests__/helpers/README.md +255 -0
  198. package/src/__tests__/helpers/index.ts +62 -0
  199. package/src/__tests__/helpers/supabaseMock.ts +75 -5
  200. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -8
  201. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +17 -6
  202. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +73 -9
  203. package/src/components/DataTable/components/DataTableCore.tsx +280 -475
  204. package/src/components/DataTable/components/UnifiedTableBody.tsx +120 -153
  205. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +55 -0
  206. package/src/components/DataTable/components/index.ts +1 -2
  207. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +208 -275
  208. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +254 -0
  209. package/src/components/DataTable/core/index.ts +1 -8
  210. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +45 -0
  211. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +117 -0
  212. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +525 -0
  213. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +570 -0
  214. package/src/components/DataTable/hooks/__tests__/useHierarchicalState.test.ts +214 -0
  215. package/src/components/DataTable/hooks/__tests__/useTableColumns.test.ts +224 -0
  216. package/src/components/DataTable/hooks/index.ts +6 -0
  217. package/src/components/DataTable/hooks/useColumnReordering.ts +1 -0
  218. package/src/components/DataTable/hooks/useDataTablePermissions.ts +149 -0
  219. package/src/components/DataTable/hooks/useDataTableState.ts +12 -6
  220. package/src/components/DataTable/hooks/useHierarchicalState.ts +26 -8
  221. package/src/components/DataTable/hooks/useTableColumns.ts +153 -0
  222. package/src/components/DataTable/index.ts +1 -9
  223. package/src/components/DataTable/utils/__tests__/COVERAGE_NOTE.md +89 -0
  224. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +3 -6
  225. package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +462 -0
  226. package/src/components/DataTable/utils/__tests__/hierarchicalSorting.test.ts +247 -0
  227. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +8 -6
  228. package/src/components/DataTable/utils/__tests__/performanceUtils.test.ts +466 -0
  229. package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +265 -0
  230. package/src/components/DataTable/utils/errorHandling.ts +52 -460
  231. package/src/components/DataTable/utils/exportUtils.ts +46 -15
  232. package/src/components/DataTable/utils/hierarchicalSorting.ts +50 -3
  233. package/src/components/DataTable/utils/hierarchicalUtils.ts +167 -34
  234. package/src/components/DataTable/utils/index.ts +5 -0
  235. package/src/components/DataTable/utils/rowUtils.ts +68 -0
  236. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +71 -0
  237. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +122 -0
  238. package/src/components/EventSelector/EventSelector.test.tsx +672 -0
  239. package/src/components/EventSelector/EventSelector.tsx +1 -1
  240. package/src/components/Header/Header.test.tsx +35 -1
  241. package/src/components/Header/Header.tsx +3 -1
  242. package/src/components/Label/__tests__/Label.test.tsx +434 -0
  243. package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -3
  244. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +24 -4
  245. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +3 -2
  246. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +190 -0
  247. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +185 -0
  248. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +313 -0
  249. package/src/components/Select/Select.test.tsx +143 -120
  250. package/src/components/Select/Select.tsx +47 -212
  251. package/src/components/Select/hooks.ts +36 -1
  252. package/src/components/Select/index.ts +2 -1
  253. package/src/hooks/__tests__/useFocusManagement.unit.test.ts +220 -0
  254. package/src/hooks/__tests__/useIsMobile.unit.test.ts +117 -0
  255. package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +295 -0
  256. package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +29 -19
  257. package/src/hooks/__tests__/useRBAC.unit.test.ts +7 -3
  258. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +115 -19
  259. package/src/hooks/services/__tests__/useServiceHooks.test.tsx +137 -0
  260. package/src/hooks/useEventTheme.test.ts +350 -0
  261. package/src/hooks/useEventTheme.ts +1 -1
  262. package/src/hooks/useEvents.ts +61 -0
  263. package/src/hooks/useOrganisationSecurity.test.ts +4 -4
  264. package/src/hooks/useOrganisationSecurity.ts +2 -2
  265. package/src/hooks/useOrganisations.ts +64 -0
  266. package/src/hooks/useSecureDataAccess.test.ts +37 -30
  267. package/src/hooks/useSecureDataAccess.ts +2 -2
  268. package/src/index.ts +18 -3
  269. package/src/providers/AuthProvider.tsx +8 -292
  270. package/src/providers/EventProvider.tsx +15 -425
  271. package/src/providers/InactivityProvider.tsx +8 -231
  272. package/src/providers/OrganisationProvider.test.simple.tsx +3 -2
  273. package/src/providers/OrganisationProvider.tsx +11 -890
  274. package/src/providers/UnifiedAuthProvider.tsx +8 -320
  275. package/src/providers/__tests__/AuthProvider.test.tsx +18 -17
  276. package/src/providers/__tests__/EventProvider.test.tsx +253 -2
  277. package/src/providers/__tests__/InactivityProvider.test-helper.tsx +65 -0
  278. package/src/providers/__tests__/InactivityProvider.test.tsx +46 -114
  279. package/src/providers/__tests__/OrganisationProvider.test.tsx +313 -3
  280. package/src/providers/__tests__/ProviderLifecycle.test.tsx +341 -0
  281. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +383 -2
  282. package/src/providers/index.ts +8 -7
  283. package/src/providers/services/EventServiceProvider.tsx +3 -0
  284. package/src/providers/services/UnifiedAuthProvider.tsx +3 -0
  285. package/src/rbac/hooks/__tests__/usePermissions.integration.test.ts +437 -0
  286. package/src/rbac/hooks/index.ts +2 -0
  287. package/src/rbac/hooks/usePermissions.test.ts +296 -0
  288. package/src/rbac/hooks/useRBAC.test.ts +9 -5
  289. package/src/rbac/hooks/useRBAC.ts +3 -3
  290. package/src/rbac/hooks/useResolvedScope.ts +232 -0
  291. package/src/rbac/providers/__tests__/RBACProvider.integration.test.tsx +688 -0
  292. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +507 -0
  293. package/src/services/AuthService.ts +19 -4
  294. package/src/services/__tests__/AuthService.test.ts +288 -0
  295. package/src/services/__tests__/InactivityService.lifecycle.test.ts +411 -0
  296. package/src/services/__tests__/OrganisationService.pagination.test.ts +375 -0
  297. package/src/styles/core.css +2 -0
  298. package/src/types/__tests__/README.md +114 -0
  299. package/src/types/__tests__/guards.test.ts +246 -0
  300. package/src/types/__tests__/validation.test.ts +731 -0
  301. package/src/types/guards.ts +1 -0
  302. package/src/types/organisation.ts +3 -2
  303. package/src/utils/__tests__/file-reference.test.ts +383 -0
  304. package/src/utils/__tests__/performanceBenchmark.test.ts +175 -0
  305. package/src/utils/appNameResolver.test.ts +54 -0
  306. package/src/validation/__tests__/csrf.unit.test.ts +63 -0
  307. package/src/validation/__tests__/passwordSchema.unit.test.ts +105 -0
  308. package/src/validation/__tests__/sanitization.unit.test.ts +250 -0
  309. package/src/validation/__tests__/schemaUtils.unit.test.ts +451 -0
  310. package/src/validation/__tests__/user.unit.test.ts +440 -0
  311. package/dist/DataTable-2QR5TER5.js +0 -102
  312. package/dist/RBACProvider-BO4ilsQB.d.ts +0 -63
  313. package/dist/UnifiedAuthProvider-D02AMXgO.d.ts +0 -103
  314. package/dist/chunk-3SP4P7NS.js.map +0 -1
  315. package/dist/chunk-B5LK25HV.js +0 -953
  316. package/dist/chunk-B5LK25HV.js.map +0 -1
  317. package/dist/chunk-BKVGJVUR.js.map +0 -1
  318. package/dist/chunk-C5Q5LRU5.js +0 -5691
  319. package/dist/chunk-C5Q5LRU5.js.map +0 -1
  320. package/dist/chunk-CDDYJCYU.js +0 -79
  321. package/dist/chunk-CDDYJCYU.js.map +0 -1
  322. package/dist/chunk-DG5Z55HH.js.map +0 -1
  323. package/dist/chunk-H2TNUICK.js.map +0 -1
  324. package/dist/chunk-IHMMNKNA.js.map +0 -1
  325. package/dist/chunk-LVQ26TCN.js.map +0 -1
  326. package/dist/chunk-ORSMVXO2.js.map +0 -1
  327. package/dist/chunk-TYHR5X4W.js +0 -33
  328. package/dist/chunk-TYHR5X4W.js.map +0 -1
  329. package/dist/chunk-UJMCGBLS.js.map +0 -1
  330. package/dist/chunk-V6BHACCH.js +0 -17
  331. package/dist/chunk-V6BHACCH.js.map +0 -1
  332. package/dist/chunk-YNUBMSMV.js.map +0 -1
  333. package/dist/eventContext-BBA42P6G.js +0 -14
  334. package/dist/rbac/cli/policy-manager.js +0 -278
  335. package/dist/rbac/cli/policy-manager.js.map +0 -1
  336. package/docs/api/interfaces/EventContextType.md +0 -96
  337. package/docs/api/interfaces/EventProviderProps.md +0 -19
  338. package/docs/documentation-style-checklist.md +0 -294
  339. package/src/components/DataTable/components/DataTableBody.tsx +0 -488
  340. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -144
  341. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -515
  342. package/src/components/DataTable/core/ActionManager.ts +0 -235
  343. package/src/components/DataTable/core/ColumnManager.ts +0 -205
  344. package/src/components/DataTable/core/DataManager.ts +0 -188
  345. package/src/components/DataTable/core/DataTableContext.tsx +0 -181
  346. package/src/components/DataTable/core/LocalDataAdapter.ts +0 -264
  347. package/src/components/DataTable/core/PluginRegistry.ts +0 -229
  348. package/src/components/DataTable/core/StateManager.ts +0 -311
  349. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +0 -634
  350. package/src/components/DataTable/core/__tests__/DataManager.test.ts +0 -519
  351. package/src/components/DataTable/core/__tests__/StateManager.test.ts +0 -714
  352. package/src/components/DataTable/core/interfaces.ts +0 -338
  353. package/src/components/DataTable/utils/debugTools.ts +0 -583
  354. package/src/components/Select/Select.bug-test.tsx +0 -69
  355. package/src/components/Select/Select.refactored.tsx +0 -497
  356. package/src/providers/OrganisationProvider.test.tsx +0 -164
  357. package/src/providers/UnifiedAuthProvider.test.tsx +0 -124
  358. package/src/providers/__tests__/AuthProvider.test.tsx.backup +0 -771
  359. package/src/providers/__tests__/EventProvider.test.tsx.backup +0 -824
  360. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +0 -820
  361. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +0 -911
  362. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +0 -166
  363. package/src/rbac/cli/__tests__/policy-manager.test.ts +0 -339
  364. package/src/rbac/cli/policy-manager.ts +0 -443
  365. package/dist/{DataTable-2QR5TER5.js.map → DataTable-4GAVPIEG.js.map} +0 -0
  366. package/dist/{UnifiedAuthProvider-K4NRGXL4.js.map → UnifiedAuthProvider-3NKDOSOK.js.map} +0 -0
  367. package/dist/{eventContext-BBA42P6G.js.map → useInactivityTracker-MRUU55XI.js.map} +0 -0
  368. package/dist/{validation-PM_iOaTI.d.ts → validation-D8VcbTzC.d.ts} +2 -2
  369. /package/src/utils/{appNameResolver.test.ts.backup → appNameResolver.test 2.ts} +0 -0
@@ -2,12 +2,16 @@
2
2
  * @file Select Component Tests
3
3
  * @description Comprehensive test suite for Select component and its sub-components
4
4
  * @package @jmruthers/pace-core
5
+ * @module Components/Select
6
+ *
7
+ * This test suite follows the testing guidelines in TEST_GUIDE_CURSOR.md
8
+ * and focuses on observable behavior, accessibility, and user interactions.
5
9
  */
6
10
 
7
11
  import React from 'react';
8
- import { screen, waitFor, act } from '@testing-library/react';
12
+ import { screen, waitFor } from '@testing-library/react';
9
13
  import userEvent from '@testing-library/user-event';
10
- import { describe, it, expect, vi, beforeEach } from 'vitest';
14
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
11
15
  import {
12
16
  Select,
13
17
  SelectTrigger,
@@ -66,46 +70,48 @@ describe('Select Component', () => {
66
70
  );
67
71
  };
68
72
 
69
- describe('Basic Rendering', () => {
70
- it('renders with default props', () => {
73
+ beforeEach(() => {
74
+ vi.clearAllMocks();
75
+ });
76
+
77
+ afterEach(() => {
78
+ vi.restoreAllMocks();
79
+ });
80
+
81
+ describe('Rendering', () => {
82
+ it('renders select trigger with placeholder', () => {
71
83
  renderSelect();
72
84
 
73
- expect(screen.getByTestId('select-root')).toBeInTheDocument();
74
- expect(screen.getByTestId('select-trigger')).toBeInTheDocument();
75
- expect(screen.getByTestId('select-value')).toBeInTheDocument();
85
+ expect(screen.getByRole('combobox')).toBeInTheDocument();
76
86
  expect(screen.getByText('Select an option...')).toBeInTheDocument();
77
87
  });
78
88
 
79
89
  it('renders with custom placeholder', () => {
80
- renderSelect({}, []);
81
-
82
- const selectValue = screen.getByTestId('select-value');
83
- expect(selectValue).toHaveTextContent('Select an option...');
84
- });
85
-
86
- it('renders with custom className', () => {
87
- renderSelect({ className: 'custom-select' });
90
+ renderWithProviders(
91
+ <Select>
92
+ <SelectTrigger>
93
+ <SelectValue placeholder="Choose..." />
94
+ </SelectTrigger>
95
+ <SelectContent>
96
+ <SelectItem value="test">Test</SelectItem>
97
+ </SelectContent>
98
+ </Select>
99
+ );
88
100
 
89
- expect(screen.getByTestId('select-root')).toHaveClass('custom-select');
101
+ expect(screen.getByText('Choose...')).toBeInTheDocument();
90
102
  });
91
103
 
92
104
  it('renders with disabled state', () => {
93
105
  renderSelect({ disabled: true });
94
106
 
95
- const trigger = screen.getByTestId('select-trigger');
107
+ const trigger = screen.getByRole('combobox');
96
108
  expect(trigger).toBeDisabled();
97
109
  });
98
110
 
99
- it('renders with default value', () => {
100
- renderSelect({ defaultValue: 'option1' });
101
-
102
- expect(screen.getByTestId('select-root')).toHaveAttribute('data-value', 'option1');
103
- });
104
-
105
- it('renders with controlled value', () => {
106
- renderSelect({ value: 'option2' });
111
+ it('shows placeholder when no value is selected', () => {
112
+ renderSelect();
107
113
 
108
- expect(screen.getByTestId('select-root')).toHaveAttribute('data-value', 'option2');
114
+ expect(screen.getByText('Select an option...')).toBeInTheDocument();
109
115
  });
110
116
  });
111
117
 
@@ -339,152 +345,157 @@ describe('Select Component', () => {
339
345
  });
340
346
 
341
347
  describe('User Interactions', () => {
342
- it('opens dropdown on trigger click', async () => {
348
+ it('opens dropdown when clicking trigger', async () => {
343
349
  const user = userEvent.setup();
344
350
  renderSelect();
345
351
 
346
- const trigger = screen.getByTestId('select-trigger');
352
+ const trigger = screen.getByRole('combobox');
347
353
  await user.click(trigger);
348
354
 
349
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
355
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
356
+ expect(screen.getByText('Option 1')).toBeInTheDocument();
350
357
  expect(trigger).toHaveAttribute('aria-expanded', 'true');
351
358
  });
352
359
 
353
- it('closes dropdown on item selection', async () => {
360
+ it('shows all options when dropdown opens', async () => {
354
361
  const user = userEvent.setup();
355
362
  renderSelect();
356
363
 
357
- const trigger = screen.getByTestId('select-trigger');
358
- await user.click(trigger);
364
+ await user.click(screen.getByRole('combobox'));
359
365
 
360
- const option = screen.getByText('Option 1');
361
- await user.click(option);
366
+ expect(screen.getByText('Option 1')).toBeInTheDocument();
367
+ expect(screen.getByText('Option 2')).toBeInTheDocument();
368
+ expect(screen.getByText('Option 3')).toBeInTheDocument();
369
+ });
370
+
371
+ it('closes dropdown when an option is selected', async () => {
372
+ const user = userEvent.setup();
373
+ renderSelect();
374
+
375
+ await user.click(screen.getByRole('combobox'));
376
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
377
+
378
+ await user.click(screen.getByText('Option 1'));
362
379
 
363
380
  await waitFor(() => {
364
- expect(screen.queryByTestId('select-content')).not.toBeInTheDocument();
365
- }, { interval: 10 });
381
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
382
+ });
366
383
  });
367
384
 
368
- it('updates value on item selection', async () => {
385
+ it('updates displayed value after selection', async () => {
369
386
  const user = userEvent.setup();
370
387
  const onValueChange = vi.fn();
371
388
  renderSelect({ onValueChange });
372
389
 
373
- const trigger = screen.getByTestId('select-trigger');
374
- await user.click(trigger);
375
-
376
- const option = screen.getByText('Option 2');
377
- await user.click(option);
390
+ await user.click(screen.getByRole('combobox'));
391
+ await user.click(screen.getByText('Option 2'));
378
392
 
379
393
  expect(onValueChange).toHaveBeenCalledWith('option2');
394
+ await waitFor(() => {
395
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
396
+ });
380
397
  });
381
398
 
382
- it('closes dropdown on outside click', async () => {
399
+ it('closes dropdown when clicking outside', async () => {
383
400
  const user = userEvent.setup();
384
401
  renderSelect();
385
402
 
386
- const trigger = screen.getByTestId('select-trigger');
387
- await user.click(trigger);
388
-
389
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
403
+ await user.click(screen.getByRole('combobox'));
404
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
390
405
 
391
- // Click outside
392
406
  await user.click(document.body);
393
407
 
394
408
  await waitFor(() => {
395
- expect(screen.queryByTestId('select-content')).not.toBeInTheDocument();
396
- }, { interval: 10 });
409
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
410
+ });
411
+ });
412
+
413
+ it('prevents opening when trigger is disabled', async () => {
414
+ const user = userEvent.setup();
415
+ renderSelect({ disabled: true });
416
+
417
+ const trigger = screen.getByRole('combobox');
418
+ expect(trigger).toBeDisabled();
419
+
420
+ await user.click(trigger);
421
+
422
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
397
423
  });
398
424
  });
399
425
 
400
426
  describe('Keyboard Navigation', () => {
401
- it('opens dropdown on Enter key', async () => {
427
+ it('opens dropdown when pressing Enter', async () => {
402
428
  const user = userEvent.setup();
403
429
  renderSelect();
404
430
 
405
- const trigger = screen.getByTestId('select-trigger');
431
+ const trigger = screen.getByRole('combobox');
406
432
  trigger.focus();
407
433
  await user.keyboard('{Enter}');
408
434
 
409
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
435
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
410
436
  });
411
437
 
412
- it('opens dropdown on Space key', async () => {
438
+ it('opens dropdown when pressing Space', async () => {
413
439
  const user = userEvent.setup();
414
440
  renderSelect();
415
441
 
416
- const trigger = screen.getByTestId('select-trigger');
442
+ const trigger = screen.getByRole('combobox');
417
443
  trigger.focus();
418
444
  await user.keyboard(' ');
419
445
 
420
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
446
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
421
447
  });
422
448
 
423
- it('opens dropdown on ArrowDown key', async () => {
449
+ it('opens dropdown when pressing ArrowDown', async () => {
424
450
  const user = userEvent.setup();
425
451
  renderSelect();
426
452
 
427
- const trigger = screen.getByTestId('select-trigger');
453
+ const trigger = screen.getByRole('combobox');
428
454
  trigger.focus();
429
455
  await user.keyboard('{ArrowDown}');
430
456
 
431
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
457
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
432
458
  });
433
459
 
434
- it('opens dropdown on ArrowUp key', async () => {
460
+ it('opens dropdown when pressing ArrowUp', async () => {
435
461
  const user = userEvent.setup();
436
462
  renderSelect();
437
463
 
438
- const trigger = screen.getByTestId('select-trigger');
464
+ const trigger = screen.getByRole('combobox');
439
465
  trigger.focus();
440
466
  await user.keyboard('{ArrowUp}');
441
467
 
442
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
468
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
443
469
  });
444
470
 
445
- it('closes dropdown on Escape key', async () => {
471
+ it('closes dropdown when pressing Escape', async () => {
446
472
  const user = userEvent.setup();
447
473
  renderSelect();
448
474
 
449
- const trigger = screen.getByTestId('select-trigger');
450
- await user.click(trigger);
451
-
452
- expect(screen.getByTestId('select-content')).toBeInTheDocument();
475
+ await user.click(screen.getByRole('combobox'));
476
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
453
477
 
454
478
  await user.keyboard('{Escape}');
455
479
 
456
480
  await waitFor(() => {
457
- expect(screen.queryByTestId('select-content')).not.toBeInTheDocument();
458
- }, { interval: 10 });
481
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
482
+ });
459
483
  });
460
484
 
461
- it('selects item on click', async () => {
485
+ it('selects option with keyboard activation', async () => {
462
486
  const user = userEvent.setup();
463
487
  const onValueChange = vi.fn();
464
488
  renderSelect({ onValueChange });
465
489
 
466
- const trigger = screen.getByTestId('select-trigger');
490
+ const trigger = screen.getByRole('combobox');
467
491
  await user.click(trigger);
468
492
 
469
493
  const item = screen.getByText('Option 1');
470
- await user.click(item);
494
+ item.focus();
495
+ await user.keyboard('{Enter}');
471
496
 
472
497
  expect(onValueChange).toHaveBeenCalledWith('option1');
473
498
  });
474
-
475
- it('selects different item on click', async () => {
476
- const user = userEvent.setup();
477
- const onValueChange = vi.fn();
478
- renderSelect({ onValueChange });
479
-
480
- const trigger = screen.getByTestId('select-trigger');
481
- await user.click(trigger);
482
-
483
- const item = screen.getByText('Option 2');
484
- await user.click(item);
485
-
486
- expect(onValueChange).toHaveBeenCalledWith('option2');
487
- });
488
499
  });
489
500
 
490
501
  describe('Search Functionality', () => {
@@ -865,65 +876,50 @@ describe('Select Component', () => {
865
876
  });
866
877
 
867
878
  describe('Accessibility', () => {
868
- it('has proper ARIA attributes', () => {
879
+ it('announces expandable state to screen readers', () => {
869
880
  renderSelect();
870
881
 
871
- const trigger = screen.getByTestId('select-trigger');
872
- expect(trigger).toHaveAttribute('role', 'combobox');
882
+ const trigger = screen.getByRole('combobox');
873
883
  expect(trigger).toHaveAttribute('aria-expanded', 'false');
874
884
  expect(trigger).toHaveAttribute('aria-haspopup', 'listbox');
875
885
  });
876
886
 
877
- it('updates ARIA attributes when opened', async () => {
887
+ it('updates expanded state when opened', async () => {
878
888
  const user = userEvent.setup();
879
889
  renderSelect();
880
890
 
881
- const trigger = screen.getByTestId('select-trigger');
891
+ const trigger = screen.getByRole('combobox');
882
892
  await user.click(trigger);
883
893
 
884
894
  expect(trigger).toHaveAttribute('aria-expanded', 'true');
885
895
  });
886
896
 
887
- it('has proper listbox role on content', async () => {
897
+ it('provides listbox structure for screen readers', async () => {
888
898
  const user = userEvent.setup();
889
899
  renderSelect();
890
900
 
891
- const trigger = screen.getByTestId('select-trigger');
901
+ const trigger = screen.getByRole('combobox');
892
902
  await user.click(trigger);
893
903
 
894
- const content = screen.getByTestId('select-content');
895
- expect(content).toHaveAttribute('role', 'listbox');
896
- });
897
-
898
- it('has proper option roles on items', async () => {
899
- const user = userEvent.setup();
900
- renderSelect();
901
-
902
- const trigger = screen.getByTestId('select-trigger');
903
- await user.click(trigger);
904
-
905
- const items = screen.getAllByRole('option');
906
- expect(items).toHaveLength(3);
907
-
908
- items.forEach(item => {
909
- expect(item).toHaveAttribute('role', 'option');
910
- });
904
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
905
+ const options = screen.getAllByRole('option');
906
+ expect(options).toHaveLength(3);
911
907
  });
912
908
 
913
- it('has proper aria-selected on items', async () => {
909
+ it('marks selected option for screen readers', async () => {
914
910
  const user = userEvent.setup();
915
911
  renderSelect({ defaultValue: 'option2' });
916
912
 
917
- const trigger = screen.getByTestId('select-trigger');
913
+ const trigger = screen.getByRole('combobox');
918
914
  await user.click(trigger);
919
915
 
920
- const items = screen.getAllByRole('option');
921
- expect(items[0]).toHaveAttribute('aria-selected', 'false');
922
- expect(items[1]).toHaveAttribute('aria-selected', 'true');
923
- expect(items[2]).toHaveAttribute('aria-selected', 'false');
916
+ const options = screen.getAllByRole('option');
917
+ expect(options[0]).toHaveAttribute('aria-selected', 'false');
918
+ expect(options[1]).toHaveAttribute('aria-selected', 'true');
919
+ expect(options[2]).toHaveAttribute('aria-selected', 'false');
924
920
  });
925
921
 
926
- it('has proper search input accessibility', async () => {
922
+ it('announces search functionality for screen readers', async () => {
927
923
  const user = userEvent.setup();
928
924
  renderWithProviders(
929
925
  <Select>
@@ -936,11 +932,38 @@ describe('Select Component', () => {
936
932
  </Select>
937
933
  );
938
934
 
939
- const trigger = screen.getByTestId('select-trigger');
935
+ await user.click(screen.getByRole('combobox'));
936
+
937
+ const searchInput = screen.getByLabelText('Search options');
938
+ expect(searchInput).toBeInTheDocument();
939
+ });
940
+
941
+ it('supports keyboard-only navigation', async () => {
942
+ const user = userEvent.setup();
943
+ renderSelect();
944
+
945
+ const trigger = screen.getByRole('combobox');
946
+ trigger.focus();
947
+
948
+ await user.keyboard('{Enter}');
949
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
950
+
951
+ await user.keyboard('{Escape}');
952
+ await waitFor(() => {
953
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
954
+ });
955
+ });
956
+
957
+ it('maintains focus management when interacting', async () => {
958
+ const user = userEvent.setup();
959
+ renderSelect();
960
+
961
+ const trigger = screen.getByRole('combobox');
940
962
  await user.click(trigger);
941
963
 
942
- const searchInput = screen.getByTestId('select-search-input');
943
- expect(searchInput).toHaveAttribute('aria-label', 'Search options');
964
+ const options = screen.getAllByRole('option');
965
+ options[0].focus();
966
+ expect(document.activeElement).toBe(options[0]);
944
967
  });
945
968
  });
946
969