Skip to main content

Project Details - Grid View Specification

Last Updated: November 20, 2025 Version: 4.4.0 Status: ⚠️ Awaiting Stakeholder Review


🎯 Overview​

The Grid View is a dense, spreadsheet-style interface for production managers who need to see their entire crew roster at a glance. It's designed to replicate the best parts of Excel-based crew planning while adding modern web UI benefits.

Key Insight​

Production managers currently use Excel because they can see everything at once:

  • Who's working which days
  • What everyone costs (offered vs actual)
  • Which admin tasks are pending
  • Total project costs in real-time

Grid View brings this power to PBS with better UX: sorting, filtering, inline editing, visual status indicators, and automatic calculations.


πŸ“Š Visual Mockup​

Full Grid Layout​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PROJECT: Idre Freestyle [+ Add Crew] [Bulk Edit] [Export to Excel] β”‚
β”‚ Dec 3-10, 2023 (8 days) β€’ 30 crew members β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ View: [β—‹ List] [● Grid] [β—‹ Timeline] Filters: [All Status β–Ό] [All Functions β–Ό] [All Teams β–Ό] [☐ Incomplete tasks] β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ CREW INFO (Frozen) ──────────┬────── LOGISTICS ────┬──────── WORK SCHEDULE ─────────┬─ FIN β”‚
β”‚ β”‚ # β”‚β˜…β”‚ Name β”‚Function β”‚Team β”‚Role β”‚Status β”‚Accom β”‚Travel β”‚S M T W T F S S β”‚Wβ”‚Tβ”‚Totβ”‚Rate β”‚Hotel β”‚
β”‚ β”œβ”€β”€β”€β”Όβ”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”Όβ”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚ 1 β”‚β˜…β”‚ Johan B. β”‚Director β”‚β€” β”‚Main β”‚βœ“ Conf β”‚FjΓ€ll 521β”‚πŸšŒ Minibus β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 2 β”‚ β”‚ Jan-Ove K. β”‚Mixer β”‚β€” β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 520β”‚πŸš— Own car β”‚ β– β– β– β– β–  β”‚5β”‚0β”‚ 5 β”‚1000 β”‚3600 β”‚
β”‚ β”‚ 3 β”‚β˜…β”‚ Peter A. β”‚Producer β”‚β€” β”‚Grafikβ”‚βœ“ Conf β”‚FjΓ€ll 521β”‚πŸš— Own car β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 4 β”‚β˜…β”‚ Susanne S. β”‚Prod Lead β”‚β€” β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 552β”‚πŸšŒ Minibus β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 5 β”‚ β”‚ Adam K. β”‚Rigg β”‚β€” β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 551β”‚πŸš— Own car β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 6 β”‚β˜…β”‚ Daniel E. β”‚Cam Ass β”‚β€” β”‚Slope β”‚βœ“ Conf β”‚FjΓ€ll 550β”‚πŸš— Own car β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 7 β”‚ β”‚ Joakim S. β”‚A-Ljud β”‚Audio β”‚Main β”‚βœ“ Conf β”‚FjΓ€ll 545β”‚πŸš— W/Adam β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 8 β”‚ β”‚ Max C. β”‚Ljud Tech β”‚Audio β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 545β”‚πŸšŒ Minibus β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚1000 β”‚4500 β”‚
β”‚ β”‚ 9 β”‚β˜…β”‚ Niklas N. β”‚EVS 1 β”‚EVS β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 673β”‚πŸš— W/Magnusβ”‚ β– β– β– β–  β”‚4β”‚0β”‚ 4 β”‚1000 β”‚3600 β”‚
β”‚ β”‚10 β”‚ β”‚ HΓ₯kan R. β”‚EVS 2 β”‚EVS β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 520β”‚πŸš— Shared β”‚ β– β– β–  β”‚3β”‚0β”‚ 3 β”‚1000 β”‚2700 β”‚
β”‚ β”‚ β”‚ β”‚ [...] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚30 β”‚ β”‚ Elin S. β”‚RF Tech β”‚Tech β”‚β€” β”‚βœ“ Conf β”‚FjΓ€ll 548β”‚πŸšŒ NEP β”‚ β– β– β– β– β– β–  β”‚6β”‚0β”‚ 6 β”‚ Inc β”‚4500 β”‚
β”‚ β”œβ”€β”€β”€β”΄β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”΄β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚ TOTAL: 30 crew β€’ 156 work days β€’ 42 travel days β€’ Crew: 130,000 SEK β€’ Hotel: 107,100 β€’ Travel: 89,600 β€’ TOTAL: 326,700β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”‚ πŸ’‘ Showing Offered costs. Toggle to [Show Actual] [Show Both] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

