generated from coulomb/repo-seed
refactor: use abstract ITEM placeholders with dynamic property mapping
Changed from fixed TASK placeholders to flexible ITEM placeholders that
automatically map all CSV fields to template placeholders.
Key changes:
- Renamed task-template → item-template in all templates
- Changed TASK_* → ITEM_* placeholder naming
- Implemented dynamic placeholder generation from item properties
- Any field in fieldMapping now creates ITEM_{FIELD} placeholder
- Updated all tests and documentation
Naming convention: CSV field → item.property → ITEM_PROPERTY
Example: "assignee" → item.assignee → {{ITEM_ASSIGNEE}}
This enables users to add custom fields without modifying generator code:
- Add "assignee": "Assignee" to fieldMapping
- Use {{ITEM_ASSIGNEE}} in template
- No code changes required
Benefits:
- More flexible and extensible
- Clearer abstraction (items vs tasks)
- Consistent naming convention
- Better documented
All 56 tests passing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -66,12 +66,12 @@ describe('Timeline Generator', () => {
|
||||
}).toThrow('Template is missing required elements: lane-template')
|
||||
})
|
||||
|
||||
it('should throw error when template is missing task-template', () => {
|
||||
const malformedTemplate = createMalformedTemplate('task-template')
|
||||
it('should throw error when template is missing item-template', () => {
|
||||
const malformedTemplate = createMalformedTemplate('item-template')
|
||||
|
||||
expect(() => {
|
||||
timelineGenerator.generate(items, config, malformedTemplate)
|
||||
}).toThrow('Template is missing required elements: task-template')
|
||||
}).toThrow('Template is missing required elements: item-template')
|
||||
})
|
||||
|
||||
it('should validate template with proper error message', () => {
|
||||
@@ -179,8 +179,8 @@ describe('Timeline Generator', () => {
|
||||
|
||||
expect(result).not.toContain('{{MONTH_X}}')
|
||||
expect(result).not.toContain('{{LANE_Y}}')
|
||||
expect(result).not.toContain('{{TASK_X}}')
|
||||
expect(result).not.toContain('{{TASK_TITLE}}')
|
||||
expect(result).not.toContain('{{ITEM_X}}')
|
||||
expect(result).not.toContain('{{ITEM_TITLE}}')
|
||||
})
|
||||
|
||||
it('should contain task data in generated SVG', () => {
|
||||
@@ -248,7 +248,7 @@ describe('Timeline Generator', () => {
|
||||
|
||||
expect(result).not.toContain('id="month-template"')
|
||||
expect(result).not.toContain('id="lane-template"')
|
||||
expect(result).not.toContain('id="task-template"')
|
||||
expect(result).not.toContain('id="item-template"')
|
||||
expect(result).not.toContain('style="display:none"')
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user