@rebasepro/app 0.0.1-canary.4829d6e
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/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/auth/api.d.ts +66 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/types.d.ts +127 -0
- package/dist/auth/useRebaseAuthController.d.ts +13 -0
- package/dist/components/AIIcon.d.ts +17 -0
- package/dist/components/AuthSimulationMenu.d.ts +0 -0
- package/dist/components/ConfirmationDialog.d.ts +9 -0
- package/dist/components/Debug/UIReferenceView.d.ts +13 -0
- package/dist/components/Debug/UIStyleGuide.d.ts +2 -0
- package/dist/components/Debug/collection-views/CardViewDemo.d.ts +2 -0
- package/dist/components/Debug/collection-views/CollectionTableDemo.d.ts +2 -0
- package/dist/components/Debug/collection-views/KanbanBoardDemo.d.ts +2 -0
- package/dist/components/Debug/collection-views/index.d.ts +3 -0
- package/dist/components/Debug/collection-views/sample_data.d.ts +23 -0
- package/dist/components/Debug/crm-dashboard/CalendarWidget.d.ts +22 -0
- package/dist/components/Debug/crm-dashboard/CrmDashboardDemo.d.ts +2 -0
- package/dist/components/Debug/crm-dashboard/DashboardMetrics.d.ts +15 -0
- package/dist/components/Debug/crm-dashboard/PipelineOverview.d.ts +34 -0
- package/dist/components/Debug/crm-dashboard/RecentActivity.d.ts +19 -0
- package/dist/components/Debug/crm-dashboard/TaskFilters.d.ts +30 -0
- package/dist/components/Debug/crm-dashboard/TaskTable.d.ts +50 -0
- package/dist/components/Debug/crm-dashboard/TasksView.d.ts +41 -0
- package/dist/components/ErrorTooltip.d.ts +3 -0
- package/dist/components/ErrorView.d.ts +21 -0
- package/dist/components/LanguageToggle.d.ts +2 -0
- package/dist/components/LoginView/LoginView.d.ts +113 -0
- package/dist/components/LoginView/index.d.ts +2 -0
- package/dist/components/NotFoundPage.d.ts +2 -0
- package/dist/components/RebaseAuth.d.ts +10 -0
- package/dist/components/RebaseLogo.d.ts +7 -0
- package/dist/components/SchemaDriftBanner.d.ts +27 -0
- package/dist/components/UnsavedChangesDialog.d.ts +9 -0
- package/dist/components/UserDisplay.d.ts +7 -0
- package/dist/components/UserSelectPopover.d.ts +63 -0
- package/dist/components/UserSettingsView.d.ts +2 -0
- package/dist/components/common/index.d.ts +6 -0
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +66 -0
- package/dist/components/common/useColumnsIds.d.ts +9 -0
- package/dist/components/common/useDataTableController.d.ts +45 -0
- package/dist/components/common/useDebouncedData.d.ts +9 -0
- package/dist/components/common/useScrollRestoration.d.ts +14 -0
- package/dist/components/index.d.ts +18 -0
- package/dist/contexts/AdminModeController.d.ts +4 -0
- package/dist/contexts/AnalyticsContext.d.ts +3 -0
- package/dist/contexts/AuthControllerContext.d.ts +3 -0
- package/dist/contexts/CollectionScopeContext.d.ts +50 -0
- package/dist/contexts/ComponentOverrideContext.d.ts +42 -0
- package/dist/contexts/CustomizationControllerContext.d.ts +3 -0
- package/dist/contexts/DataDriverContext.d.ts +3 -0
- package/dist/contexts/DataSourcesContext.d.ts +31 -0
- package/dist/contexts/DatabaseAdminContext.d.ts +3 -0
- package/dist/contexts/DialogsProvider.d.ts +4 -0
- package/dist/contexts/EffectiveRoleController.d.ts +4 -0
- package/dist/contexts/ModeController.d.ts +4 -0
- package/dist/contexts/RebaseClientInstanceContext.d.ts +6 -0
- package/dist/contexts/RebaseDataContext.d.ts +3 -0
- package/dist/contexts/SnackbarProvider.d.ts +2 -0
- package/dist/contexts/StorageSourceContext.d.ts +3 -0
- package/dist/contexts/StorageSourcesContext.d.ts +25 -0
- package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
- package/dist/contexts/index.d.ts +17 -0
- package/dist/core/PluginLifecycleManager.d.ts +17 -0
- package/dist/core/PluginProviderStack.d.ts +21 -0
- package/dist/core/Rebase.d.ts +15 -0
- package/dist/core/RebaseProps.d.ts +291 -0
- package/dist/core/RebaseRouter.d.ts +4 -0
- package/dist/core/RebaseRoutes.d.ts +17 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/hooks/ApiConfigContext.d.ts +24 -0
- package/dist/hooks/data/delete.d.ts +33 -0
- package/dist/hooks/data/save.d.ts +40 -0
- package/dist/hooks/data/useCollection.d.ts +62 -0
- package/dist/hooks/data/useData.d.ts +13 -0
- package/dist/hooks/data/useDataOrder.d.ts +12 -0
- package/dist/hooks/data/useFetch.d.ts +43 -0
- package/dist/hooks/data/useRelationSelector.d.ts +52 -0
- package/dist/hooks/index.d.ts +36 -0
- package/dist/hooks/useAdminModeController.d.ts +19 -0
- package/dist/hooks/useAnalyticsController.d.ts +5 -0
- package/dist/hooks/useAuthController.d.ts +11 -0
- package/dist/hooks/useAuthSubscription.d.ts +2 -0
- package/dist/hooks/useBackendStorageSource.d.ts +30 -0
- package/dist/hooks/useBridgeRegistration.d.ts +18 -0
- package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
- package/dist/hooks/useBuildAdminModeController.d.ts +6 -0
- package/dist/hooks/useBuildEffectiveRoleController.d.ts +8 -0
- package/dist/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
- package/dist/hooks/useBuildModeController.d.ts +6 -0
- package/dist/hooks/useClipboard.d.ts +57 -0
- package/dist/hooks/useCollapsedGroups.d.ts +27 -0
- package/dist/hooks/useComponentOverride.d.ts +32 -0
- package/dist/hooks/useCustomizationController.d.ts +11 -0
- package/dist/hooks/useDialogsController.d.ts +11 -0
- package/dist/hooks/useEffectiveRoleController.d.ts +7 -0
- package/dist/hooks/useLargeLayout.d.ts +1 -0
- package/dist/hooks/useModeController.d.ts +19 -0
- package/dist/hooks/usePermissions.d.ts +12 -0
- package/dist/hooks/useRebaseClient.d.ts +5 -0
- package/dist/hooks/useRebaseContext.d.ts +11 -0
- package/dist/hooks/useRebaseRegistry.d.ts +34 -0
- package/dist/hooks/useResolvedComponent.d.ts +47 -0
- package/dist/hooks/useSlot.d.ts +18 -0
- package/dist/hooks/useSnackbarController.d.ts +20 -0
- package/dist/hooks/useStorageSource.d.ts +6 -0
- package/dist/hooks/useStudioBridge.d.ts +79 -0
- package/dist/hooks/useTranslation.d.ts +17 -0
- package/dist/hooks/useUnsavedChangesDialog.d.ts +12 -0
- package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
- package/dist/i18n/RebaseI18nProvider.d.ts +33 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.es.js +16843 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +17021 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/internal/common.d.ts +14 -0
- package/dist/internal/useRestoreScroll.d.ts +15 -0
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/en.d.ts +10 -0
- package/dist/locales/es.d.ts +10 -0
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/hi.d.ts +2 -0
- package/dist/locales/it.d.ts +2 -0
- package/dist/locales/pt.d.ts +7 -0
- package/dist/util/constants.d.ts +1 -0
- package/dist/util/createFormexStub.d.ts +2 -0
- package/dist/util/entity_cache.d.ts +22 -0
- package/dist/util/enums.d.ts +5 -0
- package/dist/util/icon_list.d.ts +5 -0
- package/dist/util/icons.d.ts +20 -0
- package/dist/util/index.d.ts +8 -0
- package/dist/util/previews.d.ts +4 -0
- package/dist/util/useStorageUploadController.d.ts +44 -0
- package/dist/vitePlugin.d.ts +60 -0
- package/dist/vitePlugin.js +113 -0
- package/package.json +145 -0
- package/src/auth/api.ts +148 -0
- package/src/auth/index.ts +25 -0
- package/src/auth/types.ts +115 -0
- package/src/auth/useRebaseAuthController.ts +328 -0
- package/src/components/AIIcon.tsx +47 -0
- package/src/components/AuthSimulationMenu.tsx +0 -0
- package/src/components/ConfirmationDialog.tsx +48 -0
- package/src/components/Debug/UIReferenceView.tsx +958 -0
- package/src/components/Debug/UIStyleGuide.tsx +156 -0
- package/src/components/Debug/collection-views/CardViewDemo.tsx +85 -0
- package/src/components/Debug/collection-views/CollectionTableDemo.tsx +107 -0
- package/src/components/Debug/collection-views/KanbanBoardDemo.tsx +90 -0
- package/src/components/Debug/collection-views/index.ts +3 -0
- package/src/components/Debug/collection-views/sample_data.ts +42 -0
- package/src/components/Debug/crm-dashboard/CalendarWidget.tsx +389 -0
- package/src/components/Debug/crm-dashboard/CrmDashboardDemo.tsx +1102 -0
- package/src/components/Debug/crm-dashboard/DashboardMetrics.tsx +133 -0
- package/src/components/Debug/crm-dashboard/PipelineOverview.tsx +290 -0
- package/src/components/Debug/crm-dashboard/RecentActivity.tsx +215 -0
- package/src/components/Debug/crm-dashboard/TaskFilters.tsx +184 -0
- package/src/components/Debug/crm-dashboard/TaskTable.tsx +427 -0
- package/src/components/Debug/crm-dashboard/TasksView.tsx +234 -0
- package/src/components/ErrorTooltip.tsx +12 -0
- package/src/components/ErrorView.tsx +94 -0
- package/src/components/LanguageToggle.tsx +59 -0
- package/src/components/LoginView/LoginView.tsx +932 -0
- package/src/components/LoginView/index.ts +2 -0
- package/src/components/NotFoundPage.tsx +27 -0
- package/src/components/RebaseAuth.tsx +27 -0
- package/src/components/RebaseLogo.tsx +29 -0
- package/src/components/SchemaDriftBanner.tsx +102 -0
- package/src/components/UnsavedChangesDialog.tsx +46 -0
- package/src/components/UserDisplay.tsx +54 -0
- package/src/components/UserSelectPopover.tsx +399 -0
- package/src/components/UserSettingsView.tsx +318 -0
- package/src/components/common/index.ts +6 -0
- package/src/components/common/table_height.tsx +21 -0
- package/src/components/common/types.tsx +66 -0
- package/src/components/common/useColumnsIds.tsx +222 -0
- package/src/components/common/useDataTableController.tsx +514 -0
- package/src/components/common/useDebouncedData.ts +49 -0
- package/src/components/common/useScrollRestoration.tsx +68 -0
- package/src/components/index.tsx +26 -0
- package/src/contexts/AdminModeController.tsx +11 -0
- package/src/contexts/AnalyticsContext.tsx +4 -0
- package/src/contexts/AuthControllerContext.tsx +4 -0
- package/src/contexts/CollectionScopeContext.tsx +67 -0
- package/src/contexts/ComponentOverrideContext.tsx +81 -0
- package/src/contexts/CustomizationControllerContext.tsx +4 -0
- package/src/contexts/DataDriverContext.tsx +4 -0
- package/src/contexts/DataSourcesContext.tsx +36 -0
- package/src/contexts/DatabaseAdminContext.tsx +4 -0
- package/src/contexts/DialogsProvider.tsx +56 -0
- package/src/contexts/EffectiveRoleController.tsx +12 -0
- package/src/contexts/ModeController.tsx +11 -0
- package/src/contexts/RebaseClientInstanceContext.tsx +7 -0
- package/src/contexts/RebaseDataContext.tsx +4 -0
- package/src/contexts/SnackbarProvider.tsx +15 -0
- package/src/contexts/StorageSourceContext.tsx +4 -0
- package/src/contexts/StorageSourcesContext.tsx +30 -0
- package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
- package/src/contexts/index.ts +17 -0
- package/src/core/PluginLifecycleManager.tsx +95 -0
- package/src/core/PluginProviderStack.tsx +40 -0
- package/src/core/Rebase.tsx +439 -0
- package/src/core/RebaseProps.tsx +320 -0
- package/src/core/RebaseRouter.tsx +17 -0
- package/src/core/RebaseRoutes.tsx +24 -0
- package/src/core/index.tsx +5 -0
- package/src/hooks/ApiConfigContext.tsx +41 -0
- package/src/hooks/data/delete.ts +55 -0
- package/src/hooks/data/save.ts +77 -0
- package/src/hooks/data/useCollection.tsx +176 -0
- package/src/hooks/data/useData.tsx +18 -0
- package/src/hooks/data/useDataOrder.ts +26 -0
- package/src/hooks/data/useFetch.tsx +140 -0
- package/src/hooks/data/useRelationSelector.tsx +234 -0
- package/src/hooks/index.tsx +45 -0
- package/src/hooks/useAdminModeController.tsx +23 -0
- package/src/hooks/useAnalyticsController.tsx +8 -0
- package/src/hooks/useAuthController.tsx +14 -0
- package/src/hooks/useAuthSubscription.ts +87 -0
- package/src/hooks/useBackendStorageSource.ts +288 -0
- package/src/hooks/useBridgeRegistration.tsx +32 -0
- package/src/hooks/useBrowserTitleAndIcon.tsx +23 -0
- package/src/hooks/useBuildAdminModeController.tsx +24 -0
- package/src/hooks/useBuildEffectiveRoleController.tsx +31 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +75 -0
- package/src/hooks/useBuildModeController.tsx +71 -0
- package/src/hooks/useClipboard.tsx +158 -0
- package/src/hooks/useCollapsedGroups.ts +116 -0
- package/src/hooks/useComponentOverride.tsx +59 -0
- package/src/hooks/useCustomizationController.tsx +14 -0
- package/src/hooks/useDialogsController.tsx +15 -0
- package/src/hooks/useEffectiveRoleController.tsx +10 -0
- package/src/hooks/useLargeLayout.tsx +65 -0
- package/src/hooks/useModeController.tsx +23 -0
- package/src/hooks/usePermissions.ts +44 -0
- package/src/hooks/useRebaseClient.tsx +10 -0
- package/src/hooks/useRebaseContext.tsx +83 -0
- package/src/hooks/useRebaseRegistry.tsx +91 -0
- package/src/hooks/useResolvedComponent.tsx +159 -0
- package/src/hooks/useSlot.tsx +64 -0
- package/src/hooks/useSnackbarController.tsx +52 -0
- package/src/hooks/useStorageSource.tsx +11 -0
- package/src/hooks/useStudioBridge.tsx +209 -0
- package/src/hooks/useTranslation.ts +33 -0
- package/src/hooks/useUnsavedChangesDialog.tsx +64 -0
- package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
- package/src/i18n/RebaseI18nProvider.tsx +160 -0
- package/src/index.ts +25 -0
- package/src/internal/common.tsx +16 -0
- package/src/internal/useRestoreScroll.tsx +69 -0
- package/src/locales/de.ts +902 -0
- package/src/locales/en.ts +980 -0
- package/src/locales/es.ts +922 -0
- package/src/locales/fr.ts +901 -0
- package/src/locales/hi.ts +901 -0
- package/src/locales/it.ts +901 -0
- package/src/locales/pt.ts +909 -0
- package/src/util/constants.ts +7 -0
- package/src/util/createFormexStub.tsx +66 -0
- package/src/util/entity_cache.ts +239 -0
- package/src/util/enums.ts +32 -0
- package/src/util/icon_list.ts +22 -0
- package/src/util/icons.tsx +149 -0
- package/src/util/index.ts +12 -0
- package/src/util/previews.ts +105 -0
- package/src/util/useStorageUploadController.tsx +350 -0
- package/src/vitePlugin.ts +196 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React, { createContext, useContext } from "react";
|
|
2
|
+
import type { CollectionConfig } from "@rebasepro/types";
|
|
3
|
+
import { CollectionComponentOverrideProvider } from "./ComponentOverrideContext";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Carries the collection a UI subtree is currently bound to.
|
|
7
|
+
*
|
|
8
|
+
* Mounted by every collection binding (main collection views, entity
|
|
9
|
+
* edit/detail views, side panels, reference-selection dialogs, import
|
|
10
|
+
* previews) via {@link CollectionScopeProvider}. Leaf components read it with
|
|
11
|
+
* {@link useCollectionScope} to derive collection-dependent behavior — e.g.
|
|
12
|
+
* filter fields resolve the engine's supported operators from
|
|
13
|
+
* `collection.engine` — without every intermediate component threading
|
|
14
|
+
* collection props.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export const CollectionScopeContext = createContext<CollectionConfig | undefined>(undefined);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Read the collection the current subtree is bound to, or `undefined` when
|
|
22
|
+
* rendered outside any collection scope (e.g. a fully standalone table).
|
|
23
|
+
*
|
|
24
|
+
* @group Hooks
|
|
25
|
+
*/
|
|
26
|
+
export function useCollectionScope(): CollectionConfig | undefined {
|
|
27
|
+
return useContext(CollectionScopeContext);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Scopes a UI subtree to a collection.
|
|
32
|
+
*
|
|
33
|
+
* Provides two things at once:
|
|
34
|
+
* 1. The collection itself — readable via {@link useCollectionScope} —
|
|
35
|
+
* so leaf components (filter fields, previews, …) can derive
|
|
36
|
+
* collection-dependent behavior such as engine capabilities.
|
|
37
|
+
* 2. The collection's component overrides (`collection.components`),
|
|
38
|
+
* by mounting {@link CollectionComponentOverrideProvider}.
|
|
39
|
+
*
|
|
40
|
+
* Mount this wherever a subtree is bound to a specific collection. If you
|
|
41
|
+
* build a custom view around `SelectableTable` / `CollectionTableBinding`,
|
|
42
|
+
* wrap it in this provider to get engine-aware filters and collection-scoped
|
|
43
|
+
* component overrides for free:
|
|
44
|
+
*
|
|
45
|
+
* ```tsx
|
|
46
|
+
* <CollectionScopeProvider collection={myCollection}>
|
|
47
|
+
* <CollectionTableBinding ... />
|
|
48
|
+
* </CollectionScopeProvider>
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @group Components
|
|
52
|
+
*/
|
|
53
|
+
export function CollectionScopeProvider({
|
|
54
|
+
collection,
|
|
55
|
+
children
|
|
56
|
+
}: {
|
|
57
|
+
collection: CollectionConfig<any> | undefined;
|
|
58
|
+
children: React.ReactNode;
|
|
59
|
+
}) {
|
|
60
|
+
return (
|
|
61
|
+
<CollectionScopeContext.Provider value={collection as CollectionConfig | undefined}>
|
|
62
|
+
<CollectionComponentOverrideProvider overrides={collection?.components}>
|
|
63
|
+
{children}
|
|
64
|
+
</CollectionComponentOverrideProvider>
|
|
65
|
+
</CollectionScopeContext.Provider>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import React, { createContext, useContext, useMemo } from "react";
|
|
2
|
+
import type { ComponentOverrideMap } from "@rebasepro/types";
|
|
3
|
+
|
|
4
|
+
/** Stable empty reference to avoid re-creating context values on every render. */
|
|
5
|
+
const EMPTY_OVERRIDES: ComponentOverrideMap = {};
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Internal state for the component override resolution chain.
|
|
9
|
+
* Holds both global overrides (set on `<Rebase>`) and collection-scoped
|
|
10
|
+
* overrides (set on individual collections).
|
|
11
|
+
*
|
|
12
|
+
* Resolution priority: collection > global > default.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
interface ComponentOverrideState {
|
|
17
|
+
globalOverrides: ComponentOverrideMap;
|
|
18
|
+
collectionOverrides: ComponentOverrideMap;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const ComponentOverrideContext = createContext<ComponentOverrideState>({
|
|
22
|
+
globalOverrides: EMPTY_OVERRIDES,
|
|
23
|
+
collectionOverrides: EMPTY_OVERRIDES
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Provider set at the `<Rebase>` root level to supply global component overrides.
|
|
28
|
+
*
|
|
29
|
+
* @internal — Used by the Rebase component. End users set overrides via
|
|
30
|
+
* the `components` prop on `<Rebase>`.
|
|
31
|
+
*/
|
|
32
|
+
export function GlobalComponentOverrideProvider({
|
|
33
|
+
overrides,
|
|
34
|
+
children
|
|
35
|
+
}: {
|
|
36
|
+
overrides?: ComponentOverrideMap;
|
|
37
|
+
children: React.ReactNode;
|
|
38
|
+
}) {
|
|
39
|
+
const value = useMemo<ComponentOverrideState>(() => ({
|
|
40
|
+
globalOverrides: overrides ?? EMPTY_OVERRIDES,
|
|
41
|
+
collectionOverrides: EMPTY_OVERRIDES
|
|
42
|
+
}), [overrides]);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<ComponentOverrideContext.Provider value={value}>
|
|
46
|
+
{children}
|
|
47
|
+
</ComponentOverrideContext.Provider>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Provider set at the collection level to layer collection-scoped overrides
|
|
53
|
+
* on top of global overrides.
|
|
54
|
+
*
|
|
55
|
+
* When a collection defines `components`, this provider is mounted
|
|
56
|
+
* around the collection's view subtree. Components within the subtree
|
|
57
|
+
* will resolve overrides in order: collection → global → default.
|
|
58
|
+
*
|
|
59
|
+
* @internal — Used by DataCollectionView when a collection has
|
|
60
|
+
* `components` defined.
|
|
61
|
+
*/
|
|
62
|
+
export function CollectionComponentOverrideProvider({
|
|
63
|
+
overrides,
|
|
64
|
+
children
|
|
65
|
+
}: {
|
|
66
|
+
overrides?: ComponentOverrideMap;
|
|
67
|
+
children: React.ReactNode;
|
|
68
|
+
}) {
|
|
69
|
+
const parent = useContext(ComponentOverrideContext);
|
|
70
|
+
|
|
71
|
+
const value = useMemo<ComponentOverrideState>(() => ({
|
|
72
|
+
globalOverrides: parent.globalOverrides,
|
|
73
|
+
collectionOverrides: overrides ?? EMPTY_OVERRIDES
|
|
74
|
+
}), [parent.globalOverrides, overrides]);
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<ComponentOverrideContext.Provider value={value}>
|
|
78
|
+
{children}
|
|
79
|
+
</ComponentOverrideContext.Provider>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { DataSourceDefinition, RebaseData } from "@rebasepro/types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The data-source configuration provided to `<Rebase>`: the declared
|
|
6
|
+
* definitions plus the built {@link RebaseData} instances for direct/custom
|
|
7
|
+
* transports.
|
|
8
|
+
*
|
|
9
|
+
* The actual path-based routing is assembled by the navigation layer (which
|
|
10
|
+
* has the collection registry) via `resolveDataSource` + `buildRoutedRebaseData`
|
|
11
|
+
* and re-provided through `RebaseDataContext`.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export interface DataSourcesContextValue {
|
|
16
|
+
/** All declared data sources, keyed by data-source key. */
|
|
17
|
+
registry: Record<string, DataSourceDefinition>;
|
|
18
|
+
/**
|
|
19
|
+
* Built {@link RebaseData} for direct/custom data sources, keyed by
|
|
20
|
+
* data-source key. Server-mediated sources are absent (they ride the
|
|
21
|
+
* default client).
|
|
22
|
+
*/
|
|
23
|
+
sources: Record<string, RebaseData>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const EMPTY: DataSourcesContextValue = { registry: {}, sources: {} };
|
|
27
|
+
|
|
28
|
+
/** @internal */
|
|
29
|
+
export const DataSourcesContext = React.createContext<DataSourcesContextValue>(EMPTY);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Access the data-source configuration provided to `<Rebase>` via the
|
|
33
|
+
* `dataSources` prop.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export const useDataSources = (): DataSourcesContextValue => React.useContext(DataSourcesContext);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { DialogControllerEntryProps, DialogsController } from "@rebasepro/types";
|
|
2
|
+
import React, { PropsWithChildren, useCallback, useRef, useState, useMemo } from "react";
|
|
3
|
+
;
|
|
4
|
+
|
|
5
|
+
export const DialogsControllerContext = React.createContext<DialogsController>({} as DialogsController);
|
|
6
|
+
|
|
7
|
+
export const DialogsProvider: React.FC<PropsWithChildren> = ({ children }) => {
|
|
8
|
+
|
|
9
|
+
const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);
|
|
10
|
+
const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);
|
|
11
|
+
|
|
12
|
+
const updateDialogEntries = (newPanels: DialogControllerEntryProps<any>[]) => {
|
|
13
|
+
dialogEntriesRef.current = newPanels;
|
|
14
|
+
setDialogEntries(newPanels);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const close = useCallback(() => {
|
|
18
|
+
|
|
19
|
+
if (dialogEntries.length === 0)
|
|
20
|
+
return;
|
|
21
|
+
|
|
22
|
+
const updatedPanels = [...dialogEntriesRef.current.slice(0, -1)];
|
|
23
|
+
updateDialogEntries(updatedPanels);
|
|
24
|
+
|
|
25
|
+
}, [dialogEntries]);
|
|
26
|
+
|
|
27
|
+
const open = useCallback(<T extends object = object>(dialogEntry: DialogControllerEntryProps<T>) => {
|
|
28
|
+
|
|
29
|
+
const updatedPanels = [...dialogEntriesRef.current, dialogEntry];
|
|
30
|
+
updateDialogEntries(updatedPanels);
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
closeDialog: () => {
|
|
34
|
+
const updatedPanels = dialogEntriesRef.current.filter(e => e.key !== dialogEntry.key);
|
|
35
|
+
updateDialogEntries(updatedPanels);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, [dialogEntries]);
|
|
39
|
+
|
|
40
|
+
const dialogsController = useMemo(() => ({
|
|
41
|
+
open,
|
|
42
|
+
close
|
|
43
|
+
}), [open, close]);
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<DialogsControllerContext.Provider value={dialogsController}>
|
|
47
|
+
{children}
|
|
48
|
+
{dialogEntries.map((entry, i) => <entry.Component
|
|
49
|
+
key={`dialog_${i}`}
|
|
50
|
+
open={true}
|
|
51
|
+
closeDialog={close}
|
|
52
|
+
{...entry.props}
|
|
53
|
+
/>)}
|
|
54
|
+
</DialogsControllerContext.Provider>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EffectiveRoleController } from "@rebasepro/types";
|
|
2
|
+
import React from "react";
|
|
3
|
+
;
|
|
4
|
+
|
|
5
|
+
const DEFAULT_EFFECTIVE_ROLE_STATE: EffectiveRoleController = {
|
|
6
|
+
effectiveRole: null,
|
|
7
|
+
setEffectiveRole: (_role: string | null) => {
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
export const EffectiveRoleControllerContext = React.createContext<EffectiveRoleController>(DEFAULT_EFFECTIVE_ROLE_STATE);
|
|
11
|
+
|
|
12
|
+
export const EffectiveRoleControllerProvider = EffectiveRoleControllerContext.Provider;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ModeController } from "../hooks";
|
|
3
|
+
|
|
4
|
+
const DEFAULT_MODE_STATE: ModeController = {
|
|
5
|
+
mode: "light",
|
|
6
|
+
setMode: (mode: "light" | "dark" | "system") => {
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
export const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);
|
|
10
|
+
|
|
11
|
+
export const ModeControllerProvider = ModeControllerContext.Provider;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context that exposes the full RebaseClient instance.
|
|
5
|
+
* Used by the JS Editor to give developer scripts access to `client.data`, `client.auth`, etc.
|
|
6
|
+
*/
|
|
7
|
+
export const RebaseClientInstanceContext = React.createContext<any>(undefined);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { PropsWithChildren } from "react";
|
|
4
|
+
import { SnackbarProvider as NotistackSnackbarProvider } from "notistack";
|
|
5
|
+
|
|
6
|
+
export const SnackbarProvider: React.FC<PropsWithChildren> = ({ children }) => {
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<NotistackSnackbarProvider maxSnack={3}
|
|
10
|
+
preventDuplicate={true}
|
|
11
|
+
autoHideDuration={3500}>
|
|
12
|
+
{children}
|
|
13
|
+
</NotistackSnackbarProvider>
|
|
14
|
+
);
|
|
15
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { StorageSource, StorageSourceDefinition, StorageSourceRegistry } from "@rebasepro/types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The storage-source configuration provided to `<Rebase>`: the declared
|
|
6
|
+
* definitions and the built {@link StorageSource} instances, wrapped in a
|
|
7
|
+
* {@link StorageSourceRegistry} for fast key-based lookup.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the {@link DataSourcesContext} pattern used for databases.
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export interface StorageSourcesContextValue {
|
|
14
|
+
/** All declared storage sources, keyed by storage-source key. */
|
|
15
|
+
registry: Record<string, StorageSourceDefinition>;
|
|
16
|
+
/** Built {@link StorageSource} for direct sources, keyed by key. */
|
|
17
|
+
sources: Record<string, StorageSource>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const EMPTY: StorageSourcesContextValue = { registry: {}, sources: {} };
|
|
21
|
+
|
|
22
|
+
/** @internal */
|
|
23
|
+
export const StorageSourcesContext = React.createContext<StorageSourcesContextValue>(EMPTY);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Access the storage-source configuration provided to `<Rebase>` via the
|
|
27
|
+
* `storageSources` prop.
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export const useStorageSources = (): StorageSourcesContextValue => React.useContext(StorageSourcesContext);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./SnackbarProvider";
|
|
2
|
+
export * from "./ModeController";
|
|
3
|
+
export * from "./AdminModeController";
|
|
4
|
+
export * from "./EffectiveRoleController";
|
|
5
|
+
export * from "./AuthControllerContext";
|
|
6
|
+
export * from "./DataDriverContext";
|
|
7
|
+
export * from "./DataSourcesContext";
|
|
8
|
+
export * from "./RebaseDataContext";
|
|
9
|
+
export * from "./AnalyticsContext";
|
|
10
|
+
export * from "./StorageSourceContext";
|
|
11
|
+
export * from "./StorageSourcesContext";
|
|
12
|
+
export * from "./UserConfigurationPersistenceContext";
|
|
13
|
+
export * from "./DialogsProvider";
|
|
14
|
+
export * from "./RebaseClientInstanceContext";
|
|
15
|
+
export * from "./CustomizationControllerContext";
|
|
16
|
+
export * from "./ComponentOverrideContext";
|
|
17
|
+
export * from "./CollectionScopeContext";
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import type { RebasePlugin, RebaseContext, User } from "@rebasepro/types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Render-less component that manages plugin lifecycle hooks.
|
|
7
|
+
*
|
|
8
|
+
* - Calls `lifecycle.onMount(context)` when plugins mount.
|
|
9
|
+
* - Calls `lifecycle.onUnmount()` when plugins unmount.
|
|
10
|
+
* - Subscribes to auth state changes and calls `lifecycle.onAuthStateChange`.
|
|
11
|
+
*
|
|
12
|
+
* Mount this component inside the Rebase tree, below PluginProviderStack,
|
|
13
|
+
* so that the RebaseContext is fully available.
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export function PluginLifecycleManager({
|
|
18
|
+
plugins,
|
|
19
|
+
context
|
|
20
|
+
}: {
|
|
21
|
+
plugins: RebasePlugin[];
|
|
22
|
+
context: RebaseContext;
|
|
23
|
+
}) {
|
|
24
|
+
const mountedRef = useRef(false);
|
|
25
|
+
const prevUserRef = useRef<User | null | undefined>(undefined);
|
|
26
|
+
|
|
27
|
+
// ── Mount / Unmount lifecycle ────────────────────────────────────
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
// Prevent double-fire in StrictMode
|
|
30
|
+
if (mountedRef.current) return;
|
|
31
|
+
mountedRef.current = true;
|
|
32
|
+
|
|
33
|
+
for (const plugin of plugins) {
|
|
34
|
+
if (plugin.lifecycle?.onMount) {
|
|
35
|
+
try {
|
|
36
|
+
const result = plugin.lifecycle.onMount(context);
|
|
37
|
+
if (result instanceof Promise) {
|
|
38
|
+
result.catch((err) =>
|
|
39
|
+
console.error(`[Rebase] Plugin "${plugin.key}" onMount error:`, err)
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
} catch (err) {
|
|
43
|
+
console.error(`[Rebase] Plugin "${plugin.key}" onMount error:`, err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return () => {
|
|
49
|
+
mountedRef.current = false;
|
|
50
|
+
for (const plugin of plugins) {
|
|
51
|
+
if (plugin.lifecycle?.onUnmount) {
|
|
52
|
+
try {
|
|
53
|
+
plugin.lifecycle.onUnmount();
|
|
54
|
+
} catch (err) {
|
|
55
|
+
console.error(`[Rebase] Plugin "${plugin.key}" onUnmount error:`, err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// Only run on mount/unmount — plugins array identity should be stable
|
|
61
|
+
}, []);
|
|
62
|
+
|
|
63
|
+
// ── Auth state change lifecycle ──────────────────────────────────
|
|
64
|
+
const currentUser = context.authController?.user ?? null;
|
|
65
|
+
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
// Skip the initial call — onMount handles that
|
|
68
|
+
if (prevUserRef.current === undefined) {
|
|
69
|
+
prevUserRef.current = currentUser;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Only fire when the user identity actually changes
|
|
74
|
+
const prevUid = prevUserRef.current?.uid;
|
|
75
|
+
const currUid = currentUser?.uid;
|
|
76
|
+
if (prevUid === currUid) return;
|
|
77
|
+
|
|
78
|
+
prevUserRef.current = currentUser;
|
|
79
|
+
|
|
80
|
+
for (const plugin of plugins) {
|
|
81
|
+
if (plugin.lifecycle?.onAuthStateChange) {
|
|
82
|
+
try {
|
|
83
|
+
plugin.lifecycle.onAuthStateChange(currentUser);
|
|
84
|
+
} catch (err) {
|
|
85
|
+
console.error(
|
|
86
|
+
`[Rebase] Plugin "${plugin.key}" onAuthStateChange error:`,
|
|
87
|
+
err
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}, [currentUser, plugins]);
|
|
93
|
+
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { RebasePlugin } from "@rebasepro/types";
|
|
2
|
+
import React from "react";
|
|
3
|
+
;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wraps children with all provider components from plugins that match the given scope.
|
|
7
|
+
*
|
|
8
|
+
* Replaces the 3 copy-pasted `plugins.forEach(plugin => { if (plugin.form?.provider) ... })` patterns
|
|
9
|
+
* in Rebase.tsx, EditViewBinding.tsx, and PopupFormField.tsx.
|
|
10
|
+
*
|
|
11
|
+
* @param plugins - Array of plugins to extract providers from.
|
|
12
|
+
* @param scope - `"root"` or `"form"` — which providers to apply.
|
|
13
|
+
* @param scopeProps - Additional props passed to each provider component.
|
|
14
|
+
* @param children - The content to wrap.
|
|
15
|
+
*
|
|
16
|
+
* @group Core
|
|
17
|
+
*/
|
|
18
|
+
export function PluginProviderStack({
|
|
19
|
+
plugins,
|
|
20
|
+
scope,
|
|
21
|
+
scopeProps,
|
|
22
|
+
children
|
|
23
|
+
}: {
|
|
24
|
+
plugins: RebasePlugin[];
|
|
25
|
+
scope: "root" | "form";
|
|
26
|
+
scopeProps?: Record<string, unknown>;
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
}) {
|
|
29
|
+
const providers = plugins.flatMap(p => p.providers ?? [])
|
|
30
|
+
.filter(p => p.scope === scope);
|
|
31
|
+
|
|
32
|
+
return providers.reduceRight<React.ReactNode>(
|
|
33
|
+
(acc, provider) => (
|
|
34
|
+
<provider.Component {...provider.props} {...scopeProps}>
|
|
35
|
+
{acc}
|
|
36
|
+
</provider.Component>
|
|
37
|
+
),
|
|
38
|
+
children
|
|
39
|
+
);
|
|
40
|
+
}
|