mirror of
https://github.com/The-Low-Code-Foundation/OpenNoodl.git
synced 2026-01-11 14:52:55 +01:00
TASK-008: Unified JSON Editor Component
Overview
Create a modern, no-code-friendly JSON editor component for OpenNoodl with two editing modes:
- Easy Mode - Visual tree builder (impossible to break, perfect for no-coders)
- Advanced Mode - Text editor with validation/linting (for power users)
This component will replace existing JSON editors throughout the application, providing a consistent and user-friendly experience.
Problem Statement
Current State
- JSON editing in Noodl uses a basic Monaco text editor with no syntax highlighting or validation
- Monaco JSON workers are broken in Electron's CommonJS environment
- No-coders can easily create invalid JSON without feedback
- No visual way to construct arrays/objects without knowing JSON syntax
User Pain Points
- No-coders don't understand JSON syntax - They need to learn
[],{},"key": valueformat - Easy to make mistakes - Missing commas, unclosed brackets, unquoted strings
- No feedback when JSON is invalid - Just fails silently on save
- Intimidating - A blank text area with
[]is not welcoming
Solution Design
Two-Mode Editor
🟢 Easy Mode (Visual Builder)
A tree-based visual editor where users can't break the JSON structure.
Features:
- Add Item Button - Adds array elements or object keys
- Type Selector - Choose: String, Number, Boolean, Null, Array, Object
- Inline Editing - Click to edit values with type-appropriate inputs
- Drag & Drop - Reorder array items or object keys
- Delete Button - Remove items with confirmation
- Expand/Collapse - For nested structures
- No raw JSON visible - Just the structured view
Visual Example:
┌────────────────────────────────────────────────┐
│ 📋 Array (3 items) [+ Add] │
├────────────────────────────────────────────────┤
│ ▼ 0: {object} × │
│ name: "John" [edit] │
│ age: 30 [edit] │
│ active: ✓ [edit] │
│ │
│ ▼ 1: {object} × │
│ name: "Jane" [edit] │
│ age: 25 [edit] │
│ active: ✗ [edit] │
│ │
│ ▶ 2: {object} (collapsed) × │
└────────────────────────────────────────────────┘
🔵 Advanced Mode (Text Editor)
A text editor with validation feedback for power users who prefer typing.
Features:
- Syntax Highlighting - If Monaco JSON works, or via custom tokenizer
- Validate Button - Click to check JSON validity
- Error Display - Clear message: "Line 3, Position 5: Unexpected token '}'"
- Line Numbers - Help locate errors
- Format/Pretty Print - Button to auto-format JSON
- Import from Easy Mode - Seamlessly switch from visual builder
Visual Example:
┌────────────────────────────────────────────────┐
│ [Validate] [Format] │ ✅ Valid JSON │
├────────────────────────────────────────────────┤
│ 1 │ [ │
│ 2 │ { │
│ 3 │ "name": "John", │
│ 4 │ "age": 30 │
│ 5 │ } │
│ 6 │ ] │
└────────────────────────────────────────────────┘
Error State:
┌────────────────────────────────────────────────┐
│ [Validate] [Format] │ ❌ Line 4: Missing "," │
├────────────────────────────────────────────────┤
│ 1 │ [ │
│ 2 │ { │
│ 3 │ "name": "John" │
│ 4*│ "age": 30 ← ERROR HERE │
│ 5 │ } │
│ 6 │ ] │
└────────────────────────────────────────────────┘
Mode Toggle
┌────────────────────────────────────────────────┐
│ JSON Editor [Easy] [Advanced] │
├────────────────────────────────────────────────┤
│ │
│ [Content changes based on mode] │
│ │
└────────────────────────────────────────────────┘
- Default to Easy Mode for new users
- Remember preference per user (localStorage)
- Warn when switching if there are unsaved changes
- Auto-parse when switching from Advanced → Easy (show error if invalid)
Technical Implementation
Component Structure
packages/noodl-core-ui/src/components/
└── json-editor/
├── JSONEditor.tsx # Main component with mode toggle
├── JSONEditor.module.scss
├── index.ts
│
├── modes/
│ ├── EasyMode/
│ │ ├── EasyMode.tsx # Visual tree builder
│ │ ├── TreeNode.tsx # Recursive tree node
│ │ ├── ValueEditor.tsx # Type-aware value inputs
│ │ └── EasyMode.module.scss
│ │
│ └── AdvancedMode/
│ ├── AdvancedMode.tsx # Text editor with validation
│ ├── ValidationBar.tsx # Error display component
│ └── AdvancedMode.module.scss
│
└── utils/
├── jsonValidator.ts # JSON.parse with detailed errors
├── jsonFormatter.ts # Pretty print utility
└── types.ts # Shared types
API Design
interface JSONEditorProps {
/** Initial value (JSON string or parsed object) */
value: string | object | unknown[];
/** Called when value changes (debounced) */
onChange: (value: string) => void;
/** Called on explicit save (Cmd+S or button) */
onSave?: (value: string) => void;
/** Initial mode - defaults to 'easy' */
defaultMode?: 'easy' | 'advanced';
/** Force a specific mode (no toggle shown) */
mode?: 'easy' | 'advanced';
/** Type constraint for validation */
expectedType?: 'array' | 'object' | 'any';
/** Custom schema validation (optional future feature) */
schema?: object;
/** Readonly mode */
disabled?: boolean;
/** Height constraint */
height?: number | string;
}
// Usage examples:
// Basic array editing
<JSONEditor
value="[]"
onChange={setValue}
expectedType="array"
/>
// Object editing with forced advanced mode
<JSONEditor
value={myConfig}
onChange={setConfig}
mode="advanced"
/>
// With save callback
<JSONEditor
value={data}
onChange={handleChange}
onSave={handleSave}
defaultMode="easy"
/>
Integration Points
The JSON Editor will replace existing JSON editing in:
-
Config Variables (App Setup Panel)
- Array/Object variable values
- Currently uses Monaco plaintext
-
REST Node Response Mapping
- Path configuration
- Currently uses basic text input
-
Data nodes (Object, Array, etc.)
- Static default values
- Currently uses Monaco
-
Any future JSON property inputs
Subtasks
Phase 1: Core Component (2-3 days)
- JSON-001: Create base JSONEditor component structure
- JSON-002: Implement EasyMode tree view (read-only display)
- JSON-003: Implement EasyMode editing (add/edit/delete)
- JSON-004: Implement AdvancedMode text editor
- JSON-005: Add validation with detailed error messages
- JSON-006: Add mode toggle and state management
Phase 2: Polish & Integration (1-2 days)
- JSON-007: Add drag & drop for EasyMode
- JSON-008: Add format/pretty-print to AdvancedMode
- JSON-009: Integrate with VariablesSection (App Config)
- JSON-010: Add keyboard shortcuts (Cmd+S, etc.)
Phase 3: System-wide Replacement (2-3 days)
- JSON-011: Replace existing JSON editors in property panel
- JSON-012: Add to Storybook with comprehensive stories
- JSON-013: Documentation and migration guide
Dependencies
- React 19 (existing)
- No new npm packages required (pure React implementation)
- Optional:
ajvfor JSON Schema validation (future)
Design Tokens
Use existing Noodl design tokens:
--theme-color-bg-2for editor background--theme-color-bg-3for tree node hover--theme-color-primaryfor actions--theme-color-successfor valid state--theme-color-errorfor error state
Acceptance Criteria
- ✅ No-coder can create arrays/objects without knowing JSON syntax
- ✅ Power users can type raw JSON with validation feedback
- ✅ Errors clearly indicate where the problem is
- ✅ Switching modes preserves data (unless invalid)
- ✅ Works in Electron (no web worker dependencies)
- ✅ Consistent with Noodl's design system
- ✅ Accessible (keyboard navigation, screen reader friendly)
Future Enhancements
- JSON Schema validation
- Import from URL/file
- Export to file
- Copy/paste tree nodes
- Undo/redo stack
- AI-assisted JSON generation
Priority: Medium Estimated Effort: 5-8 days Related Tasks: TASK-007 App Config System