← Scroll horizontally to see more columns (Travel Costs, Admin Tasks, Actual Costs) β†’

Column Groups Detail​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ COMPLETE COLUMN STRUCTURE β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ [A. CREW INFO - Frozen] Always visible when scrolling β”‚
β”‚ β”œβ”€ # (Row number) β”‚
β”‚ β”œβ”€ β˜… (Favorite toggle) β”‚
β”‚ β”œβ”€ Name (Avatar + Name) β”‚
β”‚ β”œβ”€ Function (Role badge) β”‚
β”‚ β”œβ”€ Team (Editable label) β”‚
β”‚ β”œβ”€ Role Note (Editable descriptor) β”‚
β”‚ └─ Status (Color badge) β”‚
β”‚ β”‚
β”‚ [B. LOGISTICS] Hotel & Travel β”‚
β”‚ β”œβ”€ Accom. (Hotel assignment + roommates) β”‚
β”‚ └─ Travel (Method icon + summary) β”‚
β”‚ β”‚
β”‚ [C. WORK SCHEDULE] Visual day-by-day grid β”‚
β”‚ β”œβ”€ Date columns (Dec 3, 4, 5... 10) β–  = work day, β–‘ = travel day β”‚
β”‚ β”œβ”€ W (Work days count) β”‚
β”‚ β”œβ”€ T (Travel days count) β”‚
β”‚ └─ Total (Total days) β”‚
β”‚ β”‚
β”‚ [D. FINANCIAL - Offered] Planned costs β”‚
β”‚ β”œβ”€ Day Rate (Work day rate) β”‚
β”‚ β”œβ”€ Travel Rate (Travel day rate) β”‚
β”‚ β”œβ”€ Crew Total (Calculated: rates Γ— days) β”‚
β”‚ β”œβ”€ Hotel (Total hotel costs) β”‚
β”‚ β”œβ”€ Travel Cost (Total travel expenses) β”‚
β”‚ β”œβ”€ Other (Adjustments, bonuses) β”‚
β”‚ └─ TOTAL (Grand total per crew) **KEY METRIC** β”‚
β”‚ β”‚
β”‚ [E. ADMIN TASKS] Manual workflow checkboxes β”‚
β”‚ β”œβ”€ βœ“ Travel booked β”‚
β”‚ β”œβ”€ βœ“ Hotel booked β”‚
β”‚ β”œβ”€ βœ“ Roadbook sent β”‚
β”‚ └─ βœ“ Invoice handled (freelancers only) β”‚
β”‚ β”‚
β”‚ [F. ACTUAL COSTS] Post-production (hidden by default) β”‚
β”‚ β”œβ”€ Act. Days (Actual work days) β”‚
β”‚ β”œβ”€ Act. Rate (Adjusted rate) β”‚
β”‚ β”œβ”€ Act. Total (Invoiced amount) β”‚
β”‚ β”œβ”€ Variance (Difference from planned) β”‚
β”‚ └─ Invoice # (External reference) β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🎨 Design System​

Cell States & Visual Indicators​

WORK SCHEDULE CELLS:
β–  Work day (solid blue fill)
β–‘ Travel day (blue outline)
Empty (no work)
? TBD (dashed outline)

ACCOMMODATION:
FjΓ€llterassen 521 Simple display
πŸ‘₯ FjΓ€llterassen 521 (3) Shared with others (hover β†’ see names)
β€” Not assigned

TRAVEL:
✈️ Flight SK1234 Flight booked
πŸš— Own car Personal vehicle
πŸš‚ Train Rail travel
🚌 Minibus NCP Group transport
🟒 Symbol = Booked
🟑 Symbol = Planned
βšͺ Symbol = Not arranged

