mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 14:25:02 +00:00
431 lines
7.7 KiB
Markdown
431 lines
7.7 KiB
Markdown
# Quick Reference: Data-Driven Development
|
|
|
|
## Adding Content (Zero TypeScript Required!)
|
|
|
|
### Add a New Page
|
|
|
|
```typescript
|
|
// Option 1: Via Level 4/5 GUI (future)
|
|
// Use visual page builder
|
|
|
|
// Option 2: In seed-data/pages.ts
|
|
const newPage = {
|
|
id: 'page_my_page',
|
|
level: 2,
|
|
title: 'My Page',
|
|
layout: 'dashboard',
|
|
components: [
|
|
{
|
|
id: 'card_1',
|
|
type: 'Card',
|
|
props: { className: 'p-6' },
|
|
children: [
|
|
{
|
|
id: 'title',
|
|
type: 'Heading',
|
|
props: { level: 2, children: 'Hello World' },
|
|
children: []
|
|
}
|
|
]
|
|
}
|
|
],
|
|
permissions: { requiresAuth: true }
|
|
}
|
|
```
|
|
|
|
### Add a Lua Script
|
|
|
|
```typescript
|
|
// In seed-data/scripts.ts
|
|
{
|
|
id: 'script_my_function',
|
|
name: 'My Function',
|
|
code: `
|
|
function myFunction(param1, param2)
|
|
return param1 + param2
|
|
end
|
|
return myFunction
|
|
`,
|
|
parameters: [
|
|
{ name: 'param1', type: 'number' },
|
|
{ name: 'param2', type: 'number' }
|
|
],
|
|
returnType: 'number'
|
|
}
|
|
```
|
|
|
|
### Add a Workflow
|
|
|
|
```typescript
|
|
// In seed-data/workflows.ts
|
|
{
|
|
id: 'workflow_my_process',
|
|
name: 'My Process',
|
|
enabled: true,
|
|
nodes: [
|
|
{
|
|
id: 'step1',
|
|
type: 'action',
|
|
label: 'Do Something',
|
|
config: { action: 'my_action' },
|
|
position: { x: 100, y: 100 }
|
|
}
|
|
],
|
|
edges: []
|
|
}
|
|
```
|
|
|
|
### Add a Component Config
|
|
|
|
```typescript
|
|
// In seed-data/components.ts
|
|
{
|
|
id: 'config_my_button',
|
|
componentId: 'node_my_button',
|
|
props: {
|
|
children: 'Click Me',
|
|
variant: 'primary'
|
|
},
|
|
styles: {},
|
|
events: {
|
|
onClick: 'script_handle_click'
|
|
}
|
|
}
|
|
```
|
|
|
|
## File Locations
|
|
|
|
```
|
|
/src/seed-data/ # Add content here
|
|
├── pages.ts # New pages
|
|
├── scripts.ts # New Lua scripts
|
|
├── workflows.ts # New workflows
|
|
├── components.ts # Component configs
|
|
└── users.ts # New users
|
|
|
|
/src/lib/ # Infrastructure (don't modify)
|
|
├── database.ts
|
|
├── lua-engine.ts
|
|
└── page-renderer.ts
|
|
|
|
/src/components/ # Custom components (rarely needed)
|
|
└── GenericPage.tsx # Already handles everything
|
|
```
|
|
|
|
## Component Types Available
|
|
|
|
Use these in `type` field:
|
|
|
|
### Layout
|
|
- Container
|
|
- Card, CardHeader, CardContent
|
|
- Stack (vertical)
|
|
- Grid
|
|
|
|
### Text
|
|
- Heading (level 1-6)
|
|
- Text
|
|
- Label
|
|
|
|
### Input
|
|
- Input
|
|
- Textarea
|
|
- Select
|
|
- Checkbox
|
|
- Switch
|
|
|
|
### Action
|
|
- Button
|
|
- IconButton
|
|
|
|
### Display
|
|
- Avatar
|
|
- Badge
|
|
- Alert
|
|
- Separator
|
|
|
|
### Navigation
|
|
- Tabs, TabsList, TabsTrigger, TabsContent
|
|
- Accordion
|
|
- Breadcrumb
|
|
|
|
### Data
|
|
- Table
|
|
- DataTable
|
|
- Chart
|
|
|
|
### Feedback
|
|
- Toast (via `toast()` function)
|
|
- Progress
|
|
- Skeleton
|
|
- Spinner
|
|
|
|
## Lua Context
|
|
|
|
Available in all Lua scripts:
|
|
|
|
```lua
|
|
-- User info
|
|
context.user.id
|
|
context.user.username
|
|
context.user.email
|
|
context.user.role
|
|
|
|
-- Page info
|
|
context.page.id
|
|
context.page.level
|
|
context.page.title
|
|
|
|
-- State management
|
|
context.state.myValue
|
|
context.setState({ myValue = "new value" })
|
|
|
|
-- Database access (via exported functions)
|
|
-- Call Database methods through exposed API
|
|
|
|
-- Navigation
|
|
-- Trigger workflow: workflow_navigate_to_page
|
|
|
|
-- Utilities
|
|
print("Debug message")
|
|
os.time()
|
|
string.format()
|
|
math.floor()
|
|
table.insert()
|
|
```
|
|
|
|
## Layouts
|
|
|
|
Choose one in page definition:
|
|
|
|
### `default`
|
|
Standard page with optional header/footer.
|
|
|
|
### `sidebar`
|
|
Persistent side navigation.
|
|
|
|
### `dashboard`
|
|
Full app layout (sidebar + header + content).
|
|
|
|
### `blank`
|
|
No wrapper, full control.
|
|
|
|
## Permissions
|
|
|
|
```typescript
|
|
permissions: {
|
|
requiresAuth: true, // Must be logged in
|
|
requiredRole: 'admin', // Minimum role
|
|
customCheck: 'script_check_perm' // Lua script for custom logic
|
|
}
|
|
```
|
|
|
|
## Events
|
|
|
|
Bind events to components:
|
|
|
|
```typescript
|
|
events: {
|
|
onClick: 'script_handle_click',
|
|
onChange: 'script_handle_change',
|
|
onSubmit: 'workflow_submit_form'
|
|
}
|
|
```
|
|
|
|
## Workflow Node Types
|
|
|
|
### `trigger`
|
|
Starts the workflow (user action, timer, etc.)
|
|
|
|
### `action`
|
|
Performs an operation (create record, send email, etc.)
|
|
|
|
### `condition`
|
|
Branches based on condition (if/else)
|
|
|
|
### `lua`
|
|
Executes Lua script
|
|
|
|
### `transform`
|
|
Transforms data from one shape to another
|
|
|
|
## Common Patterns
|
|
|
|
### Page with Form
|
|
```typescript
|
|
{
|
|
id: 'contact_form',
|
|
type: 'Card',
|
|
children: [
|
|
{ type: 'Input', props: { id: 'name', placeholder: 'Name' }},
|
|
{ type: 'Input', props: { id: 'email', placeholder: 'Email' }},
|
|
{ type: 'Textarea', props: { id: 'message', placeholder: 'Message' }},
|
|
{
|
|
type: 'Button',
|
|
props: { children: 'Submit' },
|
|
events: { onClick: 'workflow_submit_contact_form' }
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Page with Data Table
|
|
```typescript
|
|
{
|
|
id: 'users_table',
|
|
type: 'DataTable',
|
|
props: {
|
|
data: '{{lua:getUsers()}}',
|
|
columns: [
|
|
{ key: 'username', label: 'Username' },
|
|
{ key: 'email', label: 'Email' },
|
|
{ key: 'role', label: 'Role' }
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Page with Tabs
|
|
```typescript
|
|
{
|
|
id: 'settings_tabs',
|
|
type: 'Tabs',
|
|
props: { defaultValue: 'profile' },
|
|
children: [
|
|
{
|
|
type: 'TabsList',
|
|
children: [
|
|
{ type: 'TabsTrigger', props: { value: 'profile', children: 'Profile' }},
|
|
{ type: 'TabsTrigger', props: { value: 'security', children: 'Security' }}
|
|
]
|
|
},
|
|
{
|
|
type: 'TabsContent',
|
|
props: { value: 'profile' },
|
|
children: [ /* Profile content */ ]
|
|
},
|
|
{
|
|
type: 'TabsContent',
|
|
props: { value: 'security' },
|
|
children: [ /* Security content */ ]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Dynamic Content with Lua
|
|
```typescript
|
|
{
|
|
id: 'welcome_message',
|
|
type: 'Text',
|
|
props: {
|
|
children: '{{lua:generateWelcome(user.username)}}'
|
|
}
|
|
}
|
|
```
|
|
|
|
### Conditional Rendering
|
|
```typescript
|
|
{
|
|
id: 'admin_panel',
|
|
type: 'Card',
|
|
conditionalRendering: {
|
|
condition: "user.role === 'admin'",
|
|
luaScriptId: 'script_check_admin'
|
|
},
|
|
children: [ /* Admin content */ ]
|
|
}
|
|
```
|
|
|
|
## Database Operations
|
|
|
|
Available methods (call via Lua or workflows):
|
|
|
|
```typescript
|
|
// Users
|
|
Database.getUsers()
|
|
Database.addUser(user)
|
|
Database.updateUser(id, updates)
|
|
|
|
// Pages
|
|
Database.getPages()
|
|
Database.addPage(page)
|
|
Database.updatePage(id, updates)
|
|
|
|
// Scripts
|
|
Database.getLuaScripts()
|
|
Database.addLuaScript(script)
|
|
|
|
// Workflows
|
|
Database.getWorkflows()
|
|
Database.addWorkflow(workflow)
|
|
|
|
// Components
|
|
Database.getComponentConfigs()
|
|
Database.addComponentConfig(config)
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Test Individual Module
|
|
```typescript
|
|
import { initializeScripts } from '@/seed-data/scripts'
|
|
import { Database } from '@/lib/database'
|
|
|
|
test('Scripts initialize', async () => {
|
|
await initializeScripts()
|
|
const scripts = await Database.getLuaScripts()
|
|
expect(scripts.length).toBeGreaterThan(0)
|
|
})
|
|
```
|
|
|
|
### Clear Database
|
|
```typescript
|
|
// Delete all KV data
|
|
await window.spark.kv.delete('db_users')
|
|
await window.spark.kv.delete('db_pages')
|
|
await window.spark.kv.delete('db_lua_scripts')
|
|
// ... etc
|
|
|
|
// Then refresh page to reinitialize
|
|
```
|
|
|
|
## Tips
|
|
|
|
### 1. Start with Examples
|
|
Copy existing pages/scripts from seed data and modify.
|
|
|
|
### 2. Use Descriptive IDs
|
|
- `page_user_dashboard` not `page_1`
|
|
- `script_validate_email` not `script_abc`
|
|
|
|
### 3. Test Lua Scripts
|
|
Use Lua REPL or test in Level 4/5 Lua editor.
|
|
|
|
### 4. Keep Components Simple
|
|
Break complex UIs into multiple components.
|
|
|
|
### 5. Use Workflows for Complex Logic
|
|
Don't put everything in one Lua script.
|
|
|
|
### 6. Document Your Data
|
|
Add comments explaining complex configurations.
|
|
|
|
## Documentation
|
|
|
|
- `DATA_DRIVEN_ARCHITECTURE.md` - Full architecture guide
|
|
- `MODULAR_SEED_DATA_GUIDE.md` - Seed data details
|
|
- `TYPESCRIPT_REDUCTION_GUIDE.md` - Migration roadmap
|
|
- `ITERATION_25_SUMMARY.md` - What was built
|
|
|
|
## Support
|
|
|
|
Questions? Check:
|
|
1. Documentation files (above)
|
|
2. Example seed data in `/src/seed-data/`
|
|
3. Existing page definitions in database
|
|
|
|
---
|
|
|
|
*Quick Reference - Iteration 25*
|