4.2 KiB
4.2 KiB
Project Switcher Component
The ProjectSwitcher component provides a dropdown interface in the sidebar header that allows users to switch between different projects and navigate to project-specific views.
Features
1. Project Selection
- Dropdown Interface: Click the project header to see all available projects
- Visual Icons: Each project has a unique icon for easy identification
- Status Display: Shows current project status (In Progress, Pre-Production, etc.)
- Keyboard Shortcuts: Use ⌘1, ⌘2, etc. to quickly switch projects
2. Project Views
- All Projects: Overview of all projects (default view)
- Specific Projects: Individual project dashboards
- Automatic Navigation: Switches routes when project is selected
3. Role-Based Features
- Create Project: Admins and coordinators can create new projects
- Project Access: Users see projects based on their permissions
- Developer Mode: Developers see a static header instead of project switcher
Implementation
Components Structure
ProjectSwitcher.vue
├── DropdownMenu (from shadcn-vue)
├── SidebarMenuButton
└── Project Icons (from lucide-vue-next)
State Management
Uses useProjectsStore() for:
- Managing available projects
- Tracking active project
- Handling project switching
- Persisting project state
Integration Points
- AppSidebar: Conditionally shows ProjectSwitcher for non-developer users
- Router: Automatically navigates to project-specific routes
- Projects Store: Manages project data and active state
Usage Examples
Basic Project Switching
- Click the project header in the sidebar
- Select a project from the dropdown
- Automatically navigates to project view
Creating New Projects
- Click the project header dropdown
- Select "Create project" (admins/coordinators only)
- Navigates to project creation form
Keyboard Navigation
⌘1- Switch to first project⌘2- Switch to second project- etc.
Project Data Structure
interface Project {
id: number
name: string
status: string
icon: Component
description?: string
member_count?: number
}
Default Projects
- Project Alpha: Feature film (In Progress)
- Project Beta: Animated series (Pre-Production)
- Project Gamma: Commercial campaign (Post-Production)
- All Projects: Overview view
Responsive Behavior
Desktop
- Dropdown opens to the right of the trigger
- Full project information displayed
- Keyboard shortcuts available
Mobile
- Dropdown opens below the trigger
- Optimized for touch interaction
- Simplified layout for smaller screens
Customization
Adding New Projects
const projectsStore = useProjectsStore()
projectsStore.addProject({
name: 'New Project',
status: 'Planning',
icon: NewIcon,
description: 'Project description'
})
Custom Icons
Import from lucide-vue-next or use custom SVG components:
import { CustomIcon } from '@/components/icons'
Status Types
Common project statuses:
PlanningPre-ProductionIn ProgressPost-ProductionCompletedOn Hold
Integration with Routes
Route Mapping
/projects→ All Projects view/projects/1→ Project Alpha/projects/2→ Project Beta/projects/new→ Create new project
Route Synchronization
The component automatically:
- Updates active project based on current route
- Navigates to appropriate route when project is selected
- Maintains project state across navigation
Accessibility
Features
- Keyboard Navigation: Full keyboard support
- Screen Readers: Proper ARIA labels and descriptions
- Focus Management: Logical tab order
- High Contrast: Works with system themes
ARIA Labels
- Project buttons have descriptive labels
- Dropdown has proper role attributes
- Status information is announced
Performance
Optimizations
- Computed Properties: Reactive project filtering
- Lazy Loading: Projects loaded on demand
- Minimal Re-renders: Efficient Vue reactivity
- Store Caching: Project data cached in store
The ProjectSwitcher provides an intuitive way for users to navigate between projects while maintaining context and state throughout the application.