STATUS BADGES:
βœ“ Confirmed (Green #10B981)
⏳ Pending (Yellow #F59E0B)
πŸ“§ Sent (Blue #3B82F6)
❌ Declined (Red #EF4444)

ADMIN TASKS:
βœ“ Done (Green)
☐ Pending (Gray)
β€” N/A

FINANCIAL INDICATORS:
🟒 Within budget
🟑 Close to limit (90%+)
πŸ”΄ Over budget
**Bold** = Non-standard rate

Typography & Spacing​

GRID DENSITY:
Row Height: 32px (compact)
Cell Padding: 4px
Font Size: 13px (body), 12px (headers)

FONTS:
Numbers: SF Mono / Consolas (monospace for alignment)
Text: Inter / San Francisco (sans-serif)

COLORS (Tailwind):
Primary: Blue-600 (#2563EB)
Secondary: Gray-600 (#64748B)
Success: Green-600 (#10B981)
Warning: Yellow-500 (#F59E0B)
Danger: Red-600 (#EF4444)
Border: Gray-200 (#E5E7EB)

πŸ”§ Functional Specifications​

View Mode Toggle​

Location: Top right below project header
Options:
β—‹ List View (default, card-based, detailed)
● Grid View (spreadsheet, high-density)
β—‹ Timeline View (Gantt chart, post-MVP)

Behavior:
- User preference saved per-project
- Auto-switches to List View on mobile (<1280px)
- Retains filters/sort when switching views

Header Controls​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Quick Filters: β”‚
β”‚ [All Status β–Ό] β†’ Filter by Confirmed/Pending/etc. β”‚
β”‚ [All Functions β–Ό] β†’ Filter by Director/Camera/Sound/etc. β”‚
β”‚ [All Teams β–Ό] β†’ Filter by Camera A/Audio Main/etc. β”‚
β”‚ [☐ Show only incomplete tasks] β†’ Show rows with pending work β”‚
β”‚ β”‚
β”‚ Date Range Display: β”‚
β”‚ "Dec 3-10, 2023 (8 days)" β”‚
β”‚ Click β†’ opens date picker to adjust view range β”‚
β”‚ β”‚
β”‚ Crew Count: β”‚
β”‚ "30 crew members" (updates with filters) β”‚
β”‚ β”‚
β”‚ Quick Actions: β”‚
β”‚ [+ Add Crew] β†’ Opens crew selection modal β”‚
β”‚ [Bulk Edit] β†’ Select multiple rows, edit common fields β”‚
β”‚ [Export] β†’ Export to Excel/PDF/Clipboard β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Column Interactions​

Frozen Columns (Crew Info)​

BEHAVIOR:
- Always visible when scrolling horizontally
- Subtle shadow appears when scrolling right
- Min width: 600px (all crew info visible)

CLICK ACTIONS:
- Name β†’ Opens crew assignment detail modal (full edit)
- β˜… β†’ Toggles favorite status (instant save)
- Team β†’ Inline edit (text input appears)
- Role Note β†’ Inline edit (text input appears)
- Status β†’ Dropdown to change status

Work Schedule Grid​

VISUAL BEHAVIOR:
- One column per day (project.start_date to project.end_date)
- Max 31 days shown (horizontal scroll if longer)
- Weekend columns have subtle gray background

CLICK ACTIONS:
- Click empty cell β†’ Mark as work day (β– )
- Click work day (β– ) β†’ Toggle to travel day (β–‘)
- Click travel day (β–‘) β†’ Toggle to empty
- Hover β†’ Tooltip: "Work day (1,000 SEK)" or "Travel day (500 SEK)"

AUTO-CALCULATION:
- W (Work days): Count of β–  cells
- T (Travel days): Count of β–‘ cells
- Total: W + T
- Updates Crew Total when changed

Financial Columns​

INLINE EDITING:
- Day Rate β†’ Double-click β†’ Input field β†’ Enter to save
- Travel Rate β†’ Double-click β†’ Input field β†’ Enter to save
- Other β†’ Click β†’ Opens adjustment modal

READ-ONLY CALCULATIONS:
- Crew Total = (W Γ— Day Rate) + (T Γ— Travel Rate)
- TOTAL = Crew Total + Hotel + Travel Cost + Other

VISUAL INDICATORS:
- Bold text if rate differs from function default
- 🟒 Green tint if within budget
- πŸ”΄ Red tint if over budget (>110% of planned)
- Background color intensity scales with amount (heat map)

Admin Tasks Checkboxes​

BEHAVIOR:
- Simple click to toggle βœ“ ↔ ☐
- Auto-saves on change (debounced 500ms)
- "Invoice handled" only shown for freelancers (employer_id IS NULL)

FILTER INTEGRATION:
- "Show only incomplete tasks" checkbox
β†’ Hides rows where all checkboxes are βœ“

Actual Costs Columns (Hidden by Default)​

TOGGLE:
Footer has button: [Show Actual Costs]
- Reveals columns: Act. Days, Act. Rate, Act. Total, Variance, Invoice #
- Intended for post-production reconciliation

VARIANCE DISPLAY:
- Positive variance: "+500 SEK (+8.3%)" in green
- Negative variance: "-200 SEK (-3.6%)" in red
- Zero: "β€”" or "0 (0%)"

INVOICE # FIELD:
- Text input for external invoice reference (e.g., "8949")
- Optional link icon β†’ opens external system (Fortnox)

Row Interactions​

CLICK BEHAVIORS:
1. Single click row β†’ Highlight row + show quick actions
2. Double-click row β†’ Opens full crew assignment detail modal
3. Right-click row β†’ Context menu:
- Edit Assignment
- Duplicate Booking
- View Crew Profile
- Remove from Project
- Copy Details

HOVER STATE:
- Entire row highlights (light blue background)
- Quick action icons appear on right:
[✎ Edit] [πŸ“‹ Copy] [πŸ—‘οΈ Remove]

DRAG & DROP:
- Grab row number (#) to drag
- Drop between rows to reorder
- Visual indicator (blue line) shows drop target
- Manual sort order saved per-user

Row Grouping (Optional)​

TOGGLE: [Group by: None β–Ό]
Options:
- None (flat list, default)
- Function (Camera (8), Sound (3), etc.)
- Team (Camera A (4), Audio Main (2), etc.)
- Status (Confirmed (28), Pending (2))

VISUAL:
β”Œβ”€ β–Ό Camera (8) ─────────────────── Subtotal: 48,000 SEK ────┐
β”‚ 1 Johan B. Director ... β”‚
β”‚ 2 Peter A. Producer ... β”‚
β”‚ [...] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€ β–Ό Sound (3) ──────────────────── Subtotal: 17,000 SEK ────┐
β”‚ 7 Joakim S. A-Ljud ... β”‚
β”‚ [...] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

COLLAPSE/EXPAND:
- Click β–Ό to collapse group
- Click β–Ά to expand group
- Collapsed: Shows only group header with subtotals
ALWAYS VISIBLE:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ TOTAL: 30 crew β€’ 156 work days β€’ 42 travel days β”‚
β”‚ Crew: 130,000 SEK β€’ Hotel: 107,100 β€’ Travel: 89,600 β”‚
β”‚ TOTAL: 326,700 SEK β”‚
β”‚ β”‚
β”‚ Budget Status: Offered: 343,035 | Actual: 379,243 β”‚
β”‚ Variance: +36,208 (+10.6%) πŸ”΄ β”‚
β”‚ β”‚
β”‚ [Show Offered] [Show Actual] [Show Both] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

CALCULATIONS:
- Updates in real-time as grid changes
- Respects active filters (shows filtered totals)
- Currency: Always in company base_currency
- Toggle buttons switch between offered/actual cost views

Column Visibility Controls​

BUTTON: [βš™οΈ Columns] (top right)

OPENS MODAL:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Column Visibility β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β˜‘ Crew Info (always visible) β”‚
β”‚ β˜‘ Logistics β”‚
β”‚ β˜‘ Work Schedule β”‚
β”‚ β˜‘ Financial (Offered) β”‚
β”‚ ☐ Financial (Actual) β”‚
β”‚ β˜‘ Admin Tasks β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ [Reset to Default] [Save] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

BEHAVIOR:
- Unchecked groups hidden from grid
- Saved as user preference (per-project)
- "Crew Info" always checked (cannot hide)

Keyboard Navigation (Excel-like)​

KEYS:
Tab / Shift+Tab Navigate cells (right/left)
Enter Start editing cell / Save edit
Esc Cancel edit / Close modal
Ctrl+C / Ctrl+V Copy/Paste cell values
Ctrl+F Find crew member (search dialog)
←↑→↓ Arrow keys to navigate
Ctrl+Home Jump to first cell
Ctrl+End Jump to last cell
Page Up/Down Scroll one page

EDIT MODE:
- Double-click or press Enter to edit cell
- Type to overwrite value
- Tab to save and move to next cell
- Esc to cancel without saving

πŸ“€ Export Options​

Export to Excel​

FORMAT: .xlsx (Excel 2010+)
INCLUDES:
- All visible columns (respects column visibility settings)
- Current filters applied
- Current sort order
- Formulas for calculated fields (Crew Total, TOTAL, etc.)
- Cell formatting (colors, bold, borders)
- Frozen panes (Crew Info columns)
- Footer row with summary formulas

FILENAME: "ProjectName_CrewRoster_YYYY-MM-DD.xlsx"
Example: "Idre_Freestyle_CrewRoster_2023-12-03.xlsx"

Export to PDF​

FORMAT: PDF (A3 landscape)
LAYOUT:
- Project header (name, dates, crew count)
- Full grid (all visible columns)
- Footer with totals
- Compact typography for print

OPTIONS:
- [ ] Include actual costs
- [ ] Include notes column
- [ ] Group by function

FILENAME: "ProjectName_CrewRoster_YYYY-MM-DD.pdf"

Copy to Clipboard​

BEHAVIOR:
- Copies grid as tab-separated values (TSV)
- Can be pasted into Excel, Google Sheets, Numbers
- Includes headers
- Respects current filters and sort

KEYBOARD: Ctrl+Shift+C (select all + copy grid)

🎯 Data Mapping to Database​

Source Tables​

PRIMARY:
- assignments (main crew booking data)
- crew_profiles (crew member info)
- project_functions (function/role data)
- projects (project dates, budget)

RELATED:
- travel_bookings (travel costs and details)
- hotel_bookings (hotel costs and details)
- users (for favorite stars, admin users)
- companies (for base_currency)
- functions (for role names)

Column to Database Field Mapping​

CREW INFO:
- # β†’ Row number (generated client-side)
- β˜… β†’ crew_profiles.is_favorite (per-company flag)
- Name β†’ crew_profiles.name + crew_profiles.avatar_url
- Function β†’ functions.name (via project_functions)
- Team β†’ assignments.team_label
- Role Note β†’ assignments.role_note
- Status β†’ assignments.current_status

LOGISTICS:
- Accom. β†’ (NOT IN DATABASE - Future feature? See Q1 below)
- Travel β†’ travel_bookings.type + travel_bookings.from_city + travel_bookings.to_city

WORK SCHEDULE:
- Date columns β†’ Generated from assignments.start_date to assignments.end_date
- W β†’ assignments.planned_work_days (or actual_work_days if completed)
- T β†’ assignments.planned_travel_days (or actual_travel_days if completed)
- Total β†’ W + T (calculated)

FINANCIAL (Offered):
- Day Rate β†’ assignments.work_day_rate_cents / 100
- Travel Rate β†’ assignments.travel_day_rate_cents / 100
- Crew Total β†’ (planned_work_days Γ— work_day_rate) + (planned_travel_days Γ— travel_day_rate)
- Hotel β†’ SUM(hotel_bookings.total_cost_cents) / 100
- Travel Cost β†’ SUM(travel_bookings.cost_cents) / 100
- Other β†’ assignments.adjustment_amount_cents / 100
- TOTAL β†’ Crew Total + Hotel + Travel Cost + Other

ADMIN TASKS:
- βœ“ Travel β†’ assignments.travel_status (not_booked / booked)
- βœ“ Hotel β†’ assignments.hotel_status (not_booked / booked)
- βœ“ Roadbook β†’ assignments.roadbook_status (not_sent / sent)
- βœ“ Invoice β†’ assignments.invoice_status (not_handled / handled)

ACTUAL COSTS:
- Act. Days β†’ assignments.actual_work_days + assignments.actual_travel_days
- Act. Rate β†’ assignments.actual_work_rate_cents / 100
- Act. Total β†’ (actual_work_days Γ— actual_work_rate) + (actual_travel_days Γ— actual_travel_rate) + adjustment_amount
- Variance β†’ Act. Total - Crew Total (calculated)
- Invoice # β†’ (NOT IN DATABASE - See Q2 below)

❓ Open Questions for Stakeholders​

Q1: Accommodation Tracking​

Context: Excel sheet shows accommodation assignments (e.g., "FjΓ€llterassen 521", roommate sharing).

Question: Do we need to track accommodation in the database?

Options:

  • A) Add accommodation_assignment table (hotel name, room number, check-in/out, roommates)
  • B) Store as free-text field on assignments table (e.g., accommodation_notes)
  • C) Keep in hotel_bookings table and extend with room assignment fields
  • D) Don't track in system, continue managing in external sheets/systems

Impact: If we track accommodation, Grid View can show roommate icons (πŸ‘₯) and click-to-expand details.


Q2: Invoice Reference Numbers​

Context: Excel sheet has "LΓΆpnr Fortnox" (invoice numbers from external accounting system).

Question: Should PBS store invoice references from Fortnox/other systems?

Options:

  • A) Add invoice_reference field to assignments table
  • B) Add full invoices table (invoice_number, date, amount, status, external_link)
  • C) Don't store, keep in external accounting system only
  • D) Store as JSON in assignments.notes or adjustment_reason

Impact: If stored, Grid View can link to external invoices (click to open Fortnox).


Q3: Daily Work Schedule Grid Usefulness​

Context: Grid View shows daily cells (β– β– β– β– β– ) for visual scanning.

Question: Is this daily grid useful for your workflow?

Alternative: Show only summary counts (6 work days, 2 travel days) without daily breakdown.

Pros of daily grid:

  • Visual scan of who works which days
  • Easy to see conflicts/overlaps
  • Quick inline editing (click to toggle)

Cons:

  • Takes horizontal space (31 days = 31 columns for long projects)
  • May be redundant if you already see start/end dates elsewhere

Preference: Keep daily grid? Or simplify to summary only?


Q4: Accommodation Display Detail Level​

Context: Grid View currently shows "FjΓ€llterassen 521" (room code).

Question: What level of detail do you need in the grid?

Options:

  • A) Room code only (e.g., "FjΓ€ll 521") - compact
  • B) Room code + roommate count (e.g., "FjΓ€ll 521 πŸ‘₯3") - shows sharing
  • C) Room code + roommate names on hover - detailed
  • D) Full hotel name + room (e.g., "FjΓ€llterassen Room 521") - verbose

