ObjectStackObjectStack

Object Designer

Object Designer protocol schemas

@module studio/object-designer

Object Designer Protocol — Visual Field Editor, Relationship Mapper & ER Diagram

Defines the specification for the Object Designer experience within ObjectStack Studio, including:

  • Field Editor: Visual field creation/editing with type-aware property panels
  • Relationship Mapper: Visual lookup/master-detail relationship configuration
  • ER Diagram: Entity-Relationship diagram rendering and interaction
  • Object Manager: Unified object list with search, filtering, and bulk operations

Architecture

The Object Designer is composed of four interconnected panels:

┌─────────────────────────────────────────────────────────────────┐
│                     Object Manager (list / search)             │
├──────────────┬──────────────────────────┬──────────────────────┤
│  Object List │  Field Editor            │  Property Panel      │
│  (sidebar)   │  (table + inline edit)   │  (type-specific)     │
│              │                          │                      │
│  ─ search    │  ─ drag-to-reorder       │  ─ constraints       │
│  ─ filter    │  ─ inline type picker    │  ─ validation        │
│  ─ group     │  ─ batch add/remove      │  ─ security          │
│  ─ create    │  ─ field groups           │  ─ relationships     │
├──────────────┴──────────────────────────┴──────────────────────┤
│                     ER Diagram (toggle panel)                  │
│  ─ auto-layout (force / hierarchy / grid)                     │
│  ─ interactive: click node → navigate to object               │
│  ─ hover: highlight connected relationships                   │
│  ─ zoom/pan/minimap                                           │
└─────────────────────────────────────────────────────────────────┘

@example

import {
  ObjectDesignerConfigSchema,
  ERDiagramConfigSchema,
} from '@objectstack/spec/studio';

const config = ObjectDesignerConfigSchema.parse({
  defaultView: 'field-editor',
  fieldEditor: {
    inlineEditing: true,
    dragReorder: true,
    showFieldGroups: true,
  },
  erDiagram: {
    enabled: true,
    layout: 'force',
    showFieldDetails: true,
  },
});

Source: packages/spec/src/studio/object-designer.zod.ts

TypeScript Usage

import { ERDiagramConfigSchema, ERLayoutAlgorithmSchema, ERNodeDisplaySchema, FieldEditorConfigSchema, FieldGroupSchema, FieldPropertySectionSchema, ObjectDesignerConfigSchema, ObjectDesignerDefaultViewSchema, ObjectFilterSchema, ObjectListDisplayModeSchema, ObjectManagerConfigSchema, ObjectPreviewConfigSchema, ObjectPreviewTabSchema, ObjectSortFieldSchema, RelationshipDisplaySchema, RelationshipMapperConfigSchema } from '@objectstack/spec/studio';
import type { ERDiagramConfig, ERLayoutAlgorithm, ERNodeDisplay, FieldEditorConfig, FieldGroup, FieldPropertySection, ObjectDesignerConfig, ObjectDesignerDefaultView, ObjectFilter, ObjectListDisplayMode, ObjectManagerConfig, ObjectPreviewConfig, ObjectPreviewTab, ObjectSortField, RelationshipDisplay, RelationshipMapperConfig } from '@objectstack/spec/studio';

// Validate data
const result = ERDiagramConfigSchema.parse(data);

ERDiagramConfig

Properties

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable ER diagram panel
layoutEnum<'force' | 'hierarchy' | 'grid' | 'circular'>optional (default: "force")Default layout algorithm
nodeDisplay{ showFields: boolean; maxFieldsVisible: number; showFieldTypes: boolean; showRequiredIndicator: boolean; … }optional (has default)Node display configuration
showMinimapbooleanoptional (default: true)Show minimap for large diagrams
zoomControlsbooleanoptional (default: true)Show zoom in/out/fit controls
minZoomnumberoptional (default: 0.1)Minimum zoom level
maxZoomnumberoptional (default: 3)Maximum zoom level
showEdgeLabelsbooleanoptional (default: true)Show cardinality labels on relationship edges
highlightOnHoverbooleanoptional (default: true)Highlight connected entities on node hover
clickToNavigatebooleanoptional (default: true)Click node to navigate to object detail
dragToConnectbooleanoptional (default: true)Drag between nodes to create relationships
hideOrphansbooleanoptional (default: false)Hide objects with no relationships
autoFitbooleanoptional (default: true)Auto-fit diagram to viewport on load
exportFormatsEnum<'png' | 'svg' | 'json'>[]optional (default: ["png","svg"])Available export formats for diagram

Nested Shape: ERDiagramConfig.nodeDisplay

