- Add useCan hook reading permissions from $investigationId layout route loader
- Add $investigationId layout route to fetch investigation and share data with children
- Add share dialog with user search autocomplete (debounced) for collaborator management
- Add /dashboard/profile page for editing first name, last name, avatar URL
- Gate all edit/create/delete actions based on user role (deny by default)
- Graph: node drag, quick add, link creation, context menus, detail panel editing
- Analysis: editor readonly, title readonly, actions hidden for viewers
- Investigation: delete (owner only), share (admin+), new sketch/analysis (editor+)
- Settings: sketch info readonly, delete sketch and import hidden for viewers
- Selected items panel: enrich, delete, ask AI hidden for viewers
- Fix nav-user to show real user data instead of hardcoded placeholder
- Add user-display utils (getDisplayName, getInitials) shared across components
- Add avatar display in nav-user, case-header collaborators and share dialog
Thread MouseEvent through onBackgroundClick for double-click detection.
Use stable callback ref to avoid ForceGraph2D stale closure issues.
Fix graphRef not being set on first load by notifying parent immediately
after ForceGraph2D mounts. Close quick-add input on blur.
Double-click on the graph background opens an inline input at that position.
Typing triggers debounced type detection via the API, showing the detected
type as a badge. On Enter, a node is created at the click position with the
detected type and persisted to the API. Escape or click outside cancels.
Allow creating edges by holding Alt and dragging from one node to another.
On release, the edge is added to the graph and the edge context menu opens
with the label input focused and selected, ready for editing. The edge is
only persisted to the API on Enter/submit; Escape removes it from the store.