- Contexts wait for connection before loading to avoid stale cached data
- MeetingsPage skips fetch when URL project ID is invalid
- Workspace isLoading starts as true for proper loading state
- Remove debug logging added during investigation
- Add PROJECTS_FETCH_LIMIT constant to timing.ts
The Meetings page skips fetching when projectsLoading is false and
activeProject is null. Since isLoading started as false, the initial
render would skip the fetch before projects had a chance to load.
By initializing isLoading to true, the Meetings page waits for the
project context to finish loading before deciding whether to fetch.
Added onSuccess callback to useDeleteMeetings hook and use it in
Meetings.tsx to close dialog, clear selection, and exit selection mode.
Removed flaky useEffect that tried to detect deletion success by
checking if meetings still existed in the list.
The Rust struct used snake_case field names (succeeded_ids, deleted_count)
but TypeScript expected camelCase (succeededIds, deletedCount), causing
'result.succeededIds is not iterable' error.
Added #[serde(rename_all = "camelCase")] to match the existing pattern
used by other response types in the codebase.
The issue: Radix UI Checkbox's onCheckedChange doesn't fire when
e.preventDefault() is called in onClick (needed to block parent Link).
Solution: Remove onClick/onCheckedChange from Checkbox, handle toggle
manually in the wrapper div's onClick handler by calling onSelect
directly with the inverted state.
Use fieldset element to wrap checkbox with proper event handling:
- e.preventDefault() + e.stopPropagation() on both fieldset and Checkbox
- Prevents Link navigation when clicking checkbox
- Uses semantic fieldset element with aria-label for a11y compliance
- No lint suppressions needed
- Add 'Select' toggle button in filter area
- Checkboxes only visible when selection mode is active
- Hide individual trash buttons during selection mode
- Exit selection mode when: deselecting all, deleting, or changing filters
- Resolves visual conflict between checkbox and card title
- Removes redundancy between checkbox and trash button
The checkbox now appears on-demand via toggle, providing cleaner default UI.
- Add DeleteMeetingsResult interface to API types
- Implement deleteMeetings adapter method with cache updates
- Add useDeleteMeetings hook with optimistic updates and rollback
- Add checkbox selection props to MeetingCard component
- Create BulkActionToolbar component with sticky bottom positioning
- Export BulkActionToolbar from meetings index
Enables frontend bulk delete UI with selection and confirmation.
Refs: mass-delete-meetings plan tasks 5-7
- Add DeleteMeetings RPC to proto schema with request/response messages
- Implement Python backend handler in MeetingMixin
- Extract bulk delete logic to _bulk_delete_ops.py module
- Skip meetings in RECORDING or STOPPING state
- Return aggregated results with succeeded/failed/skipped IDs
- Add comprehensive logging for bulk operations
Refs: mass-delete-meetings plan tasks 1-2
- Add overflow menu with delete option to Header component
- Integrate delete flow with confirmation dialog in MeetingDetailPage
- Extract delete logic to useDeleteMeeting hook for code organization
- Add comprehensive unit tests for delete functionality
- Guard against deleting active meetings (recording/stopping states)
- Navigate to /meetings on successful deletion
- All quality gates pass (479 lines in index.tsx, under 500 limit)