@object-ui/app-shell 3.3.0 → 3.3.2
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 +73 -0
- package/README.md +22 -2
- package/dist/chrome/CommandPalette.d.ts +16 -0
- package/dist/chrome/CommandPalette.js +74 -0
- package/dist/chrome/ConditionalAuthWrapper.d.ts +23 -0
- package/dist/chrome/ConditionalAuthWrapper.js +135 -0
- package/dist/chrome/ConsoleToaster.d.ts +11 -0
- package/dist/chrome/ConsoleToaster.js +28 -0
- package/dist/chrome/ErrorBoundary.d.ts +39 -0
- package/dist/chrome/ErrorBoundary.js +64 -0
- package/dist/chrome/KeyboardShortcutsDialog.d.ts +7 -0
- package/dist/chrome/KeyboardShortcutsDialog.js +63 -0
- package/dist/chrome/LoadingScreen.d.ts +12 -0
- package/dist/chrome/LoadingScreen.js +44 -0
- package/dist/chrome/OnboardingWalkthrough.d.ts +9 -0
- package/dist/chrome/OnboardingWalkthrough.js +11 -0
- package/dist/chrome/ThemeProvider.d.ts +13 -0
- package/dist/chrome/ThemeProvider.js +37 -0
- package/dist/chrome/index.d.ts +8 -0
- package/dist/chrome/index.js +8 -0
- package/dist/console/AppContent.d.ts +26 -0
- package/dist/console/AppContent.js +266 -0
- package/dist/console/ConsoleShell.d.ts +66 -0
- package/dist/console/ConsoleShell.js +97 -0
- package/dist/console/auth/AuthPageLayout.d.ts +9 -0
- package/dist/console/auth/AuthPageLayout.js +4 -0
- package/dist/console/auth/ForgotPasswordPage.d.ts +4 -0
- package/dist/console/auth/ForgotPasswordPage.js +23 -0
- package/dist/console/auth/LoginPage.d.ts +4 -0
- package/dist/console/auth/LoginPage.js +24 -0
- package/dist/console/auth/RegisterPage.d.ts +4 -0
- package/dist/console/auth/RegisterPage.js +29 -0
- package/dist/console/auth/index.d.ts +4 -0
- package/dist/console/auth/index.js +4 -0
- package/dist/console/home/AppCard.d.ts +14 -0
- package/dist/console/home/AppCard.js +36 -0
- package/dist/console/home/HomeLayout.d.ts +15 -0
- package/dist/console/home/HomeLayout.js +20 -0
- package/dist/console/home/HomePage.d.ts +18 -0
- package/dist/console/home/HomePage.js +54 -0
- package/dist/console/home/QuickActions.d.ts +9 -0
- package/dist/console/home/QuickActions.js +53 -0
- package/dist/console/home/RecentApps.d.ts +13 -0
- package/dist/console/home/RecentApps.js +32 -0
- package/dist/console/home/StarredApps.d.ts +13 -0
- package/dist/console/home/StarredApps.js +29 -0
- package/dist/console/home/index.d.ts +11 -0
- package/dist/console/home/index.js +11 -0
- package/dist/console/organizations/CreateWorkspaceDialog.d.ts +16 -0
- package/dist/console/organizations/CreateWorkspaceDialog.js +71 -0
- package/dist/console/organizations/OrganizationsLayout.d.ts +15 -0
- package/dist/console/organizations/OrganizationsLayout.js +20 -0
- package/dist/console/organizations/OrganizationsPage.d.ts +9 -0
- package/dist/console/organizations/OrganizationsPage.js +76 -0
- package/dist/console/organizations/index.d.ts +8 -0
- package/dist/console/organizations/index.js +8 -0
- package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +7 -0
- package/dist/console/organizations/manage/AcceptInvitationPage.js +100 -0
- package/dist/console/organizations/manage/InvitationsPage.d.ts +6 -0
- package/dist/console/organizations/manage/InvitationsPage.js +107 -0
- package/dist/console/organizations/manage/InviteMemberDialog.d.ts +16 -0
- package/dist/console/organizations/manage/InviteMemberDialog.js +83 -0
- package/dist/console/organizations/manage/MembersPage.d.ts +6 -0
- package/dist/console/organizations/manage/MembersPage.js +89 -0
- package/dist/console/organizations/manage/OrganizationLayout.d.ts +8 -0
- package/dist/console/organizations/manage/OrganizationLayout.js +51 -0
- package/dist/console/organizations/manage/SettingsPage.d.ts +6 -0
- package/dist/console/organizations/manage/SettingsPage.js +141 -0
- package/dist/console/organizations/manage/orgContext.d.ts +5 -0
- package/dist/console/organizations/manage/orgContext.js +4 -0
- package/dist/context/FavoritesProvider.d.ts +50 -0
- package/dist/context/FavoritesProvider.js +129 -0
- package/dist/context/NavigationContext.d.ts +46 -0
- package/dist/context/NavigationContext.js +59 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.js +2 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/useFavorites.d.ts +13 -0
- package/dist/hooks/useFavorites.js +13 -0
- package/dist/hooks/useMetadataService.d.ts +13 -0
- package/dist/hooks/useMetadataService.js +18 -0
- package/dist/hooks/useNavPins.d.ts +16 -0
- package/dist/hooks/useNavPins.js +72 -0
- package/dist/hooks/useNavigationSync.d.ts +82 -0
- package/dist/hooks/useNavigationSync.js +495 -0
- package/dist/hooks/useObjectActions.d.ts +38 -0
- package/dist/hooks/useObjectActions.js +92 -0
- package/dist/hooks/useRecentItems.d.ts +21 -0
- package/dist/hooks/useRecentItems.js +50 -0
- package/dist/hooks/useResponsiveSidebar.d.ts +8 -0
- package/dist/hooks/useResponsiveSidebar.js +28 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +35 -0
- package/dist/layout/ActivityFeed.d.ts +22 -0
- package/dist/layout/ActivityFeed.js +57 -0
- package/dist/layout/AppHeader.d.ts +33 -0
- package/dist/layout/AppHeader.js +182 -0
- package/dist/layout/AppSidebar.d.ts +14 -0
- package/dist/layout/AppSidebar.js +202 -0
- package/dist/layout/AppSwitcher.d.ts +12 -0
- package/dist/layout/AppSwitcher.js +24 -0
- package/dist/layout/AuthPageLayout.d.ts +9 -0
- package/dist/layout/AuthPageLayout.js +4 -0
- package/dist/layout/ConnectionStatus.d.ts +14 -0
- package/dist/layout/ConnectionStatus.js +36 -0
- package/dist/layout/ConsoleFloatingChatbot.d.ts +10 -0
- package/dist/layout/ConsoleFloatingChatbot.js +27 -0
- package/dist/layout/ConsoleLayout.d.ts +22 -0
- package/dist/layout/ConsoleLayout.js +49 -0
- package/dist/layout/LocaleSwitcher.d.ts +7 -0
- package/dist/layout/LocaleSwitcher.js +27 -0
- package/dist/layout/ModeToggle.d.ts +1 -0
- package/dist/layout/ModeToggle.js +10 -0
- package/dist/layout/UnifiedSidebar.d.ts +27 -0
- package/dist/layout/UnifiedSidebar.js +186 -0
- package/dist/layout/index.d.ts +11 -0
- package/dist/layout/index.js +10 -0
- package/dist/providers/AdapterProvider.d.ts +21 -0
- package/dist/providers/AdapterProvider.js +52 -0
- package/dist/providers/ExpressionProvider.d.ts +50 -0
- package/dist/providers/ExpressionProvider.js +67 -0
- package/dist/providers/MetadataProvider.d.ts +18 -0
- package/dist/providers/MetadataProvider.js +324 -0
- package/dist/services/MetadataService.d.ts +119 -0
- package/dist/services/MetadataService.js +211 -0
- package/dist/skeletons/SkeletonDashboard.d.ts +13 -0
- package/dist/skeletons/SkeletonDashboard.js +12 -0
- package/dist/skeletons/SkeletonDetail.d.ts +15 -0
- package/dist/skeletons/SkeletonDetail.js +12 -0
- package/dist/skeletons/SkeletonGrid.d.ts +15 -0
- package/dist/skeletons/SkeletonGrid.js +12 -0
- package/dist/skeletons/index.d.ts +3 -0
- package/dist/skeletons/index.js +3 -0
- package/dist/utils/getIcon.d.ts +24 -0
- package/dist/utils/getIcon.js +87 -0
- package/dist/utils/index.d.ts +33 -0
- package/dist/utils/index.js +62 -0
- package/dist/utils/metadataConverters.d.ts +78 -0
- package/dist/utils/metadataConverters.js +74 -0
- package/dist/views/ActionConfirmDialog.d.ts +22 -0
- package/dist/views/ActionConfirmDialog.js +22 -0
- package/dist/views/ActionParamDialog.d.ts +23 -0
- package/dist/views/ActionParamDialog.js +67 -0
- package/dist/views/DashboardView.d.ts +9 -0
- package/dist/views/DashboardView.js +357 -0
- package/dist/views/DesignDrawer.d.ts +28 -0
- package/dist/views/DesignDrawer.js +51 -0
- package/dist/views/MetadataInspector.d.ts +40 -0
- package/dist/views/MetadataInspector.js +69 -0
- package/dist/views/ObjectView.d.ts +11 -0
- package/dist/views/ObjectView.js +769 -0
- package/dist/views/PageView.d.ts +6 -0
- package/dist/views/PageView.js +49 -0
- package/dist/views/RecordDetailView.d.ts +14 -0
- package/dist/views/RecordDetailView.js +508 -0
- package/dist/views/ReportView.d.ts +4 -0
- package/dist/views/ReportView.js +285 -0
- package/dist/views/SearchResultsPage.d.ts +9 -0
- package/dist/views/SearchResultsPage.js +107 -0
- package/dist/views/ViewConfigPanel.d.ts +56 -0
- package/dist/views/ViewConfigPanel.js +91 -0
- package/dist/views/index.d.ts +11 -0
- package/dist/views/index.js +11 -0
- package/package.json +59 -11
- package/.turbo/turbo-build.log +0 -4
- package/src/components/AppShell.tsx +0 -31
- package/src/components/DashboardRenderer.tsx +0 -36
- package/src/components/FormRenderer.tsx +0 -71
- package/src/components/ObjectRenderer.tsx +0 -122
- package/src/components/PageRenderer.tsx +0 -28
- package/src/index.ts +0 -20
- package/src/types.ts +0 -78
- package/tsconfig.json +0 -20
- package/tsconfig.tsbuildinfo +0 -1
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/app-shell",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Minimal application shell for ObjectUI - framework-agnostic rendering engine",
|
|
7
|
-
"homepage": "https://www.objectui.org",
|
|
7
|
+
"homepage": "https://www.objectui.org/docs/layout/app-shell",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "https://github.com/objectstack-ai/objectui.git",
|
|
10
|
+
"url": "git+https://github.com/objectstack-ai/objectui.git",
|
|
11
11
|
"directory": "packages/app-shell"
|
|
12
12
|
},
|
|
13
13
|
"bugs": {
|
|
@@ -24,22 +24,70 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"@object-ui/
|
|
30
|
-
"@object-ui/
|
|
31
|
-
"@object-ui/
|
|
32
|
-
"@object-ui/
|
|
27
|
+
"lucide-react": "^0.544.0",
|
|
28
|
+
"sonner": "^2.0.7",
|
|
29
|
+
"@object-ui/auth": "3.3.2",
|
|
30
|
+
"@object-ui/collaboration": "3.3.2",
|
|
31
|
+
"@object-ui/components": "3.3.2",
|
|
32
|
+
"@object-ui/core": "3.3.2",
|
|
33
|
+
"@object-ui/data-objectstack": "3.3.2",
|
|
34
|
+
"@object-ui/fields": "3.3.2",
|
|
35
|
+
"@object-ui/i18n": "3.3.2",
|
|
36
|
+
"@object-ui/layout": "3.3.2",
|
|
37
|
+
"@object-ui/permissions": "3.3.2",
|
|
38
|
+
"@object-ui/react": "3.3.2",
|
|
39
|
+
"@object-ui/types": "3.3.2"
|
|
33
40
|
},
|
|
34
41
|
"peerDependencies": {
|
|
35
42
|
"react": "^18.0.0 || ^19.0.0",
|
|
36
|
-
"react-dom": "^18.0.0 || ^19.0.0"
|
|
43
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
44
|
+
"react-router-dom": "^6.0.0 || ^7.0.0",
|
|
45
|
+
"@object-ui/plugin-calendar": "3.3.2",
|
|
46
|
+
"@object-ui/plugin-charts": "3.3.2",
|
|
47
|
+
"@object-ui/plugin-chatbot": "3.3.2",
|
|
48
|
+
"@object-ui/plugin-dashboard": "3.3.2",
|
|
49
|
+
"@object-ui/plugin-designer": "3.3.2",
|
|
50
|
+
"@object-ui/plugin-detail": "3.3.2",
|
|
51
|
+
"@object-ui/plugin-form": "3.3.2",
|
|
52
|
+
"@object-ui/plugin-grid": "3.3.2",
|
|
53
|
+
"@object-ui/plugin-kanban": "3.3.2",
|
|
54
|
+
"@object-ui/plugin-list": "3.3.2",
|
|
55
|
+
"@object-ui/plugin-report": "3.3.2",
|
|
56
|
+
"@object-ui/plugin-view": "3.3.2"
|
|
37
57
|
},
|
|
38
58
|
"devDependencies": {
|
|
59
|
+
"@types/node": "^25.6.0",
|
|
39
60
|
"@types/react": "19.2.14",
|
|
40
61
|
"@types/react-dom": "19.2.3",
|
|
41
|
-
"
|
|
62
|
+
"react": "19.2.5",
|
|
63
|
+
"react-dom": "19.2.5",
|
|
64
|
+
"react-router-dom": "^7.14.2",
|
|
65
|
+
"sonner": "^2.0.7",
|
|
66
|
+
"typescript": "^6.0.3",
|
|
67
|
+
"vite": "^8.0.10"
|
|
42
68
|
},
|
|
69
|
+
"keywords": [
|
|
70
|
+
"objectui",
|
|
71
|
+
"sdui",
|
|
72
|
+
"schema-driven-ui",
|
|
73
|
+
"react",
|
|
74
|
+
"tailwind",
|
|
75
|
+
"shadcn",
|
|
76
|
+
"objectstack",
|
|
77
|
+
"app-shell",
|
|
78
|
+
"renderer",
|
|
79
|
+
"application-shell"
|
|
80
|
+
],
|
|
81
|
+
"author": "ObjectStack Team <team@objectstack.ai>",
|
|
82
|
+
"publishConfig": {
|
|
83
|
+
"access": "public"
|
|
84
|
+
},
|
|
85
|
+
"files": [
|
|
86
|
+
"dist",
|
|
87
|
+
"README.md",
|
|
88
|
+
"CHANGELOG.md",
|
|
89
|
+
"LICENSE"
|
|
90
|
+
],
|
|
43
91
|
"scripts": {
|
|
44
92
|
"build": "tsc",
|
|
45
93
|
"test": "vitest run",
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import type { AppShellProps } from '../types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* AppShell - Minimal layout container
|
|
6
|
-
*
|
|
7
|
-
* Provides basic application structure without routing or console-specific logic.
|
|
8
|
-
* Third-party systems can customize or replace this with their own layout.
|
|
9
|
-
*/
|
|
10
|
-
export function AppShell({
|
|
11
|
-
sidebar,
|
|
12
|
-
header,
|
|
13
|
-
footer,
|
|
14
|
-
children,
|
|
15
|
-
className = '',
|
|
16
|
-
}: AppShellProps): ReactNode {
|
|
17
|
-
return (
|
|
18
|
-
<div className={`app-shell flex h-screen flex-col ${className}`}>
|
|
19
|
-
{header && <div className="app-shell-header">{header}</div>}
|
|
20
|
-
<div className="app-shell-body flex flex-1 overflow-hidden">
|
|
21
|
-
{sidebar && (
|
|
22
|
-
<div className="app-shell-sidebar border-r">{sidebar}</div>
|
|
23
|
-
)}
|
|
24
|
-
<main className="app-shell-main flex-1 overflow-auto">
|
|
25
|
-
{children}
|
|
26
|
-
</main>
|
|
27
|
-
</div>
|
|
28
|
-
{footer && <div className="app-shell-footer">{footer}</div>}
|
|
29
|
-
</div>
|
|
30
|
-
);
|
|
31
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { SchemaRendererProvider } from '@object-ui/react';
|
|
2
|
-
import type { DashboardRendererProps } from '../types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* DashboardRenderer - Renders dashboard layouts from schema
|
|
6
|
-
*
|
|
7
|
-
* Framework-agnostic component that renders a dashboard based on JSON schema.
|
|
8
|
-
* Delegates to registered dashboard plugins.
|
|
9
|
-
*/
|
|
10
|
-
export function DashboardRenderer({
|
|
11
|
-
schema,
|
|
12
|
-
dataSource,
|
|
13
|
-
dashboardName,
|
|
14
|
-
}: DashboardRendererProps) {
|
|
15
|
-
if (!schema) {
|
|
16
|
-
return (
|
|
17
|
-
<div className="flex h-full items-center justify-center">
|
|
18
|
-
<div className="text-muted-foreground">No dashboard schema provided</div>
|
|
19
|
-
</div>
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<SchemaRendererProvider dataSource={dataSource}>
|
|
25
|
-
<div className="dashboard-renderer h-full p-4">
|
|
26
|
-
<h1 className="mb-4 text-2xl font-bold">
|
|
27
|
-
{schema.title || dashboardName || 'Dashboard'}
|
|
28
|
-
</h1>
|
|
29
|
-
{/* TODO: Integrate with actual SchemaRenderer for dashboard */}
|
|
30
|
-
<div className="text-muted-foreground">
|
|
31
|
-
Dashboard rendering: {schema.title || dashboardName}
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
</SchemaRendererProvider>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { SchemaRendererProvider } from '@object-ui/react';
|
|
2
|
-
import type { FormRendererProps } from '../types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* FormRenderer - Renders forms (modal or inline)
|
|
6
|
-
*
|
|
7
|
-
* Framework-agnostic component that renders a form based on schema.
|
|
8
|
-
* Handles both create and edit modes.
|
|
9
|
-
*/
|
|
10
|
-
export function FormRenderer({
|
|
11
|
-
schema,
|
|
12
|
-
dataSource,
|
|
13
|
-
mode = 'create',
|
|
14
|
-
recordId,
|
|
15
|
-
onSuccess,
|
|
16
|
-
onCancel,
|
|
17
|
-
objectDef,
|
|
18
|
-
}: FormRendererProps) {
|
|
19
|
-
if (!schema) {
|
|
20
|
-
return (
|
|
21
|
-
<div className="flex items-center justify-center p-4">
|
|
22
|
-
<div className="text-muted-foreground">No form schema provided</div>
|
|
23
|
-
</div>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const handleSubmit = async (data: any) => {
|
|
28
|
-
try {
|
|
29
|
-
if (mode === 'create' && objectDef) {
|
|
30
|
-
const result = await dataSource.create(objectDef.name, data);
|
|
31
|
-
onSuccess?.(result);
|
|
32
|
-
} else if (mode === 'edit' && recordId && objectDef) {
|
|
33
|
-
const result = await dataSource.update(objectDef.name, recordId, data);
|
|
34
|
-
onSuccess?.(result);
|
|
35
|
-
}
|
|
36
|
-
} catch (error) {
|
|
37
|
-
console.error('Form submission error:', error);
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<SchemaRendererProvider dataSource={dataSource}>
|
|
43
|
-
<div className="form-renderer p-4">
|
|
44
|
-
<h2 className="mb-4 text-xl font-semibold">
|
|
45
|
-
{schema.title || (mode === 'create' ? 'Create Record' : 'Edit Record')}
|
|
46
|
-
</h2>
|
|
47
|
-
{/* TODO: Integrate with actual form renderer */}
|
|
48
|
-
<div className="text-muted-foreground">
|
|
49
|
-
Form rendering in {mode} mode
|
|
50
|
-
{recordId && ` for record ${recordId}`}
|
|
51
|
-
</div>
|
|
52
|
-
<div className="mt-4 flex gap-2">
|
|
53
|
-
<button
|
|
54
|
-
onClick={() => handleSubmit({})}
|
|
55
|
-
className="rounded bg-primary px-4 py-2 text-primary-foreground"
|
|
56
|
-
>
|
|
57
|
-
Save
|
|
58
|
-
</button>
|
|
59
|
-
{onCancel && (
|
|
60
|
-
<button
|
|
61
|
-
onClick={onCancel}
|
|
62
|
-
className="rounded border px-4 py-2"
|
|
63
|
-
>
|
|
64
|
-
Cancel
|
|
65
|
-
</button>
|
|
66
|
-
)}
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
</SchemaRendererProvider>
|
|
70
|
-
);
|
|
71
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
2
|
-
import { SchemaRendererProvider } from '@object-ui/react';
|
|
3
|
-
import type { ObjectRendererProps } from '../types';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* ObjectRenderer - Renders object views (Grid, Kanban, List, etc.)
|
|
7
|
-
*
|
|
8
|
-
* Framework-agnostic component that renders an object view based on schema.
|
|
9
|
-
* Supports all view types registered in the ComponentRegistry.
|
|
10
|
-
*/
|
|
11
|
-
export function ObjectRenderer({
|
|
12
|
-
objectName,
|
|
13
|
-
viewId,
|
|
14
|
-
dataSource,
|
|
15
|
-
onRecordClick: _onRecordClick,
|
|
16
|
-
onEdit: _onEdit,
|
|
17
|
-
objectDef: externalObjectDef,
|
|
18
|
-
refreshKey = 0,
|
|
19
|
-
}: ObjectRendererProps) {
|
|
20
|
-
const [objectDef, setObjectDef] = useState(externalObjectDef);
|
|
21
|
-
const [loading, setLoading] = useState(!externalObjectDef);
|
|
22
|
-
const [error, setError] = useState<string | null>(null);
|
|
23
|
-
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
if (externalObjectDef) {
|
|
26
|
-
setObjectDef(externalObjectDef);
|
|
27
|
-
setLoading(false);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Fetch object metadata if not provided
|
|
32
|
-
if (dataSource.getMetadata) {
|
|
33
|
-
setLoading(true);
|
|
34
|
-
dataSource
|
|
35
|
-
.getMetadata()
|
|
36
|
-
.then((metadata: any) => {
|
|
37
|
-
const obj = metadata.objects?.find(
|
|
38
|
-
(o: any) => o.name === objectName
|
|
39
|
-
);
|
|
40
|
-
if (obj) {
|
|
41
|
-
setObjectDef(obj);
|
|
42
|
-
setError(null);
|
|
43
|
-
} else {
|
|
44
|
-
setError(`Object "${objectName}" not found`);
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
.catch((err: Error) => {
|
|
48
|
-
setError(err.message);
|
|
49
|
-
})
|
|
50
|
-
.finally(() => {
|
|
51
|
-
setLoading(false);
|
|
52
|
-
});
|
|
53
|
-
} else {
|
|
54
|
-
setError('Data source does not support metadata fetching');
|
|
55
|
-
setLoading(false);
|
|
56
|
-
}
|
|
57
|
-
}, [objectName, dataSource, externalObjectDef]);
|
|
58
|
-
|
|
59
|
-
if (loading) {
|
|
60
|
-
return (
|
|
61
|
-
<div className="flex h-full items-center justify-center">
|
|
62
|
-
<div className="text-muted-foreground">Loading...</div>
|
|
63
|
-
</div>
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (error) {
|
|
68
|
-
return (
|
|
69
|
-
<div className="flex h-full items-center justify-center">
|
|
70
|
-
<div className="text-destructive">Error: {error}</div>
|
|
71
|
-
</div>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (!objectDef) {
|
|
76
|
-
return (
|
|
77
|
-
<div className="flex h-full items-center justify-center">
|
|
78
|
-
<div className="text-muted-foreground">
|
|
79
|
-
Object definition not found
|
|
80
|
-
</div>
|
|
81
|
-
</div>
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Build view schema
|
|
86
|
-
const viewSchema = buildObjectViewSchema(objectDef, viewId);
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
<SchemaRendererProvider dataSource={dataSource}>
|
|
90
|
-
<div className="object-renderer h-full" key={refreshKey}>
|
|
91
|
-
{/* Render using SchemaRenderer from @object-ui/react */}
|
|
92
|
-
{/* The actual implementation will delegate to registered view plugins */}
|
|
93
|
-
<div className="h-full p-4">
|
|
94
|
-
<h1 className="mb-4 text-2xl font-bold">
|
|
95
|
-
{objectDef.label || objectDef.name}
|
|
96
|
-
</h1>
|
|
97
|
-
{/* TODO: Integrate with actual SchemaRenderer once available */}
|
|
98
|
-
<div className="text-muted-foreground">
|
|
99
|
-
View rendering for {objectName} (viewId: {viewId || 'default'})
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
</SchemaRendererProvider>
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Helper to build view schema from object definition
|
|
109
|
-
*/
|
|
110
|
-
function buildObjectViewSchema(objectDef: any, viewId?: string) {
|
|
111
|
-
// Find the requested view or use default
|
|
112
|
-
const view = viewId
|
|
113
|
-
? objectDef.views?.find((v: any) => v.id === viewId || v.name === viewId)
|
|
114
|
-
: objectDef.views?.[0];
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
type: view?.type || 'grid',
|
|
118
|
-
objectName: objectDef.name,
|
|
119
|
-
viewId: view?.id,
|
|
120
|
-
...view,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { PageRendererProps } from '../types';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PageRenderer - Renders custom page schemas
|
|
5
|
-
*
|
|
6
|
-
* Framework-agnostic component that renders a page based on JSON schema.
|
|
7
|
-
*/
|
|
8
|
-
export function PageRenderer({ schema, pageName }: PageRendererProps) {
|
|
9
|
-
if (!schema) {
|
|
10
|
-
return (
|
|
11
|
-
<div className="flex h-full items-center justify-center">
|
|
12
|
-
<div className="text-muted-foreground">No page schema provided</div>
|
|
13
|
-
</div>
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<div className="page-renderer h-full p-4">
|
|
19
|
-
<h1 className="mb-4 text-2xl font-bold">
|
|
20
|
-
{schema.title || pageName || 'Page'}
|
|
21
|
-
</h1>
|
|
22
|
-
{/* TODO: Integrate with actual SchemaRenderer for page */}
|
|
23
|
-
<div className="text-muted-foreground">
|
|
24
|
-
Page rendering: {schema.title || pageName}
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
);
|
|
28
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @object-ui/app-shell
|
|
3
|
-
*
|
|
4
|
-
* Minimal Application Shell for ObjectUI
|
|
5
|
-
* Framework-agnostic rendering engine for third-party integration
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export { AppShell } from './components/AppShell';
|
|
9
|
-
export { ObjectRenderer } from './components/ObjectRenderer';
|
|
10
|
-
export { DashboardRenderer } from './components/DashboardRenderer';
|
|
11
|
-
export { PageRenderer } from './components/PageRenderer';
|
|
12
|
-
export { FormRenderer } from './components/FormRenderer';
|
|
13
|
-
|
|
14
|
-
export type {
|
|
15
|
-
AppShellProps,
|
|
16
|
-
ObjectRendererProps,
|
|
17
|
-
DashboardRendererProps,
|
|
18
|
-
PageRendererProps,
|
|
19
|
-
FormRendererProps,
|
|
20
|
-
} from './types';
|
package/src/types.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Generic data source interface
|
|
5
|
-
* Third-party systems can implement this to connect their own backends
|
|
6
|
-
*/
|
|
7
|
-
export interface DataSource {
|
|
8
|
-
find(objectName: string, params?: any): Promise<any>;
|
|
9
|
-
findOne(objectName: string, id: string, params?: any): Promise<any>;
|
|
10
|
-
create(objectName: string, data: any): Promise<any>;
|
|
11
|
-
update(objectName: string, id: string, data: any): Promise<any>;
|
|
12
|
-
delete(objectName: string, id: string): Promise<void>;
|
|
13
|
-
getMetadata?(): Promise<any>;
|
|
14
|
-
[key: string]: any; // Allow additional methods
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface AppShellProps {
|
|
18
|
-
/** Sidebar component (optional) */
|
|
19
|
-
sidebar?: ReactNode;
|
|
20
|
-
/** Header component (optional) */
|
|
21
|
-
header?: ReactNode;
|
|
22
|
-
/** Footer component (optional) */
|
|
23
|
-
footer?: ReactNode;
|
|
24
|
-
/** Main content */
|
|
25
|
-
children: ReactNode;
|
|
26
|
-
/** Custom className */
|
|
27
|
-
className?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface ObjectRendererProps {
|
|
31
|
-
/** Object API name */
|
|
32
|
-
objectName: string;
|
|
33
|
-
/** View ID (optional) */
|
|
34
|
-
viewId?: string;
|
|
35
|
-
/** Data source for CRUD operations */
|
|
36
|
-
dataSource: DataSource;
|
|
37
|
-
/** Callback when a record is clicked */
|
|
38
|
-
onRecordClick?: (record: any) => void;
|
|
39
|
-
/** Callback when edit is triggered */
|
|
40
|
-
onEdit?: (record: any) => void;
|
|
41
|
-
/** Object metadata (optional, will fetch if not provided) */
|
|
42
|
-
objectDef?: any;
|
|
43
|
-
/** Refresh key to force re-render */
|
|
44
|
-
refreshKey?: number;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface DashboardRendererProps {
|
|
48
|
-
/** Dashboard schema */
|
|
49
|
-
schema: any;
|
|
50
|
-
/** Data source for widgets */
|
|
51
|
-
dataSource: DataSource;
|
|
52
|
-
/** Dashboard name */
|
|
53
|
-
dashboardName?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface PageRendererProps {
|
|
57
|
-
/** Page schema */
|
|
58
|
-
schema: any;
|
|
59
|
-
/** Page name */
|
|
60
|
-
pageName?: string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface FormRendererProps {
|
|
64
|
-
/** Form schema */
|
|
65
|
-
schema: any;
|
|
66
|
-
/** Data source for form submission */
|
|
67
|
-
dataSource: DataSource;
|
|
68
|
-
/** Form mode */
|
|
69
|
-
mode?: 'create' | 'edit';
|
|
70
|
-
/** Record ID (for edit mode) */
|
|
71
|
-
recordId?: string;
|
|
72
|
-
/** Success callback */
|
|
73
|
-
onSuccess?: (result: any) => void;
|
|
74
|
-
/** Cancel callback */
|
|
75
|
-
onCancel?: () => void;
|
|
76
|
-
/** Object definition */
|
|
77
|
-
objectDef?: any;
|
|
78
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "dist",
|
|
5
|
-
"rootDir": "src",
|
|
6
|
-
"jsx": "react-jsx",
|
|
7
|
-
"lib": ["ES2020", "DOM"],
|
|
8
|
-
"noEmit": false,
|
|
9
|
-
"declaration": true,
|
|
10
|
-
"composite": true
|
|
11
|
-
},
|
|
12
|
-
"include": ["src"],
|
|
13
|
-
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.test.tsx"],
|
|
14
|
-
"references": [
|
|
15
|
-
{ "path": "../types" },
|
|
16
|
-
{ "path": "../core" },
|
|
17
|
-
{ "path": "../react" },
|
|
18
|
-
{ "path": "../components" }
|
|
19
|
-
]
|
|
20
|
-
}
|