Recommendation: Option B (code + count) for balance of info vs space.


Q5: Actual Costs Column Visibility​

Context: "Actual Costs" columns hidden by default (post-production feature).

Question: When should Actual Costs columns be visible?

Options:

  • A) Always hidden, user manually shows via [βš™οΈ Columns] button
  • B) Auto-show when project status = "Completed"
  • C) Auto-show when first actual cost is entered
  • D) User preference: "Always show" / "Show after completion" / "Always hide"

Impact: Affects default grid width and information density.


Q6: Must-Have vs Nice-to-Have Columns​

Context: Grid View has 40+ columns across all groups.

Question: Which columns do you use DAILY vs OCCASIONALLY?

Please rank (1 = Critical, 2 = Important, 3 = Nice to have, 4 = Can hide):

___ Name, Function, Status (Crew Info)
___ Team, Role Note (Labels)
___ Accommodation (Logistics)
___ Travel method (Logistics)
___ Daily work schedule grid (Work Schedule)
___ Work days count (W)
___ Travel days count (T)
___ Day Rate, Travel Rate (Financial)
___ Crew Total cost (Financial)
___ Hotel cost (Financial)
___ Travel cost (Financial)
___ TOTAL per crew (Financial)
___ Admin task checkboxes (Travel/Hotel/Roadbook/Invoice)
___ Actual costs columns (Post-production)