PropertyTypeRequiredDescription
showFieldsbooleanoptional (default: true)Show field list inside entity nodes
maxFieldsVisiblenumberoptional (default: 8)Max fields visible before "N more..." collapse
showFieldTypesbooleanoptional (default: true)Show field type badges
showRequiredIndicatorbooleanoptional (default: true)Show required field indicators
showRecordCountbooleanoptional (default: false)Show live record count on nodes
showIconbooleanoptional (default: true)Show object icon on node header
showDescriptionbooleanoptional (default: true)Show description tooltip on hover

ERLayoutAlgorithm

ER diagram layout algorithm

Allowed Values

  • force
  • hierarchy
  • grid
  • circular

ERNodeDisplay

Properties

PropertyTypeRequiredDescription
showFieldsbooleanoptional (default: true)Show field list inside entity nodes
maxFieldsVisiblenumberoptional (default: 8)Max fields visible before "N more..." collapse
showFieldTypesbooleanoptional (default: true)Show field type badges
showRequiredIndicatorbooleanoptional (default: true)Show required field indicators
showRecordCountbooleanoptional (default: false)Show live record count on nodes
showIconbooleanoptional (default: true)Show object icon on node header
showDescriptionbooleanoptional (default: true)Show description tooltip on hover

FieldEditorConfig

Properties

PropertyTypeRequiredDescription
inlineEditingbooleanoptional (default: true)Enable inline editing of field properties
dragReorderbooleanoptional (default: true)Enable drag-and-drop field reordering
showFieldGroupsbooleanoptional (default: true)Show field group headers
showPropertyPanelbooleanoptional (default: true)Show the right-side property panel
propertySections{ key: string; label: string; icon?: string; defaultExpanded: boolean; … }[]optional (has default)Property panel section definitions
fieldGroups{ key: string; label: string; icon?: string; defaultExpanded: boolean; … }[]optional (default: [])Field group definitions
paginationThresholdnumberoptional (default: 50)Number of fields before pagination is enabled
batchOperationsbooleanoptional (default: true)Enable batch add/remove field operations
showUsageStatsbooleanoptional (default: false)Show field usage statistics

Nested Shape: FieldEditorConfig.propertySections[number]

PropertyTypeRequiredDescription
keystringSection key (e.g., "basics", "constraints", "security")
labelstringSection display label
iconstringoptionalLucide icon name
defaultExpandedbooleanoptional (default: true)Whether section is expanded by default
ordernumberoptional (default: 0)Sort order (lower = higher)

Nested Shape: FieldEditorConfig.fieldGroups[number]

PropertyTypeRequiredDescription
keystringGroup key matching field.group values
labelstringGroup display label
iconstringoptionalLucide icon name
defaultExpandedbooleanoptional (default: true)Whether group is expanded by default
ordernumberoptional (default: 0)Sort order (lower = higher)

FieldGroup

Properties

PropertyTypeRequiredDescription
keystringGroup key matching field.group values
labelstringGroup display label
iconstringoptionalLucide icon name
defaultExpandedbooleanoptional (default: true)Whether group is expanded by default
ordernumberoptional (default: 0)Sort order (lower = higher)

FieldPropertySection

Properties

PropertyTypeRequiredDescription
keystringSection key (e.g., "basics", "constraints", "security")
labelstringSection display label
iconstringoptionalLucide icon name
defaultExpandedbooleanoptional (default: true)Whether section is expanded by default
ordernumberoptional (default: 0)Sort order (lower = higher)

ObjectDesignerConfig

Properties

PropertyTypeRequiredDescription
defaultViewEnum<'field-editor' | 'relationship-mapper' | 'er-diagram' | 'object-manager'>optional (default: "field-editor")Default view
fieldEditor{ inlineEditing: boolean; dragReorder: boolean; showFieldGroups: boolean; showPropertyPanel: boolean; … }optional (has default)Field editor configuration
relationshipMapper{ visualCreation: boolean; showReverseRelationships: boolean; showCascadeWarnings: boolean; displayConfig: object[] }optional (has default)Relationship mapper configuration
erDiagram{ enabled: boolean; layout: Enum<'force' | 'hierarchy' | 'grid' | 'circular'>; nodeDisplay: object; showMinimap: boolean; … }optional (has default)ER diagram configuration
objectManager{ defaultDisplayMode: Enum<'table' | 'cards' | 'tree'>; defaultSortField: Enum<'name' | 'label' | 'fieldCount' | 'updatedAt'>; defaultSortDirection: Enum<'asc' | 'desc'>; defaultFilter: object; … }optional (has default)Object manager configuration
objectPreview{ tabs: object[]; defaultTab: string; showHeader: boolean; showBreadcrumbs: boolean }optional (has default)Object preview configuration

Nested Shape: ObjectDesignerConfig.fieldEditor

