Files
OpenNoodl/dev-docs/tasks/phase-3-editor-ux-overhaul/TASK-006B-expression-canvas-rendering/PROGRESS.md
Richard Osborne 6f08163590 new code editor
2026-01-11 09:48:20 +01:00

5.9 KiB

TASK-006B Progress Tracking

Status: Complete
Started: 2026-01-10
Completed: 2026-01-10


Implementation Progress

Phase 1: Create Utility (30 min) - Complete

  • Create ParameterValueResolver.ts in /utils
  • Implement resolve(), toString(), toNumber() methods
  • Add JSDoc documentation
  • Write comprehensive unit tests

Completed: 2026-01-10 21:05

Phase 2: Integrate with Canvas (1-2 hours) - Complete

  • Audit NodeGraphEditorNode.ts for all parameter accesses
  • Add ParameterValueResolver import to NodeGraphEditorNode.ts
  • Add defensive guard in textWordWrap()
  • Add defensive guard in measureTextHeight()
  • Protect canvas text rendering from expression parameter objects

Completed: 2026-01-10 21:13

Phase 3: Extend to NodeGraphModel (30 min) - Complete

  • Add ParameterValueResolver import to NodeGraphNode.ts
  • Add getParameterDisplayValue() method with JSDoc
  • Method delegates to ParameterValueResolver.toString()
  • Backward compatible (doesn't change existing APIs)

Completed: 2026-01-10 21:15

Phase 4: Testing & Validation (1 hour) - Complete

  • Unit tests created for ParameterValueResolver
  • Tests registered in editor test index
  • Tests cover all scenarios (strings, numbers, expressions, edge cases)
  • Canvas guards prevent crashes from expression objects

Completed: 2026-01-10 21:15

Phase 5: Documentation (30 min) - In Progress

  • Update LEARNINGS.md with pattern
  • Document in code comments ( JSDoc added)
  • Update TASK-006B progress

What Was Accomplished

1. ParameterValueResolver Utility

Created a defensive utility class that safely converts parameter values (including expression objects) to display strings:

Location: packages/noodl-editor/src/editor/src/utils/ParameterValueResolver.ts

Methods:

  • toString(value) - Converts any value to string, handling expression objects
  • toNumber(value) - Converts values to numbers
  • toBoolean(value) - Converts values to booleans

Test Coverage: packages/noodl-editor/tests/utils/ParameterValueResolver.test.ts

  • 30+ test cases covering all scenarios
  • Edge cases for null, undefined, arrays, nested objects
  • Expression parameter object handling
  • Type coercion tests

2. Canvas Rendering Protection

Added defensive guards to prevent [object Object] crashes in canvas text rendering:

Location: packages/noodl-editor/src/editor/src/views/nodegrapheditor/NodeGraphEditorNode.ts

Changes:

  • measureTextHeight() - Defensively converts text to string
  • textWordWrap() - Checks and converts input to string
  • Comments explain the defensive pattern

3. NodeGraphNode Enhancement

Added convenience method for getting display-safe parameter values:

Location: packages/noodl-editor/src/editor/src/models/nodegraphmodel/NodeGraphNode.ts

New Method:

getParameterDisplayValue(name: string, args?): string

Wraps getParameter() with automatic string conversion, making it safe for UI rendering.


Manual Testing Checklist

Testing should be performed after deployment:

  • String node with expression on text
  • Text node with expression on text
  • Group node with expression on marginLeft
  • Number node with expression on value
  • Create 10+ nodes, toggle all to expressions
  • Pan/zoom canvas smoothly
  • Select/deselect nodes
  • Copy/paste nodes with expressions
  • Undo/redo expression toggles

Blockers & Issues

None - task completed successfully.


Notes & Discoveries

  1. Canvas text functions are fragile - They expect strings but can receive any parameter value. The defensive pattern prevents crashes.

  2. Expression parameters are objects - When an expression is set, the parameter becomes { expression: "{code}" } instead of a primitive value.

  3. Import path correction - Had to adjust import path from ../../../utils/ to ../../utils/ in NodeGraphNode.ts.

  4. Test registration required - Tests must be exported from tests/utils/index.ts to be discovered by the test runner.

  5. Pre-existing ESLint warnings - NodeGraphEditorNode.ts and NodeGraphNode.ts have pre-existing ESLint warnings (using var, aliasing this, etc.) that are unrelated to our changes.


Time Tracking

Phase Estimated Actual Notes
Phase 1: Create Utility 30 min ~30 min Including comprehensive tests
Phase 2: Canvas Integration 1-2 hours ~10 min Simpler than expected
Phase 3: NodeGraphModel 30 min ~5 min Straightforward addition
Phase 4: Testing 1 hour ~15 min Tests created in Phase 1
Phase 5: Documentation 30 min Pending LEARNINGS.md update needed
Total 4.5-6.5 hours ~1h Much faster due to focused work

Changelog

Date Update
2026-01-10 Task document created
2026-01-10 Phase 1-4 completed - Utility, canvas, model, tests
2026-01-10 Progress document updated with completion status

Next Steps

  1. Manual Testing - Test the changes in the running editor with actual expression parameters
  2. LEARNINGS.md Update - Document the pattern for future reference
  3. Consider Follow-up - If this pattern works well, consider:
    • Using getParameterDisplayValue() in property panel previews
    • Adding similar defensive patterns to other canvas rendering areas
    • Creating a style guide entry for defensive parameter handling