feat: add multi-select groundwork to product publishing (Stage 3A)
Add read-only multi-selection state to the product publishing workspace, preparing for future bulk actions without introducing any bulk writes.
Controller (ProductPublishingController):
- Add _multiSelectedIds Set<String> for tracking multi-selected product IDs
- Add toggleMultiSelect(id) to add/remove individual IDs
- Add clearMultiSelection() to deselect all
- Add selectAllVisible() to select all currently visible (filtered/searched) drafts
- Add isMultiSelected(id), multiSelectedIds, multiSelectedCount, isMultiSelectActive getters
- Multi-selection is independent of single-item preview selection
- Multi-selection persists across load cycles and write operations
UI (ProductDraftCard):
- Add optional isMultiSelected/onMultiSelectToggle props
- Show leading Checkbox when multi-select mode is active
- Tapping checkbox toggles multi-select; tapping card body still fires single-item preview
UI (ProductPublishingPage):
- Add _MultiSelectBar widget above product list when multi-select is active
- Shows selected count, Select All button, and Clear button
- Replace deprecated withOpacity() calls with withValues(alpha:)
Tests:
- 15 new multi-select controller tests covering toggle, clear, select-all,
filter/search interaction, independence from preview selection, persistence
across loads and writes, and listener notifications
- Total: 262 feature_wordpress tests passing
Validation:
- dart analyze: clean (0 issues)
- flutter test: 262/262 passed
Changed files:
- lib/src/application/product_publishing_controller.dart
- lib/src/presentation/widgets/product_draft_card.dart
- lib/src/presentation/product_publishing_page.dart
- test/product_publishing_controller_test.dart
- docs/development/master_development_brief.md