@specverse/runtime 4.1.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/dist/runtime/views/core/entity-display.d.ts +31 -0
- package/dist/runtime/views/core/entity-display.d.ts.map +1 -0
- package/dist/runtime/views/core/entity-display.js +123 -0
- package/dist/runtime/views/core/entity-display.js.map +1 -0
- package/dist/runtime/views/core/field-classification.d.ts +65 -0
- package/dist/runtime/views/core/field-classification.d.ts.map +1 -0
- package/dist/runtime/views/core/field-classification.js +142 -0
- package/dist/runtime/views/core/field-classification.js.map +1 -0
- package/dist/runtime/views/core/index.d.ts +5 -0
- package/dist/runtime/views/core/index.d.ts.map +1 -0
- package/dist/runtime/views/core/index.js +5 -0
- package/dist/runtime/views/core/index.js.map +1 -0
- package/dist/runtime/views/core/pattern-engine.d.ts +54 -0
- package/dist/runtime/views/core/pattern-engine.d.ts.map +1 -0
- package/dist/runtime/views/core/pattern-engine.js +125 -0
- package/dist/runtime/views/core/pattern-engine.js.map +1 -0
- package/dist/runtime/views/core/types.d.ts +82 -0
- package/dist/runtime/views/core/types.d.ts.map +1 -0
- package/dist/runtime/views/core/types.js +10 -0
- package/dist/runtime/views/core/types.js.map +1 -0
- package/dist/runtime/views/index.d.ts +11 -0
- package/dist/runtime/views/index.d.ts.map +1 -0
- package/dist/runtime/views/index.js +11 -0
- package/dist/runtime/views/index.js.map +1 -0
- package/dist/runtime/views/react/components/DevShell.d.ts +26 -0
- package/dist/runtime/views/react/components/DevShell.d.ts.map +1 -0
- package/dist/runtime/views/react/components/DevShell.js +55 -0
- package/dist/runtime/views/react/components/DevShell.js.map +1 -0
- package/dist/runtime/views/react/components/ModelManager.d.ts +15 -0
- package/dist/runtime/views/react/components/ModelManager.d.ts.map +1 -0
- package/dist/runtime/views/react/components/ModelManager.js +182 -0
- package/dist/runtime/views/react/components/ModelManager.js.map +1 -0
- package/dist/runtime/views/react/components/ModelSelector.d.ts +13 -0
- package/dist/runtime/views/react/components/ModelSelector.d.ts.map +1 -0
- package/dist/runtime/views/react/components/ModelSelector.js +43 -0
- package/dist/runtime/views/react/components/ModelSelector.js.map +1 -0
- package/dist/runtime/views/react/components/RelationshipField.d.ts +20 -0
- package/dist/runtime/views/react/components/RelationshipField.d.ts.map +1 -0
- package/dist/runtime/views/react/components/RelationshipField.js +31 -0
- package/dist/runtime/views/react/components/RelationshipField.js.map +1 -0
- package/dist/runtime/views/react/components/RuntimeView.d.ts +20 -0
- package/dist/runtime/views/react/components/RuntimeView.d.ts.map +1 -0
- package/dist/runtime/views/react/components/RuntimeView.js +284 -0
- package/dist/runtime/views/react/components/RuntimeView.js.map +1 -0
- package/dist/runtime/views/react/components/ViewRouter.d.ts +22 -0
- package/dist/runtime/views/react/components/ViewRouter.d.ts.map +1 -0
- package/dist/runtime/views/react/components/ViewRouter.js +70 -0
- package/dist/runtime/views/react/components/ViewRouter.js.map +1 -0
- package/dist/runtime/views/react/components/ViewSidebar.d.ts +14 -0
- package/dist/runtime/views/react/components/ViewSidebar.d.ts.map +1 -0
- package/dist/runtime/views/react/components/ViewSidebar.js +11 -0
- package/dist/runtime/views/react/components/ViewSidebar.js.map +1 -0
- package/dist/runtime/views/react/components/ui/ResizeHandle.d.ts +13 -0
- package/dist/runtime/views/react/components/ui/ResizeHandle.d.ts.map +1 -0
- package/dist/runtime/views/react/components/ui/ResizeHandle.js +11 -0
- package/dist/runtime/views/react/components/ui/ResizeHandle.js.map +1 -0
- package/dist/runtime/views/react/context.d.ts +24 -0
- package/dist/runtime/views/react/context.d.ts.map +1 -0
- package/dist/runtime/views/react/context.js +32 -0
- package/dist/runtime/views/react/context.js.map +1 -0
- package/dist/runtime/views/react/hooks/useEntityHelpers.d.ts +25 -0
- package/dist/runtime/views/react/hooks/useEntityHelpers.d.ts.map +1 -0
- package/dist/runtime/views/react/hooks/useEntityHelpers.js +49 -0
- package/dist/runtime/views/react/hooks/useEntityHelpers.js.map +1 -0
- package/dist/runtime/views/react/hooks/useResizableSidebar.d.ts +18 -0
- package/dist/runtime/views/react/hooks/useResizableSidebar.d.ts.map +1 -0
- package/dist/runtime/views/react/hooks/useResizableSidebar.js +37 -0
- package/dist/runtime/views/react/hooks/useResizableSidebar.js.map +1 -0
- package/dist/runtime/views/react/hooks/useTheme.d.ts +15 -0
- package/dist/runtime/views/react/hooks/useTheme.d.ts.map +1 -0
- package/dist/runtime/views/react/hooks/useTheme.js +32 -0
- package/dist/runtime/views/react/hooks/useTheme.js.map +1 -0
- package/dist/runtime/views/react/index.d.ts +20 -0
- package/dist/runtime/views/react/index.d.ts.map +1 -0
- package/dist/runtime/views/react/index.js +23 -0
- package/dist/runtime/views/react/index.js.map +1 -0
- package/dist/runtime/views/tailwind/index.d.ts +8 -0
- package/dist/runtime/views/tailwind/index.d.ts.map +1 -0
- package/dist/runtime/views/tailwind/index.js +8 -0
- package/dist/runtime/views/tailwind/index.js.map +1 -0
- package/dist/runtime/views/tailwind/universal-adapter.d.ts +37 -0
- package/dist/runtime/views/tailwind/universal-adapter.d.ts.map +1 -0
- package/dist/runtime/views/tailwind/universal-adapter.js +616 -0
- package/dist/runtime/views/tailwind/universal-adapter.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeView — Pattern-based view renderer
|
|
3
|
+
*
|
|
4
|
+
* Renders spec views using the pattern engine and tailwind adapter.
|
|
5
|
+
* Uses RuntimeViewProvider context for data access instead of appStore.
|
|
6
|
+
*
|
|
7
|
+
* Ported from specverse-app-demo/frontend-react/src/components/views/RuntimeViewNew.tsx
|
|
8
|
+
*/
|
|
9
|
+
export interface RuntimeViewProps {
|
|
10
|
+
/** The view specification to render */
|
|
11
|
+
view: any;
|
|
12
|
+
/** Pre-selected entity ID (e.g., from navigation) */
|
|
13
|
+
selectedEntityId?: string | null;
|
|
14
|
+
/** Navigation callback for cross-view/cross-model navigation */
|
|
15
|
+
onNavigate?: (targetViewType: string, entityId?: string, targetModel?: string) => void;
|
|
16
|
+
/** Optional pattern adapter instance (if not provided, uses built-in) */
|
|
17
|
+
patternAdapter?: any;
|
|
18
|
+
}
|
|
19
|
+
export declare function RuntimeView({ view, selectedEntityId: initialEntityId, onNavigate, patternAdapter: externalAdapter }: RuntimeViewProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=RuntimeView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeView.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/RuntimeView.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,IAAI,EAAE,GAAG,CAAC;IACV,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gEAAgE;IAChE,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvF,yEAAyE;IACzE,cAAc,CAAC,EAAE,GAAG,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,EAAE,gBAAgB,2CAoPrI"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* RuntimeView — Pattern-based view renderer
|
|
4
|
+
*
|
|
5
|
+
* Renders spec views using the pattern engine and tailwind adapter.
|
|
6
|
+
* Uses RuntimeViewProvider context for data access instead of appStore.
|
|
7
|
+
*
|
|
8
|
+
* Ported from specverse-app-demo/frontend-react/src/components/views/RuntimeViewNew.tsx
|
|
9
|
+
*/
|
|
10
|
+
import { useEffect, useState, useMemo } from 'react';
|
|
11
|
+
import { useRuntimeContext } from '../context.js';
|
|
12
|
+
import { getEntityDisplayName } from '../../core/entity-display.js';
|
|
13
|
+
import { detectPattern } from '../../core/pattern-engine.js';
|
|
14
|
+
import { createUniversalTailwindAdapter } from '../../tailwind/universal-adapter.js';
|
|
15
|
+
export function RuntimeView({ view, selectedEntityId: initialEntityId, onNavigate, patternAdapter: externalAdapter }) {
|
|
16
|
+
const [renderedHtml, setRenderedHtml] = useState('');
|
|
17
|
+
const [error, setError] = useState(null);
|
|
18
|
+
const [selectedEntityId, setSelectedEntityId] = useState(initialEntityId || null);
|
|
19
|
+
// Get data from RuntimeViewProvider context
|
|
20
|
+
const ctx = useRuntimeContext();
|
|
21
|
+
const { entities, modelSchemas } = ctx;
|
|
22
|
+
// Create tailwind adapter
|
|
23
|
+
const tailwindAdapter = useMemo(() => createUniversalTailwindAdapter(), []);
|
|
24
|
+
// Determine primary model from view spec
|
|
25
|
+
const primaryModel = useMemo(() => {
|
|
26
|
+
if (view.model)
|
|
27
|
+
return view.model;
|
|
28
|
+
if (view.controller)
|
|
29
|
+
return view.controller.replace(/Controller$/, '');
|
|
30
|
+
return null;
|
|
31
|
+
}, [view]);
|
|
32
|
+
// Detect additional models from view components and relationships
|
|
33
|
+
const allModels = useMemo(() => {
|
|
34
|
+
const models = new Set();
|
|
35
|
+
if (primaryModel)
|
|
36
|
+
models.add(primaryModel);
|
|
37
|
+
// From view.uiComponents
|
|
38
|
+
if (view.uiComponents) {
|
|
39
|
+
for (const comp of Object.values(view.uiComponents)) {
|
|
40
|
+
if (comp?.model)
|
|
41
|
+
models.add(comp.model);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// From schema relationships (2 levels deep)
|
|
45
|
+
const processed = new Set();
|
|
46
|
+
const processModel = (name) => {
|
|
47
|
+
if (processed.has(name))
|
|
48
|
+
return;
|
|
49
|
+
processed.add(name);
|
|
50
|
+
const schema = modelSchemas[name];
|
|
51
|
+
if (schema?.relationships) {
|
|
52
|
+
for (const rel of Object.values(schema.relationships)) {
|
|
53
|
+
const target = rel?.targetModel || rel?.model;
|
|
54
|
+
if (target)
|
|
55
|
+
models.add(target);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
for (const m of [...models])
|
|
60
|
+
processModel(m);
|
|
61
|
+
// Second level
|
|
62
|
+
for (const m of [...models])
|
|
63
|
+
processModel(m);
|
|
64
|
+
return [...models];
|
|
65
|
+
}, [primaryModel, view, modelSchemas]);
|
|
66
|
+
// Fetch schemas and entities for all detected models
|
|
67
|
+
for (const modelName of allModels) {
|
|
68
|
+
const controllerName = `${modelName}Controller`;
|
|
69
|
+
ctx.useEntitiesQuery(controllerName, modelName);
|
|
70
|
+
ctx.useModelSchemaQuery(modelName);
|
|
71
|
+
}
|
|
72
|
+
// Build model data from context
|
|
73
|
+
const modelData = useMemo(() => {
|
|
74
|
+
const result = {};
|
|
75
|
+
for (const modelName of allModels) {
|
|
76
|
+
result[modelName] = entities[modelName] || [];
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}, [allModels, entities]);
|
|
80
|
+
// Primary entities
|
|
81
|
+
const primaryEntities = useMemo(() => (primaryModel ? entities[primaryModel] || [] : []), [primaryModel, entities]);
|
|
82
|
+
// Selected entity
|
|
83
|
+
const selectedEntity = useMemo(() => {
|
|
84
|
+
if (!selectedEntityId || !primaryEntities.length)
|
|
85
|
+
return null;
|
|
86
|
+
return primaryEntities.find((e) => e.id === selectedEntityId) || null;
|
|
87
|
+
}, [selectedEntityId, primaryEntities]);
|
|
88
|
+
// Auto-select first entity for detail/dashboard views
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if ((view.type === 'detail' || view.type === 'dashboard') && primaryEntities.length > 0 && !selectedEntityId) {
|
|
91
|
+
setSelectedEntityId(primaryEntities[0].id);
|
|
92
|
+
}
|
|
93
|
+
}, [view.type, primaryEntities, selectedEntityId]);
|
|
94
|
+
// Sync with external entity ID
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
if (initialEntityId)
|
|
97
|
+
setSelectedEntityId(initialEntityId);
|
|
98
|
+
}, [initialEntityId]);
|
|
99
|
+
// Render pattern
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
try {
|
|
102
|
+
const patternResult = detectPattern(view);
|
|
103
|
+
if (!patternResult) {
|
|
104
|
+
setRenderedHtml(`
|
|
105
|
+
<div class="p-4 bg-yellow-50 dark:bg-yellow-900/30 border border-yellow-200 dark:border-yellow-700 rounded">
|
|
106
|
+
<p class="text-yellow-800 dark:text-yellow-200">
|
|
107
|
+
No pattern found for view type: ${view.type}
|
|
108
|
+
</p>
|
|
109
|
+
</div>
|
|
110
|
+
`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Build entity selector for detail/dashboard views
|
|
114
|
+
let html = '';
|
|
115
|
+
if (primaryModel && primaryEntities.length > 0 && (view.type === 'detail' || view.type === 'dashboard')) {
|
|
116
|
+
html += `
|
|
117
|
+
<div class="mb-4 pb-4 border-b border-gray-200 dark:border-gray-700 flex items-end justify-between gap-4">
|
|
118
|
+
<div class="flex-1">
|
|
119
|
+
<label class="block text-sm font-semibold text-gray-700 dark:text-gray-200 mb-2">
|
|
120
|
+
Select ${primaryModel}:
|
|
121
|
+
</label>
|
|
122
|
+
<select
|
|
123
|
+
id="entity-selector"
|
|
124
|
+
class="w-full max-w-md px-3 py-2 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
125
|
+
>
|
|
126
|
+
${primaryEntities.map((entity) => {
|
|
127
|
+
const displayName = getEntityDisplayName(entity, modelData);
|
|
128
|
+
return `<option value="${entity.id}" ${entity.id === selectedEntityId ? 'selected' : ''}>${displayName}</option>`;
|
|
129
|
+
}).join('')}
|
|
130
|
+
</select>
|
|
131
|
+
</div>
|
|
132
|
+
${onNavigate ? `
|
|
133
|
+
<button
|
|
134
|
+
id="edit-button"
|
|
135
|
+
class="px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
|
|
136
|
+
>
|
|
137
|
+
Edit
|
|
138
|
+
</button>
|
|
139
|
+
` : ''}
|
|
140
|
+
</div>
|
|
141
|
+
`;
|
|
142
|
+
}
|
|
143
|
+
// If external pattern adapter provided, use it
|
|
144
|
+
if (externalAdapter) {
|
|
145
|
+
const pattern = externalAdapter.detectPattern(view);
|
|
146
|
+
if (pattern) {
|
|
147
|
+
const context = {
|
|
148
|
+
pattern,
|
|
149
|
+
viewSpec: view,
|
|
150
|
+
modelData,
|
|
151
|
+
modelSchemas,
|
|
152
|
+
primaryModel,
|
|
153
|
+
selectedEntity,
|
|
154
|
+
primaryEntities,
|
|
155
|
+
protocolMapping: externalAdapter.REACT_PROTOCOL_MAPPING || {},
|
|
156
|
+
tailwindAdapter: externalAdapter.tailwindAdapter || tailwindAdapter,
|
|
157
|
+
};
|
|
158
|
+
html += externalAdapter.renderPattern(context, {
|
|
159
|
+
enableListNavigation: view.type === 'list' && onNavigate !== undefined,
|
|
160
|
+
enableRelatedNavigation: onNavigate !== undefined,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// Built-in rendering using tailwind adapter directly
|
|
166
|
+
html += renderBuiltInPattern(patternResult, view, modelData, modelSchemas, primaryModel, selectedEntity, primaryEntities, tailwindAdapter);
|
|
167
|
+
}
|
|
168
|
+
setRenderedHtml(html);
|
|
169
|
+
setError(null);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
console.error('Pattern-based rendering error:', err);
|
|
173
|
+
setError(err instanceof Error ? err.message : 'Unknown error');
|
|
174
|
+
}
|
|
175
|
+
}, [view, modelData, modelSchemas, selectedEntity, primaryModel, primaryEntities, selectedEntityId, externalAdapter, tailwindAdapter, onNavigate]);
|
|
176
|
+
// DOM event handlers for navigation
|
|
177
|
+
useEffect(() => {
|
|
178
|
+
// Entity selector change
|
|
179
|
+
const selector = document.getElementById('entity-selector');
|
|
180
|
+
if (selector) {
|
|
181
|
+
const handler = (e) => {
|
|
182
|
+
setSelectedEntityId(e.target.value);
|
|
183
|
+
};
|
|
184
|
+
selector.addEventListener('change', handler);
|
|
185
|
+
return () => selector.removeEventListener('change', handler);
|
|
186
|
+
}
|
|
187
|
+
}, [renderedHtml]);
|
|
188
|
+
useEffect(() => {
|
|
189
|
+
// Edit button
|
|
190
|
+
const editButton = document.getElementById('edit-button');
|
|
191
|
+
if (editButton && onNavigate) {
|
|
192
|
+
const handler = () => onNavigate('form', selectedEntityId || undefined);
|
|
193
|
+
editButton.addEventListener('click', handler);
|
|
194
|
+
return () => editButton.removeEventListener('click', handler);
|
|
195
|
+
}
|
|
196
|
+
}, [renderedHtml, onNavigate, selectedEntityId]);
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
// List item navigation (same model)
|
|
199
|
+
const items = document.querySelectorAll('[data-nav-entity-id]:not([data-nav-model])');
|
|
200
|
+
if (items.length > 0 && onNavigate) {
|
|
201
|
+
const handlers = [];
|
|
202
|
+
items.forEach((item) => {
|
|
203
|
+
const handler = () => {
|
|
204
|
+
const entityId = item.getAttribute('data-nav-entity-id');
|
|
205
|
+
if (entityId)
|
|
206
|
+
onNavigate('detail', entityId);
|
|
207
|
+
};
|
|
208
|
+
item.addEventListener('click', handler);
|
|
209
|
+
handlers.push([item, handler]);
|
|
210
|
+
});
|
|
211
|
+
return () => handlers.forEach(([el, h]) => el.removeEventListener('click', h));
|
|
212
|
+
}
|
|
213
|
+
}, [renderedHtml, onNavigate]);
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
// Cross-model navigation
|
|
216
|
+
const items = document.querySelectorAll('[data-nav-entity-id][data-nav-model]');
|
|
217
|
+
if (items.length > 0 && onNavigate) {
|
|
218
|
+
const handlers = [];
|
|
219
|
+
items.forEach((item) => {
|
|
220
|
+
const handler = () => {
|
|
221
|
+
const entityId = item.getAttribute('data-nav-entity-id');
|
|
222
|
+
const targetModel = item.getAttribute('data-nav-model');
|
|
223
|
+
if (entityId && targetModel)
|
|
224
|
+
onNavigate('detail', entityId, targetModel);
|
|
225
|
+
};
|
|
226
|
+
item.addEventListener('click', handler);
|
|
227
|
+
handlers.push([item, handler]);
|
|
228
|
+
});
|
|
229
|
+
return () => handlers.forEach(([el, h]) => el.removeEventListener('click', h));
|
|
230
|
+
}
|
|
231
|
+
}, [renderedHtml, onNavigate]);
|
|
232
|
+
if (error) {
|
|
233
|
+
return (_jsxs("div", { className: "p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-700 rounded", children: [_jsx("p", { className: "text-red-800 dark:text-red-200 font-semibold", children: "Pattern Rendering Error" }), _jsx("pre", { className: "text-sm text-red-700 dark:text-red-300 mt-2", children: error })] }));
|
|
234
|
+
}
|
|
235
|
+
return (_jsx("div", { className: "runtime-view-container p-4 h-full overflow-auto", children: _jsx("div", { dangerouslySetInnerHTML: { __html: renderedHtml } }) }));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Built-in pattern rendering when no external adapter is provided.
|
|
239
|
+
* Uses the tailwind adapter to generate HTML for common patterns.
|
|
240
|
+
*/
|
|
241
|
+
function renderBuiltInPattern(pattern, view, modelData, modelSchemas, primaryModel, selectedEntity, primaryEntities, tailwindAdapter) {
|
|
242
|
+
const tw = tailwindAdapter.components;
|
|
243
|
+
if (pattern.patternId === 'list-view' && primaryModel) {
|
|
244
|
+
const entities = modelData[primaryModel] || [];
|
|
245
|
+
const schema = modelSchemas[primaryModel];
|
|
246
|
+
const attributes = schema?.attributes || {};
|
|
247
|
+
const columns = Object.keys(attributes).filter(k => k !== 'id' && k !== 'createdAt' && k !== 'updatedAt');
|
|
248
|
+
if (entities.length === 0) {
|
|
249
|
+
return `<div class="text-center py-16 text-gray-500 dark:text-gray-400">No ${primaryModel} entities yet</div>`;
|
|
250
|
+
}
|
|
251
|
+
const headerRow = columns.map(col => `<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">${col}</th>`).join('');
|
|
252
|
+
const bodyRows = entities.map((entity) => {
|
|
253
|
+
const data = entity.data || entity;
|
|
254
|
+
const cells = columns.map(col => `<td class="px-6 py-4 text-sm text-gray-900 dark:text-gray-100">${data[col] ?? '-'}</td>`).join('');
|
|
255
|
+
return `<tr class="hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer" data-nav-entity-id="${entity.id}">${cells}</tr>`;
|
|
256
|
+
}).join('');
|
|
257
|
+
return tw.table?.render({
|
|
258
|
+
properties: { columns },
|
|
259
|
+
children: bodyRows,
|
|
260
|
+
}) || `<table class="min-w-full"><thead><tr>${headerRow}</tr></thead><tbody>${bodyRows}</tbody></table>`;
|
|
261
|
+
}
|
|
262
|
+
if (pattern.patternId === 'detail-view' && selectedEntity) {
|
|
263
|
+
const data = selectedEntity.data || selectedEntity;
|
|
264
|
+
const schema = modelSchemas[primaryModel || ''];
|
|
265
|
+
const attributes = schema?.attributes || {};
|
|
266
|
+
const fields = Object.keys(attributes).filter(k => k !== 'id' && k !== 'createdAt' && k !== 'updatedAt');
|
|
267
|
+
return tw.content?.render({
|
|
268
|
+
properties: { fields },
|
|
269
|
+
children: fields.map(f => `<div class="py-3 border-b border-gray-200 dark:border-gray-700">
|
|
270
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-1">${f}</dt>
|
|
271
|
+
<dd class="text-base text-gray-900 dark:text-gray-100">${data[f] ?? '-'}</dd>
|
|
272
|
+
</div>`).join(''),
|
|
273
|
+
}) || '';
|
|
274
|
+
}
|
|
275
|
+
if (pattern.patternId === 'dashboard-view' && primaryModel) {
|
|
276
|
+
const entities = modelData[primaryModel] || [];
|
|
277
|
+
return tw.card?.render({
|
|
278
|
+
properties: { variant: 'metric', metric: `Total ${primaryModel}` },
|
|
279
|
+
children: String(entities.length),
|
|
280
|
+
}) || '';
|
|
281
|
+
}
|
|
282
|
+
return `<div class="p-4 text-gray-500 dark:text-gray-400">View type: ${view.type} — pattern: ${pattern.patternId}</div>`;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=RuntimeView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeView.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/RuntimeView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewRouter — Routes views to appropriate renderer
|
|
3
|
+
*
|
|
4
|
+
* Forms → FormView (stateful, controller-based)
|
|
5
|
+
* Display (list/detail/dashboard) → RuntimeView (pattern-based)
|
|
6
|
+
*
|
|
7
|
+
* Ported from specverse-app-demo/frontend-react/src/components/views/ViewRenderer.tsx
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
export interface ViewRouterProps {
|
|
11
|
+
/** Optional: override which views to show */
|
|
12
|
+
views?: any[];
|
|
13
|
+
/** Optional: custom form renderer for interactive views */
|
|
14
|
+
FormView?: React.ComponentType<{
|
|
15
|
+
view: any;
|
|
16
|
+
selectedEntityId?: string | null;
|
|
17
|
+
}>;
|
|
18
|
+
/** Optional: pattern adapter for rendering */
|
|
19
|
+
patternAdapter?: any;
|
|
20
|
+
}
|
|
21
|
+
export declare function ViewRouter({ views: viewsOverride, FormView, patternAdapter }: ViewRouterProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=ViewRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewRouter.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ViewRouter.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAyC,MAAM,OAAO,CAAC;AAO9D,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAChF,8CAA8C;IAC9C,cAAc,CAAC,EAAE,GAAG,CAAC;CACtB;AAOD,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,eAAe,2CAqF7F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ViewRouter — Routes views to appropriate renderer
|
|
4
|
+
*
|
|
5
|
+
* Forms → FormView (stateful, controller-based)
|
|
6
|
+
* Display (list/detail/dashboard) → RuntimeView (pattern-based)
|
|
7
|
+
*
|
|
8
|
+
* Ported from specverse-app-demo/frontend-react/src/components/views/ViewRenderer.tsx
|
|
9
|
+
*/
|
|
10
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
11
|
+
import { useRuntimeContext } from '../context.js';
|
|
12
|
+
import { RuntimeView } from './RuntimeView.js';
|
|
13
|
+
import { ViewSidebar } from './ViewSidebar.js';
|
|
14
|
+
import { ResizeHandle } from './ui/ResizeHandle.js';
|
|
15
|
+
import { useResizableSidebar } from '../hooks/useResizableSidebar.js';
|
|
16
|
+
/** View types that require interactive (form-based) rendering */
|
|
17
|
+
const INTERACTIVE_VIEW_TYPES = new Set([
|
|
18
|
+
'form', 'create', 'edit', 'create-form', 'edit-form',
|
|
19
|
+
]);
|
|
20
|
+
export function ViewRouter({ views: viewsOverride, FormView, patternAdapter }) {
|
|
21
|
+
const ctx = useRuntimeContext();
|
|
22
|
+
const views = viewsOverride || ctx.views || [];
|
|
23
|
+
const [selectedViewName, setSelectedViewName] = useState(null);
|
|
24
|
+
const [selectedEntityId, setSelectedEntityId] = useState(null);
|
|
25
|
+
const { width, isResizing, startResizing } = useResizableSidebar();
|
|
26
|
+
// Auto-select first view
|
|
27
|
+
const selectedView = useMemo(() => {
|
|
28
|
+
if (!views.length)
|
|
29
|
+
return null;
|
|
30
|
+
const name = selectedViewName || views[0]?.name;
|
|
31
|
+
return views.find(v => v.name === name) || null;
|
|
32
|
+
}, [views, selectedViewName]);
|
|
33
|
+
// Find a view by model and type
|
|
34
|
+
const findViewByModelAndType = useCallback((model, type) => {
|
|
35
|
+
return views.find(v => {
|
|
36
|
+
const viewModel = v.model || v.controller?.replace(/Controller$/, '');
|
|
37
|
+
return viewModel === model && v.type === type;
|
|
38
|
+
});
|
|
39
|
+
}, [views]);
|
|
40
|
+
// Navigation handler
|
|
41
|
+
const handleNavigate = useCallback((targetViewType, entityId, targetModel) => {
|
|
42
|
+
if (entityId)
|
|
43
|
+
setSelectedEntityId(entityId);
|
|
44
|
+
if (targetModel) {
|
|
45
|
+
// Cross-model navigation
|
|
46
|
+
const targetView = findViewByModelAndType(targetModel, targetViewType);
|
|
47
|
+
if (targetView) {
|
|
48
|
+
setSelectedViewName(targetView.name);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (selectedView) {
|
|
52
|
+
// Same-model navigation
|
|
53
|
+
const currentModel = selectedView.model || selectedView.controller?.replace(/Controller$/, '');
|
|
54
|
+
if (currentModel) {
|
|
55
|
+
const targetView = findViewByModelAndType(currentModel, targetViewType);
|
|
56
|
+
if (targetView) {
|
|
57
|
+
setSelectedViewName(targetView.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}, [selectedView, findViewByModelAndType]);
|
|
62
|
+
const handleViewSelect = useCallback((viewName) => {
|
|
63
|
+
setSelectedViewName(viewName);
|
|
64
|
+
setSelectedEntityId(null);
|
|
65
|
+
}, []);
|
|
66
|
+
// Determine rendering strategy
|
|
67
|
+
const isInteractive = selectedView && INTERACTIVE_VIEW_TYPES.has(selectedView.type?.toLowerCase());
|
|
68
|
+
return (_jsxs("div", { className: "flex h-full bg-gray-900", children: [_jsx(ViewSidebar, { views: views, selectedView: selectedView?.name || null, onSelectView: handleViewSelect }), _jsx(ResizeHandle, { onMouseDown: startResizing, isResizing: isResizing }), _jsx("div", { className: "flex-1 bg-white dark:bg-gray-800 rounded-lg shadow overflow-hidden flex flex-col ml-3 border border-gray-200 dark:border-gray-700", children: selectedView ? (isInteractive && FormView ? (_jsx(FormView, { view: selectedView, selectedEntityId: selectedEntityId })) : (_jsx(RuntimeView, { view: selectedView, selectedEntityId: selectedEntityId, onNavigate: handleNavigate, patternAdapter: patternAdapter }))) : (_jsx("div", { className: "flex-1 flex items-center justify-center text-gray-500 dark:text-gray-400", children: _jsx("p", { children: "Select a view from the sidebar" }) })) })] }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ViewRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewRouter.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ViewRouter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewSidebar — View selection sidebar
|
|
3
|
+
*
|
|
4
|
+
* Displays a scrollable list of available views with selection state.
|
|
5
|
+
* Ported from specverse-app-demo.
|
|
6
|
+
*/
|
|
7
|
+
export interface ViewSidebarProps {
|
|
8
|
+
views: unknown[];
|
|
9
|
+
selectedView?: string | null;
|
|
10
|
+
onSelectView?: (viewName: string) => void;
|
|
11
|
+
width?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function ViewSidebar({ views, selectedView, onSelectView, width }: ViewSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=ViewSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewSidebar.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ViewSidebar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CAoCzF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function ViewSidebar({ views, selectedView, onSelectView, width }) {
|
|
3
|
+
const style = width ? { width: `${width}px`, minWidth: `${width}px`, maxWidth: `${width}px` } : undefined;
|
|
4
|
+
return (_jsxs("div", { className: "bg-white dark:bg-gray-800 rounded-lg shadow p-4 flex flex-col overflow-hidden border border-gray-200 dark:border-gray-700", style: style, children: [_jsx("h3", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100 uppercase tracking-wide mb-4", children: "Views" }), views.length === 0 ? (_jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400 italic", children: "No views defined in spec" })) : (_jsx("ul", { className: "space-y-0.5 overflow-y-auto flex-1 sidebar-scrollbar", children: views.map((view) => {
|
|
5
|
+
const isSelected = view.name === selectedView;
|
|
6
|
+
return (_jsx("li", { onClick: () => onSelectView?.(view.name), className: `px-2 py-1.5 rounded cursor-pointer border transition-all text-sm ${isSelected
|
|
7
|
+
? 'bg-blue-50 dark:bg-blue-900/30 border-blue-500 dark:border-blue-600 text-blue-700 dark:text-blue-200'
|
|
8
|
+
: 'border-transparent hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'}`, children: view.name }, view.name));
|
|
9
|
+
}) }))] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ViewSidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewSidebar.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ViewSidebar.tsx"],"names":[],"mappings":";AAgBA,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAoB;IACxF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1G,OAAO,CACL,eACE,SAAS,EAAC,2HAA2H,EACrI,KAAK,EAAE,KAAK,aAEZ,aAAI,SAAS,EAAC,qFAAqF,sBAE9F,EAEH,KAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,YAAG,SAAS,EAAC,iDAAiD,yCAA6B,CAC5F,CAAC,CAAC,CAAC,CACF,aAAI,SAAS,EAAC,sDAAsD,YAChE,KAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;oBAC9C,OAAO,CACL,aAEE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EACxC,SAAS,EAAE,oEACT,UAAU;4BACR,CAAC,CAAC,sGAAsG;4BACxG,CAAC,CAAC,6FACN,EAAE,YAED,IAAI,CAAC,IAAI,IARL,IAAI,CAAC,IAAI,CASX,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,CACN,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResizeHandle — Draggable resize handle between panels
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export interface ResizeHandleProps {
|
|
6
|
+
onMouseDown: () => void;
|
|
7
|
+
isResizing: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function ResizeHandle({ onMouseDown, isResizing }: ResizeHandleProps): React.DetailedReactHTMLElement<{
|
|
10
|
+
className: string;
|
|
11
|
+
onMouseDown: () => void;
|
|
12
|
+
}, HTMLElement>;
|
|
13
|
+
//# sourceMappingURL=ResizeHandle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResizeHandle.d.ts","sourceRoot":"","sources":["../../../../../../src/runtime/views/react/components/ui/ResizeHandle.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,iBAAiB;;uBAJtD,IAAI;gBAWxB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResizeHandle — Draggable resize handle between panels
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export function ResizeHandle({ onMouseDown, isResizing }) {
|
|
6
|
+
return React.createElement('div', {
|
|
7
|
+
className: `w-1 cursor-col-resize hover:bg-blue-500 transition-colors ${isResizing ? 'bg-blue-500' : 'bg-gray-200 dark:bg-gray-700'}`,
|
|
8
|
+
onMouseDown,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ResizeHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResizeHandle.js","sourceRoot":"","sources":["../../../../../../src/runtime/views/react/components/ui/ResizeHandle.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,UAAU,YAAY,CAAC,EAAE,WAAW,EAAE,UAAU,EAAqB;IACzE,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE;QAChC,SAAS,EAAE,6DACT,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,8BAC/B,EAAE;QACF,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeViewProvider — React Context
|
|
3
|
+
*
|
|
4
|
+
* Connects runtime view components to instance-specific data and hooks.
|
|
5
|
+
* The generated App.tsx provides this context; runtime components consume it.
|
|
6
|
+
*/
|
|
7
|
+
import type { RuntimeViewProviderValue } from '../core/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Provider that supplies instance-specific hooks and data to runtime view components.
|
|
10
|
+
*
|
|
11
|
+
* Usage in generated App.tsx:
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <RuntimeViewProvider value={{ useEntitiesQuery, useModelSchemaQuery, ... }}>
|
|
14
|
+
* <DevShell />
|
|
15
|
+
* </RuntimeViewProvider>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare const RuntimeViewProvider: import("react").Provider<RuntimeViewProviderValue | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Access the runtime context from within runtime view components.
|
|
21
|
+
* Throws if used outside a RuntimeViewProvider.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useRuntimeContext(): RuntimeViewProviderValue;
|
|
24
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/runtime/views/react/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAIjE;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,2DAA8B,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,wBAAwB,CAS5D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeViewProvider — React Context
|
|
3
|
+
*
|
|
4
|
+
* Connects runtime view components to instance-specific data and hooks.
|
|
5
|
+
* The generated App.tsx provides this context; runtime components consume it.
|
|
6
|
+
*/
|
|
7
|
+
import { createContext, useContext } from 'react';
|
|
8
|
+
const RuntimeViewContext = createContext(null);
|
|
9
|
+
/**
|
|
10
|
+
* Provider that supplies instance-specific hooks and data to runtime view components.
|
|
11
|
+
*
|
|
12
|
+
* Usage in generated App.tsx:
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <RuntimeViewProvider value={{ useEntitiesQuery, useModelSchemaQuery, ... }}>
|
|
15
|
+
* <DevShell />
|
|
16
|
+
* </RuntimeViewProvider>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const RuntimeViewProvider = RuntimeViewContext.Provider;
|
|
20
|
+
/**
|
|
21
|
+
* Access the runtime context from within runtime view components.
|
|
22
|
+
* Throws if used outside a RuntimeViewProvider.
|
|
23
|
+
*/
|
|
24
|
+
export function useRuntimeContext() {
|
|
25
|
+
const ctx = useContext(RuntimeViewContext);
|
|
26
|
+
if (!ctx) {
|
|
27
|
+
throw new Error('useRuntimeContext must be used within a <RuntimeViewProvider>. ' +
|
|
28
|
+
'Ensure your App.tsx wraps the view tree with RuntimeViewProvider.');
|
|
29
|
+
}
|
|
30
|
+
return ctx;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/runtime/views/react/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD,MAAM,kBAAkB,GAAG,aAAa,CAAkC,IAAI,CAAC,CAAC;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iEAAiE;YACjE,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useEntityHelpers — React hooks wrapping core field classification
|
|
3
|
+
*
|
|
4
|
+
* Uses RuntimeViewContext instead of instance-specific appStore.
|
|
5
|
+
*/
|
|
6
|
+
import { METADATA_FIELDS } from '../../core/field-classification.js';
|
|
7
|
+
export { METADATA_FIELDS };
|
|
8
|
+
/**
|
|
9
|
+
* Hook to separate regular fields from metadata fields for table display.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useFieldSeparation(attributes: Record<string, unknown>): import("../../core/field-classification.js").FieldClassification;
|
|
12
|
+
/**
|
|
13
|
+
* Hook to create a relationship resolver function.
|
|
14
|
+
* Uses entities from RuntimeViewProvider context.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useRelationshipResolver(): (entity: any, relName: string, relDef: any) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Combined hook for entity helpers.
|
|
19
|
+
*/
|
|
20
|
+
export declare function useEntityHelpers(attributes: Record<string, unknown>): {
|
|
21
|
+
resolveRelationship: (entity: any, relName: string, relDef: any) => string;
|
|
22
|
+
regularFields: string[];
|
|
23
|
+
metadataFields: string[];
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=useEntityHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntityHelpers.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/hooks/useEntityHelpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAkB,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAIrF,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,oEAErE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,aAInB,GAAG,WAAW,MAAM,UAAU,GAAG,KAAG,MAAM,CAsB7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;kCA3BhD,GAAG,WAAW,MAAM,UAAU,GAAG,KAAG,MAAM;;;EA+B7D"}
|