@jmruthers/pace-core 0.6.10 → 0.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/audit-tool/00-dependencies.cjs +46 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +96 -21
- package/audit-tool/audits/02-project-structure.cjs +13 -3
- package/audit-tool/audits/03-architecture.cjs +78 -4
- package/audit-tool/audits/04-code-quality.cjs +9 -2
- package/audit-tool/audits/05-styling.cjs +19 -7
- package/audit-tool/audits/06-security-rbac.cjs +105 -14
- package/audit-tool/audits/07-api-tech-stack.cjs +31 -15
- package/audit-tool/audits/08-testing-documentation.cjs +11 -3
- package/audit-tool/audits/09-operations.cjs +19 -7
- package/audit-tool/index.cjs +22 -11
- package/audit-tool/utils/report-utils.cjs +4 -0
- package/cursor-rules/01-pace-core-compliance.mdc +1 -0
- package/cursor-rules/02-project-structure.mdc +1 -0
- package/cursor-rules/03-architecture.mdc +3 -1
- package/cursor-rules/04-code-quality.mdc +1 -0
- package/cursor-rules/05-styling.mdc +41 -7
- package/cursor-rules/06-security-rbac.mdc +2 -1
- package/cursor-rules/07-api-tech-stack.mdc +1 -0
- package/cursor-rules/08-testing-documentation.mdc +1 -0
- package/cursor-rules/09-operations.mdc +1 -0
- package/dist/{DataTable-SAXFG4XI.js → DataTable-EFYP2QLE.js} +10 -7
- package/dist/{InactivityServiceProvider-DHryoh6K.d.ts → InactivityServiceProvider-BbxwwDz1.d.ts} +10 -1
- package/dist/{UnifiedAuthProvider-CiBAl9-s.d.ts → UnifiedAuthProvider-Bkt_tzdS.d.ts} +56 -24
- package/dist/{api-F47QJ7FX.js → api-BZR2CYXL.js} +3 -2
- package/dist/api-result-USV1Czr-.d.ts +51 -0
- package/dist/{audit-Z6ZZBWLU.js → audit-HI2DHUVU.js} +2 -1
- package/dist/{auth-BZOJqrdd.d.ts → auth-JvdRVaud.d.ts} +1 -1
- package/dist/{chunk-KSNLMI7N.js → chunk-2DL2WSOE.js} +1 -155
- package/dist/{chunk-MPY44PWB.js → chunk-2OEVOGGR.js} +4648 -3560
- package/dist/chunk-44CNXN4P.js +15 -0
- package/dist/{chunk-Y4PF6HIM.js → chunk-4R3T5ENU.js} +867 -786
- package/dist/{chunk-LNHFAF4X.js → chunk-7A6IMHH2.js} +289 -247
- package/dist/chunk-CU2BU2MQ.js +2 -0
- package/dist/{chunk-JJEYZ3DX.js → chunk-D6BMFMQZ.js} +37 -2
- package/dist/{chunk-BCTXBU6U.js → chunk-ENLXB7GP.js} +88 -71
- package/dist/{chunk-FBZ7U3ID.js → chunk-J2KQK6DG.js} +937 -987
- package/dist/{chunk-TFIPNIPE.js → chunk-KJXRL3XE.js} +3300 -2245
- package/dist/{chunk-3GWSPISD.js → chunk-L5LFKKLJ.js} +1 -1
- package/dist/{chunk-X5EAU5G7.js → chunk-PCSHBLPB.js} +132 -114
- package/dist/{chunk-NIU6DPQV.js → chunk-QRYSEPHB.js} +2 -0
- package/dist/{chunk-KYURMOQM.js → chunk-V7FTM2LU.js} +423 -320
- package/dist/chunk-WY6Y7KC3.js +264 -0
- package/dist/{chunk-FN52B75D.js → chunk-XOJME5T7.js} +176 -15
- package/dist/{chunk-7YDC7LMU.js → chunk-XPFVT3GN.js} +71 -66
- package/dist/{chunk-66R6RLUZ.js → chunk-YFTFFJIV.js} +3 -3
- package/dist/{chunk-W46INAVW.js → chunk-YYTWKVHO.js} +688 -570
- package/dist/components.d.ts +8 -7
- package/dist/components.js +17 -15
- package/dist/{database.generated-DT8JTZiP.d.ts → database.generated-qkdoiVrJ.d.ts} +45 -10
- package/dist/eslint-rules/index.cjs +3 -0
- package/dist/eslint-rules/rules/03-architecture.cjs +74 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +74 -0
- package/dist/{event-WTAQuGcq.d.ts → event-BfCox3N2.d.ts} +36 -10
- package/dist/{file-reference-BavO2eQj.d.ts → file-reference-DU1hcawx.d.ts} +29 -13
- package/dist/hooks.d.ts +22 -9
- package/dist/hooks.js +34 -25
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +66 -177
- package/dist/index.js +316 -340
- package/dist/pagination-BW1mqywp.d.ts +201 -0
- package/dist/providers.d.ts +6 -5
- package/dist/providers.js +5 -3
- package/dist/rbac/index.d.ts +123 -138
- package/dist/rbac/index.js +10 -8
- package/dist/theming/runtime.d.ts +19 -2
- package/dist/theming/runtime.js +1 -1
- package/dist/{timezone-K-ptz3HO.d.ts → timezone-BTWWXKVY.d.ts} +1 -1
- package/dist/types.d.ts +17 -10
- package/dist/types.js +1 -0
- package/dist/{usePublicPageContext-vxBlEHO9.d.ts → usePublicPageContext-B91dGYW1.d.ts} +433 -356
- package/dist/{usePublicRouteParams-G3Ks53mk.d.ts → usePublicRouteParams-BgV6VhMi.d.ts} +73 -4
- package/dist/utils.d.ts +163 -145
- package/dist/utils.js +42 -25
- package/docs/api/modules.md +782 -643
- package/docs/api-reference/rpc-functions.md +12 -3
- package/docs/core-concepts/rbac-system.md +8 -0
- package/docs/getting-started/cursor-rules.md +17 -20
- package/docs/getting-started/dependencies.md +1 -1
- package/docs/getting-started/setup.md +235 -0
- package/docs/implementation-guides/authentication.md +27 -0
- package/docs/implementation-guides/data-tables.md +176 -3
- package/docs/migration/ApiResult-migration.md +25 -0
- package/docs/rbac/api-reference.md +33 -31
- package/docs/standards/0-standards-overview.md +50 -15
- package/docs/standards/1-pace-core-compliance-standards.md +62 -57
- package/docs/standards/2-project-structure-standards.md +33 -16
- package/docs/standards/3-architecture-standards.md +41 -1
- package/docs/standards/4-code-quality-standards.md +26 -6
- package/docs/standards/5-styling-standards.md +35 -1
- package/docs/standards/6-security-rbac-standards.md +66 -0
- package/docs/standards/7-api-tech-stack-standards.md +25 -14
- package/docs/standards/8-testing-documentation-standards.md +31 -0
- package/docs/standards/9-operations-standards.md +19 -0
- package/docs/standards/README.md +20 -201
- package/docs/testing/test-setup-for-consumers.md +2 -0
- package/docs/troubleshooting/common-issues.md +17 -1
- package/docs/troubleshooting/organisation-context-setup.md +8 -0
- package/docs/troubleshooting/print-event-name-css-variable-analysis.md +217 -0
- package/eslint-config-pace-core.cjs +20 -0
- package/package.json +14 -20
- package/scripts/{build-docs-incremental.js → build-docs.js} +3 -2
- package/scripts/setup.cjs +536 -0
- package/scripts/validate.cjs +480 -0
- package/src/__tests__/helpers/{__tests__/component-test-utils.test.tsx → component-test-utils.test.tsx} +3 -3
- package/src/__tests__/helpers/{__tests__/optimized-test-setup.test.ts → optimized-test-setup.test.ts} +2 -2
- package/src/__tests__/helpers/{__tests__/supabaseMock.test.ts → supabaseMock.test.ts} +2 -2
- package/src/__tests__/helpers/{__tests__/test-providers.test.tsx → test-providers.test.tsx} +1 -1
- package/src/__tests__/helpers/test-providers.tsx +37 -39
- package/src/__tests__/helpers/{__tests__/test-utils.test.tsx → test-utils.test.tsx} +4 -3
- package/src/__tests__/helpers/{__tests__/timer-utils.test.ts → timer-utils.test.ts} +2 -2
- package/src/assets/app-icons/index.test.ts +304 -0
- package/src/components/AddressField/AddressField.test.tsx +1 -1
- package/src/components/AddressField/AddressField.tsx +238 -212
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Card/Card.test.tsx +172 -17
- package/src/components/Card/Card.tsx +19 -10
- package/src/components/ContextSelector/ContextSelector.internals.tsx +204 -0
- package/src/components/ContextSelector/{__tests__/ContextSelector.test.tsx → ContextSelector.test.tsx} +6 -6
- package/src/components/ContextSelector/ContextSelector.tsx +66 -280
- package/src/components/ContextSelector/ContextSelector.types.ts +35 -0
- package/src/components/ContextSelector/useContextSelectorState.tsx +195 -0
- package/src/components/DataTable/AUDIT_REPORT.md +59 -44
- package/src/components/DataTable/{__tests__/DataTable.comprehensive.test.tsx → DataTable.comprehensive.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/DataTable.default-state.test.tsx → DataTable.default-state.test.tsx} +5 -5
- package/src/components/DataTable/{__tests__/DataTable.export.test.tsx → DataTable.export.test.tsx} +10 -10
- package/src/components/DataTable/{__tests__/DataTable.grouping-aggregation.test.tsx → DataTable.grouping-aggregation.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/DataTable.hooks.test.tsx → DataTable.hooks.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/DataTable.select-label-display.test.tsx → DataTable.select-label-display.test.tsx} +6 -6
- package/src/components/DataTable/DataTable.test.tsx +787 -416
- package/src/components/DataTable/DataTable.tsx +12 -12
- package/src/components/DataTable/DataTableCore.integration.test.tsx +458 -0
- package/src/components/DataTable/{__tests__/DataTableCore.test-setup.ts → DataTableCore.test-setup.ts} +10 -9
- package/src/components/DataTable/{__tests__/DataTableCore.test.tsx → DataTableCore.test.tsx} +8 -8
- package/src/components/DataTable/{__tests__/README.md → README.md} +17 -7
- package/src/components/DataTable/TESTING.md +101 -0
- package/src/components/DataTable/{__tests__/a11y.basic.test.tsx → a11y.basic.test.tsx} +34 -34
- package/src/components/DataTable/components/DataTableCore.tsx +104 -864
- package/src/components/DataTable/components/{__tests__/GroupingDropdown.test.tsx → GroupingDropdown.test.tsx} +17 -8
- package/src/components/DataTable/components/GroupingDropdown.tsx +2 -2
- package/src/components/DataTable/components/ImportModal.tsx +61 -559
- package/src/components/DataTable/components/ImportModalFileSection.tsx +148 -0
- package/src/components/DataTable/context/{__tests__/DataTableContext.test.tsx → DataTableContext.test.tsx} +2 -2
- package/src/components/DataTable/context/DataTableContext.tsx +7 -6
- package/src/components/DataTable/core/{__tests__/ColumnFactory.test.ts → ColumnFactory.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useColumnOrderPersistence.test.ts → useColumnOrderPersistence.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useColumnVisibilityPersistence.test.ts → useColumnVisibilityPersistence.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useDataTableConfiguration.test.ts → useDataTableConfiguration.test.ts} +3 -3
- package/src/components/DataTable/hooks/useDataTableConfiguration.ts +14 -2
- package/src/components/DataTable/hooks/{__tests__/useDataTableDataPipeline.test.ts → useDataTableDataPipeline.test.ts} +6 -6
- package/src/components/DataTable/hooks/useDataTableDeletionBatching.test.ts +127 -0
- package/src/components/DataTable/hooks/useDataTableDeletionBatching.ts +106 -0
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.test.ts +461 -0
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.ts +238 -0
- package/src/components/DataTable/hooks/useDataTableLayoutHandlers.test.ts +296 -0
- package/src/components/DataTable/hooks/useDataTableLayoutHandlers.ts +175 -0
- package/src/components/DataTable/hooks/useDataTablePaginationSync.test.ts +203 -0
- package/src/components/DataTable/hooks/useDataTablePaginationSync.ts +109 -0
- package/src/components/DataTable/hooks/{__tests__/useDataTablePermissions.test.ts → useDataTablePermissions.test.ts} +11 -11
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +79 -247
- package/src/components/DataTable/hooks/useDataTablePipeline.test.tsx +219 -0
- package/src/components/DataTable/hooks/useDataTablePipeline.tsx +239 -0
- package/src/components/DataTable/hooks/useDataTableRenderGuard.test.tsx +316 -0
- package/src/components/DataTable/hooks/useDataTableRenderGuard.tsx +195 -0
- package/src/components/DataTable/hooks/useDataTableScope.test.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableScope.ts +123 -0
- package/src/components/DataTable/hooks/{__tests__/useDataTableState.test.ts → useDataTableState.test.ts} +47 -5
- package/src/components/DataTable/hooks/useDataTableState.ts +145 -94
- package/src/components/DataTable/hooks/useDataTableStateAndPersistence.test.ts +277 -0
- package/src/components/DataTable/hooks/useDataTableStateAndPersistence.ts +222 -0
- package/src/components/DataTable/hooks/useDataTableSuperAdmin.test.ts +93 -0
- package/src/components/DataTable/hooks/useDataTableSuperAdmin.ts +86 -0
- package/src/components/DataTable/hooks/useDataTableTableInstance.test.ts +185 -0
- package/src/components/DataTable/hooks/useDataTableTableInstance.ts +178 -0
- package/src/components/DataTable/hooks/{__tests__/useEffectiveColumnOrder.test.ts → useEffectiveColumnOrder.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useHierarchicalState.test.ts → useHierarchicalState.test.ts} +2 -2
- package/src/components/DataTable/{components/hooks → hooks}/useImportModalFocus.test.ts +3 -3
- package/src/components/DataTable/{components/hooks → hooks}/useImportModalFocus.ts +2 -2
- package/src/components/DataTable/hooks/useImportModalState.test.ts +390 -0
- package/src/components/DataTable/hooks/useImportModalState.ts +345 -0
- package/src/components/DataTable/hooks/{__tests__/useKeyboardNavigation.test.ts → useKeyboardNavigation.test.ts} +3 -3
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +309 -269
- package/src/components/DataTable/{components/hooks → hooks}/usePermissionTracking.test.ts +3 -3
- package/src/components/DataTable/{components/hooks → hooks}/usePermissionTracking.ts +3 -3
- package/src/components/DataTable/hooks/{__tests__/useServerSideDataEffect.test.ts → useServerSideDataEffect.test.ts} +2 -2
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +14 -3
- package/src/components/DataTable/hooks/{__tests__/useTableColumns.test.ts → useTableColumns.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useTableHandlers.test.ts → useTableHandlers.test.ts} +25 -4
- package/src/components/DataTable/hooks/useTableHandlers.ts +5 -2
- package/src/components/DataTable/index.ts +18 -17
- package/src/components/DataTable/{__tests__/keyboard.test.tsx → keyboard.test.tsx} +41 -63
- package/src/components/DataTable/{__tests__/mocks → mocks}/MockRBACProvider.tsx +1 -1
- package/src/components/DataTable/{__tests__/pagination.modes.test.tsx → pagination.modes.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/ssr.strict-mode.test.tsx → ssr.strict-mode.test.tsx} +2 -2
- package/src/components/DataTable/{__tests__/styles.test.ts → styles.test.ts} +1 -4
- package/src/components/DataTable/styles.ts +0 -1
- package/src/components/DataTable/test-utils/MockDataTableComponents.tsx +55 -0
- package/src/components/DataTable/{__tests__/test-utils → test-utils}/dataFactories.ts +2 -2
- package/src/components/DataTable/test-utils/featureConfig.ts +10 -0
- package/src/components/DataTable/{__tests__/test-utils/sharedTestUtils.tsx → test-utils/sharedTestUtils.ts} +97 -66
- package/src/components/DataTable/{__tests__/test-utils.ts → test-utils.ts} +1 -1
- package/src/components/DataTable/types/actions.ts +71 -0
- package/src/components/DataTable/types/base.ts +39 -0
- package/src/components/DataTable/types/columns.ts +125 -0
- package/src/components/DataTable/types/export.ts +32 -0
- package/src/components/DataTable/types/features.ts +81 -0
- package/src/components/DataTable/types/hierarchical.ts +44 -0
- package/src/components/DataTable/types/index.ts +43 -0
- package/src/components/DataTable/types/pagination.ts +85 -0
- package/src/components/DataTable/types/performance.ts +47 -0
- package/src/components/DataTable/types/props.ts +62 -0
- package/src/components/DataTable/types/rbac.ts +45 -0
- package/src/components/DataTable/{components/__tests__ → ui/layout}/DataTableCore.test.tsx +430 -28
- package/src/components/DataTable/ui/layout/DataTableCore.tsx +345 -0
- package/src/components/DataTable/{components/__tests__ → ui/layout}/DataTableErrorBoundary.test.tsx +4 -4
- package/src/components/DataTable/{components → ui/layout}/DataTableErrorBoundary.tsx +7 -7
- package/src/components/DataTable/ui/layout/DataTableLayout.test.tsx +1352 -0
- package/src/components/DataTable/ui/layout/DataTableLayout.tsx +661 -0
- package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.test.tsx +91 -0
- package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.tsx +43 -0
- package/src/components/DataTable/ui/modals/DataTableModals.test.tsx +749 -0
- package/src/components/DataTable/{components → ui/modals}/DataTableModals.tsx +36 -28
- package/src/components/DataTable/ui/modals/ImportModal.test.tsx +1834 -0
- package/src/components/DataTable/ui/modals/ImportModal.tsx +197 -0
- package/src/components/DataTable/ui/modals/ImportModalFailedRowsSection.tsx +60 -0
- package/src/components/DataTable/ui/modals/ImportModalFileSection.tsx +148 -0
- package/src/components/DataTable/ui/modals/ImportModalPreviewSection.tsx +60 -0
- package/src/components/DataTable/ui/modals/ImportModalSummarySection.tsx +59 -0
- package/src/components/DataTable/ui/modals/importModalPersistence.ts +73 -0
- package/src/components/DataTable/{components/__tests__ → ui/shared}/AccessDeniedPage.test.tsx +2 -2
- package/src/components/DataTable/{components → ui/shared}/AccessDeniedPage.tsx +2 -2
- package/src/components/DataTable/{components/__tests__ → ui/shared}/ActionButtons.test.tsx +6 -4
- package/src/components/DataTable/{components → ui/shared}/ActionButtons.tsx +4 -4
- package/src/components/DataTable/{components/__tests__ → ui/shared}/ColumnFilter.test.tsx +29 -16
- package/src/components/DataTable/{components → ui/shared}/ColumnFilter.tsx +4 -4
- package/src/components/DataTable/{components/__tests__ → ui/shared}/PaginationControls.test.tsx +38 -16
- package/src/components/DataTable/{components → ui/shared}/PaginationControls.tsx +21 -15
- package/src/components/DataTable/{components/__tests__ → ui/shared}/SortIndicator.test.tsx +2 -2
- package/src/components/DataTable/{components → ui/shared}/SortIndicator.tsx +1 -1
- package/src/components/DataTable/{components/__tests__ → ui/table}/EditFields.test.tsx +3 -3
- package/src/components/DataTable/{components → ui/table}/EditFields.tsx +138 -69
- package/src/components/DataTable/{components/__tests__ → ui/table}/EditableRow.test.tsx +36 -27
- package/src/components/DataTable/{components → ui/table}/EditableRow.tsx +86 -104
- package/src/components/DataTable/{components/__tests__ → ui/table}/EmptyState.test.tsx +2 -62
- package/src/components/DataTable/{components → ui/table}/EmptyState.tsx +7 -15
- package/src/components/DataTable/{components/__tests__ → ui/table}/FilterRow.test.tsx +5 -4
- package/src/components/DataTable/{components → ui/table}/FilterRow.tsx +3 -3
- package/src/components/DataTable/{components/__tests__ → ui/table}/LoadingState.test.tsx +6 -10
- package/src/components/DataTable/{components → ui/table}/LoadingState.tsx +4 -4
- package/src/components/DataTable/{components/__tests__ → ui/table}/RowComponent.test.tsx +412 -17
- package/src/components/DataTable/{components → ui/table}/RowComponent.tsx +183 -177
- package/src/components/DataTable/{components/__tests__ → ui/table}/UnifiedTableBody.test.tsx +425 -16
- package/src/components/DataTable/ui/table/UnifiedTableBody.tsx +440 -0
- package/src/components/DataTable/{components/__tests__ → ui/table}/cellValueUtils.test.ts +2 -2
- package/src/components/DataTable/{components → ui/table}/cellValueUtils.ts +1 -1
- package/src/components/DataTable/{components/__tests__ → ui/toolbar}/BulkOperationsDropdown.test.tsx +12 -5
- package/src/components/DataTable/{components → ui/toolbar}/BulkOperationsDropdown.tsx +3 -3
- package/src/components/DataTable/{components/__tests__ → ui/toolbar}/ColumnVisibilityDropdown.test.tsx +7 -4
- package/src/components/DataTable/{components → ui/toolbar}/ColumnVisibilityDropdown.tsx +7 -7
- package/src/components/DataTable/{components/__tests__ → ui/toolbar}/DataTableToolbar.test.tsx +4 -4
- package/src/components/DataTable/{components → ui/toolbar}/DataTableToolbar.tsx +4 -4
- package/src/components/DataTable/ui/toolbar/GroupingDropdown.test.tsx +621 -0
- package/src/components/DataTable/ui/toolbar/GroupingDropdown.tsx +107 -0
- package/src/components/DataTable/utils/{__tests__/a11yUtils.test.ts → a11yUtils.test.ts} +2 -2
- package/src/components/DataTable/utils/{__tests__/aggregationUtils.test.ts → aggregationUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/columnUtils.test.ts → columnUtils.test.ts} +2 -2
- package/src/components/DataTable/utils/csvParse.test.ts +74 -0
- package/src/components/DataTable/utils/csvParse.ts +65 -0
- package/src/components/DataTable/utils/{__tests__/errorHandling.test.ts → errorHandling.test.ts} +2 -2
- package/src/components/DataTable/utils/{__tests__/exportUtils.test.ts → exportUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/flexibleImport.test.ts → flexibleImport.test.ts} +2 -2
- package/src/components/DataTable/utils/flexibleImport.ts +3 -186
- package/src/components/DataTable/utils/{__tests__/hierarchicalSorting.test.ts → hierarchicalSorting.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/hierarchicalUtils.test.ts → hierarchicalUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/importDateParser.test.ts +162 -0
- package/src/components/DataTable/utils/importDateParser.ts +114 -0
- package/src/components/DataTable/utils/importValueParser.test.ts +138 -0
- package/src/components/DataTable/utils/importValueParser.ts +91 -0
- package/src/components/DataTable/utils/{__tests__/paginationUtils.test.ts → paginationUtils.test.ts} +2 -2
- package/src/components/DataTable/utils/paginationUtils.ts +6 -3
- package/src/components/DataTable/utils/{__tests__/performanceUtils.test.ts → performanceUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/rowUtils.test.ts → rowUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/selectFieldUtils.test.ts → selectFieldUtils.test.ts} +66 -3
- package/src/components/DataTable/utils/selectFieldUtils.ts +97 -60
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
- package/src/components/DateTimeField/DateTimeField.test.tsx +1 -1
- package/src/components/Dialog/Dialog.test-utils.ts +49 -0
- package/src/components/Dialog/Dialog.test.tsx +896 -89
- package/src/components/Dialog/Dialog.tsx +174 -882
- package/src/components/Dialog/dialogLock.test.ts +238 -0
- package/src/components/Dialog/dialogLock.ts +98 -0
- package/src/components/Dialog/index.ts +2 -0
- package/src/components/Dialog/useDialogDimensions.test.ts +163 -0
- package/src/components/Dialog/useDialogDimensions.ts +140 -0
- package/src/components/Dialog/useDialogLifecycle.test.ts +358 -0
- package/src/components/Dialog/useDialogLifecycle.ts +135 -0
- package/src/components/Dialog/useDialogPersistence.test.ts +381 -0
- package/src/components/Dialog/useDialogPersistence.ts +357 -0
- package/src/components/FileDisplay/FileDisplay.test.tsx +40 -40
- package/src/components/FileDisplay/FileDisplay.tsx +24 -656
- package/src/components/FileDisplay/FileDisplayContent.test.tsx +395 -0
- package/src/components/FileDisplay/FileDisplayContent.tsx +242 -0
- package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.test.tsx +74 -0
- package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.tsx +38 -0
- package/src/components/FileDisplay/FileDisplayEmptyView.test.tsx +33 -0
- package/src/components/FileDisplay/FileDisplayEmptyView.tsx +33 -0
- package/src/components/FileDisplay/FileDisplayErrorView.test.tsx +71 -0
- package/src/components/FileDisplay/FileDisplayErrorView.tsx +50 -0
- package/src/components/FileDisplay/FileDisplayLoadingFallbackView.test.tsx +22 -0
- package/src/components/FileDisplay/FileDisplayLoadingFallbackView.tsx +22 -0
- package/src/components/FileDisplay/FileDisplayLoadingView.test.tsx +21 -0
- package/src/components/FileDisplay/FileDisplayLoadingView.tsx +23 -0
- package/src/components/FileDisplay/FileDisplayMultipleFilesView.test.tsx +101 -0
- package/src/components/FileDisplay/FileDisplayMultipleFilesView.tsx +109 -0
- package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.test.tsx +58 -0
- package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.tsx +48 -0
- package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.test.tsx +111 -0
- package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.tsx +270 -0
- package/src/components/FileDisplay/FileDisplaySingleImageView.test.tsx +78 -0
- package/src/components/FileDisplay/FileDisplaySingleImageView.tsx +67 -0
- package/src/components/FileDisplay/fallbackUtils.test.ts +50 -0
- package/src/components/FileDisplay/fallbackUtils.ts +44 -0
- package/src/components/FileDisplay/fetchFileDisplayData.ts +24 -0
- package/src/components/FileDisplay/fetchFileDisplayData.unit.test.ts +183 -0
- package/src/components/FileDisplay/fileDisplayUtils.test.ts +58 -0
- package/src/components/FileDisplay/fileDisplayUtils.ts +24 -0
- package/src/{hooks/__tests__ → components/FileDisplay}/useFileDisplay.test.ts +40 -42
- package/src/components/FileDisplay/useFileDisplay.ts +515 -0
- package/src/{hooks/__tests__ → components/FileDisplay}/useFileDisplay.unit.test.ts +406 -77
- package/src/components/FileDisplay/useFileDisplayData.ts +126 -0
- package/src/{hooks/public → components/FileDisplay}/usePublicFileDisplay.test.ts +94 -88
- package/src/components/FileDisplay/usePublicFileDisplay.ts +579 -0
- package/src/components/FileUpload/FileUpload.test.tsx +16 -10
- package/src/components/FileUpload/FileUpload.tsx +107 -525
- package/src/components/FileUpload/FileUploadDropZone.tsx +112 -0
- package/src/components/FileUpload/FileUploadProgressItem.tsx +86 -0
- package/src/components/FileUpload/FileUploadProgressList.tsx +40 -0
- package/src/components/FileUpload/useFileUploadManager.test.ts +308 -0
- package/src/components/FileUpload/useFileUploadManager.ts +454 -0
- package/src/components/FileUpload/useResolvedAppId.test.ts +102 -0
- package/src/components/FileUpload/useResolvedAppId.ts +77 -0
- package/src/components/Footer/Footer.test.tsx +6 -292
- package/src/components/Footer/Footer.tsx +8 -125
- package/src/components/Form/Form.test.tsx +44 -27
- package/src/components/Form/Form.tsx +64 -287
- package/src/components/Form/useFormPersistence.ts +257 -0
- package/src/components/Header/Header.test.tsx +17 -18
- package/src/components/Header/Header.tsx +10 -1
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.test.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +1 -1
- package/src/components/NavigationMenu/HierarchicalNavItem.tsx +104 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +1029 -26
- package/src/components/NavigationMenu/NavigationMenu.tsx +61 -361
- package/src/components/NavigationMenu/index.ts +6 -1
- package/src/components/NavigationMenu/navigationPermissionHelper.ts +188 -0
- package/src/components/NavigationMenu/{__tests__/useNavigationFiltering.test.ts → useNavigationFiltering.test.ts} +68 -53
- package/src/components/NavigationMenu/useNavigationFiltering.ts +197 -296
- package/src/components/NavigationMenu/useNavigationScope.ts +125 -0
- package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +77 -62
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +3 -3
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +16 -19
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +529 -5
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +280 -756
- package/src/components/PaceAppLayout/useFilteredNavItems.ts +304 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutConfig.ts +142 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutGate.tsx +150 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutPermissions.ts +162 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutScope.ts +79 -0
- package/src/components/PaceAppLayout/useRoleBasedRouteAccess.ts +157 -0
- package/src/components/PaceAppLayout/useSuperAdminFallback.ts +58 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +31 -25
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +31 -122
- package/src/components/PaceLoginPage/useLoginAppAccess.ts +153 -0
- package/src/components/Progress/Progress.tsx +1 -2
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +29 -235
- package/src/components/ProtectedRoute/useProtectedRouteState.ts +128 -0
- package/src/components/ProtectedRoute/useVisibilityRedirectGrace.ts +89 -0
- package/src/components/PublicLayout/PublicLayout.test.tsx +217 -36
- package/src/components/PublicLayout/PublicPageLayout.tsx +132 -73
- package/src/components/PublicLayout/PublicPageProvider.tsx +5 -1
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +28 -18
- package/src/components/Select/{__tests__/context.test.tsx → context.test.tsx} +3 -3
- package/src/components/Select/{utils/__tests__/text.test.tsx → text.test.tsx} +2 -2
- package/src/components/Select/{utils/text.ts → text.ts} +1 -1
- package/src/components/Select/{hooks/__tests__/useSelectEvents.test.ts → useSelectEvents.test.ts} +5 -5
- package/src/components/Select/{hooks/useSelectEvents.ts → useSelectEvents.ts} +2 -2
- package/src/components/Select/{hooks/__tests__/useSelectSearch.test.tsx → useSelectSearch.test.tsx} +7 -7
- package/src/components/Select/{hooks/useSelectSearch.ts → useSelectSearch.ts} +2 -2
- package/src/components/Select/{hooks/__tests__/useSelectState.test.ts → useSelectState.test.ts} +16 -2
- package/src/components/Select/{hooks/useSelectState.ts → useSelectState.ts} +3 -3
- package/src/components/Table/Table.test.tsx +348 -0
- package/src/components/Tabs/Tabs.test.tsx +270 -0
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Toast/Toast.test.tsx +420 -0
- package/src/components/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/constants/{__tests__/performance.test.ts → performance.test.ts} +2 -2
- package/src/hooks/{__tests__/ServiceHooks.test.tsx → ServiceHooks.test.tsx} +8 -8
- package/src/hooks/{__tests__/hooks.integration.test.tsx → hooks.integration.test.tsx} +11 -11
- package/src/hooks/index.ts +7 -4
- package/src/hooks/{__tests__/index.unit.test.ts → index.unit.test.ts} +2 -2
- package/src/hooks/public/usePublicEvent.test.ts +1 -1
- package/src/hooks/public/usePublicEventLogo.test.ts +1 -1
- package/src/hooks/public/usePublicRouteParams.test.ts +1 -1
- package/src/hooks/services/useAuth.ts +9 -7
- package/src/hooks/useAddressAutocomplete.test.ts +22 -22
- package/src/hooks/useAddressAutocomplete.ts +90 -75
- package/src/hooks/{__tests__/useAppConfig.unit.test.ts → useAppConfig.unit.test.ts} +328 -22
- package/src/hooks/{__tests__/useComponentPerformance.unit.test.tsx → useComponentPerformance.unit.test.tsx} +27 -41
- package/src/hooks/useDataTablePerformance.ts +100 -120
- package/src/hooks/{__tests__/useDataTablePerformance.unit.test.ts → useDataTablePerformance.unit.test.ts} +5 -5
- package/src/hooks/{__tests__/useDataTableState.test.ts → useDataTableState.test.ts} +2 -2
- package/src/hooks/{__tests__/useDebounce.unit.test.ts → useDebounce.unit.test.ts} +2 -2
- package/src/hooks/useEventTheme.test.ts +4 -1
- package/src/hooks/useEventTheme.ts +49 -21
- package/src/hooks/useEvents.ts +41 -1
- package/src/hooks/{__tests__/useEvents.unit.test.ts → useEvents.unit.test.ts} +5 -5
- package/src/hooks/useFileReference.test.ts +44 -41
- package/src/hooks/useFileReference.ts +182 -173
- package/src/hooks/useFileUrl.ts +1 -1
- package/src/hooks/{__tests__/useFileUrl.unit.test.ts → useFileUrl.unit.test.ts} +26 -36
- package/src/hooks/{__tests__/useFileUrlCache.test.ts → useFileUrlCache.test.ts} +8 -8
- package/src/hooks/useFileUrlCache.ts +1 -1
- package/src/hooks/{__tests__/useFocusManagement.unit.test.ts → useFocusManagement.unit.test.ts} +2 -2
- package/src/hooks/{__tests__/useFocusTrap.unit.test.tsx → useFocusTrap.unit.test.tsx} +2 -2
- package/src/hooks/{__tests__/useFormDialog.test.ts → useFormDialog.test.ts} +2 -2
- package/src/hooks/useInactivityTracker.ts +138 -131
- package/src/hooks/{__tests__/useInactivityTracker.unit.test.ts → useInactivityTracker.unit.test.ts} +3 -3
- package/src/hooks/{__tests__/useIsMobile.unit.test.ts → useIsMobile.unit.test.ts} +2 -2
- package/src/hooks/useIsPrint.ts +62 -0
- package/src/hooks/useIsPrint.unit.test.ts +545 -0
- package/src/hooks/{__tests__/useKeyboardShortcuts.unit.test.ts → useKeyboardShortcuts.unit.test.ts} +2 -2
- package/src/hooks/{__tests__/useOrganisationPermissions.unit.test.tsx → useOrganisationPermissions.unit.test.tsx} +4 -4
- package/src/hooks/useOrganisationSecurity.test.ts +3 -3
- package/src/hooks/useOrganisationSecurity.ts +190 -201
- package/src/hooks/{__tests__/useOrganisationSecurity.unit.test.tsx → useOrganisationSecurity.unit.test.tsx} +61 -63
- package/src/hooks/{__tests__/useOrganisations.unit.test.ts → useOrganisations.unit.test.ts} +5 -5
- package/src/hooks/{__tests__/usePerformanceMonitor.unit.test.ts → usePerformanceMonitor.unit.test.ts} +13 -14
- package/src/hooks/{__tests__/usePermissionCache.test.ts → usePermissionCache.test.ts} +26 -27
- package/src/hooks/usePermissionCache.ts +276 -271
- package/src/hooks/{__tests__/usePreventTabReload.test.ts → usePreventTabReload.test.ts} +2 -2
- package/src/hooks/{__tests__/usePublicEvent.simple.test.ts → usePublicEvent.simple.test.ts} +4 -4
- package/src/hooks/{__tests__/usePublicEvent.test.ts → usePublicEvent.test.ts} +4 -4
- package/src/hooks/{__tests__/usePublicEvent.unit.test.ts → usePublicEvent.unit.test.ts} +4 -4
- package/src/hooks/{__tests__/usePublicFileDisplay.test.ts → usePublicFileDisplay.test.ts} +12 -12
- package/src/hooks/{__tests__/usePublicRouteParams.unit.test.ts → usePublicRouteParams.unit.test.ts} +3 -3
- package/src/hooks/{__tests__/useQueryCache.test.ts → useQueryCache.test.ts} +2 -2
- package/src/hooks/useQueryCache.ts +0 -2
- package/src/hooks/{__tests__/useRBAC.unit.test.ts → useRBAC.unit.test.ts} +55 -38
- package/src/hooks/{__tests__/useSessionDraft.test.ts → useSessionDraft.test.ts} +2 -2
- package/src/hooks/{__tests__/useSessionRestoration.unit.test.tsx → useSessionRestoration.unit.test.tsx} +10 -19
- package/src/hooks/useStorage.ts +21 -16
- package/src/hooks/{__tests__/useStorage.unit.test.ts → useStorage.unit.test.ts} +38 -75
- package/src/hooks/{__tests__/useToast.test.ts → useToast.test.ts} +2 -2
- package/src/hooks/{__tests__/useToast.unit.test.tsx → useToast.unit.test.tsx} +2 -2
- package/src/hooks/{__tests__/useZodForm.unit.test.tsx → useZodForm.unit.test.tsx} +2 -2
- package/src/icons/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/icons/index.ts +2 -0
- package/src/{__tests__/index.test.ts → index.test.ts} +3 -7
- package/src/index.ts +15 -7
- package/src/providers/{__tests__/AuthProvider.test.tsx → AuthProvider.test.tsx} +3 -3
- package/src/providers/{__tests__/EventProvider.test.tsx → EventProvider.test.tsx} +3 -3
- package/src/providers/InactivityProvider.test-helper.tsx +40 -0
- package/src/providers/{__tests__/InactivityProvider.test.tsx → InactivityProvider.test.tsx} +14 -21
- package/src/providers/{__tests__/ProviderLifecycle.test.tsx → ProviderLifecycle.test.tsx} +4 -4
- package/src/providers/{__tests__/UnifiedAuthProvider.test.tsx → UnifiedAuthProvider.test.tsx} +1 -1
- package/src/providers/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/providers/services/{__tests__/AuthServiceProvider.integration.test.tsx → AuthServiceProvider.integration.test.tsx} +4 -4
- package/src/providers/services/{__tests__/AuthServiceProvider.test.tsx → AuthServiceProvider.test.tsx} +7 -7
- package/src/providers/services/{__tests__/EventServiceProvider.test.tsx → EventServiceProvider.test.tsx} +7 -7
- package/src/providers/services/{__tests__/InactivityServiceProvider.test.tsx → InactivityServiceProvider.test.tsx} +5 -5
- package/src/providers/services/{__tests__/OrganisationServiceProvider.test.tsx → OrganisationServiceProvider.test.tsx} +6 -6
- package/src/providers/services/UnifiedAuthContext.ts +30 -27
- package/src/providers/services/{__tests__/UnifiedAuthProvider.advanced.test.tsx → UnifiedAuthProvider.advanced.test.tsx} +8 -9
- package/src/providers/services/{__tests__/UnifiedAuthProvider.appId.test.tsx → UnifiedAuthProvider.appId.test.tsx} +25 -25
- package/src/providers/services/{__tests__/UnifiedAuthProvider.integration.test.tsx → UnifiedAuthProvider.integration.test.tsx} +14 -11
- package/src/providers/services/UnifiedAuthProvider.tsx +115 -360
- package/src/providers/services/{__tests__/contexts.test.tsx → contexts.test.tsx} +6 -6
- package/src/providers/services/{__tests__/useUnifiedAuth.test.tsx → useUnifiedAuth.test.tsx} +6 -6
- package/src/providers/services/useUnifiedAuthContextValue.ts +279 -0
- package/src/providers/useInactivity.test-helper.ts +27 -0
- package/src/rbac/{__tests__/adapters.comprehensive.test.tsx → adapters.comprehensive.test.tsx} +24 -24
- package/src/rbac/adapters.test.tsx +22 -22
- package/src/rbac/adapters.tsx +29 -29
- package/src/rbac/api.test.ts +973 -42
- package/src/rbac/api.ts +228 -253
- package/src/rbac/{__tests__/audit-batched.test.ts → audit-batched.test.ts} +6 -6
- package/src/rbac/audit.ts +4 -1
- package/src/rbac/{__tests__/auth-rbac-security.integration.test.tsx → auth-rbac-security.integration.test.tsx} +1 -1
- package/src/rbac/{__tests__/auth-rbac.e2e.test.tsx → auth-rbac.e2e.test.tsx} +27 -34
- package/src/rbac/cache-invalidation.test.ts +715 -0
- package/src/rbac/components/{__tests__/AccessDenied.test.tsx → AccessDenied.test.tsx} +3 -3
- package/src/rbac/components/{__tests__/NavigationGuard.test.tsx → NavigationGuard.test.tsx} +13 -11
- package/src/{__tests__/rbac/PagePermissionGuard.test.tsx → rbac/components/PagePermissionGuard.guard.test.tsx} +33 -19
- package/src/rbac/components/{__tests__/PagePermissionGuard.performance.test.tsx → PagePermissionGuard.performance.test.tsx} +30 -9
- package/src/rbac/components/{__tests__/PagePermissionGuard.race-condition.test.tsx → PagePermissionGuard.race-condition.test.tsx} +7 -7
- package/src/rbac/components/{__tests__/PagePermissionGuard.test.tsx → PagePermissionGuard.test.tsx} +10 -10
- package/src/rbac/components/PagePermissionGuard.tsx +177 -372
- package/src/rbac/components/{__tests__/PagePermissionGuard.verification.test.tsx → PagePermissionGuard.verification.test.tsx} +7 -7
- package/src/rbac/config.ts +58 -18
- package/src/rbac/{__tests__/engine.comprehensive.test.ts → engine.comprehensive.test.ts} +3 -3
- package/src/rbac/engine.test.ts +494 -0
- package/src/rbac/errors.ts +89 -55
- package/src/rbac/hooks/permissions/runPermissionCheck.ts +77 -0
- package/src/rbac/hooks/permissions/{__tests__/useAccessLevel.test.ts → useAccessLevel.test.ts} +40 -40
- package/src/rbac/hooks/permissions/useAccessLevel.ts +16 -6
- package/src/rbac/hooks/permissions/{__tests__/useCan.test.ts → useCan.test.ts} +41 -41
- package/src/rbac/hooks/permissions/useCan.ts +170 -252
- package/src/rbac/hooks/permissions/{__tests__/useMultiplePermissions.test.ts → useMultiplePermissions.test.ts} +49 -49
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +6 -2
- package/src/rbac/hooks/permissions/{__tests__/usePermissions.test.ts → usePermissions.test.ts} +10 -12
- package/src/rbac/hooks/permissions/usePermissions.ts +36 -65
- package/src/rbac/hooks/useCan.test.ts +42 -42
- package/src/rbac/hooks/usePageAccessLogging.ts +160 -0
- package/src/rbac/hooks/usePageGuardScope.ts +117 -0
- package/src/rbac/hooks/usePagePermissionCheck.ts +67 -0
- package/src/rbac/hooks/{__tests__/usePermissions.integration.test.ts → usePermissions.integration.test.ts} +9 -9
- package/src/{__tests__/hooks/usePermissions.test.ts → rbac/hooks/usePermissions.stability.test.ts} +18 -18
- package/src/rbac/hooks/usePermissions.test.ts +54 -54
- package/src/rbac/hooks/useRBAC.test.ts +313 -217
- package/src/rbac/hooks/useRBAC.ts +145 -81
- package/src/rbac/hooks/useResourcePermissions.test.ts +25 -25
- package/src/rbac/hooks/useResourcePermissions.ts +68 -134
- package/src/rbac/hooks/useResourcePermissionsSuperAdmin.ts +67 -0
- package/src/rbac/hooks/useRoleManagement.test.ts +27 -112
- package/src/rbac/hooks/useRoleManagement.ts +153 -585
- package/src/rbac/hooks/{__tests__/useSecureSupabase.test.ts → useSecureSupabase.test.ts} +17 -17
- package/src/rbac/hooks/useSecureSupabase.ts +10 -2
- package/src/rbac/hooks/useSuperAdminCheck.ts +80 -0
- package/src/rbac/{__tests__/performance.test.ts → performance.test.ts} +1 -1
- package/src/rbac/{__tests__/rbac-core.test.tsx → rbac-core.test.tsx} +3 -3
- package/src/rbac/{__tests__/rbac-engine-core-logic.test.ts → rbac-engine-core-logic.test.ts} +2 -2
- package/src/rbac/{__tests__/rbac-engine-simplified.test.ts → rbac-engine-simplified.test.ts} +3 -3
- package/src/rbac/{__tests__/rbac-functions.test.ts → rbac-functions.test.ts} +57 -0
- package/src/rbac/{__tests__/rbac-role-isolation.test.ts → rbac-role-isolation.test.ts} +2 -2
- package/src/rbac/request-deduplication.test.ts +14 -9
- package/src/rbac/request-deduplication.ts +5 -4
- package/src/rbac/{__tests__/scenarios.user-role.test.tsx → scenarios.user-role.test.tsx} +23 -23
- package/src/rbac/secureClient.test.ts +514 -83
- package/src/rbac/secureClient.ts +8 -2
- package/src/rbac/security.test.ts +323 -0
- package/src/rbac/types/roleManagement.ts +66 -0
- package/src/rbac/utils/{__tests__/clientSecurity.test.ts → clientSecurity.test.ts} +4 -4
- package/src/rbac/utils/{__tests__/contextValidator.test.ts → contextValidator.test.ts} +4 -4
- package/src/rbac/utils/contextValidator.ts +5 -1
- package/src/rbac/utils/{__tests__/deep-equal.test.ts → deep-equal.test.ts} +1 -1
- package/src/rbac/utils/{__tests__/eventContext.test.ts → eventContext.test.ts} +36 -21
- package/src/rbac/utils/eventContext.ts +37 -33
- package/src/rbac/utils/fetchPermissionMap.ts +13 -0
- package/src/rbac/utils/permissionMapHelpers.ts +34 -0
- package/src/rbac/utils/roleManagementRpc.ts +303 -0
- package/src/services/{__tests__/AuthService.edge-cases.test.ts → AuthService.edge-cases.test.ts} +19 -19
- package/src/services/{__tests__/AuthService.restoreSession.test.ts → AuthService.restoreSession.test.ts} +2 -2
- package/src/services/{__tests__/AuthService.test.ts → AuthService.test.ts} +89 -55
- package/src/services/AuthService.ts +184 -205
- package/src/services/{__tests__/BaseService.edge-cases.test.ts → BaseService.edge-cases.test.ts} +3 -3
- package/src/services/{__tests__/BaseService.test.ts → BaseService.test.ts} +2 -2
- package/src/services/{__tests__/EventService.edge-cases.test.ts → EventService.edge-cases.test.ts} +27 -24
- package/src/services/{__tests__/EventService.eventColours.test.ts → EventService.eventColours.test.ts} +1 -1
- package/src/services/{__tests__/EventService.test.ts → EventService.test.ts} +256 -24
- package/src/services/EventService.ts +242 -312
- package/src/services/{__tests__/InactivityService.edge-cases.test.ts → InactivityService.edge-cases.test.ts} +3 -3
- package/src/services/{__tests__/InactivityService.lifecycle.test.ts → InactivityService.lifecycle.test.ts} +2 -2
- package/src/services/{__tests__/InactivityService.test.ts → InactivityService.test.ts} +179 -4
- package/src/services/InactivityService.ts +172 -213
- package/src/services/{__tests__/OrganisationService.edge-cases.test.ts → OrganisationService.edge-cases.test.ts} +5 -5
- package/src/services/{__tests__/OrganisationService.pagination.test.ts → OrganisationService.pagination.test.ts} +4 -4
- package/src/services/{__tests__/OrganisationService.test.ts → OrganisationService.test.ts} +410 -7
- package/src/services/OrganisationService.ts +184 -238
- package/src/services/base/BaseService.test.ts +1 -1
- package/src/services/interfaces/{__tests__/IAuthService.test.ts → IAuthService.test.ts} +21 -27
- package/src/services/interfaces/IAuthService.ts +10 -9
- package/src/services/interfaces/{__tests__/IEventService.test.ts → IEventService.test.ts} +4 -4
- package/src/services/interfaces/{__tests__/IInactivityService.test.ts → IInactivityService.test.ts} +3 -3
- package/src/services/interfaces/{__tests__/IOrganisationService.test.ts → IOrganisationService.test.ts} +3 -3
- package/src/styles/core.css +243 -12
- package/src/theming/{__tests__/parseEventColours.test.ts → parseEventColours.test.ts} +1 -1
- package/src/theming/{__tests__/runtime.test.ts → runtime.test.ts} +8 -17
- package/src/theming/runtime.ts +71 -2
- package/src/types/api-result.ts +53 -0
- package/src/types/{__tests__/core.test.ts → core.test.ts} +2 -2
- package/src/types/{__tests__/database-generated.test.ts → database-generated.test.ts} +3 -3
- package/src/types/database.generated.ts +45 -10
- package/src/types/event.ts +38 -18
- package/src/types/{__tests__/file-reference.test.ts → file-reference.test.ts} +13 -13
- package/src/types/file-reference.ts +37 -12
- package/src/types/{__tests__/guards.test.ts → guards.test.ts} +2 -2
- package/src/types/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/types/index.ts +3 -0
- package/src/types/{__tests__/organisation.roles.test.ts → organisation.roles.test.ts} +1 -1
- package/src/types/{__tests__/organisation.test.ts → organisation.test.ts} +3 -31
- package/src/types/organisation.ts +15 -15
- package/src/types/supabase.ts +13 -4
- package/src/types/{__tests__/theme.test.ts → theme.test.ts} +1 -1
- package/src/types/{__tests__/type-validation.test.ts → type-validation.test.ts} +1 -1
- package/src/types/{__tests__/validation.test.ts → validation.test.ts} +2 -2
- package/src/utils/app/appIdResolver.test.ts +98 -71
- package/src/utils/app/appIdResolver.ts +31 -20
- package/src/utils/{__tests__/appConfig.unit.test.ts → appConfig.unit.test.ts} +1 -1
- package/src/utils/{__tests__/audit.unit.test.ts → audit.unit.test.ts} +1 -1
- package/src/utils/{__tests__/auth-utils.unit.test.ts → auth-utils.unit.test.ts} +16 -17
- package/src/utils/{__tests__/bundleAnalysis.unit.test.ts → bundleAnalysis.unit.test.ts} +35 -35
- package/src/utils/{__tests__/cn.unit.test.ts → cn.unit.test.ts} +1 -1
- package/src/utils/context/organisationContext.test.ts +105 -91
- package/src/utils/context/organisationContext.ts +29 -40
- package/src/utils/core/{__tests__/cn.test.ts → cn.test.ts} +3 -3
- package/src/utils/core/{__tests__/debugLogger.test.ts → debugLogger.test.ts} +2 -2
- package/src/utils/core/{__tests__/logger.test.ts → logger.test.ts} +2 -2
- package/src/utils/core/mergeRefs.ts +24 -0
- package/src/utils/{__tests__/debugLogger.test.ts → debugLogger.test.ts} +1 -1
- package/src/utils/{__tests__/deviceFingerprint.unit.test.ts → deviceFingerprint.unit.test.ts} +1 -1
- package/src/utils/dynamic/createLazyComponent.tsx +9 -1
- package/src/utils/dynamic/{__tests__/dynamicUtils.test.ts → dynamicUtils.test.ts} +2 -2
- package/src/utils/dynamic/{__tests__/lazyLoad.test.tsx → lazyLoad.test.tsx} +2 -2
- package/src/utils/{__tests__/dynamicUtils.unit.test.ts → dynamicUtils.unit.test.ts} +1 -1
- package/src/utils/file-reference/{__tests__/file-reference.test.ts → file-reference.test.ts} +214 -289
- package/src/utils/file-reference/index.ts +330 -347
- package/src/utils/{__tests__/formatDate.unit.test.ts → formatDate.unit.test.ts} +2 -2
- package/src/utils/formatting/formatDateTimeTimezone.test.ts +1 -1
- package/src/utils/formatting/formatNumber.test.ts +1 -1
- package/src/utils/{__tests__/formatting.unit.test.ts → formatting.unit.test.ts} +1 -1
- package/src/utils/google-places/googlePlacesUtils.test.ts +70 -48
- package/src/utils/google-places/googlePlacesUtils.ts +67 -99
- package/src/utils/google-places/loadGoogleMapsScript.test.ts +25 -22
- package/src/utils/google-places/loadGoogleMapsScript.ts +138 -117
- package/src/utils/{__tests__/index.unit.test.ts → index.unit.test.ts} +1 -1
- package/src/utils/{__tests__/lazyLoad.unit.test.tsx → lazyLoad.unit.test.tsx} +13 -14
- package/src/utils/location/location.test.ts +1 -1
- package/src/utils/{__tests__/logger.unit.test.ts → logger.unit.test.ts} +1 -1
- package/src/utils/{__tests__/organisationContext.unit.test.ts → organisationContext.unit.test.ts} +37 -48
- package/src/utils/performance/{__tests__/bundleAnalysis.test.ts → bundleAnalysis.test.ts} +2 -2
- package/src/utils/performance/{__tests__/performanceBenchmark.test.ts → performanceBenchmark.test.ts} +2 -2
- package/src/utils/performance/{__tests__/performanceBudgets.test.ts → performanceBudgets.test.ts} +2 -2
- package/src/utils/{__tests__/performanceBenchmark.test.ts → performanceBenchmark.test.ts} +2 -2
- package/src/utils/{__tests__/performanceBudgets.unit.test.ts → performanceBudgets.unit.test.ts} +2 -2
- package/src/utils/{__tests__/permissionTypes.unit.test.ts → permissionTypes.unit.test.ts} +1 -1
- package/src/utils/{__tests__/permissionUtils.unit.test.ts → permissionUtils.unit.test.ts} +1 -1
- package/src/utils/permissions/{__tests__/permissionTypes.test.ts → permissionTypes.test.ts} +2 -2
- package/src/utils/persistence/{__tests__/keyDerivation.test.ts → keyDerivation.test.ts} +2 -2
- package/src/utils/persistence/{__tests__/sensitiveFieldDetection.test.ts → sensitiveFieldDetection.test.ts} +2 -2
- package/src/utils/{__tests__/request-deduplication.test.ts → request-deduplication.test.ts} +2 -2
- package/src/utils/{__tests__/sanitization.unit.test.ts → sanitization.unit.test.ts} +1 -1
- package/src/utils/{__tests__/schemaUtils.unit.test.ts → schemaUtils.unit.test.ts} +1 -1
- package/src/utils/{__tests__/secureDataAccess.unit.test.ts → secureDataAccess.unit.test.ts} +2 -2
- package/src/utils/{__tests__/secureErrors.unit.test.ts → secureErrors.unit.test.ts} +4 -4
- package/src/utils/{__tests__/secureStorage.unit.test.ts → secureStorage.unit.test.ts} +1 -1
- package/src/utils/security/auth-utils.ts +34 -23
- package/src/utils/security/secureDataAccess.ts +241 -281
- package/src/utils/security/secureErrors.test.ts +1 -1
- package/src/utils/security/secureStorage.test.ts +1 -1
- package/src/utils/security/security.test.ts +25 -17
- package/src/utils/security/security.ts +15 -18
- package/src/utils/security/securityMonitor.test.ts +1 -1
- package/src/utils/{__tests__/security.unit.test.ts → security.unit.test.ts} +21 -15
- package/src/utils/{__tests__/securityMonitor.unit.test.ts → securityMonitor.unit.test.ts} +1 -1
- package/src/utils/{__tests__/sessionTracking.unit.test.ts → sessionTracking.unit.test.ts} +12 -12
- package/src/utils/storage/{__tests__/config.unit.test.ts → config.unit.test.ts} +2 -2
- package/src/utils/storage/helpers.test.ts +88 -102
- package/src/utils/storage/helpers.ts +173 -251
- package/src/utils/storage/{__tests__/index.unit.test.ts → index.unit.test.ts} +3 -3
- package/src/utils/storage/types.ts +7 -0
- package/src/utils/supabase/createBaseClient.test.ts +1 -1
- package/src/utils/timezone/timezone.test.ts +1 -1
- package/src/utils/{__tests__/timezone.test.ts → timezone.test.ts} +2 -2
- package/src/utils/validation/{__tests__/common.test.ts → common.test.ts} +2 -2
- package/src/utils/validation/{__tests__/csrf.test.ts → csrf.test.ts} +56 -28
- package/src/utils/validation/csrf.ts +42 -41
- package/src/utils/validation/{__tests__/htmlSanitization.unit.test.ts → htmlSanitization.unit.test.ts} +2 -2
- package/src/utils/validation/{__tests__/passwordSchema.test.ts → passwordSchema.test.ts} +2 -2
- package/src/utils/validation/{__tests__/schema.test.ts → schema.test.ts} +2 -2
- package/src/utils/validation/{__tests__/sqlInjectionProtection.test.ts → sqlInjectionProtection.test.ts} +2 -2
- package/src/utils/validation/{__tests__/user.test.ts → user.test.ts} +2 -2
- package/src/utils/validation/{__tests__/validation.test.ts → validation.test.ts} +2 -2
- package/src/utils/validation/{__tests__/validationUtils.test.ts → validationUtils.test.ts} +2 -2
- package/src/utils/{__tests__/validation.unit.test.ts → validation.unit.test.ts} +1 -1
- package/src/utils/{__tests__/validationUtils.unit.test.ts → validationUtils.unit.test.ts} +5 -2
- package/dist/UnifiedAuthProvider-BBD2PS3Q.js +0 -7
- package/dist/chunk-KPYQWGFQ.js +0 -183
- package/dist/types-D05dCGma.d.ts +0 -521
- package/scripts/eslint-audit.cjs +0 -222
- package/scripts/generate-docs.js +0 -157
- package/scripts/install-cursor-rules.cjs +0 -255
- package/scripts/install-eslint-config.cjs +0 -349
- package/scripts/setup-build-cache.js +0 -73
- package/scripts/validate-pre-publish.js +0 -145
- package/src/__tests__/integration/UserProfile.test.tsx +0 -124
- package/src/__tests__/public-recipe-view.test.ts +0 -228
- package/src/__tests__/rls-policies.test.ts +0 -472
- package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -876
- package/src/components/DataTable/components/DataTableLayout.tsx +0 -584
- package/src/components/DataTable/components/UnifiedTableBody.tsx +0 -395
- package/src/components/DataTable/components/__tests__/DataTableLayout.test.tsx +0 -467
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +0 -358
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +0 -957
- package/src/components/DataTable/core/ActionManager.ts +0 -235
- package/src/components/DataTable/core/ColumnManager.ts +0 -204
- package/src/components/DataTable/core/DataManager.ts +0 -190
- package/src/components/DataTable/core/LocalDataAdapter.ts +0 -274
- package/src/components/DataTable/core/PluginRegistry.ts +0 -229
- package/src/components/DataTable/core/StateManager.ts +0 -312
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +0 -235
- package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +0 -141
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +0 -178
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +0 -133
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +0 -142
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +0 -158
- package/src/components/DataTable/core/interfaces.ts +0 -338
- package/src/components/DataTable/types.ts +0 -764
- package/src/hooks/public/usePublicFileDisplay.ts +0 -534
- package/src/hooks/useFileDisplay.ts +0 -748
- package/src/providers/OrganisationProvider.test.tsx +0 -40
- package/src/providers/OrganisationProvider.tsx +0 -92
- package/src/providers/__tests__/InactivityProvider.test-helper.tsx +0 -65
- package/src/providers/__tests__/OrganisationProvider.test.tsx +0 -616
- package/src/providers/__tests__/OrganisationProvider.wrapper.test.tsx +0 -591
- package/src/rbac/__tests__/cache-invalidation.test.ts +0 -393
- /package/src/components/DataTable/{components/__tests__ → ui}/COVERAGE_NOTE.md +0 -0
- /package/src/components/DataTable/utils/{__tests__/COVERAGE_NOTE.md → COVERAGE_NOTE.md} +0 -0
- /package/src/hooks/{__tests__/useApiFetch.unit.test.ts → useApiFetch.unit.test.ts} +0 -0
- /package/src/providers/{__tests__/README.md → README.md} +0 -0
- /package/src/rbac/{__tests__/index.test.ts → index.test.ts} +0 -0
- /package/src/rbac/{__tests__/rbac-integration.test.ts → rbac-integration.test.ts} +0 -0
- /package/src/types/{__tests__/README.md → README.md} +0 -0
|
@@ -86,129 +86,123 @@ export class EventService extends BaseService implements IEventService {
|
|
|
86
86
|
const newOrgId = selectedOrganisation?.id;
|
|
87
87
|
const previousUserId = this.user?.id || null;
|
|
88
88
|
const newUserId = user?.id || null;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
// Reset initialization when user changes
|
|
102
|
-
this.resetInitialization();
|
|
103
|
-
this.isInitializedRef = false;
|
|
104
|
-
this.isFetchingRef = false;
|
|
105
|
-
// Reset user cleared flag when new user logs in - allows auto-selection for new user
|
|
106
|
-
this.userClearedEventRef = false;
|
|
107
|
-
this.hasAutoSelectedRef = false;
|
|
108
|
-
|
|
89
|
+
|
|
90
|
+
await this.handleUserChange(previousUserId, newUserId);
|
|
91
|
+
this.applyNewDependencies(supabaseClient, user, session, appName, selectedOrganisation, setSelectedEventId);
|
|
92
|
+
await this.updateSuperAdminStatus(user);
|
|
93
|
+
this.handleOrganisationChange(previousOrgId, newOrgId);
|
|
94
|
+
|
|
95
|
+
this.notify();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private async handleUserChange(previousUserId: string | null, newUserId: string | null): Promise<void> {
|
|
99
|
+
if (previousUserId === newUserId) {
|
|
100
|
+
return;
|
|
109
101
|
}
|
|
110
|
-
|
|
102
|
+
if (previousUserId !== null) {
|
|
103
|
+
await this.clearEventSelectionForUser(previousUserId);
|
|
104
|
+
}
|
|
105
|
+
if (newUserId === null) {
|
|
106
|
+
this.selectedEvent = null;
|
|
107
|
+
this.setSelectedEventId?.(null);
|
|
108
|
+
}
|
|
109
|
+
this.resetInitialization();
|
|
110
|
+
this.isInitializedRef = false;
|
|
111
|
+
this.isFetchingRef = false;
|
|
112
|
+
this.userClearedEventRef = false;
|
|
113
|
+
this.hasAutoSelectedRef = false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private applyNewDependencies(
|
|
117
|
+
supabaseClient: SupabaseClient,
|
|
118
|
+
user: User | null,
|
|
119
|
+
session: Session | null,
|
|
120
|
+
appName: string,
|
|
121
|
+
selectedOrganisation: Organisation | null,
|
|
122
|
+
setSelectedEventId: (eventId: string | null) => void
|
|
123
|
+
): void {
|
|
111
124
|
this.supabaseClient = supabaseClient;
|
|
112
125
|
this.user = user;
|
|
113
126
|
this.session = session;
|
|
114
127
|
this.appName = appName;
|
|
115
128
|
this.selectedOrganisation = selectedOrganisation;
|
|
116
129
|
this.setSelectedEventId = setSelectedEventId;
|
|
117
|
-
|
|
118
|
-
// App name changed - state will be reset by updateDependencies
|
|
119
|
-
|
|
120
|
-
// Update super admin status when user changes
|
|
121
|
-
// This allows super admins to select events from any organisation
|
|
122
|
-
// RBAC should be initialized synchronously by UnifiedAuthProvider, so this should always work
|
|
123
|
-
if (user?.id) {
|
|
124
|
-
try {
|
|
125
|
-
const { isRBACInitialized, isSuperAdmin: checkSuperAdmin, setupRBAC } = await import('../rbac/api');
|
|
126
|
-
|
|
127
|
-
// Ensure RBAC is initialized if possible (defensive check for edge cases)
|
|
128
|
-
if (!isRBACInitialized() && this.supabaseClient) {
|
|
129
|
-
setupRBAC(this.supabaseClient);
|
|
130
|
-
}
|
|
130
|
+
}
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
132
|
+
private async updateSuperAdminStatus(user: User | null): Promise<void> {
|
|
133
|
+
if (!user?.id) {
|
|
134
|
+
this.isSuperAdmin = false;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const { isRBACInitialized, isSuperAdmin: checkSuperAdmin, setupRBAC } = await import('../rbac/api');
|
|
139
|
+
if (!isRBACInitialized() && this.supabaseClient) {
|
|
140
|
+
setupRBAC(this.supabaseClient);
|
|
141
|
+
}
|
|
142
|
+
if (isRBACInitialized()) {
|
|
143
|
+
const result = await checkSuperAdmin(user.id as UUID);
|
|
144
|
+
this.isSuperAdmin = result.ok && result.data;
|
|
145
|
+
} else {
|
|
146
|
+
logger.warn('EventService', 'RBAC not initialized in updateDependencies, keeping existing super admin status', {
|
|
146
147
|
userId: user.id,
|
|
147
|
-
existingIsSuperAdmin: this.isSuperAdmin
|
|
148
|
+
existingIsSuperAdmin: this.isSuperAdmin,
|
|
149
|
+
note: 'RBAC should be initialized by UnifiedAuthProvider. This may indicate EventService is being used outside the provider.'
|
|
148
150
|
});
|
|
149
|
-
// Don't reset to false on error - keep existing value to avoid blocking super admins
|
|
150
|
-
// The error might be transient, and we don't want to clear a valid super admin status
|
|
151
151
|
}
|
|
152
|
-
}
|
|
153
|
-
|
|
152
|
+
} catch (error) {
|
|
153
|
+
logger.warn('EventService', 'Failed to check super admin status in updateDependencies', {
|
|
154
|
+
error,
|
|
155
|
+
userId: user.id,
|
|
156
|
+
existingIsSuperAdmin: this.isSuperAdmin
|
|
157
|
+
});
|
|
154
158
|
}
|
|
155
|
-
|
|
156
|
-
// If organisation changed (from null to value, or different org, or value to null), reset initialization
|
|
157
|
-
// This ensures events are re-fetched when organisation context changes
|
|
158
|
-
// For event-required apps, selectedOrganisation will be null, so we need to reset when it changes from undefined/null to null
|
|
159
|
-
if (previousOrgId !== newOrgId) {
|
|
160
|
-
this.resetInitialization(); // Reset BaseService's isInitialized flag
|
|
161
|
-
this.isInitializedRef = false;
|
|
162
|
-
this.isFetchingRef = false;
|
|
163
|
-
|
|
164
|
-
// SECURITY: Super admins can see events regardless of organisation context
|
|
165
|
-
// Do not clear events for super admins when organisation context is removed
|
|
166
|
-
const shouldClearEvents = !this.isSuperAdmin;
|
|
159
|
+
}
|
|
167
160
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
selectedEventId: this.selectedEvent?.event_id,
|
|
188
|
-
hadAutoSelectedEvent,
|
|
189
|
-
preservingEvent: hadAutoSelectedEvent,
|
|
190
|
-
previousOrgId,
|
|
191
|
-
newOrgId
|
|
192
|
-
});
|
|
193
|
-
} else if (previousOrgId !== null && previousOrgId !== undefined && newOrgId !== null && newOrgId !== undefined && previousOrgId !== newOrgId) {
|
|
194
|
-
// Switching between different organisations - clear events
|
|
195
|
-
if (shouldClearEvents) {
|
|
196
|
-
this.events = [];
|
|
197
|
-
// Use setSelectedEvent(null) to preserve userClearedEventRef flag if user explicitly cleared
|
|
198
|
-
// This prevents auto-selection from re-selecting the event after org switch
|
|
199
|
-
this.setSelectedEvent(null);
|
|
200
|
-
}
|
|
201
|
-
} else if (previousOrgId !== null && previousOrgId !== undefined && newOrgId === null) {
|
|
202
|
-
// Organisation was removed - clear events if not super admin
|
|
203
|
-
if (shouldClearEvents) {
|
|
204
|
-
this.events = [];
|
|
205
|
-
// Use setSelectedEvent(null) to preserve userClearedEventRef flag if user explicitly cleared
|
|
206
|
-
this.setSelectedEvent(null);
|
|
207
|
-
}
|
|
161
|
+
private handleOrganisationChange(previousOrgId: string | undefined | null, newOrgId: string | undefined | null): void {
|
|
162
|
+
if (previousOrgId === newOrgId) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
this.resetInitialization();
|
|
166
|
+
this.isInitializedRef = false;
|
|
167
|
+
this.isFetchingRef = false;
|
|
168
|
+
|
|
169
|
+
const shouldClearEvents = !this.isSuperAdmin;
|
|
170
|
+
const isFirstOrgSet =
|
|
171
|
+
(previousOrgId === null || previousOrgId === undefined) &&
|
|
172
|
+
newOrgId !== null &&
|
|
173
|
+
newOrgId !== undefined;
|
|
174
|
+
|
|
175
|
+
if (isFirstOrgSet) {
|
|
176
|
+
const hadAutoSelectedEvent = this.hasAutoSelectedRef && !!this.selectedEvent;
|
|
177
|
+
this.userClearedEventRef = false;
|
|
178
|
+
if (!hadAutoSelectedEvent) {
|
|
179
|
+
this.hasAutoSelectedRef = false;
|
|
208
180
|
}
|
|
181
|
+
logger.debug('EventService', 'Organisation first set - preserving event and resetting auto-selection flags', {
|
|
182
|
+
organisationId: newOrgId,
|
|
183
|
+
hasSelectedEvent: !!this.selectedEvent,
|
|
184
|
+
selectedEventId: this.selectedEvent?.event_id,
|
|
185
|
+
hadAutoSelectedEvent,
|
|
186
|
+
preservingEvent: hadAutoSelectedEvent,
|
|
187
|
+
previousOrgId,
|
|
188
|
+
newOrgId
|
|
189
|
+
});
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const switchingOrgs =
|
|
194
|
+
previousOrgId != null &&
|
|
195
|
+
newOrgId != null &&
|
|
196
|
+
previousOrgId !== newOrgId;
|
|
197
|
+
const orgRemoved = previousOrgId != null && newOrgId === null;
|
|
198
|
+
|
|
199
|
+
if (switchingOrgs && shouldClearEvents) {
|
|
200
|
+
this.events = [];
|
|
201
|
+
this.setSelectedEvent(null);
|
|
202
|
+
} else if (orgRemoved && shouldClearEvents) {
|
|
203
|
+
this.events = [];
|
|
204
|
+
this.setSelectedEvent(null);
|
|
209
205
|
}
|
|
210
|
-
|
|
211
|
-
this.notify();
|
|
212
206
|
}
|
|
213
207
|
|
|
214
208
|
// Event state getters
|
|
@@ -417,20 +411,146 @@ export class EventService extends BaseService implements IEventService {
|
|
|
417
411
|
// Cleanup any resources
|
|
418
412
|
}
|
|
419
413
|
|
|
414
|
+
private async resolveOrganisationIdForRpc(): Promise<string | null> {
|
|
415
|
+
let userIsSuperAdmin = this.isSuperAdmin;
|
|
416
|
+
try {
|
|
417
|
+
const { isRBACInitialized, isSuperAdmin: checkSuperAdmin, setupRBAC } = await import('../rbac/api');
|
|
418
|
+
if (!isRBACInitialized() && this.supabaseClient) {
|
|
419
|
+
setupRBAC(this.supabaseClient);
|
|
420
|
+
}
|
|
421
|
+
if (isRBACInitialized()) {
|
|
422
|
+
const result = await checkSuperAdmin(this.user!.id as UUID);
|
|
423
|
+
userIsSuperAdmin = result.ok && result.data;
|
|
424
|
+
this.isSuperAdmin = userIsSuperAdmin;
|
|
425
|
+
} else {
|
|
426
|
+
if (this.isSuperAdmin) {
|
|
427
|
+
userIsSuperAdmin = true;
|
|
428
|
+
logger.warn('EventService', 'RBAC not initialized, using cached super admin status', {
|
|
429
|
+
userId: this.user!.id,
|
|
430
|
+
cachedIsSuperAdmin: this.isSuperAdmin,
|
|
431
|
+
note: 'RBAC should be initialized by UnifiedAuthProvider. This may indicate EventService is being used outside the provider.'
|
|
432
|
+
});
|
|
433
|
+
} else {
|
|
434
|
+
logger.warn('EventService', 'RBAC not initialized, using cached non-super-admin status', {
|
|
435
|
+
userId: this.user!.id,
|
|
436
|
+
cachedIsSuperAdmin: this.isSuperAdmin,
|
|
437
|
+
note: 'RBAC should be initialized by UnifiedAuthProvider. This may indicate EventService is being used outside the provider.'
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (userIsSuperAdmin) {
|
|
442
|
+
return null;
|
|
443
|
+
}
|
|
444
|
+
if (this.selectedEvent) {
|
|
445
|
+
return this.selectedEvent.organisation_id;
|
|
446
|
+
}
|
|
447
|
+
if (this.selectedOrganisation) {
|
|
448
|
+
return this.selectedOrganisation.id;
|
|
449
|
+
}
|
|
450
|
+
return null;
|
|
451
|
+
} catch (superAdminCheckError) {
|
|
452
|
+
if (this.isSuperAdmin) {
|
|
453
|
+
logger.warn('EventService', 'Super admin check failed, using cached super admin status', {
|
|
454
|
+
error: superAdminCheckError,
|
|
455
|
+
cachedIsSuperAdmin: this.isSuperAdmin
|
|
456
|
+
});
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
logger.warn('EventService', 'Failed to check super admin status, using organisation-scoped query', {
|
|
460
|
+
error: superAdminCheckError,
|
|
461
|
+
cachedIsSuperAdmin: this.isSuperAdmin
|
|
462
|
+
});
|
|
463
|
+
if (this.selectedEvent) {
|
|
464
|
+
return this.selectedEvent.organisation_id;
|
|
465
|
+
}
|
|
466
|
+
if (this.selectedOrganisation) {
|
|
467
|
+
return this.selectedOrganisation.id;
|
|
468
|
+
}
|
|
469
|
+
return null;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
private transformRpcDataToEvents(data: unknown): Event[] {
|
|
474
|
+
interface EventRpcResponse {
|
|
475
|
+
event_id: string;
|
|
476
|
+
event_name: string;
|
|
477
|
+
event_code: string;
|
|
478
|
+
event_date: string | null;
|
|
479
|
+
event_venue: string | null;
|
|
480
|
+
event_participants: number | null;
|
|
481
|
+
event_colours: Record<string, unknown> | null;
|
|
482
|
+
organisation_id: string;
|
|
483
|
+
is_visible: boolean;
|
|
484
|
+
}
|
|
485
|
+
const eventsData = Array.isArray(data) ? data : [];
|
|
486
|
+
const transformed: Event[] = eventsData.map((event: EventRpcResponse) => ({
|
|
487
|
+
id: event.event_id,
|
|
488
|
+
event_id: event.event_id,
|
|
489
|
+
event_name: event.event_name,
|
|
490
|
+
event_code: event.event_code,
|
|
491
|
+
event_date: event.event_date ?? undefined,
|
|
492
|
+
event_venue: event.event_venue ?? undefined,
|
|
493
|
+
event_participants: event.event_participants ?? undefined,
|
|
494
|
+
event_colours: event.event_colours,
|
|
495
|
+
event_logo: '',
|
|
496
|
+
organisation_id: assertOrganisationId(event.organisation_id),
|
|
497
|
+
is_visible: event.is_visible,
|
|
498
|
+
created_at: new Date().toISOString(),
|
|
499
|
+
updated_at: new Date().toISOString()
|
|
500
|
+
}));
|
|
501
|
+
return [...transformed].sort((a, b) => {
|
|
502
|
+
if (a.event_date && b.event_date) {
|
|
503
|
+
return new Date(b.event_date).getTime() - new Date(a.event_date).getTime();
|
|
504
|
+
}
|
|
505
|
+
if (a.event_date && !b.event_date) return -1;
|
|
506
|
+
if (!a.event_date && b.event_date) return 1;
|
|
507
|
+
return 0;
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
private validateSelectedEventInList(events: Event[]): void {
|
|
512
|
+
if (!this.selectedEvent) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
const selectedEventId = this.selectedEvent.event_id;
|
|
516
|
+
const eventStillExists = events.some(e => e.event_id === selectedEventId);
|
|
517
|
+
if (!eventStillExists) {
|
|
518
|
+
const previousUserClearedRef = this.userClearedEventRef;
|
|
519
|
+
this.selectedEvent = null;
|
|
520
|
+
this.setSelectedEventId?.(null);
|
|
521
|
+
this.userClearedEventRef = previousUserClearedRef;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
private async runPersistedOrAutoSelection(events: Event[], skipLoadPersisted: boolean): Promise<void> {
|
|
526
|
+
this.hasAutoSelectedRef = false;
|
|
527
|
+
if (!skipLoadPersisted) {
|
|
528
|
+
const persistedEventLoaded = await this.loadPersistedEvent(events);
|
|
529
|
+
if (!persistedEventLoaded && !this.userClearedEventRef) {
|
|
530
|
+
const nextEvent = this.getNextEventByDate(events);
|
|
531
|
+
if (nextEvent) {
|
|
532
|
+
this.hasAutoSelectedRef = true;
|
|
533
|
+
this.setSelectedEvent(nextEvent);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
} else if (!this.userClearedEventRef) {
|
|
537
|
+
const nextEvent = this.getNextEventByDate(events);
|
|
538
|
+
if (nextEvent) {
|
|
539
|
+
this.hasAutoSelectedRef = true;
|
|
540
|
+
this.setSelectedEvent(nextEvent);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
420
545
|
private async fetchEvents(skipLoadPersisted: boolean = false): Promise<void> {
|
|
421
|
-
// For event-required apps, selectedOrganisation may be null (org derived from event)
|
|
422
|
-
// For org-required apps, selectedOrganisation is required
|
|
423
546
|
if (!this.user || !this.session || !this.supabaseClient || !this.appName) {
|
|
424
|
-
// Already false from initialization, just notify
|
|
425
547
|
this.notify();
|
|
426
548
|
return;
|
|
427
549
|
}
|
|
428
|
-
|
|
429
|
-
// Only set loading to true if we actually have dependencies and are going to fetch
|
|
550
|
+
|
|
430
551
|
this._isLoading = true;
|
|
431
552
|
this.notify();
|
|
432
553
|
|
|
433
|
-
// Prevent multiple simultaneous fetches
|
|
434
554
|
if (this.isFetchingRef) {
|
|
435
555
|
return;
|
|
436
556
|
}
|
|
@@ -439,221 +559,31 @@ export class EventService extends BaseService implements IEventService {
|
|
|
439
559
|
const isMounted = true;
|
|
440
560
|
|
|
441
561
|
try {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
// Determine organisationId for RPC call
|
|
445
|
-
// For event-required apps: org is derived from selectedEvent (if available), or null to get all accessible events
|
|
446
|
-
// For org-required apps: org comes from selectedOrganisation
|
|
447
|
-
// Super admins: pass null to see all events
|
|
448
|
-
let organisationIdForRpc: string | null = null;
|
|
449
|
-
|
|
450
|
-
// Check if user is super admin first
|
|
451
|
-
// RBAC should be initialized synchronously by UnifiedAuthProvider before EventService is used
|
|
452
|
-
// Use cached value as fallback for edge cases (e.g., EventService used outside UnifiedAuthProvider)
|
|
453
|
-
let userIsSuperAdmin = this.isSuperAdmin; // Start with cached value from updateDependencies
|
|
454
|
-
try {
|
|
455
|
-
const { isRBACInitialized, isSuperAdmin: checkSuperAdmin, setupRBAC } = await import('../rbac/api');
|
|
456
|
-
|
|
457
|
-
// Ensure RBAC is initialized if possible (defensive check for edge cases)
|
|
458
|
-
if (!isRBACInitialized() && this.supabaseClient) {
|
|
459
|
-
setupRBAC(this.supabaseClient);
|
|
460
|
-
}
|
|
562
|
+
const organisationIdForRpc = await this.resolveOrganisationIdForRpc();
|
|
461
563
|
|
|
462
|
-
|
|
463
|
-
// RBAC should always be initialized by UnifiedAuthProvider, but we check defensively
|
|
464
|
-
if (isRBACInitialized()) {
|
|
465
|
-
userIsSuperAdmin = await checkSuperAdmin(this.user.id as UUID);
|
|
466
|
-
// Update cached value for future use
|
|
467
|
-
this.isSuperAdmin = userIsSuperAdmin;
|
|
468
|
-
} else {
|
|
469
|
-
// RBAC not initialized - this should be rare since UnifiedAuthProvider initializes it synchronously
|
|
470
|
-
// Use cached value from updateDependencies as fallback
|
|
471
|
-
// If cached value is true, trust it to avoid blocking super admins
|
|
472
|
-
if (this.isSuperAdmin) {
|
|
473
|
-
userIsSuperAdmin = true;
|
|
474
|
-
logger.warn('EventService', 'RBAC not initialized, using cached super admin status', {
|
|
475
|
-
userId: this.user.id,
|
|
476
|
-
cachedIsSuperAdmin: this.isSuperAdmin,
|
|
477
|
-
note: 'RBAC should be initialized by UnifiedAuthProvider. This may indicate EventService is being used outside the provider.'
|
|
478
|
-
});
|
|
479
|
-
} else {
|
|
480
|
-
logger.warn('EventService', 'RBAC not initialized, using cached non-super-admin status', {
|
|
481
|
-
userId: this.user.id,
|
|
482
|
-
cachedIsSuperAdmin: this.isSuperAdmin,
|
|
483
|
-
note: 'RBAC should be initialized by UnifiedAuthProvider. This may indicate EventService is being used outside the provider.'
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
if (userIsSuperAdmin) {
|
|
489
|
-
// Super admin: Pass null to see all events across all organisations
|
|
490
|
-
organisationIdForRpc = null;
|
|
491
|
-
} else {
|
|
492
|
-
// Not super admin: determine org from available context
|
|
493
|
-
// Scope is now page-level only - use whatever context is available
|
|
494
|
-
if (this.selectedEvent) {
|
|
495
|
-
// If event is already selected, use its organisation
|
|
496
|
-
organisationIdForRpc = this.selectedEvent.organisation_id;
|
|
497
|
-
} else if (this.selectedOrganisation) {
|
|
498
|
-
// Use selected organisation
|
|
499
|
-
organisationIdForRpc = this.selectedOrganisation.id;
|
|
500
|
-
} else {
|
|
501
|
-
// No context available - pass null to get all accessible events via event-app roles
|
|
502
|
-
// This allows users with event-app roles to see their events even without org context
|
|
503
|
-
organisationIdForRpc = null; // Will return events user has access to via event-app roles
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
} catch (superAdminCheckError) {
|
|
507
|
-
// If super admin check fails, use cached value as fallback
|
|
508
|
-
// If cached value is true, trust it to avoid blocking super admins
|
|
509
|
-
if (this.isSuperAdmin) {
|
|
510
|
-
userIsSuperAdmin = true;
|
|
511
|
-
organisationIdForRpc = null; // Super admin gets all events
|
|
512
|
-
logger.warn('EventService', 'Super admin check failed, using cached super admin status', {
|
|
513
|
-
error: superAdminCheckError,
|
|
514
|
-
cachedIsSuperAdmin: this.isSuperAdmin
|
|
515
|
-
});
|
|
516
|
-
} else {
|
|
517
|
-
// Fallback: use available context
|
|
518
|
-
logger.warn('EventService', 'Failed to check super admin status, using organisation-scoped query', {
|
|
519
|
-
error: superAdminCheckError,
|
|
520
|
-
cachedIsSuperAdmin: this.isSuperAdmin
|
|
521
|
-
});
|
|
522
|
-
if (this.selectedEvent) {
|
|
523
|
-
organisationIdForRpc = this.selectedEvent.organisation_id;
|
|
524
|
-
} else if (this.selectedOrganisation) {
|
|
525
|
-
organisationIdForRpc = this.selectedOrganisation.id;
|
|
526
|
-
} else {
|
|
527
|
-
// No context - pass null to get all accessible events via event-app roles
|
|
528
|
-
organisationIdForRpc = null;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
// Call the RPC function following the established pattern
|
|
534
|
-
// For super admins, pass null for p_organisation_id to see all events
|
|
535
|
-
|
|
536
|
-
const { data, error: rpcError } = await this.supabaseClient.rpc('data_user_events_get', {
|
|
564
|
+
const { data, error: rpcError } = await this.supabaseClient!.rpc('data_user_events_get', {
|
|
537
565
|
p_user_id: this.user.id,
|
|
538
566
|
p_organisation_id: organisationIdForRpc,
|
|
539
567
|
p_app_name: this.appName
|
|
540
568
|
});
|
|
541
|
-
|
|
542
|
-
|
|
569
|
+
|
|
543
570
|
if (rpcError) {
|
|
544
571
|
logger.error('EventService', 'RPC error fetching events:', rpcError);
|
|
545
572
|
throw new Error(rpcError.message || 'Failed to fetch events');
|
|
546
573
|
}
|
|
547
574
|
|
|
548
575
|
if (isMounted) {
|
|
549
|
-
const
|
|
550
|
-
|
|
551
|
-
// Transform the data to match our Event interface
|
|
552
|
-
// Type for RPC response from data_user_events_get
|
|
553
|
-
interface EventRpcResponse {
|
|
554
|
-
event_id: string;
|
|
555
|
-
event_name: string;
|
|
556
|
-
event_code: string;
|
|
557
|
-
event_date: string | null;
|
|
558
|
-
event_venue: string | null;
|
|
559
|
-
event_participants: number | null;
|
|
560
|
-
event_colours: Record<string, unknown> | null;
|
|
561
|
-
organisation_id: string;
|
|
562
|
-
is_visible: boolean;
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
const transformedEvents: Event[] = eventsData.map((event: EventRpcResponse) => ({
|
|
566
|
-
id: event.event_id,
|
|
567
|
-
event_id: event.event_id,
|
|
568
|
-
event_name: event.event_name,
|
|
569
|
-
event_code: event.event_code,
|
|
570
|
-
event_date: event.event_date,
|
|
571
|
-
event_venue: event.event_venue,
|
|
572
|
-
event_participants: event.event_participants,
|
|
573
|
-
event_colours: event.event_colours,
|
|
574
|
-
event_logo: '', // No logo field in event table
|
|
575
|
-
organisation_id: assertOrganisationId(event.organisation_id),
|
|
576
|
-
is_visible: event.is_visible,
|
|
577
|
-
created_at: new Date().toISOString(),
|
|
578
|
-
updated_at: new Date().toISOString()
|
|
579
|
-
}));
|
|
580
|
-
|
|
581
|
-
// Sort events by event_date descending (newest first)
|
|
582
|
-
// Handle null dates by putting them at the end
|
|
583
|
-
const sortedEvents = [...transformedEvents].sort((a, b) => {
|
|
584
|
-
// If both have dates, sort descending (newest first)
|
|
585
|
-
if (a.event_date && b.event_date) {
|
|
586
|
-
return new Date(b.event_date).getTime() - new Date(a.event_date).getTime();
|
|
587
|
-
}
|
|
588
|
-
// If only one has a date, prioritize the one with a date
|
|
589
|
-
if (a.event_date && !b.event_date) return -1;
|
|
590
|
-
if (!a.event_date && b.event_date) return 1;
|
|
591
|
-
// If neither has a date, maintain original order
|
|
592
|
-
return 0;
|
|
593
|
-
});
|
|
594
|
-
|
|
595
|
-
this.events = sortedEvents;
|
|
576
|
+
const transformedEvents = this.transformRpcDataToEvents(data ?? []);
|
|
577
|
+
this.events = transformedEvents;
|
|
596
578
|
this.error = null;
|
|
597
579
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
// Don't set userClearedEventRef to true in this case - it's an automatic clear, not user-initiated
|
|
601
|
-
if (this.selectedEvent) {
|
|
602
|
-
const selectedEventId = this.selectedEvent.event_id;
|
|
603
|
-
const eventStillExists = transformedEvents.some(
|
|
604
|
-
e => e.event_id === selectedEventId
|
|
605
|
-
);
|
|
606
|
-
if (!eventStillExists) {
|
|
607
|
-
// Event no longer available - clear it but don't mark as user-cleared
|
|
608
|
-
const previousUserClearedRef = this.userClearedEventRef;
|
|
609
|
-
this.selectedEvent = null;
|
|
610
|
-
this.setSelectedEventId?.(null);
|
|
611
|
-
// Restore the previous userClearedEventRef value - this was an automatic clear, not user-initiated
|
|
612
|
-
this.userClearedEventRef = previousUserClearedRef;
|
|
613
|
-
// Cleared selected event - no longer in events list
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
// Reset auto-selection ref for new events
|
|
618
|
-
this.hasAutoSelectedRef = false;
|
|
619
|
-
|
|
620
|
-
// Try to restore persisted event first (only if not skipping)
|
|
621
|
-
if (!skipLoadPersisted) {
|
|
622
|
-
const persistedEventLoaded = await this.loadPersistedEvent(transformedEvents);
|
|
623
|
-
|
|
624
|
-
// If no persisted event was loaded and user hasn't explicitly cleared an event, auto-select the next event
|
|
625
|
-
if (!persistedEventLoaded && !this.userClearedEventRef) {
|
|
626
|
-
const nextEvent = this.getNextEventByDate(transformedEvents);
|
|
627
|
-
if (nextEvent) {
|
|
628
|
-
this.hasAutoSelectedRef = true;
|
|
629
|
-
// Use setSelectedEvent() to ensure consistent behavior
|
|
630
|
-
// Theme will be applied by useEventTheme() hook
|
|
631
|
-
this.setSelectedEvent(nextEvent);
|
|
632
|
-
}
|
|
633
|
-
} else if (persistedEventLoaded) {
|
|
634
|
-
// Skipped auto-selection - persisted event loaded
|
|
635
|
-
} else if (this.userClearedEventRef) {
|
|
636
|
-
// Skipped auto-selection - user explicitly cleared event
|
|
637
|
-
}
|
|
638
|
-
} else {
|
|
639
|
-
// If skipping persisted event load, still do auto-selection for new users
|
|
640
|
-
if (!this.userClearedEventRef) {
|
|
641
|
-
const nextEvent = this.getNextEventByDate(transformedEvents);
|
|
642
|
-
if (nextEvent) {
|
|
643
|
-
this.hasAutoSelectedRef = true;
|
|
644
|
-
// Use setSelectedEvent() to ensure consistent behavior
|
|
645
|
-
// Theme will be applied by useEventTheme() hook
|
|
646
|
-
this.setSelectedEvent(nextEvent);
|
|
647
|
-
}
|
|
648
|
-
} else {
|
|
649
|
-
// Skipped auto-selection (skip persisted) - user explicitly cleared event
|
|
650
|
-
}
|
|
651
|
-
}
|
|
580
|
+
this.validateSelectedEventInList(transformedEvents);
|
|
581
|
+
await this.runPersistedOrAutoSelection(transformedEvents, skipLoadPersisted);
|
|
652
582
|
}
|
|
653
583
|
} catch (err) {
|
|
654
584
|
logger.error('EventService', 'Error fetching events:', err);
|
|
655
585
|
const _error = err instanceof Error ? err : new Error('Unknown error occurred');
|
|
656
|
-
|
|
586
|
+
|
|
657
587
|
if (isMounted) {
|
|
658
588
|
this.error = _error;
|
|
659
589
|
this.events = [];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file InactivityService Edge Cases and Complex Scenarios Tests
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Services
|
|
4
|
+
* @module Services
|
|
5
5
|
* @since 0.1.0
|
|
6
6
|
*
|
|
7
7
|
* Comprehensive edge case and complex scenario tests for InactivityService.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
17
|
-
import { InactivityService } from '
|
|
17
|
+
import { InactivityService } from './InactivityService';
|
|
18
18
|
|
|
19
19
|
// Mock Supabase client
|
|
20
20
|
const createMockSupabaseClient = () => ({
|
|
@@ -249,7 +249,7 @@ describe('InactivityService Edge Cases and Complex Scenarios', () => {
|
|
|
249
249
|
|
|
250
250
|
it('handles timeout change during tracking', () => {
|
|
251
251
|
inactivityService.startTracking();
|
|
252
|
-
const
|
|
252
|
+
const _initialTime = inactivityService.getTimeRemaining();
|
|
253
253
|
|
|
254
254
|
inactivityService.updateDependencies(
|
|
255
255
|
mockSupabase as any,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file InactivityService Lifecycle Tests
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Services
|
|
4
|
+
* @module Services
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*
|
|
7
7
|
* Additional lifecycle tests for InactivityService covering:
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
14
|
-
import { InactivityService } from '
|
|
14
|
+
import { InactivityService } from './InactivityService';
|
|
15
15
|
|
|
16
16
|
// Mock Supabase client
|
|
17
17
|
const createMockSupabaseClient = () => ({
|