@ramme-io/kernel 1.3.0
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/.turbo/turbo-build.log +5 -0
- package/LICENSE +21 -0
- package/dist/components/AutoForm.d.ts +24 -0
- package/dist/components/AutoForm.d.ts.map +1 -0
- package/dist/components/AutoForm.js +78 -0
- package/dist/components/AutoForm.js.map +1 -0
- package/dist/components/SmartTable.d.ts +14 -0
- package/dist/components/SmartTable.d.ts.map +1 -0
- package/dist/components/SmartTable.js +128 -0
- package/dist/components/SmartTable.js.map +1 -0
- package/dist/config/app.manifest.d.ts +7 -0
- package/dist/config/app.manifest.d.ts.map +1 -0
- package/dist/config/app.manifest.js +8 -0
- package/dist/config/app.manifest.js.map +1 -0
- package/dist/engine/renderers/DynamicBlock.d.ts +9 -0
- package/dist/engine/renderers/DynamicBlock.d.ts.map +1 -0
- package/dist/engine/renderers/DynamicBlock.js +67 -0
- package/dist/engine/renderers/DynamicBlock.js.map +1 -0
- package/dist/engine/renderers/DynamicPage.d.ts +11 -0
- package/dist/engine/renderers/DynamicPage.d.ts.map +1 -0
- package/dist/engine/renderers/DynamicPage.js +91 -0
- package/dist/engine/renderers/DynamicPage.js.map +1 -0
- package/dist/engine/renderers/route-generator.d.ts +16 -0
- package/dist/engine/renderers/route-generator.d.ts.map +1 -0
- package/dist/engine/renderers/route-generator.js +30 -0
- package/dist/engine/renderers/route-generator.js.map +1 -0
- package/dist/engine/renderers/sitemap-entry.d.ts +7 -0
- package/dist/engine/renderers/sitemap-entry.d.ts.map +1 -0
- package/dist/engine/renderers/sitemap-entry.js +2 -0
- package/dist/engine/renderers/sitemap-entry.js.map +1 -0
- package/dist/engine/runtime/ManifestContext.d.ts +115 -0
- package/dist/engine/runtime/ManifestContext.d.ts.map +1 -0
- package/dist/engine/runtime/ManifestContext.js +56 -0
- package/dist/engine/runtime/ManifestContext.js.map +1 -0
- package/dist/engine/runtime/MqttContext.d.ts +14 -0
- package/dist/engine/runtime/MqttContext.d.ts.map +1 -0
- package/dist/engine/runtime/MqttContext.js +70 -0
- package/dist/engine/runtime/MqttContext.js.map +1 -0
- package/dist/engine/runtime/SitemapContext.d.ts +31 -0
- package/dist/engine/runtime/SitemapContext.d.ts.map +1 -0
- package/dist/engine/runtime/SitemapContext.js +54 -0
- package/dist/engine/runtime/SitemapContext.js.map +1 -0
- package/dist/engine/runtime/data-seeder.d.ts +10 -0
- package/dist/engine/runtime/data-seeder.d.ts.map +1 -0
- package/dist/engine/runtime/data-seeder.js +35 -0
- package/dist/engine/runtime/data-seeder.js.map +1 -0
- package/dist/engine/runtime/useAction.d.ts +4 -0
- package/dist/engine/runtime/useAction.d.ts.map +1 -0
- package/dist/engine/runtime/useAction.js +55 -0
- package/dist/engine/runtime/useAction.js.map +1 -0
- package/dist/engine/runtime/useCrudLocalStorage.d.ts +19 -0
- package/dist/engine/runtime/useCrudLocalStorage.d.ts.map +1 -0
- package/dist/engine/runtime/useCrudLocalStorage.js +73 -0
- package/dist/engine/runtime/useCrudLocalStorage.js.map +1 -0
- package/dist/engine/runtime/useDataQuery.d.ts +39 -0
- package/dist/engine/runtime/useDataQuery.d.ts.map +1 -0
- package/dist/engine/runtime/useDataQuery.js +50 -0
- package/dist/engine/runtime/useDataQuery.js.map +1 -0
- package/dist/engine/runtime/useDynamicSitemap.d.ts +9 -0
- package/dist/engine/runtime/useDynamicSitemap.d.ts.map +1 -0
- package/dist/engine/runtime/useDynamicSitemap.js +38 -0
- package/dist/engine/runtime/useDynamicSitemap.js.map +1 -0
- package/dist/engine/runtime/useJustInTimeSeeder.d.ts +11 -0
- package/dist/engine/runtime/useJustInTimeSeeder.d.ts.map +1 -0
- package/dist/engine/runtime/useJustInTimeSeeder.js +88 -0
- package/dist/engine/runtime/useJustInTimeSeeder.js.map +1 -0
- package/dist/engine/runtime/useLiveBridge.d.ts +109 -0
- package/dist/engine/runtime/useLiveBridge.d.ts.map +1 -0
- package/dist/engine/runtime/useLiveBridge.js +21 -0
- package/dist/engine/runtime/useLiveBridge.js.map +1 -0
- package/dist/engine/runtime/useSignal.d.ts +11 -0
- package/dist/engine/runtime/useSignal.d.ts.map +1 -0
- package/dist/engine/runtime/useSignal.js +26 -0
- package/dist/engine/runtime/useSignal.js.map +1 -0
- package/dist/engine/runtime/useSignalStore.d.ts +31 -0
- package/dist/engine/runtime/useSignalStore.d.ts.map +1 -0
- package/dist/engine/runtime/useSignalStore.js +60 -0
- package/dist/engine/runtime/useSignalStore.js.map +1 -0
- package/dist/engine/runtime/useWorkflowEngine.d.ts +4 -0
- package/dist/engine/runtime/useWorkflowEngine.d.ts.map +1 -0
- package/dist/engine/runtime/useWorkflowEngine.js +85 -0
- package/dist/engine/runtime/useWorkflowEngine.js.map +1 -0
- package/dist/engine/types/manifest-types.d.ts +38 -0
- package/dist/engine/types/manifest-types.d.ts.map +1 -0
- package/dist/engine/types/manifest-types.js +5 -0
- package/dist/engine/types/manifest-types.js.map +1 -0
- package/dist/engine/types/sitemap-entry.d.ts +58 -0
- package/dist/engine/types/sitemap-entry.d.ts.map +1 -0
- package/dist/engine/types/sitemap-entry.js +19 -0
- package/dist/engine/types/sitemap-entry.js.map +1 -0
- package/dist/engine/validation/schema.d.ts +383 -0
- package/dist/engine/validation/schema.d.ts.map +1 -0
- package/dist/engine/validation/schema.js +156 -0
- package/dist/engine/validation/schema.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -0
- package/src/components/AutoForm.tsx +141 -0
- package/src/components/SmartTable.tsx +316 -0
- package/src/config/app.manifest.ts +7 -0
- package/src/engine/renderers/DynamicBlock.tsx +84 -0
- package/src/engine/renderers/DynamicPage.tsx +196 -0
- package/src/engine/renderers/route-generator.tsx +47 -0
- package/src/engine/renderers/sitemap-entry.ts +6 -0
- package/src/engine/runtime/ManifestContext.tsx +81 -0
- package/src/engine/runtime/MqttContext.tsx +94 -0
- package/src/engine/runtime/SitemapContext.tsx +61 -0
- package/src/engine/runtime/data-seeder.ts +39 -0
- package/src/engine/runtime/useAction.ts +64 -0
- package/src/engine/runtime/useCrudLocalStorage.ts +82 -0
- package/src/engine/runtime/useDataQuery.ts +98 -0
- package/src/engine/runtime/useDynamicSitemap.tsx +43 -0
- package/src/engine/runtime/useJustInTimeSeeder.ts +101 -0
- package/src/engine/runtime/useLiveBridge.ts +24 -0
- package/src/engine/runtime/useSignal.ts +40 -0
- package/src/engine/runtime/useSignalStore.ts +94 -0
- package/src/engine/runtime/useWorkflowEngine.ts +89 -0
- package/src/engine/types/manifest-types.ts +45 -0
- package/src/engine/types/sitemap-entry.ts +66 -0
- package/src/engine/validation/schema.ts +189 -0
- package/src/index.ts +27 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* @file schema.ts
|
|
4
|
+
* @description The "Application Constitution".
|
|
5
|
+
*
|
|
6
|
+
* ARCHITECTURAL ROLE:
|
|
7
|
+
* This file uses Zod to define the strict runtime validation rules for the
|
|
8
|
+
* App Manifest. While `manifest-types.ts` handles compile-time TypeScript checks,
|
|
9
|
+
* this file handles runtime validation, ensuring that any JSON loaded into the
|
|
10
|
+
* engine (whether from a file, API, or user input) is structurally sound.
|
|
11
|
+
*
|
|
12
|
+
* LAYERS DEFINED:
|
|
13
|
+
* 1. **SaaS Layer:** Data resources, fields, and tables.
|
|
14
|
+
* 2. **Physical Layer:** IoT signals, sensors, and entities.
|
|
15
|
+
* 3. **Logic Layer:** Workflows, triggers, and automated actions.
|
|
16
|
+
* 4. **Presentation Layer:** Pages, sections, and UI blocks.
|
|
17
|
+
*/
|
|
18
|
+
// ------------------------------------------------------------------
|
|
19
|
+
// 1. DATA RESOURCE DEFINITIONS (SaaS Layer)
|
|
20
|
+
// ------------------------------------------------------------------
|
|
21
|
+
export const FieldSchema = z.object({
|
|
22
|
+
key: z.string(),
|
|
23
|
+
label: z.string(),
|
|
24
|
+
type: z.enum(['text', 'number', 'currency', 'date', 'boolean', 'status', 'email', 'image', 'textarea']),
|
|
25
|
+
required: z.boolean().optional(),
|
|
26
|
+
description: z.string().optional(),
|
|
27
|
+
defaultValue: z.any().optional(),
|
|
28
|
+
});
|
|
29
|
+
export const ResourceSchema = z.object({
|
|
30
|
+
id: z.string(),
|
|
31
|
+
name: z.string(),
|
|
32
|
+
fields: z.array(FieldSchema),
|
|
33
|
+
defaultView: z.enum(['table', 'grid', 'list']).optional(),
|
|
34
|
+
features: z.object({
|
|
35
|
+
searchable: z.boolean().optional(),
|
|
36
|
+
creatable: z.boolean().optional(),
|
|
37
|
+
editable: z.boolean().optional(),
|
|
38
|
+
deletable: z.boolean().optional(),
|
|
39
|
+
exportable: z.boolean().optional(),
|
|
40
|
+
}).optional(),
|
|
41
|
+
});
|
|
42
|
+
// ------------------------------------------------------------------
|
|
43
|
+
// 2. SIGNAL & IOT DEFINITIONS (Physical Layer)
|
|
44
|
+
// ------------------------------------------------------------------
|
|
45
|
+
export const SignalSchema = z.object({
|
|
46
|
+
id: z.string().min(1, "Signal ID is required"),
|
|
47
|
+
label: z.string(),
|
|
48
|
+
description: z.string().optional(),
|
|
49
|
+
kind: z.enum(['sensor', 'actuator', 'setpoint', 'metric', 'status', 'kpi']),
|
|
50
|
+
source: z.enum(['mock', 'mqtt', 'http', 'derived', 'local']),
|
|
51
|
+
// Connectivity
|
|
52
|
+
topic: z.string().optional(),
|
|
53
|
+
endpoint: z.string().optional(),
|
|
54
|
+
jsonPath: z.string().optional(),
|
|
55
|
+
refreshRate: z.number().optional().default(1000),
|
|
56
|
+
// Values
|
|
57
|
+
defaultValue: z.any().optional(),
|
|
58
|
+
unit: z.string().optional(),
|
|
59
|
+
min: z.number().optional(),
|
|
60
|
+
max: z.number().optional(),
|
|
61
|
+
});
|
|
62
|
+
export const EntitySchema = z.object({
|
|
63
|
+
id: z.string(),
|
|
64
|
+
name: z.string(),
|
|
65
|
+
description: z.string().optional(),
|
|
66
|
+
type: z.string(),
|
|
67
|
+
category: z.string().default('logical'),
|
|
68
|
+
signals: z.array(z.string()),
|
|
69
|
+
ui: z.object({
|
|
70
|
+
icon: z.string().optional(),
|
|
71
|
+
color: z.string().optional(),
|
|
72
|
+
dashboardComponent: z.string().optional(),
|
|
73
|
+
}).optional(),
|
|
74
|
+
});
|
|
75
|
+
// ------------------------------------------------------------------
|
|
76
|
+
// ✅ NEW: LOGIC & WORKFLOW DEFINITIONS
|
|
77
|
+
// ------------------------------------------------------------------
|
|
78
|
+
export const TriggerSchema = z.object({
|
|
79
|
+
id: z.string(),
|
|
80
|
+
type: z.enum(['signal_change', 'manual_action', 'schedule', 'webhook']),
|
|
81
|
+
config: z.record(z.string(), z.any()),
|
|
82
|
+
});
|
|
83
|
+
export const ActionSchema = z.object({
|
|
84
|
+
id: z.string(),
|
|
85
|
+
type: z.enum([
|
|
86
|
+
'update_resource',
|
|
87
|
+
'send_notification',
|
|
88
|
+
'mqtt_publish',
|
|
89
|
+
'api_call',
|
|
90
|
+
'navigate',
|
|
91
|
+
'agent_task'
|
|
92
|
+
]),
|
|
93
|
+
config: z.record(z.string(), z.any()),
|
|
94
|
+
});
|
|
95
|
+
export const WorkflowSchema = z.object({
|
|
96
|
+
id: z.string(),
|
|
97
|
+
name: z.string(),
|
|
98
|
+
active: z.boolean().default(true),
|
|
99
|
+
trigger: TriggerSchema,
|
|
100
|
+
actions: z.array(ActionSchema),
|
|
101
|
+
});
|
|
102
|
+
// ------------------------------------------------------------------
|
|
103
|
+
// 3. UI LAYOUT DEFINITIONS (Presentation Layer)
|
|
104
|
+
// ------------------------------------------------------------------
|
|
105
|
+
export const BlockSchema = z.object({
|
|
106
|
+
id: z.string(),
|
|
107
|
+
type: z.string(),
|
|
108
|
+
props: z.record(z.string(), z.any()),
|
|
109
|
+
layout: z.object({
|
|
110
|
+
colSpan: z.number().optional(),
|
|
111
|
+
rowSpan: z.number().optional(),
|
|
112
|
+
}).optional(),
|
|
113
|
+
});
|
|
114
|
+
export const PageSectionSchema = z.object({
|
|
115
|
+
id: z.string(),
|
|
116
|
+
title: z.string().optional(),
|
|
117
|
+
description: z.string().optional(),
|
|
118
|
+
layout: z.object({
|
|
119
|
+
columns: z.number().optional(),
|
|
120
|
+
variant: z.enum(['grid', 'stack', 'split']).optional()
|
|
121
|
+
}).optional(),
|
|
122
|
+
blocks: z.array(BlockSchema),
|
|
123
|
+
});
|
|
124
|
+
export const PageSchema = z.object({
|
|
125
|
+
id: z.string(),
|
|
126
|
+
slug: z.string(),
|
|
127
|
+
title: z.string(),
|
|
128
|
+
description: z.string().optional(),
|
|
129
|
+
icon: z.string().optional(),
|
|
130
|
+
sections: z.array(PageSectionSchema),
|
|
131
|
+
});
|
|
132
|
+
// MASTER APP SPECIFICATION
|
|
133
|
+
export const AppSpecificationSchema = z.object({
|
|
134
|
+
meta: z.object({
|
|
135
|
+
name: z.string(),
|
|
136
|
+
version: z.string(),
|
|
137
|
+
description: z.string().optional(),
|
|
138
|
+
author: z.string().optional(),
|
|
139
|
+
createdAt: z.string().optional(),
|
|
140
|
+
}),
|
|
141
|
+
config: z.object({
|
|
142
|
+
theme: z.enum(['light', 'dark', 'system', 'corporate', 'midnight', 'blueprint']).default('system'),
|
|
143
|
+
mockMode: z.boolean().default(true),
|
|
144
|
+
brokerUrl: z.string().optional(),
|
|
145
|
+
}),
|
|
146
|
+
modules: z.array(z.string()).optional(),
|
|
147
|
+
resources: z.array(ResourceSchema).optional(),
|
|
148
|
+
domain: z.object({
|
|
149
|
+
signals: z.array(SignalSchema),
|
|
150
|
+
entities: z.array(EntitySchema),
|
|
151
|
+
// ✅ ADDED WORKFLOWS HERE
|
|
152
|
+
workflows: z.array(WorkflowSchema).optional(),
|
|
153
|
+
}),
|
|
154
|
+
pages: z.array(PageSchema).optional(),
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/engine/validation/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export * from './engine/runtime/ManifestContext';
|
|
2
|
+
export * from './engine/runtime/MqttContext';
|
|
3
|
+
export * from './engine/runtime/SitemapContext';
|
|
4
|
+
export * from './engine/runtime/useAction';
|
|
5
|
+
export * from './engine/runtime/useCrudLocalStorage';
|
|
6
|
+
export * from './engine/runtime/useDataQuery';
|
|
7
|
+
export * from './engine/runtime/useDynamicSitemap';
|
|
8
|
+
export * from './engine/runtime/useJustInTimeSeeder';
|
|
9
|
+
export * from './engine/runtime/useLiveBridge';
|
|
10
|
+
export * from './engine/runtime/useSignal';
|
|
11
|
+
export * from './engine/runtime/useSignalStore';
|
|
12
|
+
export * from './engine/runtime/useWorkflowEngine';
|
|
13
|
+
export * from './engine/runtime/data-seeder';
|
|
14
|
+
export * from './engine/renderers/DynamicBlock';
|
|
15
|
+
export * from './engine/renderers/DynamicPage';
|
|
16
|
+
export * from './engine/renderers/route-generator';
|
|
17
|
+
export * from './engine/types/manifest-types';
|
|
18
|
+
export * from './engine/types/sitemap-entry';
|
|
19
|
+
export * from './engine/validation/schema';
|
|
20
|
+
export { SmartTable } from './components/SmartTable';
|
|
21
|
+
export { AutoForm } from './components/AutoForm';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,4BAA4B,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Engine exports
|
|
2
|
+
export * from './engine/runtime/ManifestContext';
|
|
3
|
+
export * from './engine/runtime/MqttContext';
|
|
4
|
+
export * from './engine/runtime/SitemapContext';
|
|
5
|
+
export * from './engine/runtime/useAction';
|
|
6
|
+
export * from './engine/runtime/useCrudLocalStorage';
|
|
7
|
+
export * from './engine/runtime/useDataQuery';
|
|
8
|
+
export * from './engine/runtime/useDynamicSitemap';
|
|
9
|
+
export * from './engine/runtime/useJustInTimeSeeder';
|
|
10
|
+
export * from './engine/runtime/useLiveBridge';
|
|
11
|
+
export * from './engine/runtime/useSignal';
|
|
12
|
+
export * from './engine/runtime/useSignalStore';
|
|
13
|
+
export * from './engine/runtime/useWorkflowEngine';
|
|
14
|
+
export * from './engine/runtime/data-seeder';
|
|
15
|
+
export * from './engine/renderers/DynamicBlock';
|
|
16
|
+
export * from './engine/renderers/DynamicPage';
|
|
17
|
+
export * from './engine/renderers/route-generator';
|
|
18
|
+
export * from './engine/types/manifest-types';
|
|
19
|
+
export * from './engine/types/sitemap-entry';
|
|
20
|
+
export * from './engine/validation/schema';
|
|
21
|
+
// Component exports
|
|
22
|
+
export { SmartTable } from './components/SmartTable';
|
|
23
|
+
export { AutoForm } from './components/AutoForm';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,4BAA4B,CAAC;AAE3C,oBAAoB;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ramme-io/kernel",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "Core engine",
|
|
5
|
+
"private": false,
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"mqtt": "^5.14.1",
|
|
20
|
+
"zustand": "^5.0.3",
|
|
21
|
+
"@ramme-io/ui": "1.2.3"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"react": ">=18.2.0",
|
|
25
|
+
"react-dom": ">=18.2.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/react": "^18.2.0",
|
|
29
|
+
"@types/react-dom": "^18.2.0",
|
|
30
|
+
"typescript": "^5.0.0"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"dev": "tsc --watch",
|
|
34
|
+
"build": "tsc"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { Drawer, FormTemplate, Button, type FormField } from '@ramme-io/ui';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file AutoForm.tsx
|
|
6
|
+
* @description The "Zero-Boilerplate" Form Engine.
|
|
7
|
+
* * ARCHITECTURAL ROLE:
|
|
8
|
+
* This component acts as the bridge between your data schema (JSON) and the UI.
|
|
9
|
+
* Instead of writing manual form code for every resource (Users, Products, Orders),
|
|
10
|
+
* this component dynamically generates the correct inputs based on the field type.
|
|
11
|
+
* * KEY FEATURES:
|
|
12
|
+
* 1. **Smart Mapping:** Automatically converts 'boolean' -> Toggle, 'date' -> DatePicker, etc.
|
|
13
|
+
* 2. **Context Aware:** Auto-detects "Create" vs "Edit" mode based on `initialData`.
|
|
14
|
+
* 3. **Safety Logic:** Automatically hides primary keys during creation and locks them during editing.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
interface AutoFormProps {
|
|
18
|
+
isOpen: boolean;
|
|
19
|
+
onClose: () => void;
|
|
20
|
+
onSubmit: (data: any) => void;
|
|
21
|
+
title: string;
|
|
22
|
+
fields: any[]; // The raw metadata from app.manifest.ts
|
|
23
|
+
initialData?: any;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const AutoForm: React.FC<AutoFormProps> = ({
|
|
27
|
+
isOpen,
|
|
28
|
+
onClose,
|
|
29
|
+
onSubmit,
|
|
30
|
+
title,
|
|
31
|
+
fields,
|
|
32
|
+
initialData
|
|
33
|
+
}) => {
|
|
34
|
+
|
|
35
|
+
// 1. Safe Data Handling
|
|
36
|
+
const safeData = initialData || {};
|
|
37
|
+
const isEditMode = !!safeData.id;
|
|
38
|
+
|
|
39
|
+
// 2. Schema-to-UI Mapping Engine
|
|
40
|
+
const formFields = useMemo<FormField[]>(() => {
|
|
41
|
+
return fields
|
|
42
|
+
// 🛑 RULE 1: Hide ID field during creation (System handles it)
|
|
43
|
+
.filter((f: any) => !(f.key === 'id' && !isEditMode))
|
|
44
|
+
.map((f: any) => {
|
|
45
|
+
|
|
46
|
+
const isIdField = f.key === 'id';
|
|
47
|
+
|
|
48
|
+
// Base Configuration for all fields
|
|
49
|
+
const baseConfig = {
|
|
50
|
+
name: f.key,
|
|
51
|
+
label: f.label,
|
|
52
|
+
required: f.required,
|
|
53
|
+
placeholder: f.description || `Enter ${f.label.toLowerCase()}`,
|
|
54
|
+
// Pre-fill data if editing, or use default from schema
|
|
55
|
+
value: safeData[f.key] !== undefined ? safeData[f.key] : (f.defaultValue || ''),
|
|
56
|
+
colSpan: 1,
|
|
57
|
+
// 🛑 RULE 2: If it's the ID field, force it to be disabled (View Only)
|
|
58
|
+
disabled: isIdField
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Intelligent Type Switching
|
|
62
|
+
switch (f.type) {
|
|
63
|
+
case 'number':
|
|
64
|
+
case 'integer':
|
|
65
|
+
case 'currency':
|
|
66
|
+
return {
|
|
67
|
+
...baseConfig,
|
|
68
|
+
type: 'number',
|
|
69
|
+
value: Number(baseConfig.value) || 0
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
case 'boolean':
|
|
73
|
+
return {
|
|
74
|
+
...baseConfig,
|
|
75
|
+
type: 'toggle',
|
|
76
|
+
checked: !!baseConfig.value
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
case 'date':
|
|
80
|
+
return {
|
|
81
|
+
...baseConfig,
|
|
82
|
+
type: 'datepicker',
|
|
83
|
+
value: baseConfig.value ? new Date(baseConfig.value) : null
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
case 'status':
|
|
87
|
+
return {
|
|
88
|
+
...baseConfig,
|
|
89
|
+
type: 'select',
|
|
90
|
+
options: [
|
|
91
|
+
{ value: 'Active', label: 'Active' },
|
|
92
|
+
{ value: 'Pending', label: 'Pending' },
|
|
93
|
+
{ value: 'Inactive', label: 'Inactive' },
|
|
94
|
+
{ value: 'Archived', label: 'Archived' }
|
|
95
|
+
]
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
case 'textarea':
|
|
99
|
+
return {
|
|
100
|
+
...baseConfig,
|
|
101
|
+
type: 'textarea',
|
|
102
|
+
colSpan: 2
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
case 'email':
|
|
106
|
+
return { ...baseConfig, type: 'email' };
|
|
107
|
+
|
|
108
|
+
default:
|
|
109
|
+
return { ...baseConfig, type: 'text' };
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}, [fields, safeData, isEditMode]);
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<Drawer
|
|
116
|
+
isOpen={isOpen}
|
|
117
|
+
onClose={onClose}
|
|
118
|
+
title={`${isEditMode ? 'Edit' : 'New'} ${title}`}
|
|
119
|
+
size="500px"
|
|
120
|
+
>
|
|
121
|
+
<div className="p-6">
|
|
122
|
+
<FormTemplate
|
|
123
|
+
fields={formFields}
|
|
124
|
+
onSubmit={(formData) => {
|
|
125
|
+
// Merge original ID to ensure we update the correct record
|
|
126
|
+
onSubmit({ ...safeData, ...formData });
|
|
127
|
+
}}
|
|
128
|
+
>
|
|
129
|
+
<div className="flex justify-end gap-2 mt-8 pt-4 border-t border-border">
|
|
130
|
+
<Button variant="outline" onClick={onClose} type="button">
|
|
131
|
+
Cancel
|
|
132
|
+
</Button>
|
|
133
|
+
<Button type="submit" variant="primary">
|
|
134
|
+
{isEditMode ? 'Save Changes' : 'Create Record'}
|
|
135
|
+
</Button>
|
|
136
|
+
</div>
|
|
137
|
+
</FormTemplate>
|
|
138
|
+
</div>
|
|
139
|
+
</Drawer>
|
|
140
|
+
);
|
|
141
|
+
};
|