PropertyTypeRequiredDescription
inlineEditingbooleanoptional (default: true)Enable inline editing of field properties
dragReorderbooleanoptional (default: true)Enable drag-and-drop field reordering
showFieldGroupsbooleanoptional (default: true)Show field group headers
showPropertyPanelbooleanoptional (default: true)Show the right-side property panel
propertySections{ key: string; label: string; icon?: string; defaultExpanded: boolean; … }[]optional (has default)Property panel section definitions
fieldGroups{ key: string; label: string; icon?: string; defaultExpanded: boolean; … }[]optional (default: [])Field group definitions
paginationThresholdnumberoptional (default: 50)Number of fields before pagination is enabled
batchOperationsbooleanoptional (default: true)Enable batch add/remove field operations
showUsageStatsbooleanoptional (default: false)Show field usage statistics

Nested Shape: ObjectDesignerConfig.relationshipMapper

PropertyTypeRequiredDescription
visualCreationbooleanoptional (default: true)Enable drag-to-create relationships
showReverseRelationshipsbooleanoptional (default: true)Show reverse/child-to-parent relationships
showCascadeWarningsbooleanoptional (default: true)Show cascade delete behavior warnings
displayConfig{ type: Enum<'lookup' | 'master_detail' | 'tree'>; lineStyle: Enum<'solid' | 'dashed' | 'dotted'>; color: string; highlightColor: string; … }[]optional (has default)Visual config per relationship type

Nested Shape: ObjectDesignerConfig.erDiagram

PropertyTypeRequiredDescription
enabledbooleanoptional (default: true)Enable ER diagram panel
layoutEnum<'force' | 'hierarchy' | 'grid' | 'circular'>optional (default: "force")Default layout algorithm
nodeDisplay{ showFields: boolean; maxFieldsVisible: number; showFieldTypes: boolean; showRequiredIndicator: boolean; … }optional (has default)Node display configuration
showMinimapbooleanoptional (default: true)Show minimap for large diagrams
zoomControlsbooleanoptional (default: true)Show zoom in/out/fit controls
minZoomnumberoptional (default: 0.1)Minimum zoom level
maxZoomnumberoptional (default: 3)Maximum zoom level
showEdgeLabelsbooleanoptional (default: true)Show cardinality labels on relationship edges
highlightOnHoverbooleanoptional (default: true)Highlight connected entities on node hover
clickToNavigatebooleanoptional (default: true)Click node to navigate to object detail
dragToConnectbooleanoptional (default: true)Drag between nodes to create relationships
hideOrphansbooleanoptional (default: false)Hide objects with no relationships
autoFitbooleanoptional (default: true)Auto-fit diagram to viewport on load
exportFormatsEnum<'png' | 'svg' | 'json'>[]optional (default: ["png","svg"])Available export formats for diagram

Nested Shape: ObjectDesignerConfig.objectManager

PropertyTypeRequiredDescription
defaultDisplayModeEnum<'table' | 'cards' | 'tree'>optional (default: "table")Default list display mode
defaultSortFieldEnum<'name' | 'label' | 'fieldCount' | 'updatedAt'>optional (default: "label")Default sort field
defaultSortDirectionEnum<'asc' | 'desc'>optional (default: "asc")Default sort direction
defaultFilter{ package?: string; tags?: string[]; includeSystem: boolean; includeAbstract: boolean; … }optional (default: {"includeSystem":true,"includeAbstract":false})Default filter configuration
showFieldCountbooleanoptional (default: true)Show field count badge
showRelationshipCountbooleanoptional (default: true)Show relationship count badge
showQuickPreviewbooleanoptional (default: true)Show quick field preview tooltip on hover
enableComparisonbooleanoptional (default: false)Enable side-by-side object comparison
showERDiagramTogglebooleanoptional (default: true)Show ER diagram toggle in toolbar
showCreateActionbooleanoptional (default: true)Show create object action
showStatsSummarybooleanoptional (default: true)Show statistics summary bar

Nested Shape: ObjectDesignerConfig.objectPreview

PropertyTypeRequiredDescription
tabs{ key: string; label: string; icon?: string; enabled: boolean; … }[]optional (has default)Object detail preview tabs
defaultTabstringoptional (default: "fields")Default active tab key
showHeaderbooleanoptional (default: true)Show object summary header
showBreadcrumbsbooleanoptional (default: true)Show navigation breadcrumbs

ObjectDesignerDefaultView

Default view when entering the Object Designer

Allowed Values

  • field-editor
  • relationship-mapper
  • er-diagram
  • object-manager

ObjectFilter

Properties

PropertyTypeRequiredDescription
packagestringoptionalFilter by owning package
tagsstring[]optionalFilter by object tags
includeSystembooleanoptional (default: true)Include system-level objects
includeAbstractbooleanoptional (default: false)Include abstract base objects
hasFieldTypestringoptionalFilter to objects containing a specific field type
hasRelationshipsbooleanoptionalFilter to objects with lookup/master_detail fields
searchQuerystringoptionalFree-text search across name, label, and description

