brackt/plans/completed/draft-room-redesign.md

412 lines
11 KiB
Markdown
Raw Permalink Normal View History

# Draft Room Redesign Plan
**Status**: ✅ Complete - All Features Implemented & Tested
**Created**: 2025-10-24
**Last Updated**: 2025-10-24
## Overview
Redesigning the draft room to use a full-screen layout with a collapsible left sidebar and tabbed main content area.
---
## Requirements
### Layout Changes
#### 1. Full-Screen Layout (No Page Scroll)
- Page fills entire viewport (100vh)
- Individual sections scroll internally
- Fixed header at top
- Content area uses remaining height
#### 2. Collapsible Left Sidebar
- **Default State**: Expanded
- **Width**:
- Expanded: 350px
- Collapsed: 50px
- **Contents** (Accordion-style sections):
- My Queue (top section) - Collapsible
- Eligibility status banner
- Queue list (ordered, scrollable)
- Autodraft settings
- Clear queue button
- Available Participants (bottom section) - Collapsible
- Search bar
- Sport filter dropdown
- Show/hide drafted toggle
- Participants table (scrollable)
- Action buttons (Pick/Add to Queue)
- **Section Behavior**:
- Both sections can be expanded or collapsed independently
- When both expanded: 50/50 vertical split
- When one collapsed: Expanded section takes 100% of space
- At least one section must remain expanded
- **Responsive**:
- Desktop (≥1024px): Fixed sidebar on left
- Mobile (<1024px): Full-screen modal
#### 3. Tabbed Main Content Area
Three tabs with toggle functionality:
**Tab 1: Draft Board (Default)**
- Current draft grid display
- Team headers with timers and autodraft status
- Snake draft grid (scrollable)
- Context menu for commissioners
- Reuse existing DraftGrid component or inline implementation
**Tab 2: Recent Picks**
- List of recent picks (latest 10-20)
- Same format as current Recent Picks section
- Scrollable list
- Shows: Pick number, team, participant, sport
**Tab 3: Teams Drafted (NEW)**
- Grid layout:
- **Rows**: Sports (from season sports)
- **Columns**: Teams (in draft order)
- **Cells**: Participants drafted by that team in that sport
- **Highlighting**: Visual indicator when team has multiple participants in same sport
- **Flex Display**: Show "X of Y flexes used" somewhere with team data
- **Scrollable**: Both horizontal and vertical as needed
### Design Decisions
**Teams Drafted Grid:**
1.**Cell content**: Show participant names (e.g., "Patrick Mahomes, Travis Kelce")
2.**Cell interactivity**: No clickability needed (existing commissioner context menu on draft board remains)
3.**Empty cells**: Leave empty (just border, no text)
4.**Flex display**: In team column header, below team name (similar to timer positioning)
**Tab UI:**
5.**Tab style**: ShadCN Tabs component
6.**Recent Picks data**: Same 10 most recent picks as current implementation
**Sidebar:**
7.**Section sizing**: Accordion-style - both sections collapsible independently
- Both expanded: 50/50 split
- One collapsed: Expanded section takes 100%
- At least one must remain expanded
---
## Current Implementation Analysis
### File Structure
**Main Route**: `/app/routes/leagues/$leagueId.draft.$seasonId.tsx`
- All draft room logic currently in this single file
- ~1,300 lines of code
- Inline rendering of Queue and Available Participants (not extracted components)
**Related Components**:
- `/app/components/DraftGrid.tsx` - Reusable draft grid (not currently used in draft room)
- `/app/components/AutodraftSettings.tsx` - Autodraft toggle and settings
**Current Layout**:
```
Header (full width, fixed)
├─ Title and metadata
├─ Control buttons (start/pause/resume)
└─ Connection status
Draft Grid (full width, scrollable)
├─ Team headers
└─ Pick grid
3-Column Grid (lg:grid-cols-3)
├─ My Queue (conditional if user has team)
│ ├─ Eligibility status
│ ├─ Queue list (max-h-96)
│ ├─ Autodraft settings
│ └─ Clear button
├─ Recent Picks
│ └─ Last 10 picks (max-h-96)
└─ Available Participants
├─ Search and filters
└─ Participants table (max-h-[500px])
```
### State Management
Component state (useState):
- `picks` - All draft picks
- `currentPick` - Current pick number
- `searchQuery` - Participant search term
- `hideDrafted` - Toggle drafted visibility
- `sportFilter` - Active sport filter
- `queue` - User's queue items
- `teamTimers` - Timer for each team
- `autodraftStatus` - Autodraft state per team
- `connectedTeams` - Set of connected team IDs
- `forcePickDialogOpen` - Commissioner dialog state
Real-time updates via Socket.IO:
- `pick-made`
- `timer-update`
- `draft-paused` / `draft-resumed`
- `draft-completed`
- `autodraft-updated`
- `team-connected` / `team-disconnected`
- `participant-removed-from-queues`
### Data Flow
- Loader provides initial data
- Socket.IO provides real-time updates
- Form actions handle queue management and draft actions
- Draft eligibility calculated client-side via `calculateDraftEligibility()`
---
## Proposed Architecture
### New Component Structure
```
leagues/$leagueId.draft.$seasonId.tsx (Main Route)
├─ Full-screen flex container (100vh)
├─ Header (fixed, flex: 0 0 auto)
├─ Content Area (flex: 1 1 auto, flex row)
│ ├─ DraftSidebar (NEW component)
│ │ ├─ Collapse toggle button
│ │ ├─ QueueSection (scrollable)
│ │ └─ AvailableParticipantsSection (scrollable)
│ └─ MainContent (flex: 1 1 auto)
│ ├─ TabSelector (Draft Board | Recent Picks | Teams Drafted)
│ └─ TabContent (scrollable)
│ ├─ DraftBoardTab (uses DraftGrid component)
│ ├─ RecentPicksTab
│ └─ TeamsDraftedTab (NEW)
```
### Files to Create
1. **`/app/components/DraftSidebar.tsx`** (NEW)
- Collapsible sidebar container
- Props: collapsed state, queue data, participants data, handlers
- Two internal sections with separate scrolling
2. **`/app/components/draft/QueueSection.tsx`** (NEW, optional)
- Extracted queue rendering logic
- Props: queue, eligibility, autodraft settings, handlers
3. **`/app/components/draft/AvailableParticipantsSection.tsx`** (NEW, optional)
- Extracted participants table logic
- Props: participants, filters, handlers
4. **`/app/components/draft/TeamsDraftedGrid.tsx`** (NEW)
- Grid showing teams × sports with drafted participants
- Props: teams, sports, picks, flex usage
- Highlighting logic for multiple drafts per sport
5. **`/app/components/draft/DraftTabs.tsx`** (NEW, optional)
- Tab selector and content container
- Props: active tab, tab change handler, children
### Files to Modify
1. **`/app/routes/leagues/$leagueId.draft.$seasonId.tsx`**
- Add full-screen layout container
- Add sidebar collapsed state
- Add active tab state
- Import and render DraftSidebar
- Render tabbed main content
- Remove 3-column grid layout
- Remove Recent Picks section (moved to tab)
2. **`/app/components/DraftGrid.tsx`**
- Ensure it works in flex container
- May need height/overflow adjustments
### State Additions
Add to main route component:
```typescript
const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {
// Check localStorage for user preference
const stored = localStorage.getItem('draftSidebarCollapsed');
return stored ? JSON.parse(stored) : false; // Default: expanded
});
const [activeTab, setActiveTab] = useState<'board' | 'picks' | 'teams'>('board');
```
---
## CSS/Styling Strategy
### Layout CSS
```css
/* Main container */
.draft-room-container {
height: 100vh;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* Header */
.draft-room-header {
flex: 0 0 auto;
}
/* Content area */
.draft-room-content {
flex: 1 1 auto;
display: flex;
overflow: hidden;
}
/* Sidebar */
.draft-sidebar {
flex: 0 0 auto;
width: 350px; /* Expanded */
transition: width 0.3s ease, transform 0.3s ease;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.draft-sidebar.collapsed {
width: 50px;
}
/* Sidebar sections */
.sidebar-section {
flex: 0 0 auto; /* Queue: take what you need */
overflow-y: auto;
}
.sidebar-section.grow {
flex: 1 1 auto; /* Available Participants: take remaining */
}
/* Main content */
.draft-main-content {
flex: 1 1 auto;
overflow-y: auto;
display: flex;
flex-direction: column;
}
/* Tab content */
.draft-tab-content {
flex: 1 1 auto;
overflow-y: auto;
}
```
### Responsive Breakpoints
```css
/* Mobile (<1024px) */
@media (max-width: 1023px) {
.draft-sidebar {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
z-index: 50;
transform: translateX(-100%);
}
.draft-sidebar.open {
transform: translateX(0);
}
}
```
### Teams Drafted Grid Styling
```css
.teams-grid {
display: grid;
grid-template-columns: 150px repeat(auto-fit, minmax(120px, 1fr));
overflow: auto;
}
.teams-grid-cell {
border: 1px solid var(--border);
padding: 0.5rem;
min-height: 60px;
}
.teams-grid-cell.multiple-picks {
background-color: var(--accent);
font-weight: 600;
}
```
---
## Implementation Steps
### Phase 1: Setup and Layout Structure
- [x] Create plans directory and documentation
- [ ] Add sidebar collapsed state with localStorage persistence
- [ ] Add active tab state
- [ ] Create full-screen layout container in main route
- [ ] Update header to work with new layout
- [ ] Test basic layout structure
### Phase 2: Sidebar Component
- [ ] Create DraftSidebar.tsx component shell
- [ ] Add collapse/expand toggle button
- [ ] Move Queue section rendering to sidebar
- [ ] Move Available Participants section to sidebar
- [ ] Add internal scrolling for both sections
- [ ] Test sidebar functionality and transitions
- [ ] Add mobile modal behavior
### Phase 3: Tab System
- [ ] Create tab selector UI (choose style based on user feedback)
- [ ] Add Draft Board tab (use existing grid)
- [ ] Add Recent Picks tab (move existing section)
- [ ] Create TeamsDraftedGrid component
- [ ] Implement Teams Drafted grid logic
- [ ] Add flex usage display
- [ ] Add highlighting for multiple picks
- [ ] Test tab switching and content rendering
### Phase 4: Refinement
- [ ] Adjust spacing and padding throughout
- [ ] Test all Socket.IO real-time updates
- [ ] Test all form actions (queue management, making picks)
- [ ] Test responsive behavior (desktop, tablet, mobile)
- [ ] Add keyboard shortcuts (optional)
- [ ] Performance testing with large datasets
- [ ] Accessibility audit (ARIA labels, focus management)
### Phase 5: Polish
- [ ] Animation tuning
- [ ] Dark mode verification
- [ ] Cross-browser testing
- [ ] User acceptance testing
---
## Notes
- Preserve all existing Socket.IO functionality
- Maintain commissioner-specific features (force pick, context menus)
- Keep eligibility calculation logic unchanged
- Ensure autodraft integration remains functional
- Test with various screen sizes and data volumes
---
## Success Criteria
- [ ] Draft room fills viewport (no page scroll)
- [ ] Sidebar collapses/expands smoothly
- [ ] All three tabs render correctly
- [ ] Teams Drafted grid shows accurate data
- [ ] Queue and Available Participants work as before
- [ ] All real-time updates continue to work
- [ ] Mobile experience is usable
- [ ] No regressions in existing functionality
- [ ] Performance is acceptable (no lag during picks/updates)