2.5 KiB
| id | title | status | assignee | created_date | updated_date | labels | milestone | dependencies | references | priority | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TASK-41 | Build dynamic Shape Registry to replace hardcoded switch statements | Done | 2026-02-18 20:06 | 2026-03-11 23:01 |
|
m-1 |
|
high |
Description
Replace the 170-line switch statement in canvas.html's createShapeElement() and the 100-line type-switch in community-sync.ts's #updateShapeElement() with a dynamic ShapeRegistry.
Create lib/shape-registry.ts with:
- ShapeRegistration interface (tagName, elementClass, defaults, category, portDescriptors, eventDescriptors)
- ShapeRegistry class with register(), createElement(), updateElement(), listAll(), getByCategory()
- Each folk-*.ts gets a static
registrationproperty and staticfromData()method
This is the prerequisite for all other ecosystem features (pipes, events, groups, nesting, embedding).
Acceptance Criteria
- #1 ShapeRegistry class created with register/createElement/updateElement methods
- #2 All 30+ folk-*.ts shapes have static registration property
- #3 canvas.html switch statement replaced with registry.createElement()
- #4 community-sync.ts type-switch replaced with registry.updateElement()
- #5 All existing shapes still create and sync correctly
- #6 No regression in shape creation or remote sync
Final Summary
Completed: Dynamic Shape Registry
Created lib/shape-registry.ts — ShapeRegistry class with register(), createElement(), updateElement(), has(), listAll(). Singleton shapeRegistry exported from lib/index.ts.
Added static fromData(data) and applyData(data) to all 41 shape classes (base FolkShape + 40 subclasses including FolkArrow). Each shape's creation/sync logic is now co-located with its toJSON().
Replaced 300-line newShapeElement() switch in canvas.html with ~25-line registry call. Special cases preserved: wb-svg whiteboard drawings, folk-canvas parentSlug, folk-rapp spaceSlug context defaults.
Replaced 165-line #updateShapeElement() if-chain in community-sync.ts with single shape.applyData(data) delegation (~10 lines).
All existing shapes create and sync identically. No TypeScript errors introduced.
Commit: c4717e3