Impact: Helps prioritize default column visibility and grid width.


Q7: Meal Per Diems Tracking​

Context: Not mentioned in Excel sheet, but common in production.

Question: Do you need to track meal per diems or meal allowances in the grid?

Options:

  • A) Yes, add "Meals" column (daily rate Γ— days)
  • B) Yes, but as simple checkbox "Meals Included" (boolean)
  • C) No, tracked separately outside PBS
  • D) Store in "Other" expenses column

Impact: Additional financial column if tracked.


Q8: Color-Coding for Conflicts​

Context: Grid View currently shows status badges (Confirmed/Pending).

Question: Should we highlight crew with booking conflicts or availability issues?

Visual Ideas:

  • πŸ”΄ Red row background if crew double-booked (overlapping project dates)
  • 🟑 Yellow row background if crew marked unavailable in those dates
  • ⚠️ Warning icon in Name column with tooltip "Conflict with Project X"

Preference: Add visual conflict warnings? Or keep clean grid?


Q9: Export Format Preference​

Context: Grid View can export to Excel with formulas or flat values.

Question: What do you prefer in exported Excel files?

Options:

  • A) Formulas (e.g., =B2*C2 for cost calculations) - editable, updates automatically
  • B) Flat values (e.g., 6000) - static snapshot, no formulas
  • C) Both (two sheets: "Data" with values, "Calculations" with formulas)

