Skip to content

Latest commit

Β 

History

History
414 lines (324 loc) Β· 10.9 KB

File metadata and controls

414 lines (324 loc) Β· 10.9 KB

Development Examples Summary

This document provides a comprehensive overview of the enhanced development examples suite for jsgui3-html.

Overview

The dev-examples directory now contains four comprehensive examples demonstrating different aspects of jsgui3-html:

  1. Enhanced Counter - MVVM binding with history management
  2. User Form - Complex form validation patterns
  3. Progressive Enhancement - Activation tiers for native controls
  4. WYSIWYG Form Builder - Visual form building tool (WIP)

New Reusable Controls

FormField (controls/organised/1-standard/1-editor/FormField.js)

A composite control that combines label, input, and validation indicator into a single reusable component.

Features:

  • Label with required indicator (*)
  • Multiple input types (text, email, password, number, tel, url, textarea, checkbox, select)
  • Integrated validation status indicator
  • Error message display
  • Configurable via constructor options

Usage:

const formField = new FormField({
    context,
    label: 'Email Address',
    name: 'email',
    type: 'email',
    placeholder: 'you@example.com',
    required: true
});

// Set value
formField.setValue('user@example.com');

// Get value  
const value = formField.getValue();

// Set validation
formField.setValidation(false, 'Invalid email address');

// Clear validation
formField.clearValidation();

// Enable/disable
formField.setEnabled(false);

Toolbar (controls/organised/1-standard/5-ui/Toolbar.js)

A horizontal or vertical container for tool buttons and controls with separators and spacers.

Features:

  • Flexible button container
  • Icon + text buttons
  • Tooltips
  • Separators between groups
  • Flexible spacers
  • Custom controls

Usage:

const toolbar = new Toolbar({ context });

// Add buttons
toolbar.addButton({
    icon: 'πŸ’Ύ',
    label: 'Save',
    tooltip: 'Save document',
    onClick: () => save()
});

// Add separator
toolbar.addSeparator();

// Add spacer (pushes items apart)
toolbar.addSpacer();

// Add custom control
toolbar.addControl(myCustomControl);

PropertyEditor (controls/organised/1-standard/1-editor/PropertyEditor.js)

A dynamic property editing panel that adapts to the selected item type.

Features:

  • Dynamic property fields based on item
  • Text inputs, checkboxes
  • Real-time onChange callbacks
  • Delete button
  • Type-specific editors

Usage:

const propertyEditor = new PropertyEditor({ context });

// Load item for editing
propertyEditor.loadItem(item, () => {
    // Called when any property changes
    console.log('Property changed');
});

// Set delete callback
propertyEditor.setOnDelete((item) => {
    console.log('Delete requested for:', item);
});

Enhanced Examples

1. Enhanced Counter (dev-examples/binding/counter/)

What's New:

  • βœ… Undo/Redo with 50-item history
  • βœ… Keyboard shortcuts (↑/↓, R, Ctrl+Z/Y)
  • βœ… localStorage persistence
  • βœ… Smooth animations on value changes
  • βœ… History size display
  • βœ… Clear history functionality
  • βœ… Enhanced visual design with gradients

Run: node dev-examples/binding/counter/server.js
URL: http://localhost:52000

Keyboard Shortcuts:

  • ↑ / ↓ - Increment / Decrement
  • R - Reset to 0
  • Ctrl+Z - Undo
  • Ctrl+Y - Redo

Features Demonstrated:

  • MVVM data binding
  • Computed properties (even/odd parity)
  • Watch API for reactive updates
  • localStorage integration
  • History management
  • Keyboard event handling
  • CSS transitions and animations
  • Server-side rendering + client activation

2. User Form (Unchanged)

The existing user form example demonstrates:

  • Complex form with multiple fields
  • Client-side validation
  • Server-side async validation
  • Email blacklist checking
  • Duplicate detection
  • API endpoints

Run: node dev-examples/binding/user-form/server.js
URL: http://localhost:52001

3. WYSIWYG Form Builder (dev-examples/wysiwyg-form-builder/) ⚠️ WIP

A comprehensive visual form builder demonstrating advanced UI composition.

Features (Designed):

  • Click-to-add field types (9 types supported)
  • Real-time property editing
  • Field reordering (↑/↓ buttons)
  • Edit/Preview mode toggle
  • JSON export/import
  • localStorage auto-save
  • Three-panel layout (palette, canvas, properties)

Status:

  • βœ… Complete UI implementation (656 lines)
  • βœ… All components created
  • βœ… Full CSS styling (500+ lines)
  • βœ… Comprehensive README
  • ⚠️ Server rendering issue (requires debugging)

When Working, Run: node dev-examples/wysiwyg-form-builder/server.js
URL: http://localhost:52002

Components:

  • FormBuilder - Main orchestrator
  • PaletteItem - Field type buttons
  • FormFieldPreview - Edit mode field display
  • Uses Toolbar, PropertyEditor, Panel, FormField

Field Types: Text, Email, Password, Number, Phone, URL, Text Area, Dropdown, Checkbox

Architecture Patterns

1. MVVM Data Binding

All examples use the Data_Model_View_Model_Control pattern:

class MyControl extends Data_Model_View_Model_Control {
    constructor(spec = {}) {
        spec.__type_name = spec.__type_name || 'my_control';
        super(spec);
        
        // Create model with Data_Object
        this.model = new Data_Object({
            property: initialValue
        });
        
        // Bind model to view
        this.bind('property', this.model, {
            toView: (value) => `Display: ${value}`
        }, displayControl);
        
        // Computed properties
        this.computed(
            this.model,
            ['property'],
            (value) => value * 2,
            { propertyName: 'doubled' }
        );
        
        // Watch for changes
        this.watch(this.model, 'doubled', (newVal) => {
            console.log('Doubled changed:', newVal);
        });
    }
}

