Background
Users need to export a filtered subset of tasks from the in-memory task list to CSV for reporting. This complements the broader export work on the board.
Requirements
Add a helper that accepts an array of task objects and returns a CSV string.
Supported columns: id, title, status, dueDate, labels (labels joined with ;).
Support an optional filter object: { status?, label?, search? }.
status: exact match on task.status
label: task must include the label (case-insensitive)
search: case-insensitive match on title
If no tasks match the filter, return header row only (no data rows).
Escape CSV correctly when title/labels contain commas or double quotes.
Cap export at 1000 rows; if more match, export first 1000 only.
Null or missing dueDate should export as empty string, not "null" or "undefined".
Export must not throw when tasks array is empty.
Acceptance criteria
[ ] AC1: Filter by status returns only matching tasks
[ ] AC2: Label filter is case-insensitive
[ ] AC3: CSV cells with commas/quotes are escaped per RFC 4180
[ ] AC4: Empty result still returns valid CSV with headers
[ ] AC5: More than 1000 matches truncates to 1000 rows
[ ] AC6: Missing dueDate renders as blank
[ ] AC7: Empty input array returns headers only, no throw
Out of scope
UI/download button
Jira API integration
Persistence
Background
Users need to export a filtered subset of tasks from the in-memory task list to CSV for reporting. This complements the broader export work on the board.
Requirements
Add a helper that accepts an array of task objects and returns a CSV string.
Supported columns: id, title, status, dueDate, labels (labels joined with ;).
Support an optional filter object: { status?, label?, search? }.
status: exact match on task.status
label: task must include the label (case-insensitive)
search: case-insensitive match on title
If no tasks match the filter, return header row only (no data rows).
Escape CSV correctly when title/labels contain commas or double quotes.
Cap export at 1000 rows; if more match, export first 1000 only.
Null or missing dueDate should export as empty string, not "null" or "undefined".
Export must not throw when tasks array is empty.
Acceptance criteria
[ ] AC1: Filter by status returns only matching tasks
[ ] AC2: Label filter is case-insensitive
[ ] AC3: CSV cells with commas/quotes are escaped per RFC 4180
[ ] AC4: Empty result still returns valid CSV with headers
[ ] AC5: More than 1000 matches truncates to 1000 rows
[ ] AC6: Missing dueDate renders as blank
[ ] AC7: Empty input array returns headers only, no throw
Out of scope
UI/download button
Jira API integration
Persistence