Impact: Formula exports are more complex but allow external what-if analysis.


Q10: Countdown Timer Display​

Context: Showing "Days until project starts" in header.

Question: Useful to see countdown in Grid View header?

Example: "⏰ 12 days until project starts" (updates daily)

Preference: Add countdown? Or unnecessary clutter?


πŸš€ Implementation Notes​

Performance Optimization​

CRITICAL:
- Virtualized scrolling for 100+ crew members
β†’ Only render visible rows (10-20) + buffer (10)
β†’ Library: react-virtual, react-window, or @tanstack/react-virtual

- Debounced inline editing (500ms)
β†’ Don't save on every keystroke
β†’ Save on blur or after 500ms idle

- Client-side calculations for totals
β†’ Don't re-fetch API on every cell change
β†’ Calculate crew totals, footer sums in React state

- Lazy load actual costs columns
β†’ Only fetch actual_work_days, actual_rate, etc. when user clicks [Show Actual]

- Memoized rows and cells
β†’ Use React.memo to prevent unnecessary re-renders

Responsive Behavior​

DESKTOP (>1280px):
- Full Grid View with all features
- Horizontal scroll if needed
- Frozen columns with shadow

TABLET (768px-1279px):
- Auto-switch to List View
- Show message: "Grid View requires desktop (1280px+ width)"
- Option: Rotate device to landscape for Grid View