ObjectListDisplayMode

Object list display mode

Allowed Values

  • table
  • cards
  • tree

ObjectManagerConfig

Properties

PropertyTypeRequiredDescription
defaultDisplayModeEnum<'table' | 'cards' | 'tree'>optional (default: "table")Default list display mode
defaultSortFieldEnum<'name' | 'label' | 'fieldCount' | 'updatedAt'>optional (default: "label")Default sort field
defaultSortDirectionEnum<'asc' | 'desc'>optional (default: "asc")Default sort direction
defaultFilter{ package?: string; tags?: string[]; includeSystem: boolean; includeAbstract: boolean; … }optional (default: {"includeSystem":true,"includeAbstract":false})Default filter configuration
showFieldCountbooleanoptional (default: true)Show field count badge
showRelationshipCountbooleanoptional (default: true)Show relationship count badge
showQuickPreviewbooleanoptional (default: true)Show quick field preview tooltip on hover
enableComparisonbooleanoptional (default: false)Enable side-by-side object comparison
showERDiagramTogglebooleanoptional (default: true)Show ER diagram toggle in toolbar
showCreateActionbooleanoptional (default: true)Show create object action
showStatsSummarybooleanoptional (default: true)Show statistics summary bar

Nested Shape: ObjectManagerConfig.defaultFilter

PropertyTypeRequiredDescription
packagestringoptionalFilter by owning package
tagsstring[]optionalFilter by object tags
includeSystembooleanoptional (default: true)Include system-level objects
includeAbstractbooleanoptional (default: false)Include abstract base objects
hasFieldTypestringoptionalFilter to objects containing a specific field type
hasRelationshipsbooleanoptionalFilter to objects with lookup/master_detail fields
searchQuerystringoptionalFree-text search across name, label, and description

ObjectPreviewConfig

Properties

PropertyTypeRequiredDescription
tabs{ key: string; label: string; icon?: string; enabled: boolean; … }[]optional (has default)Object detail preview tabs
defaultTabstringoptional (default: "fields")Default active tab key
showHeaderbooleanoptional (default: true)Show object summary header
showBreadcrumbsbooleanoptional (default: true)Show navigation breadcrumbs

Nested Shape: ObjectPreviewConfig.tabs[number]

PropertyTypeRequiredDescription
keystringTab key
labelstringTab display label
iconstringoptionalLucide icon name
enabledbooleanoptional (default: true)Whether this tab is available
ordernumberoptional (default: 0)Sort order (lower = higher)

ObjectPreviewTab

Properties

PropertyTypeRequiredDescription
keystringTab key
labelstringTab display label
iconstringoptionalLucide icon name
enabledbooleanoptional (default: true)Whether this tab is available
ordernumberoptional (default: 0)Sort order (lower = higher)

ObjectSortField

Object list sort field

Allowed Values

  • name
  • label
  • fieldCount
  • updatedAt

RelationshipDisplay

Properties

PropertyTypeRequiredDescription
typeEnum<'lookup' | 'master_detail' | 'tree'>Relationship type
lineStyleEnum<'solid' | 'dashed' | 'dotted'>optional (default: "solid")Line style in diagrams
colorstringoptional (default: "#94a3b8")Line color (CSS value)
highlightColorstringoptional (default: "#0891b2")Highlighted color on hover/select
cardinalityLabelstringoptional (default: "1:N")Cardinality label (e.g., "1:N", "1:1", "N:M")

RelationshipMapperConfig

Properties

PropertyTypeRequiredDescription
visualCreationbooleanoptional (default: true)Enable drag-to-create relationships
showReverseRelationshipsbooleanoptional (default: true)Show reverse/child-to-parent relationships
showCascadeWarningsbooleanoptional (default: true)Show cascade delete behavior warnings
displayConfig{ type: Enum<'lookup' | 'master_detail' | 'tree'>; lineStyle: Enum<'solid' | 'dashed' | 'dotted'>; color: string; highlightColor: string; … }[]optional (has default)Visual config per relationship type

Nested Shape: RelationshipMapperConfig.displayConfig[number]

PropertyTypeRequiredDescription
typeEnum<'lookup' | 'master_detail' | 'tree'>Relationship type
lineStyleEnum<'solid' | 'dashed' | 'dotted'>optional (default: "solid")Line style in diagrams
colorstringoptional (default: "#94a3b8")Line color (CSS value)
highlightColorstringoptional (default: "#0891b2")Highlighted color on hover/select
cardinalityLabelstringoptional (default: "1:N")Cardinality label (e.g., "1:N", "1:1", "N:M")

On this page