@@ -223,180 +120,27 @@ export function Level4({ user, onLogout, onNavigate, onPreview }: Level4Props) {
diff --git a/src/components/Level5.tsx b/src/components/Level5.tsx
index af8a97ae0..f0d782d88 100644
--- a/src/components/Level5.tsx
+++ b/src/components/Level5.tsx
@@ -1,12 +1,8 @@
import { useState, useEffect } from 'react'
import { Button } from '@/components/ui/button'
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
-import { Badge } from '@/components/ui/badge'
-import { ScrollArea } from '@/components/ui/scroll-area'
-import { Separator } from '@/components/ui/separator'
import {
Dialog,
DialogContent,
@@ -25,11 +21,16 @@ import {
AlertDialogHeader,
AlertDialogTitle,
} from '@/components/ui/alert-dialog'
-import { Crown, Users, House, ArrowsLeftRight, Shield, Eye, SignOut, Buildings, Terminal } from '@phosphor-icons/react'
+import { Crown, Buildings, Users, ArrowsLeftRight, Eye } from '@phosphor-icons/react'
import { toast } from 'sonner'
+import { Level5Header } from './level5/Level5Header'
+import { TenantsTab } from './level5/TenantsTab'
+import { GodUsersTab } from './level5/GodUsersTab'
+import { PowerTransferTab } from './level5/PowerTransferTab'
+import { PreviewTab } from './level5/PreviewTab'
+import { NerdModeIDE } from './NerdModeIDE'
import type { User, AppLevel, Tenant, PowerTransferRequest } from '@/lib/level-types'
import { Database } from '@/lib/database'
-import { NerdModeIDE } from './NerdModeIDE'
import { useKV } from '@github/spark/hooks'
interface Level5Props {
@@ -96,11 +97,12 @@ export function Level5({ user, onLogout, onNavigate, onPreview }: Level5Props) {
toast.success('Homepage assigned to tenant')
}
- const handleInitiateTransfer = () => {
- if (!selectedUserId) {
+ const handleInitiateTransfer = (userId: string) => {
+ if (!userId) {
toast.error('Please select a user to transfer power to')
return
}
+ setSelectedUserId(userId)
setShowConfirmTransfer(true)
}
@@ -126,7 +128,6 @@ export function Level5({ user, onLogout, onNavigate, onPreview }: Level5Props) {
}
setShowConfirmTransfer(false)
- setShowTransferDialog(false)
}
const handleDeleteTenant = async (tenantId: string) => {
@@ -135,43 +136,19 @@ export function Level5({ user, onLogout, onNavigate, onPreview }: Level5Props) {
toast.success('Tenant deleted')
}
+ const handleToggleNerdMode = () => {
+ setNerdMode(!nerdMode)
+ toast.info(nerdMode ? 'Nerd Mode disabled' : 'Nerd Mode enabled')
+ }
+
return (
-
+
@@ -195,242 +172,28 @@ export function Level5({ user, onLogout, onNavigate, onPreview }: Level5Props) {
-
-
-
-
- Tenant Management
-
- Create and manage tenants with custom homepages
-
-
-
setShowCreateTenant(true)} className="bg-purple-600 hover:bg-purple-700">
-
- Create Tenant
-
-
-
-
-
-
- {tenants.length === 0 ? (
-
-
-
No tenants created yet
-
- ) : (
- tenants.map(tenant => {
- const owner = allUsers.find(u => u.id === tenant.ownerId)
- return (
-
-
-
-
- {tenant.name}
-
- Owner: {owner?.username || 'Unknown'}
-
-
-
handleDeleteTenant(tenant.id)}
- >
- Delete
-
-
-
-
-
-
- Created: {new Date(tenant.createdAt).toLocaleDateString()}
-
- {tenant.homepageConfig && (
-
-
- Homepage Configured
-
- )}
-
-
-
- )
- })
- )}
-
-
-
-
+ setShowCreateTenant(true)}
+ onDeleteTenant={handleDeleteTenant}
+ />
-
-
- God-Level Users
-
- All users with God access level
-
-
-
-
-
- {godUsers.map(godUser => (
-
-
-
-
-
-
-
{godUser.username}
-
{godUser.email}
-
-
-
- God
-
-
-
-
- ))}
-
-
-
-
+
-
-
- Transfer Super God Power
-
- Transfer your Super God privileges to another user. You will be downgraded to God.
-
-
-
-
-
-
-
-
Critical Action
-
- This action cannot be undone. Only one Super God can exist at a time. After transfer, you will have God-level access only.
-
-
-
-
-
-
-
-
-
Select User to Transfer Power To:
-
-
- {allUsers
- .filter(u => u.id !== user.id && u.role !== 'supergod')
- .map(u => (
-
setSelectedUserId(u.id)}
- >
-
-
-
-
{u.username}
-
{u.email}
-
-
- {u.role}
-
-
-
-
- ))}
-
-
-
-
-
-
- Initiate Power Transfer
-
-
-
+
-
-
- Preview Application Levels
-
- View how each level appears to different user roles
-
-
-
-
- onPreview(1)}>
-
- Level 1: Public
- Landing page and public content
-
-
-
-
- Preview
-
-
-
-
- onPreview(2)}>
-
- Level 2: User Area
- User dashboard and profile
-
-
-
-
- Preview
-
-
-
-
- onPreview(3)}>
-
- Level 3: Admin Panel
- Data management interface
-
-
-
-
- Preview
-
-
-
-
- onPreview(4)}>
-
- Level 4: God Panel
- System builder interface
-
-
-
-
- Preview
-
-
-
-
-
-
+
diff --git a/src/components/level4/Level4Header.tsx b/src/components/level4/Level4Header.tsx
new file mode 100644
index 000000000..e52bb41ac
--- /dev/null
+++ b/src/components/level4/Level4Header.tsx
@@ -0,0 +1,126 @@
+import { Button } from '@/components/ui/button'
+import { Badge } from '@/components/ui/badge'
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from '@/components/ui/dropdown-menu'
+import { SignOut, Eye, House, Download, Upload, Terminal } from '@phosphor-icons/react'
+
+interface Level4HeaderProps {
+ username: string
+ nerdMode: boolean
+ onNavigate: (level: number) => void
+ onPreview: (level: number) => void
+ onLogout: () => void
+ onToggleNerdMode: () => void
+ onExportConfig: () => void
+ onImportConfig: () => void
+}
+
+export function Level4Header({
+ username,
+ nerdMode,
+ onNavigate,
+ onPreview,
+ onLogout,
+ onToggleNerdMode,
+ onExportConfig,
+ onImportConfig,
+}: Level4HeaderProps) {
+ return (
+
+
+
+
+
+
onNavigate(1)} className="text-sidebar-foreground">
+
+ Home
+
+
+
+
+
+
PREVIEW:
+
onPreview(1)}
+ className="bg-sidebar-accent hover:bg-sidebar-accent/80"
+ >
+
+ Level 1
+
+
onPreview(2)}
+ className="bg-sidebar-accent hover:bg-sidebar-accent/80"
+ >
+
+ Level 2
+
+
onPreview(3)}
+ className="bg-sidebar-accent hover:bg-sidebar-accent/80"
+ >
+
+ Level 3
+
+
+
+
+
+
+
+ Preview
+
+
+
+ onPreview(1)}>
+
+ Level 1 (Public)
+
+ onPreview(2)}>
+
+ Level 2 (User Area)
+
+ onPreview(3)}>
+
+ Level 3 (Admin Panel)
+
+
+
+
+
+
+
+ Nerd
+
+
+
+
+
+
+
+
{username}
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/level4/Level4Summary.tsx b/src/components/level4/Level4Summary.tsx
new file mode 100644
index 000000000..60c127083
--- /dev/null
+++ b/src/components/level4/Level4Summary.tsx
@@ -0,0 +1,44 @@
+import type { AppConfiguration } from '@/lib/level-types'
+
+interface Level4SummaryProps {
+ appConfig: AppConfiguration
+ nerdMode: boolean
+}
+
+export function Level4Summary({ appConfig, nerdMode }: Level4SummaryProps) {
+ return (
+
+
Configuration Summary
+
+
+ Data Models:
+ {appConfig.schemas.length}
+
+
+ Total Fields:
+
+ {appConfig.schemas.reduce((acc, s) => acc + s.fields.length, 0)}
+
+
+ {nerdMode && (
+ <>
+
+ Workflows:
+ {appConfig.workflows.length}
+
+
+ Workflow Nodes:
+
+ {appConfig.workflows.reduce((acc, w) => acc + w.nodes.length, 0)}
+
+
+
+ Lua Scripts:
+ {appConfig.luaScripts.length}
+
+ >
+ )}
+
+
+ )
+}
diff --git a/src/components/level4/Level4Tabs.tsx b/src/components/level4/Level4Tabs.tsx
new file mode 100644
index 000000000..938d4fe75
--- /dev/null
+++ b/src/components/level4/Level4Tabs.tsx
@@ -0,0 +1,165 @@
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
+import { Database as DatabaseIcon, Lightning, Code, BookOpen, HardDrives, MapTrifold, Tree, Users, Gear, Palette, ListDashes, Sparkle, Package } from '@phosphor-icons/react'
+import { SchemaEditorLevel4 } from '@/components/SchemaEditorLevel4'
+import { WorkflowEditor } from '@/components/WorkflowEditor'
+import { LuaEditor } from '@/components/LuaEditor'
+import { LuaSnippetLibrary } from '@/components/LuaSnippetLibrary'
+import { DatabaseManager } from '@/components/DatabaseManager'
+import { PageRoutesManager } from '@/components/PageRoutesManager'
+import { ComponentHierarchyEditor } from '@/components/ComponentHierarchyEditor'
+import { UserManagement } from '@/components/UserManagement'
+import { GodCredentialsSettings } from '@/components/GodCredentialsSettings'
+import { CssClassManager } from '@/components/CssClassManager'
+import { DropdownConfigManager } from '@/components/DropdownConfigManager'
+import { QuickGuide } from '@/components/QuickGuide'
+import { PackageManager } from '@/components/PackageManager'
+import { ThemeEditor } from '@/components/ThemeEditor'
+import { SMTPConfigEditor } from '@/components/SMTPConfigEditor'
+import type { AppConfiguration } from '@/lib/level-types'
+
+interface Level4TabsProps {
+ appConfig: AppConfiguration
+ nerdMode: boolean
+ onSchemasChange: (schemas: any[]) => Promise
+ onWorkflowsChange: (workflows: any[]) => Promise
+ onLuaScriptsChange: (scripts: any[]) => Promise
+}
+
+export function Level4Tabs({
+ appConfig,
+ nerdMode,
+ onSchemasChange,
+ onWorkflowsChange,
+ onLuaScriptsChange,
+}: Level4TabsProps) {
+ return (
+
+
+
+
+ Guide
+
+
+
+ Packages
+
+
+
+ Page Routes
+
+
+
+ Components
+
+
+
+ Users
+
+
+
+ Schemas
+
+ {nerdMode && (
+ <>
+
+
+ Workflows
+
+
+
+ Lua Scripts
+
+
+
+ Snippets
+
+
+
+ CSS Classes
+
+
+
+ Dropdowns
+
+
+
+ Database
+
+ >
+ )}
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {nerdMode && (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )}
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/level5/GodUsersTab.tsx b/src/components/level5/GodUsersTab.tsx
new file mode 100644
index 000000000..f9000912d
--- /dev/null
+++ b/src/components/level5/GodUsersTab.tsx
@@ -0,0 +1,46 @@
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { ScrollArea } from '@/components/ui/scroll-area'
+import { Badge } from '@/components/ui/badge'
+import { Shield, Users } from '@phosphor-icons/react'
+import type { User } from '@/lib/level-types'
+
+interface GodUsersTabProps {
+ godUsers: User[]
+}
+
+export function GodUsersTab({ godUsers }: GodUsersTabProps) {
+ return (
+
+
+ God-Level Users
+
+ All users with God access level
+
+
+
+
+
+ {godUsers.map(godUser => (
+
+
+
+
+
+
+
{godUser.username}
+
{godUser.email}
+
+
+
+ God
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/src/components/level5/Level5Header.tsx b/src/components/level5/Level5Header.tsx
new file mode 100644
index 000000000..c28718cf8
--- /dev/null
+++ b/src/components/level5/Level5Header.tsx
@@ -0,0 +1,47 @@
+import { Button } from '@/components/ui/button'
+import { Badge } from '@/components/ui/badge'
+import { Crown, SignOut, Terminal } from '@phosphor-icons/react'
+
+interface Level5HeaderProps {
+ username: string
+ nerdMode: boolean
+ onLogout: () => void
+ onToggleNerdMode: () => void
+}
+
+export function Level5Header({ username, nerdMode, onLogout, onToggleNerdMode }: Level5HeaderProps) {
+ return (
+
+ )
+}
diff --git a/src/components/level5/PowerTransferTab.tsx b/src/components/level5/PowerTransferTab.tsx
new file mode 100644
index 000000000..614a474bc
--- /dev/null
+++ b/src/components/level5/PowerTransferTab.tsx
@@ -0,0 +1,88 @@
+import { useState } from 'react'
+import { Button } from '@/components/ui/button'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { ScrollArea } from '@/components/ui/scroll-area'
+import { Badge } from '@/components/ui/badge'
+import { Separator } from '@/components/ui/separator'
+import { Alert, AlertDescription } from '@/components/ui/alert'
+import { Crown, ArrowsLeftRight } from '@phosphor-icons/react'
+import type { User } from '@/lib/level-types'
+
+interface PowerTransferTabProps {
+ currentUser: User
+ allUsers: User[]
+ onInitiateTransfer: (userId: string) => void
+}
+
+export function PowerTransferTab({ currentUser, allUsers, onInitiateTransfer }: PowerTransferTabProps) {
+ const [selectedUserId, setSelectedUserId] = useState('')
+
+ return (
+
+
+ Transfer Super God Power
+
+ Transfer your Super God privileges to another user. You will be downgraded to God.
+
+
+
+
+
+
+
+
Critical Action
+
+ This action cannot be undone. Only one Super God can exist at a time. After transfer, you will have God-level access only.
+
+
+
+
+
+
+
+
+
Select User to Transfer Power To:
+
+
+ {allUsers
+ .filter(u => u.id !== currentUser.id && u.role !== 'supergod')
+ .map(u => (
+
setSelectedUserId(u.id)}
+ >
+
+
+
+
{u.username}
+
{u.email}
+
+
+ {u.role}
+
+
+
+
+ ))}
+
+
+
+
+ onInitiateTransfer(selectedUserId)}
+ disabled={!selectedUserId}
+ className="w-full bg-gradient-to-r from-amber-600 to-yellow-600 hover:from-amber-700 hover:to-yellow-700"
+ size="lg"
+ >
+
+ Initiate Power Transfer
+
+
+
+ )
+}
diff --git a/src/components/level5/PreviewTab.tsx b/src/components/level5/PreviewTab.tsx
new file mode 100644
index 000000000..51a25e432
--- /dev/null
+++ b/src/components/level5/PreviewTab.tsx
@@ -0,0 +1,75 @@
+import { Button } from '@/components/ui/button'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Eye } from '@phosphor-icons/react'
+
+interface PreviewTabProps {
+ onPreview: (level: number) => void
+}
+
+export function PreviewTab({ onPreview }: PreviewTabProps) {
+ return (
+
+
+ Preview Application Levels
+
+ View how each level appears to different user roles
+
+
+
+
+ onPreview(1)}>
+
+ Level 1: Public
+ Landing page and public content
+
+
+
+
+ Preview
+
+
+
+
+ onPreview(2)}>
+
+ Level 2: User Area
+ User dashboard and profile
+
+
+
+
+ Preview
+
+
+
+
+ onPreview(3)}>
+
+ Level 3: Admin Panel
+ Data management interface
+
+
+
+
+ Preview
+
+
+
+
+ onPreview(4)}>
+
+ Level 4: God Panel
+ System builder interface
+
+
+
+
+ Preview
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/level5/TenantsTab.tsx b/src/components/level5/TenantsTab.tsx
new file mode 100644
index 000000000..17dfcd9af
--- /dev/null
+++ b/src/components/level5/TenantsTab.tsx
@@ -0,0 +1,84 @@
+import { Button } from '@/components/ui/button'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { ScrollArea } from '@/components/ui/scroll-area'
+import { Badge } from '@/components/ui/badge'
+import { Buildings, House } from '@phosphor-icons/react'
+import type { Tenant, User } from '@/lib/level-types'
+
+interface TenantsTabProps {
+ tenants: Tenant[]
+ allUsers: User[]
+ onCreateTenant: () => void
+ onDeleteTenant: (tenantId: string) => void
+}
+
+export function TenantsTab({ tenants, allUsers, onCreateTenant, onDeleteTenant }: TenantsTabProps) {
+ return (
+
+
+
+
+ Tenant Management
+
+ Create and manage tenants with custom homepages
+
+
+
+
+ Create Tenant
+
+
+
+
+
+
+ {tenants.length === 0 ? (
+
+
+
No tenants created yet
+
+ ) : (
+ tenants.map(tenant => {
+ const owner = allUsers.find(u => u.id === tenant.ownerId)
+ return (
+
+
+
+
+ {tenant.name}
+
+ Owner: {owner?.username || 'Unknown'}
+
+
+
onDeleteTenant(tenant.id)}
+ >
+ Delete
+
+
+
+
+
+
+ Created: {new Date(tenant.createdAt).toLocaleDateString()}
+
+ {tenant.homepageConfig && (
+
+
+ Homepage Configured
+
+ )}
+
+
+
+ )
+ })
+ )}
+
+
+
+
+ )
+}