@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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for the SpecVerse runtime view engine.
|
|
3
|
+
*
|
|
4
|
+
* These types define the contracts between:
|
|
5
|
+
* - The runtime view engine (framework-agnostic)
|
|
6
|
+
* - Framework adapters (React, Vue, etc.)
|
|
7
|
+
* - Instance-specific wiring (API client, state management)
|
|
8
|
+
*/
|
|
9
|
+
/** Configuration for the view engine */
|
|
10
|
+
export interface ViewEngineConfig {
|
|
11
|
+
/** The full specification object */
|
|
12
|
+
spec: Record<string, unknown>;
|
|
13
|
+
/** Dev spec for auto-generated dev views */
|
|
14
|
+
devSpec?: Record<string, unknown>;
|
|
15
|
+
/** Tailwind adapter for markup generation */
|
|
16
|
+
tailwindAdapter?: unknown;
|
|
17
|
+
}
|
|
18
|
+
/** Context passed to pattern renderers */
|
|
19
|
+
export interface ViewRenderContext {
|
|
20
|
+
/** The view specification being rendered */
|
|
21
|
+
viewSpec: Record<string, unknown>;
|
|
22
|
+
/** Entity data keyed by model name */
|
|
23
|
+
modelData: Record<string, unknown[]>;
|
|
24
|
+
/** Model schemas keyed by model name */
|
|
25
|
+
modelSchemas: Record<string, unknown>;
|
|
26
|
+
/** The primary model name for this view */
|
|
27
|
+
primaryModel: string;
|
|
28
|
+
/** Currently selected entity (for detail/form views) */
|
|
29
|
+
selectedEntity?: Record<string, unknown>;
|
|
30
|
+
/** All entities for the primary model */
|
|
31
|
+
primaryEntities?: unknown[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Value provided by RuntimeViewProvider.
|
|
35
|
+
*
|
|
36
|
+
* This is the contract between the instance-specific wiring
|
|
37
|
+
* (generated API client, state management) and the runtime
|
|
38
|
+
* view components. Components use useRuntimeContext() to
|
|
39
|
+
* access these without importing instance-specific modules.
|
|
40
|
+
*/
|
|
41
|
+
export interface RuntimeViewProviderValue {
|
|
42
|
+
/** Hook to query entities for a controller/model */
|
|
43
|
+
useEntitiesQuery: (controllerName: string, modelName: string) => {
|
|
44
|
+
data: unknown[] | undefined;
|
|
45
|
+
isLoading: boolean;
|
|
46
|
+
error: unknown;
|
|
47
|
+
};
|
|
48
|
+
/** Hook to query a model's schema */
|
|
49
|
+
useModelSchemaQuery: (modelName: string) => {
|
|
50
|
+
data: unknown | undefined;
|
|
51
|
+
isLoading: boolean;
|
|
52
|
+
error: unknown;
|
|
53
|
+
};
|
|
54
|
+
/** Hook to execute a CRUD operation */
|
|
55
|
+
useExecuteOperationMutation: () => {
|
|
56
|
+
mutateAsync: (args: {
|
|
57
|
+
controllerName: string;
|
|
58
|
+
operationName: string;
|
|
59
|
+
data: Record<string, unknown>;
|
|
60
|
+
entityId?: string;
|
|
61
|
+
}) => Promise<unknown>;
|
|
62
|
+
isPending: boolean;
|
|
63
|
+
};
|
|
64
|
+
/** Hook to transition lifecycle state */
|
|
65
|
+
useTransitionStateMutation: () => {
|
|
66
|
+
mutateAsync: (args: {
|
|
67
|
+
controllerName: string;
|
|
68
|
+
entityId: string;
|
|
69
|
+
targetState: string;
|
|
70
|
+
}) => Promise<unknown>;
|
|
71
|
+
isPending: boolean;
|
|
72
|
+
};
|
|
73
|
+
/** All entities keyed by model name */
|
|
74
|
+
entities: Record<string, unknown[]>;
|
|
75
|
+
/** Model schemas keyed by model name */
|
|
76
|
+
modelSchemas: Record<string, unknown>;
|
|
77
|
+
/** All views from the spec */
|
|
78
|
+
views: unknown[];
|
|
79
|
+
/** The full specification */
|
|
80
|
+
spec: Record<string, unknown>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/runtime/views/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,yCAAyC;IACzC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,gBAAgB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK;QAC/D,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QAC5B,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,qCAAqC;IACrC,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK;QAC1C,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;QAC1B,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,uCAAuC;IACvC,2BAA2B,EAAE,MAAM;QACjC,WAAW,EAAE,CAAC,IAAI,EAAE;YAClB,cAAc,EAAE,MAAM,CAAC;YACvB,aAAa,EAAE,MAAM,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,yCAAyC;IACzC,0BAA0B,EAAE,MAAM;QAChC,WAAW,EAAE,CAAC,IAAI,EAAE;YAClB,cAAc,EAAE,MAAM,CAAC;YACvB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;SACrB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,8BAA8B;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for the SpecVerse runtime view engine.
|
|
3
|
+
*
|
|
4
|
+
* These types define the contracts between:
|
|
5
|
+
* - The runtime view engine (framework-agnostic)
|
|
6
|
+
* - Framework adapters (React, Vue, etc.)
|
|
7
|
+
* - Instance-specific wiring (API client, state management)
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/runtime/views/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @specverse/runtime/views
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic view engine — core utilities for rendering
|
|
5
|
+
* SpecVerse views from spec + data at runtime.
|
|
6
|
+
*/
|
|
7
|
+
export { getEntityDisplayName, humanizeFieldName, } from './core/entity-display.js';
|
|
8
|
+
export { classifyFields, isAutoField, isMetadataField, isRelationshipField, METADATA_FIELDS, type FieldClassification, } from './core/field-classification.js';
|
|
9
|
+
export { detectPattern, inferFieldsFromSchema, inferFieldsFromModel, CURVED_PROTOCOL_MAPPING, type PatternDetectionResult, } from './core/pattern-engine.js';
|
|
10
|
+
export type { ViewEngineConfig, ViewRenderContext, RuntimeViewProviderValue, } from './core/types.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/views/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,KAAK,mBAAmB,GACzB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @specverse/runtime/views
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic view engine — core utilities for rendering
|
|
5
|
+
* SpecVerse views from spec + data at runtime.
|
|
6
|
+
*/
|
|
7
|
+
// Core utilities
|
|
8
|
+
export { getEntityDisplayName, humanizeFieldName, } from './core/entity-display.js';
|
|
9
|
+
export { classifyFields, isAutoField, isMetadataField, isRelationshipField, METADATA_FIELDS, } from './core/field-classification.js';
|
|
10
|
+
export { detectPattern, inferFieldsFromSchema, inferFieldsFromModel, CURVED_PROTOCOL_MAPPING, } from './core/pattern-engine.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/views/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iBAAiB;AACjB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,eAAe,GAEhB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevShell — Development GUI Shell
|
|
3
|
+
*
|
|
4
|
+
* The main dev GUI container with tabs, dark mode, and sidebar navigation.
|
|
5
|
+
* Renders both dev views (auto-generated) and spec views (user-declared).
|
|
6
|
+
*
|
|
7
|
+
* Assembled from app-demo's App.tsx patterns.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
export interface DevShellProps {
|
|
11
|
+
/** Dev spec (auto-generated views for all models) */
|
|
12
|
+
devSpec?: Record<string, unknown>;
|
|
13
|
+
/** App spec (user-declared views from main.specly) */
|
|
14
|
+
appSpec?: Record<string, unknown>;
|
|
15
|
+
/** Custom form view component for interactive views */
|
|
16
|
+
FormView?: React.ComponentType<{
|
|
17
|
+
view: any;
|
|
18
|
+
selectedEntityId?: string | null;
|
|
19
|
+
}>;
|
|
20
|
+
/** Optional external pattern adapter */
|
|
21
|
+
patternAdapter?: any;
|
|
22
|
+
/** Application title */
|
|
23
|
+
title?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function DevShell({ devSpec, appSpec, FormView, patternAdapter, title }: DevShellProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=DevShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevShell.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/DevShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAChF,wCAAwC;IACxC,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,aAAa,2CA2F5F"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* DevShell — Development GUI Shell
|
|
4
|
+
*
|
|
5
|
+
* The main dev GUI container with tabs, dark mode, and sidebar navigation.
|
|
6
|
+
* Renders both dev views (auto-generated) and spec views (user-declared).
|
|
7
|
+
*
|
|
8
|
+
* Assembled from app-demo's App.tsx patterns.
|
|
9
|
+
*/
|
|
10
|
+
import React, { useState } from 'react';
|
|
11
|
+
import { useTheme } from '../hooks/useTheme.js';
|
|
12
|
+
import { ViewRouter } from './ViewRouter.js';
|
|
13
|
+
import { ModelSelector } from './ModelSelector.js';
|
|
14
|
+
const TABS = [
|
|
15
|
+
{ id: 'views', label: 'Views' },
|
|
16
|
+
{ id: 'models', label: 'Models' },
|
|
17
|
+
];
|
|
18
|
+
export function DevShell({ devSpec, appSpec, FormView, patternAdapter, title }) {
|
|
19
|
+
const { theme, toggleTheme, isDark } = useTheme();
|
|
20
|
+
const [activeTab, setActiveTab] = useState('views');
|
|
21
|
+
// Combine views from both specs
|
|
22
|
+
const allViews = React.useMemo(() => {
|
|
23
|
+
const views = [];
|
|
24
|
+
const spec = appSpec;
|
|
25
|
+
const dev = devSpec;
|
|
26
|
+
// App spec views first (user-declared)
|
|
27
|
+
if (spec?.views) {
|
|
28
|
+
for (const [name, viewDef] of Object.entries(spec.views)) {
|
|
29
|
+
views.push({ name, ...viewDef });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Dev spec views (auto-generated) — skip if already declared in app spec
|
|
33
|
+
if (dev?.views) {
|
|
34
|
+
const appViewNames = new Set(views.map(v => v.name));
|
|
35
|
+
for (const [name, viewDef] of Object.entries(dev.views)) {
|
|
36
|
+
if (!appViewNames.has(name)) {
|
|
37
|
+
views.push({ name, ...viewDef, _isDev: true });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return views;
|
|
42
|
+
}, [appSpec, devSpec]);
|
|
43
|
+
// Derive models from spec
|
|
44
|
+
const models = React.useMemo(() => {
|
|
45
|
+
const spec = (appSpec || devSpec);
|
|
46
|
+
if (spec?.models)
|
|
47
|
+
return Object.keys(spec.models);
|
|
48
|
+
return [];
|
|
49
|
+
}, [appSpec, devSpec]);
|
|
50
|
+
const appTitle = title || appSpec?.metadata?.name || 'SpecVerse Dev';
|
|
51
|
+
return (_jsxs("div", { className: "flex flex-col h-screen bg-gray-900 text-white overflow-hidden", children: [_jsxs("header", { className: "bg-gray-800 border-b border-gray-700 px-4 py-3 flex items-center justify-between flex-shrink-0", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("h1", { className: "text-lg font-semibold text-white", children: appTitle }), _jsx("span", { className: "text-xs text-gray-400 bg-gray-700 px-2 py-0.5 rounded", children: "dev" })] }), _jsx("div", { className: "flex items-center gap-3", children: _jsx("button", { onClick: toggleTheme, className: "px-3 py-1.5 text-sm bg-gray-700 hover:bg-gray-600 text-gray-300 rounded transition-colors", children: isDark ? 'Light' : 'Dark' }) })] }), _jsx("div", { className: "bg-gray-800 px-4 flex gap-1 flex-shrink-0", children: TABS.map((tab) => (_jsx("button", { onClick: () => setActiveTab(tab.id), className: `px-4 py-2 text-sm font-medium rounded-t-lg transition-colors ${activeTab === tab.id
|
|
52
|
+
? 'bg-gray-900 text-white'
|
|
53
|
+
: 'bg-gray-700 text-gray-300 hover:bg-gray-650 hover:text-gray-200'}`, children: tab.label }, tab.id))) }), _jsxs("main", { className: "flex-1 p-4 overflow-hidden", children: [activeTab === 'views' && (_jsx(ViewRouter, { views: allViews, FormView: FormView, patternAdapter: patternAdapter })), activeTab === 'models' && (_jsx(ModelSelector, { models: models }))] })] }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=DevShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevShell.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/DevShell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelManager — CRUD interface for a single model
|
|
3
|
+
*
|
|
4
|
+
* Two-panel layout: form (top) + entity list (bottom).
|
|
5
|
+
* Supports create, update, delete, and lifecycle transitions.
|
|
6
|
+
*
|
|
7
|
+
* Uses RuntimeViewProvider context instead of appStore.
|
|
8
|
+
* Ported from specverse-app-demo/frontend-react/src/components/models/ModelManager.tsx
|
|
9
|
+
*/
|
|
10
|
+
export interface ModelManagerProps {
|
|
11
|
+
modelName: string;
|
|
12
|
+
controllerName?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function ModelManager({ modelName, controllerName }: ModelManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=ModelManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelManager.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ModelManager.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,iBAAiB,2CAkT5E"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ModelManager — CRUD interface for a single model
|
|
4
|
+
*
|
|
5
|
+
* Two-panel layout: form (top) + entity list (bottom).
|
|
6
|
+
* Supports create, update, delete, and lifecycle transitions.
|
|
7
|
+
*
|
|
8
|
+
* Uses RuntimeViewProvider context instead of appStore.
|
|
9
|
+
* Ported from specverse-app-demo/frontend-react/src/components/models/ModelManager.tsx
|
|
10
|
+
*/
|
|
11
|
+
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
12
|
+
import { useRuntimeContext } from '../context.js';
|
|
13
|
+
import { isAutoField, isFieldRequired, initializeFormData, classifyFields } from '../../core/field-classification.js';
|
|
14
|
+
import { RelationshipField } from './RelationshipField.js';
|
|
15
|
+
export function ModelManager({ modelName, controllerName }) {
|
|
16
|
+
const ctx = useRuntimeContext();
|
|
17
|
+
const controller = controllerName || `${modelName}Controller`;
|
|
18
|
+
// Fetch data via context hooks
|
|
19
|
+
const { data: entitiesData = [], isLoading: entitiesLoading } = ctx.useEntitiesQuery(controller, modelName);
|
|
20
|
+
const { data: schemaData } = ctx.useModelSchemaQuery(modelName);
|
|
21
|
+
const executeMutation = ctx.useExecuteOperationMutation();
|
|
22
|
+
const transitionMutation = ctx.useTransitionStateMutation();
|
|
23
|
+
const entities = entitiesData;
|
|
24
|
+
const schema = schemaData;
|
|
25
|
+
const attributes = schema?.attributes || {};
|
|
26
|
+
const relationships = schema?.relationships || {};
|
|
27
|
+
const lifecycles = schema?.lifecycles || {};
|
|
28
|
+
const { regularFields, metadataFields } = useMemo(() => classifyFields(attributes), [attributes]);
|
|
29
|
+
// State
|
|
30
|
+
const [selectedEntity, setSelectedEntity] = useState(null);
|
|
31
|
+
const [formMode, setFormMode] = useState('create');
|
|
32
|
+
const [activeTab, setActiveTab] = useState('edit');
|
|
33
|
+
const [formData, setFormData] = useState({});
|
|
34
|
+
const [errors, setErrors] = useState({});
|
|
35
|
+
const [successMessage, setSuccessMessage] = useState(null);
|
|
36
|
+
// Init form when mode or entity changes
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (formMode === 'update' && selectedEntity) {
|
|
39
|
+
setFormData({ ...(selectedEntity.data || selectedEntity) });
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
setFormData(initializeFormData(attributes));
|
|
43
|
+
}
|
|
44
|
+
setErrors({});
|
|
45
|
+
setSuccessMessage(null);
|
|
46
|
+
}, [formMode, selectedEntity, attributes]);
|
|
47
|
+
// Reset when model changes
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
setSelectedEntity(null);
|
|
50
|
+
setFormMode('create');
|
|
51
|
+
setActiveTab('edit');
|
|
52
|
+
setFormData(initializeFormData(attributes));
|
|
53
|
+
setErrors({});
|
|
54
|
+
}, [modelName, attributes]);
|
|
55
|
+
const handleFieldChange = useCallback((field, value) => {
|
|
56
|
+
setFormData(prev => ({ ...prev, [field]: value }));
|
|
57
|
+
}, []);
|
|
58
|
+
const shouldShowField = useCallback((fieldName) => {
|
|
59
|
+
if (formMode === 'create') {
|
|
60
|
+
return !isAutoField(fieldName, attributes[fieldName]);
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}, [formMode, attributes]);
|
|
64
|
+
const handleSave = async () => {
|
|
65
|
+
try {
|
|
66
|
+
setErrors({});
|
|
67
|
+
setSuccessMessage(null);
|
|
68
|
+
if (formMode === 'create') {
|
|
69
|
+
await executeMutation.mutateAsync({
|
|
70
|
+
controllerName: controller,
|
|
71
|
+
operationName: 'create',
|
|
72
|
+
data: formData,
|
|
73
|
+
});
|
|
74
|
+
setFormData(initializeFormData(attributes));
|
|
75
|
+
setSuccessMessage(`${modelName} created successfully`);
|
|
76
|
+
}
|
|
77
|
+
else if (selectedEntity) {
|
|
78
|
+
await executeMutation.mutateAsync({
|
|
79
|
+
controllerName: controller,
|
|
80
|
+
operationName: 'update',
|
|
81
|
+
data: formData,
|
|
82
|
+
entityId: selectedEntity.data?.id || selectedEntity.id,
|
|
83
|
+
});
|
|
84
|
+
setSuccessMessage(`${modelName} updated successfully`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
setErrors({ _form: err.message || 'Operation failed' });
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const handleDelete = async () => {
|
|
92
|
+
if (!selectedEntity)
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
await executeMutation.mutateAsync({
|
|
96
|
+
controllerName: controller,
|
|
97
|
+
operationName: 'delete',
|
|
98
|
+
data: {},
|
|
99
|
+
entityId: selectedEntity.data?.id || selectedEntity.id,
|
|
100
|
+
});
|
|
101
|
+
setSelectedEntity(null);
|
|
102
|
+
setFormMode('create');
|
|
103
|
+
setSuccessMessage(`${modelName} deleted`);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
setErrors({ _form: err.message || 'Delete failed' });
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const handleSelectEntity = useCallback((entity) => {
|
|
110
|
+
setSelectedEntity(entity);
|
|
111
|
+
setFormMode('update');
|
|
112
|
+
setActiveTab('edit');
|
|
113
|
+
}, []);
|
|
114
|
+
const handleClear = useCallback(() => {
|
|
115
|
+
setSelectedEntity(null);
|
|
116
|
+
setFormMode('create');
|
|
117
|
+
setActiveTab('edit');
|
|
118
|
+
setFormData(initializeFormData(attributes));
|
|
119
|
+
setErrors({});
|
|
120
|
+
setSuccessMessage(null);
|
|
121
|
+
}, [attributes]);
|
|
122
|
+
const hasLifecycles = Object.keys(lifecycles).length > 0;
|
|
123
|
+
return (_jsxs("div", { className: "flex flex-col h-full", children: [_jsxs("div", { className: "px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between", children: [_jsx("h2", { className: "text-lg font-semibold text-gray-900 dark:text-gray-100", children: formMode === 'create' ? `New ${modelName}` : `Edit ${modelName}` }), _jsx("div", { className: "flex gap-2", children: formMode === 'update' && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleClear, className: "px-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors", children: "+ New" }), _jsx("button", { onClick: handleDelete, className: "px-3 py-1.5 text-sm bg-red-600 hover:bg-red-700 text-white rounded transition-colors", children: "Delete" })] })) })] }), errors._form && (_jsx("div", { className: "mx-4 mt-2 px-4 py-3 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-700 rounded text-sm text-red-800 dark:text-red-200", children: errors._form })), successMessage && (_jsx("div", { className: "mx-4 mt-2 px-4 py-3 bg-green-50 dark:bg-green-900/30 border border-green-200 dark:border-green-700 rounded text-sm text-green-800 dark:text-green-200", children: successMessage })), formMode === 'update' && hasLifecycles && (_jsxs("div", { className: "px-4 pt-2 flex gap-1", children: [_jsx("button", { onClick: () => setActiveTab('edit'), className: `px-3 py-1.5 text-sm rounded-t ${activeTab === 'edit' ? 'bg-white dark:bg-gray-800 text-blue-600 border border-b-0 border-gray-200 dark:border-gray-700' : 'text-gray-600 dark:text-gray-400'}`, children: "Edit" }), _jsx("button", { onClick: () => setActiveTab('evolve'), className: `px-3 py-1.5 text-sm rounded-t ${activeTab === 'evolve' ? 'bg-white dark:bg-gray-800 text-blue-600 border border-b-0 border-gray-200 dark:border-gray-700' : 'text-gray-600 dark:text-gray-400'}`, children: "Evolve" })] })), _jsx("div", { className: "px-4 py-4 max-h-[50vh] overflow-auto border-b border-gray-200 dark:border-gray-700", children: activeTab === 'edit' ? (_jsxs("form", { onSubmit: (e) => { e.preventDefault(); handleSave(); }, className: "space-y-4", children: [regularFields.filter(shouldShowField).map((fieldName) => {
|
|
124
|
+
const attrDef = attributes[fieldName];
|
|
125
|
+
const typeStr = typeof attrDef === 'string' ? attrDef : attrDef?.type || 'String';
|
|
126
|
+
const required = isFieldRequired(attrDef);
|
|
127
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1", children: [fieldName, required && _jsx("span", { className: "text-red-500 dark:text-red-400 ml-1", children: "*" })] }), renderFieldInput(fieldName, typeStr, formData[fieldName], (val) => handleFieldChange(fieldName, val))] }, fieldName));
|
|
128
|
+
}), Object.entries(relationships).map(([relName, relDef]) => {
|
|
129
|
+
if (relDef.type !== 'belongsTo')
|
|
130
|
+
return null;
|
|
131
|
+
return (_jsx(RelationshipField, { name: relName, relationship: relDef, value: formData[relDef.foreignKey || `${relName}Id`], onChange: (val) => handleFieldChange(relDef.foreignKey || `${relName}Id`, val), required: relDef.required }, relName));
|
|
132
|
+
}), _jsx("button", { type: "submit", disabled: executeMutation.isPending, className: "px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded font-medium transition-colors disabled:opacity-50", children: executeMutation.isPending ? 'Saving...' : formMode === 'create' ? 'Create' : 'Update' })] })) : (_jsx("div", { className: "space-y-4", children: Object.entries(lifecycles).map(([lcName, lcDef]) => {
|
|
133
|
+
const currentState = selectedEntity?.data?.lifecycleStates?.[lcName] || selectedEntity?.metadata?.lifecycleStates?.[lcName] || lcDef.initial;
|
|
134
|
+
return (_jsxs("div", { className: "p-3 border border-gray-200 dark:border-gray-700 rounded", children: [_jsx("div", { className: "text-sm font-medium text-gray-700 dark:text-gray-200 mb-2", children: lcName }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm text-gray-500 dark:text-gray-400", children: "Current:" }), _jsx("span", { className: "px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 rounded text-xs font-medium", children: currentState }), lcDef.states && (_jsxs("select", { className: "ml-auto px-2 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100", value: "", onChange: (e) => {
|
|
135
|
+
if (e.target.value && selectedEntity) {
|
|
136
|
+
transitionMutation.mutateAsync({
|
|
137
|
+
controllerName: controller,
|
|
138
|
+
entityId: selectedEntity.data?.id || selectedEntity.id,
|
|
139
|
+
targetState: e.target.value,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}, children: [_jsx("option", { value: "", children: "Transition to..." }), Object.keys(lcDef.states).filter((s) => s !== currentState).map((state) => (_jsx("option", { value: state, children: state }, state)))] }))] })] }, lcName));
|
|
143
|
+
}) })) }), _jsx("div", { className: "flex-1 overflow-auto", children: entitiesLoading ? (_jsx("div", { className: "flex items-center justify-center p-8 text-gray-500 dark:text-gray-400", children: "Loading..." })) : entities.length === 0 ? (_jsxs("div", { className: "flex items-center justify-center p-8 text-gray-500 dark:text-gray-400", children: ["No ", modelName, " entities yet"] })) : (_jsxs("table", { className: "min-w-full divide-y divide-gray-200 dark:divide-gray-700", children: [_jsx("thead", { className: "bg-gray-50 dark:bg-gray-800 sticky top-0", children: _jsxs("tr", { children: [regularFields.map(f => (_jsx("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: f }, f))), metadataFields.slice(0, 2).map(f => (_jsx("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-400 dark:text-gray-500 uppercase tracking-wider italic", children: f }, f)))] }) }), _jsx("tbody", { className: "bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700", children: entities.map((entity) => {
|
|
144
|
+
const data = entity.data || entity;
|
|
145
|
+
const isSelected = selectedEntity?.id === entity.id;
|
|
146
|
+
return (_jsxs("tr", { onClick: () => handleSelectEntity(entity), className: `cursor-pointer transition-colors ${isSelected ? 'bg-blue-50 dark:bg-blue-900/20' : 'hover:bg-gray-50 dark:hover:bg-gray-800'}`, children: [regularFields.map(f => (_jsx("td", { className: "px-4 py-2 text-sm text-gray-900 dark:text-gray-100 truncate max-w-[200px]", children: formatCellValue(data[f]) }, f))), metadataFields.slice(0, 2).map(f => (_jsx("td", { className: "px-4 py-2 text-xs text-gray-400 dark:text-gray-500 italic truncate max-w-[150px]", children: formatCellValue(data[f]) }, f)))] }, entity.id));
|
|
147
|
+
}) })] })) })] }));
|
|
148
|
+
}
|
|
149
|
+
/** Render appropriate input for field type */
|
|
150
|
+
function renderFieldInput(name, typeStr, value, onChange) {
|
|
151
|
+
const t = typeStr.toLowerCase();
|
|
152
|
+
const inputClass = 'w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-gray-200';
|
|
153
|
+
if (t.includes('bool')) {
|
|
154
|
+
return (_jsx("input", { type: "checkbox", checked: !!value, onChange: (e) => onChange(e.target.checked), className: "h-4 w-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded focus:ring-blue-500" }));
|
|
155
|
+
}
|
|
156
|
+
if (t.includes('int') || t.includes('number') || t.includes('float') || t.includes('decimal')) {
|
|
157
|
+
return (_jsx("input", { type: "number", value: value ?? '', onChange: (e) => onChange(e.target.value ? Number(e.target.value) : ''), className: inputClass }));
|
|
158
|
+
}
|
|
159
|
+
if (t.includes('datetime')) {
|
|
160
|
+
return (_jsx("input", { type: "datetime-local", value: value ? String(value).slice(0, 16) : '', onChange: (e) => onChange(e.target.value ? new Date(e.target.value).toISOString() : ''), className: inputClass }));
|
|
161
|
+
}
|
|
162
|
+
if (t.includes('date')) {
|
|
163
|
+
return (_jsx("input", { type: "date", value: value ? String(value).slice(0, 10) : '', onChange: (e) => onChange(e.target.value), className: inputClass }));
|
|
164
|
+
}
|
|
165
|
+
if (name.toLowerCase().includes('description') || name.toLowerCase().includes('body') || name.toLowerCase().includes('content')) {
|
|
166
|
+
return (_jsx("textarea", { rows: 4, value: value ?? '', onChange: (e) => onChange(e.target.value), className: inputClass }));
|
|
167
|
+
}
|
|
168
|
+
return (_jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), className: inputClass }));
|
|
169
|
+
}
|
|
170
|
+
function formatCellValue(value) {
|
|
171
|
+
if (value === null || value === undefined)
|
|
172
|
+
return '-';
|
|
173
|
+
if (typeof value === 'boolean')
|
|
174
|
+
return value ? 'Yes' : 'No';
|
|
175
|
+
if (value instanceof Date)
|
|
176
|
+
return value.toLocaleDateString();
|
|
177
|
+
if (typeof value === 'string' && value.match(/^\d{4}-\d{2}-\d{2}T/)) {
|
|
178
|
+
return new Date(value).toLocaleDateString();
|
|
179
|
+
}
|
|
180
|
+
return String(value);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=ModelManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelManager.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ModelManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelSelector — Sidebar model browser with CRUD manager
|
|
3
|
+
*
|
|
4
|
+
* Two-panel layout: model list (left) + ModelManager (right).
|
|
5
|
+
* Uses RuntimeViewProvider context for data access.
|
|
6
|
+
*/
|
|
7
|
+
export interface ModelSelectorProps {
|
|
8
|
+
models?: string[];
|
|
9
|
+
selectedModel?: string;
|
|
10
|
+
onSelectModel?: (model: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function ModelSelector({ models: modelsOverride, selectedModel: selectedOverride, onSelectModel }: ModelSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=ModelSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelSelector.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ModelSelector.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,kBAAkB,2CAsE3H"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ModelSelector — Sidebar model browser with CRUD manager
|
|
4
|
+
*
|
|
5
|
+
* Two-panel layout: model list (left) + ModelManager (right).
|
|
6
|
+
* Uses RuntimeViewProvider context for data access.
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
9
|
+
import { useRuntimeContext } from '../context.js';
|
|
10
|
+
import { ModelManager } from './ModelManager.js';
|
|
11
|
+
import { ResizeHandle } from './ui/ResizeHandle.js';
|
|
12
|
+
import { useResizableSidebar } from '../hooks/useResizableSidebar.js';
|
|
13
|
+
export function ModelSelector({ models: modelsOverride, selectedModel: selectedOverride, onSelectModel }) {
|
|
14
|
+
const ctx = useRuntimeContext();
|
|
15
|
+
const { width, isResizing, startResizing } = useResizableSidebar();
|
|
16
|
+
// Derive models from spec if not provided
|
|
17
|
+
const models = useMemo(() => {
|
|
18
|
+
if (modelsOverride)
|
|
19
|
+
return modelsOverride;
|
|
20
|
+
const spec = ctx.spec;
|
|
21
|
+
if (spec?.models)
|
|
22
|
+
return Object.keys(spec.models);
|
|
23
|
+
return [];
|
|
24
|
+
}, [modelsOverride, ctx.spec]);
|
|
25
|
+
const [selected, setSelected] = useState(selectedOverride || null);
|
|
26
|
+
// Auto-select first model
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!selected && models.length > 0) {
|
|
29
|
+
setSelected(models[0]);
|
|
30
|
+
}
|
|
31
|
+
}, [models, selected]);
|
|
32
|
+
const handleSelect = (model) => {
|
|
33
|
+
setSelected(model);
|
|
34
|
+
onSelectModel?.(model);
|
|
35
|
+
};
|
|
36
|
+
return (_jsxs("div", { className: "flex h-full bg-gray-900", children: [_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: { width: `${width}px`, minWidth: `${width}px`, maxWidth: `${width}px` }, children: [_jsx("h3", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100 uppercase tracking-wide mb-4", children: "Models" }), _jsx("ul", { className: "space-y-0.5 overflow-y-auto flex-1 sidebar-scrollbar", children: models.map((model) => {
|
|
37
|
+
const isSelected = model === selected;
|
|
38
|
+
return (_jsx("li", { onClick: () => handleSelect(model), className: `px-2 py-1.5 rounded cursor-pointer border transition-all text-sm ${isSelected
|
|
39
|
+
? 'bg-blue-50 dark:bg-blue-900/30 border-blue-500 dark:border-blue-600 text-blue-700 dark:text-blue-200'
|
|
40
|
+
: 'border-transparent hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300'}`, children: model }, model));
|
|
41
|
+
}) })] }), _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: selected ? (_jsx(ModelManager, { modelName: selected, controllerName: `${selected}Controller` })) : (_jsx("div", { className: "flex-1 flex items-center justify-center text-gray-500 dark:text-gray-400", children: "Select a model to manage" })) })] }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ModelSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelSelector.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/ModelSelector.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAQtE,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAsB;IAC1H,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEnE,0CAA0C;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAW,CAAC;QAC7B,IAAI,IAAI,EAAE,MAAM;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,gBAAgB,IAAI,IAAI,CAAC,CAAC;IAElF,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aAEtC,eACE,SAAS,EAAC,2HAA2H,EACrI,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,EAAE,aAE9E,aAAI,SAAS,EAAC,qFAAqF,uBAE9F,EACL,aAAI,SAAS,EAAC,sDAAsD,YACjE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;4BACpB,MAAM,UAAU,GAAG,KAAK,KAAK,QAAQ,CAAC;4BACtC,OAAO,CACL,aAEE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,SAAS,EAAE,oEACT,UAAU;oCACR,CAAC,CAAC,sGAAsG;oCACxG,CAAC,CAAC,6FACN,EAAE,YAED,KAAK,IARD,KAAK,CASP,CACN,CAAC;wBACJ,CAAC,CAAC,GACC,IACD,EAEN,KAAC,YAAY,IAAC,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAI,EAGpE,cAAK,SAAS,EAAC,mIAAmI,YAC/I,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,YAAY,IAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,QAAQ,YAAY,GAAI,CAC/E,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,0EAA0E,yCAEnF,CACP,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RelationshipField — Smart relationship field renderer
|
|
3
|
+
*
|
|
4
|
+
* Renders appropriate UI based on relationship type:
|
|
5
|
+
* - belongsTo: dropdown select with target entities
|
|
6
|
+
* - hasMany: read-only count display
|
|
7
|
+
* - hasOne: read-only entity reference
|
|
8
|
+
*
|
|
9
|
+
* Uses RuntimeViewProvider context for entity fetching.
|
|
10
|
+
*/
|
|
11
|
+
export interface RelationshipFieldProps {
|
|
12
|
+
name: string;
|
|
13
|
+
relationship: Record<string, unknown>;
|
|
14
|
+
value?: unknown;
|
|
15
|
+
onChange?: (value: unknown) => void;
|
|
16
|
+
required?: boolean;
|
|
17
|
+
readOnly?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function RelationshipField({ name, relationship, value, onChange, required, readOnly }: RelationshipFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=RelationshipField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipField.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/RelationshipField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CAuFpH"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRuntimeContext } from '../context.js';
|
|
3
|
+
import { getEntityDisplayName } from '../../core/entity-display.js';
|
|
4
|
+
export function RelationshipField({ name, relationship, value, onChange, required, readOnly }) {
|
|
5
|
+
const ctx = useRuntimeContext();
|
|
6
|
+
const rel = relationship;
|
|
7
|
+
const targetModel = rel.targetModel || rel.model;
|
|
8
|
+
const controllerName = `${targetModel}Controller`;
|
|
9
|
+
const relType = rel.type || 'belongsTo';
|
|
10
|
+
// Fetch target entities
|
|
11
|
+
const { data: targetEntities = [], isLoading } = ctx.useEntitiesQuery(controllerName, targetModel);
|
|
12
|
+
if (relType === 'hasMany') {
|
|
13
|
+
const count = Array.isArray(value) ? value.length : 0;
|
|
14
|
+
return (_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1", children: name }), _jsxs("div", { className: "px-3 py-2 bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-md text-sm text-gray-600 dark:text-gray-400", children: [count, " ", targetModel || 'items'] })] }));
|
|
15
|
+
}
|
|
16
|
+
if (relType === 'hasOne') {
|
|
17
|
+
const display = value
|
|
18
|
+
? getEntityDisplayName(targetEntities.find((e) => e.data?.id === value || e.id === value), ctx.entities)
|
|
19
|
+
: 'None';
|
|
20
|
+
return (_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1", children: name }), _jsx("div", { className: "px-3 py-2 bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-md text-sm text-gray-600 dark:text-gray-400", children: display })] }));
|
|
21
|
+
}
|
|
22
|
+
// belongsTo — dropdown select
|
|
23
|
+
if (readOnly) {
|
|
24
|
+
const display = value
|
|
25
|
+
? getEntityDisplayName(targetEntities.find((e) => e.data?.id === value || e.id === value), ctx.entities)
|
|
26
|
+
: '-';
|
|
27
|
+
return (_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1", children: name }), _jsx("div", { className: "px-3 py-2 bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-md text-sm text-gray-900 dark:text-gray-100", children: display })] }));
|
|
28
|
+
}
|
|
29
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1", children: [name, required && _jsx("span", { className: "text-red-500 dark:text-red-400 ml-1", children: "*" })] }), _jsxs("select", { value: value || '', onChange: (e) => onChange?.(e.target.value || null), disabled: isLoading, className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-gray-200", children: [_jsxs("option", { value: "", children: ["-- Select ", targetModel, " --"] }), targetEntities.map((entity) => (_jsx("option", { value: entity.data?.id || entity.id, children: getEntityDisplayName(entity, ctx.entities) }, entity.id)))] })] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=RelationshipField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipField.js","sourceRoot":"","sources":["../../../../../src/runtime/views/react/components/RelationshipField.tsx"],"names":[],"mappings":"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"}
|