# Club Logos Modal Integration - Calendar & Homepage ## Overview Integrated clickable club logos in the MatchModal (calendar/matches view) that open a ClubModal with team statistics, similar to the existing tabulky (standings) functionality. ## Changes Made ### 1. **MatchModal Component** (`frontend/src/components/home/MatchModal.tsx`) - ✅ Added `onTeamClick` optional callback prop - ✅ Made team logos clickable with hover effects - ✅ Added visual feedback (opacity change and scale on hover) - ✅ Accessible: cursor pointer, role button, tab navigation support **New Interface:** ```typescript interface MatchModalProps { isOpen: boolean; match: FacrMatchLike | null; onClose: () => void; onTeamClick?: (teamName: string, teamLogoUrl?: string) => void; // NEW } ``` **Visual Changes:** - Team logos now show pointer cursor on hover - Scale up to 105% on hover - Opacity reduces to 80% on hover - Smooth transitions (0.2s) ### 2. **HomePage Component** (`frontend/src/pages/HomePage.tsx`) - ✅ Added `handleTeamClickFromMatch` function - ✅ Searches through standings data to find team statistics - ✅ Falls back to minimal modal if team not found in standings - ✅ Updated all MatchModal instances across different layout styles: - Magazine layout - Edge layout - PRO layout - Unified layout (default) **Logic Flow:** 1. User clicks team logo in MatchModal 2. System normalizes team name for matching 3. Searches through all standings/competitions 4. If found: Shows full ClubModal with stats (wins, draws, losses, points, etc.) 5. If not found: Shows minimal ClubModal with just name and logo **Team Name Normalization:** - Removes diacritics (á → a, č → c, etc.) - Converts to lowercase - Trims whitespace - Supports partial matching (handles prefixes like TJ, SK, MFK) ### 3. **CalendarPage Component** (`frontend/src/pages/CalendarPage.tsx`) - ✅ Added ClubModal import - ✅ Added state for ClubModal management - ✅ Added standings data loading from FACR cache - ✅ Implemented `handleTeamClick` function - ✅ Made team logos clickable in the match detail modal - ✅ Added ClubModal component at the end of the page **New Features:** - Loads standings from `/cache/prefetch/facr_tables.json` - Processes team data (goals for/against, wins/draws/losses) - Clickable team logos in calendar match modals - Hover tooltips: "Klikněte pro zobrazení statistik: [Team Name]" ### 4. **ClubModal Component** (No Changes Required) - Already exists with proper interface - Displays team statistics beautifully - Works for both football and futsal ## User Experience ### Before - Team logos in match modals were static images - No way to see team statistics from match view - Had to navigate to standings page separately ### After - Click home team logo → Opens ClubModal with team stats - Click away team logo → Opens ClubModal with team stats - Visual feedback on hover (scale + opacity) - Seamless integration with existing standings data - Works on both homepage and calendar page ## Technical Details ### Data Flow ``` MatchModal (team logo click) ↓ handleTeamClick(teamName, logoUrl) ↓ Search standings array ↓ Transform to ClubModal format ↓ Open ClubModal with team data ``` ### Standings Data Structure ```typescript { name: string, // Competition name table: [{ team_name: string, team_id: string, position: number, played: number, wins: number, draws: number, losses: number, goals_for: number, goals_against: number, points: number, logo_url?: string }] } ``` ### Team Matching Algorithm 1. Exact match: normalized names are identical 2. Contains match: one name contains the other 3. Fallback: Show minimal modal if no match found ## Files Modified 1. `frontend/src/components/home/MatchModal.tsx` - Added onTeamClick prop - Made logos clickable 2. `frontend/src/pages/HomePage.tsx` - Added handleTeamClickFromMatch function - Updated all 4 MatchModal instances - Added team search logic 3. `frontend/src/pages/CalendarPage.tsx` - Added ClubModal import - Added standings state and loading - Added handleTeamClick function - Made modal logos clickable - Added ClubModal component ## Testing Recommendations ### 1. **Homepage - All Layouts** - Test Magazine style - Test Edge style - Test PRO style - Test Unified style (default) ### 2. **Match Modal Interactions** - Click home team logo - Click away team logo - Verify ClubModal opens - Check hover effects work ### 3. **Calendar Page** - Open calendar view - Click match to open detail modal - Click team logos in modal - Verify statistics display correctly ### 4. **Team Matching** - Test with teams in standings → Full stats shown - Test with teams NOT in standings → Minimal modal shown - Test with Czech diacritics (Kravaře, Třinec, etc.) - Test with club prefixes (TJ, SK, MFK, Sokol) ### 5. **Edge Cases** - Teams with long names - Teams with special characters - Teams without logos - Empty standings data ## Browser Compatibility - ✅ Modern browsers (Chrome, Firefox, Safari, Edge) - ✅ Hover effects use standard CSS - ✅ Transitions supported in all modern browsers - ✅ Modal system uses Chakra UI (fully compatible) ## Performance Considerations - Standings data loaded once on page mount - Team search is O(n*m) but data is small (typically < 100 teams) - No performance impact expected - Modal rendering is lazy (only when opened) ## Future Enhancements Potential improvements: - Add team historical performance graph - Show head-to-head statistics between teams - Add recent form indicator (last 5 matches) - Link to team detail page if available - Cache team lookups for better performance --- **Date:** 2025-10-11 **Status:** ✅ Complete **Files Modified:** 3 **New Components:** 0 (reused existing ClubModal) **Breaking Changes:** None