feat: Add virtual boards that dynamically group images by date by Pfannkuchensack · Pull Request #8971 · invoke-ai/InvokeAI
Summary
Virtual boards are computed on-the-fly via backend queries, not stored in the database. The first virtual board type groups images by creation date into sub-boards per day. The feature is togglable via the board settings popover and the collapse state persists across sessions.
Backend:
- New
GET /api/v1/virtual_boards/by_dateendpoint returning date-grouped sub-boards with image/asset counts and cover images - New
GET /api/v1/virtual_boards/by_date/{date}/image_namesendpoint returning ordered image names for a specific date - Added
get_image_dates()andget_image_names_by_date()toImageRecordStorageBase/SqliteImageRecordStorage
Frontend:
- "Virtual Boards" toggle in board settings popover (off by default)
- Collapsible "By Date" section in the board list with persist state
- Virtual sub-boards show date, image/asset counts, cover thumbnail, and calendar icon
- Gallery seamlessly loads images when a virtual sub-board is selected
- Virtual boards are read-only: no drag-and-drop, no context menu, no auto-add
- Cache invalidation via
VirtualBoardstag on image mutations - Redux slice migration for new
showVirtualBoardsandvirtualBoardsSectionOpenfields
Related Issues / Discussions
None
QA Instructions
- Open the gallery panel and click the gear icon to open board settings
- Enable "Virtual Boards" checkbox
- A collapsible "By Date" section should appear in the board list with sub-boards for each day that has images
- Click a date sub-board → gallery shows only images from that day
- Verify the collapse toggle (caret icon) works and persists across page reloads
- Verify drag-and-drop onto virtual boards is not possible
- Generate a new image → virtual board counts should update
- Disable "Virtual Boards" → section disappears, selection resets to "Uncategorized"
Merge Plan
No special considerations.
Checklist
- The PR has a short but descriptive title, suitable for a changelog
- Tests added / updated (if applicable)
- Changes to a redux slice have a corresponding migration
- Documentation added / updated (if applicable)
- Updated
What's Newcopy (if doing a release after this PR)