MOBILE (<768px):
- List View only (Grid View not available)
- Crew cards with key info

Browser Compatibility​

REQUIRED:
- Modern evergreen browsers (Chrome, Firefox, Safari, Edge)
- ES6+ support
- CSS Grid and Flexbox
- Sticky positioning

NOT SUPPORTED:
- IE 11 (no longer required in 2025)

Accessibility​

CONSIDERATIONS:
- Keyboard navigation (Tab, Arrow keys, Enter)
- Focus indicators on cells (blue outline)
- ARIA labels for icons and status badges
- Screen reader support for grid structure
β†’ Use proper table semantics (<table>, <th>, <td>)
β†’ Announce row/column headers on focus
- High contrast mode support (system preference)
- Reduced motion support (disable animations if user prefers)


πŸ“ Next Steps​

Before Implementation:

  1. βœ… Review this specification with stakeholders
  2. ⏳ Answer open questions Q1-Q10
  3. ⏳ Prioritize column visibility (Q6)
  4. ⏳ Decide on accommodation tracking (Q1)
  5. ⏳ Decide on invoice reference storage (Q2)
  6. ⏳ Create visual mockups (Figma/Sketch) based on this spec
  7. ⏳ User testing with production managers (Excel vs Grid View)

During Implementation: 8. ⏳ Build Grid View component with frozen columns 9. ⏳ Implement inline editing for rates, teams, role notes 10. ⏳ Add daily work schedule grid with toggle functionality 11. ⏳ Build footer calculations and summary row 12. ⏳ Add export to Excel/PDF functionality 13. ⏳ Performance testing with 100+ crew members 14. ⏳ Accessibility audit (keyboard nav, screen readers)

Post-Launch: 15. ⏳ Gather feedback from production managers 16. ⏳ Iterate on column priorities based on usage analytics 17. ⏳ Add Timeline View mode (Gantt chart for crew schedules)


Document Version: 4.4.0 Last Updated: November 20, 2025 Status: ⚠️ Draft - Awaiting Stakeholder Review