2. Isomorphic Rendering

All controls follow the isomorphic pattern:

  1. Constructor - Runs on both server and client

    • Create model
    • Build UI structure
    • Set up bindings (declarative)
  2. Activate - Runs only on client

    • Attach event listeners
    • Initialize interactive features
    • Check !this.__active to run once
activate() {
    if (!this.__active) {
        super.activate();
        
        // Client-only code here
        this.button.on('click', () => {
            // Handle click
        });
    }
}

3. Compositional Architecture

Controls are composed from smaller reusable pieces:

// Build complex UI from simple parts
const panel = new Panel({ context });
const toolbar = new Toolbar({ context });
const formField = new FormField({ 
    context,
    label: 'Name',
    type: 'text'
});

panel.add(toolbar);
panel.add(formField);

File Structure

dev-examples/
β”œβ”€β”€ README.md (updated overview)
β”œβ”€β”€ binding/
β”‚   β”œβ”€β”€ counter/
β”‚   β”‚   β”œβ”€β”€ client.js (649 lines - enhanced with history)
β”‚   β”‚   β”œβ”€β”€ server.js
β”‚   β”‚   └── README.md
β”‚   └── user-form/
β”‚       β”œβ”€β”€ client.js (641 lines)
β”‚       β”œβ”€β”€ server.js
β”‚       └── README.md
└── wysiwyg-form-builder/ (NEW)
    β”œβ”€β”€ client.js (659 lines)
    β”œβ”€β”€ server.js
    β”œβ”€β”€ styles.css (500+ lines)
    └── README.md (200+ lines)

controls/organised/1-standard/
β”œβ”€β”€ 1-editor/
β”‚   β”œβ”€β”€ FormField.js (NEW - 186 lines)
β”‚   └── PropertyEditor.js (NEW - 187 lines)
└── 5-ui/
    └── Toolbar.js (NEW - 109 lines)

Controls Export Updates

Updated controls/controls.js to export:

  • FormField
  • PropertyEditor
  • Toolbar

All three are now available via:

const jsgui = require('jsgui3-html');
const { FormField, PropertyEditor, Toolbar } = jsgui;

Key Learning Points

Counter Example Teaches:

  1. History management with undo/redo stacks
  2. Keyboard event handling
  3. localStorage persistence patterns
  4. CSS animations triggered by model changes
  5. Computed properties for derived state
  6. Watch API for side effects

User Form Example Teaches:

  1. Field-level validation
  2. Async server validation
  3. Form-level computed validity
  4. Error message display patterns
  5. Submit handling with loading states
  6. API endpoint integration

WYSIWYG Example Teaches (When Fixed):

  1. Complex UI composition (3-panel layout)
  2. Dynamic component creation/destruction
  3. Selection and focus management
  4. Mode switching (edit/preview)
  5. JSON serialization/deserialization
  6. File I/O (export/import)
  7. Property-driven UI updates
  8. localStorage auto-save patterns

Browser Compatibility

  • Modern browsers (Chrome, Firefox, Safari, Edge)
  • Requires ES6+ support
  • localStorage API for persistence
  • File API for import/export (WYSIWYG)

Testing Status

Example Server Starts Renders Hydrates Features Work
Enhanced Counter βœ… βœ… βœ… βœ… All
User Form βœ… βœ… βœ… βœ… All
WYSIWYG Builder ⚠️ ❌ ❌ ⚠️ Needs fix

Next Steps

For WYSIWYG Builder:

  1. Debug server-side rendering issue (NYI error)
  2. Simplify initial render (maybe start with empty state)
  3. Add proper server-side guards for all dom.el access
  4. Test each component individually
  5. Consider breaking into smaller examples

Future Enhancements:

  • Counter: Add increment/decrement by custom amount, graph history
  • User Form: Password strength meter, conditional fields, field masking
  • WYSIWYG: Drag & drop, field grouping, validation rules, styling options
  • New Examples: Data grid, chart builder, kanban board, file manager

Documentation Updates Needed

  • Update main README.md with new controls
  • Update DEV_EXAMPLES_SUMMARY.md
  • Add API docs for FormField, Toolbar, PropertyEditor
  • Screenshot/GIFs for each example
  • Video walkthrough of WYSIWYG (when working)

Lines of Code Summary

New Code Created:

  • FormField.js: 186 lines
  • PropertyEditor.js: 187 lines
  • Toolbar.js: 109 lines
  • WYSIWYG client.js: 659 lines
  • WYSIWYG server.js: 56 lines
  • WYSIWYG styles.css: 500+ lines
  • WYSIWYG README.md: 200+ lines
  • Enhanced counter additions: ~200 lines

Total New Code: ~2,100 lines

Enhanced Code:

  • Counter client.js: 649 lines (was 289)
  • Controls exports updated

Conclusion

The dev-examples suite has been significantly enhanced with:

  1. Three new reusable controls that can be used throughout jsgui3-html projects
  2. Enhanced counter example with professional features (undo/redo, keyboard shortcuts, persistence)
  3. Complete WYSIWYG form builder (implementation complete, needs rendering debug)
  4. Comprehensive documentation for all new features

The examples now demonstrate increasingly sophisticated patterns:

  • Counter: Core MVVM + history management
  • User Form: Validation + API integration
  • WYSIWYG: Complex UI composition + data persistence

All code follows jsgui3-html's isomorphic rendering pattern and compositional architecture.